Project

General

Profile

バグ #1371

mikutter 3.9.2にて、タブを左クリックするとフリーズする。

Added by ぶっちゃん ! 4 months ago. Updated 29 days ago.

Status:
終了
Priority:
通常
Target version:
プラグイン名:
ブランチ:
topic/1373-gtk2-3.3.7
クラッシュする:
Yes

Description

・現象
mikutterがフリーズする。

・環境
  • Arch Linux(x86_64 Linux 5.2.4-arch1-1-ARCH)
  • mikutter 3.9.2(AUR版)
  • Ruby 2.6.0

・エラーログ

$ mikutter
/opt/mikutter/usr/share/mikutter/core/boot/check_config_permission.rb:11: warning: use glob patterns list instead of nul-separated patterns
GLib-GObject-CRITICAL **: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed
    from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.6/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
    from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
    from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed
    from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.6/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
    from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
    from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
    from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
    from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
    from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
    from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
^C/usr/bin/mikutter: 2 行: 10910 強制終了            /opt/mikutter/AppRun


再現手順

  • mikutterを起動する
  • タブを左クリックする

Related issues

Related to 提案 #1397: Ruby-GNOME 3.3.8を利用する終了Actions
Blocks 提案 #1373: Ruby-GNOME2 3.3.7を利用する終了Actions

History

#1

Updated by toshi_a 初音 4 months ago

  • Assignee set to ぶっちゃん !

再現しませんでした。以下のことをやってみて、結果を教えてもらえますか。

  • クラッシュしているようですが、フリーズしたので強制終了したのでしょうか。
  • 左クリックしたタブはどのタブですか。環境によって存在するタブは異なるので、いくつか(できればすべて)を試して、どれでフリーズするか教えてほしいです。
  • 同じことをmikutter 3.9.1で行っても再現するか試してほしいです。
#2

Updated by toshi_a 初音 4 months ago

  • Status changed from 分類待ち to 実装待ち
  • Assignee changed from ぶっちゃん ! to toshi_a 初音

起動直後にクラッシュするバグが発生しましたが、本件と同じバックトレースでクラッシュしました。

調査したところ、タイムラインでアンダーラインやカスタム絵文字を表示する処理でクラッシュしているようです。
アンダーラインは、mentionか(@acct のような文字列)URLのようなクリック可能なもので、これらが表示された時にクラッシュすると思われます。

引き続き以下の点について教えてほしいです。

  • 左クリックしたタブはどのタブですか。環境によって存在するタブは異なるので、いくつか(できればすべて)を試して、どれでフリーズするか教えてほしいです。

参考: https://social.mikutter.hachune.net/@shibafu528/102595997600262822

#3

Updated by toshi_a 初音 4 months ago

  • クラッシュする changed from No to Yes
#4

Updated by ぶっちゃん ! 4 months ago

返信遅れて申し訳ございません。

  • クラッシュしているようですが、フリーズしたので強制終了したのでしょうか。

フリーズするだけで、しばらく放置してると強制終了ダイアログが出たので強制終了させました。

  • 左クリックしたタブはどのタブですか。環境によって存在するタブは異なるので、いくつか(できればすべて)を試して、どれでフリーズするか教えてほしいです。
Pluginを全く入れていないバニラの状態で、
  • ホームタイムライン(Mastodon/Twitter)
  • リプライ(Mastodon/Twitter)
  • ローカルタイムライン
  • ダイレクトメッセージ
    のタブをクリックするとフリーズします。
  • Activityタブ
  • 検索タブ
    はフリーズしません。
  • 同じことをmikutter 3.9.1で行っても再現するか試してほしいです。

mikutter 3.9.1, 3.9.2, 3.9.3の全てで発生します。

原因と思われるもの
pango-1:1.44.3-1からpango-1:1.43.0-2にダウングレードすると、フリーズが発生しません。

#5

Updated by Izumi Tsutsui 4 months ago

toshi_a さんが ruby-gnome2 にバグレポートを出されていて、
速攻で ruby-gnome2 の pango gem 側に修正がコミットされています。
https://github.com/ruby-gnome2/ruby-gnome2/commit/ed7af9fbb1ce27e5a1a33363d5642a25baaba4b0#issuecomment-520624377

ruby-gnome2 の次の 3.3.7 の pango gem が pango 1.44 との組み合わせで
ビルドされていれば解決すると思います。

ruby-gnome2 pango gem をビルドするときにシステムにインストールされている
pango のバージョンとユーザー側が使用する pango のバージョンが一致している
必要がありますが、Archではすでに pango が更新されているので
パッケージビルドもその環境で行われるんですかね。

#6

Updated by toshi_a 初音 4 months ago

リリースされました。
https://github.com/ruby-gnome2/ruby-gnome2/blob/3.3.7/NEWS

これで問題なく動いてるっぽいので軽くまとめます。

#7

Updated by toshi_a 初音 4 months ago

  • Blocks 提案 #1373: Ruby-GNOME2 3.3.7を利用する added
#8

Updated by toshi_a 初音 4 months ago

  • Status changed from 実装待ち to レビュー待ち
  • Assignee changed from toshi_a 初音 to ぶっちゃん !
  • ブランチ set to topic/1373-gtk2-3.3.7

ありがとうございます。報告のおかげで、Ruby-GNOME2 Projectのpango gemに問題があることが分かりました。
今朝修正されたものがリリースされたので、 topic/1373-gtk2-3.3.7 ブランチをcheckoutして起動してみてください。
(Archのパッケージでやっているようなので、ソースからの起動で確認するのが難しい場合は教えてください)

#9

Updated by ぶっちゃん ! 4 months ago

  • Status changed from レビュー待ち to マージ待ち

対応ありがとうございます。

今朝修正されたものがリリースされたので、 topic/1373-gtk2-3.3.7 ブランチをcheckoutして起動してみてください。

確認しました。問題なく動いています。

#10

Updated by toshi_a 初音 4 months ago

  • Status changed from マージ待ち to 終了

merged.

#11

Updated by karin 722 about 1 month ago

mikutter3.9.6でも同様の症状が確認されました

環境
Arch Linux(x86_64 Linux 5.3.8-zen1-1-zen)
mikutter 3.9.6(AUR版)
Ruby 2.6.5p114

再現手順
mikutterを起動する
タブを左クリックする(ホームタイムライン,メンション,ローカルタイムライン)

ログ
which: no aplay in (/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)
GLib-GObject-CRITICAL *: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed
from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.7/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
GLib-CRITICAL *
: g_once_init_leave: assertion 'result != 0' failed
from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.7/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
^C/usr/bin/mikutter: 2 行: 89761 強制終了 /opt/mikutter/AppRun

プラグインは一切入れていません。フリーズするだけで、しばらく放置してると強制終了ダイアログが出たので強制終了させました。

ぶっちゃん ! さんは書きました:

・現象
mikutterがフリーズする。

・環境
  • Arch Linux(x86_64 Linux 5.2.4-arch1-1-ARCH)
  • mikutter 3.9.2(AUR版)
  • Ruby 2.6.0

・エラーログ
[...]

mikutter3.9.6でも同様の症状が確認されました

環境
Arch Linux(x86_64 Linux 5.3.8-zen1-1-zen)
mikutter 3.9.6(AUR版)
Ruby 2.6.5p114

再現手順
mikutterを起動する
タブを左クリックする(ホームタイムライン,メンション,ローカルタイムライン)

ログ
which: no aplay in (/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)
GLib-GObject-CRITICAL *: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed
from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.7/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
GLib-CRITICAL *
: g_once_init_leave: assertion 'result != 0' failed
from /opt/mikutter/usr/lib/ruby/gems/2.6.0/gems/gobject-introspection-3.3.7/lib/gobject-introspection/loader.rb:268:in `block in load_field_writer'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:45:in `block in description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `<<'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:48:in `block (2 levels) in score_expand'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `each'
from /opt/mikutter/usr/share/mikutter/core/plugin/score/select.rb:44:in `block in score_expand'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `each'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `inject'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_markup_generator.rb:34:in `description_attr_list'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_miracle_painter.rb:354:in `main_message'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_coordinate_module.rb:49:in `height'
from /opt/mikutter/usr/share/mikutter/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:145:in `render_message'
from /opt/mikutter/usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb:128:in `uri='
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `main'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:7:in `block in mainloop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `loop'
from /opt/mikutter/usr/share/mikutter/core/plugin/gtk/mainloop.rb:6:in `mainloop'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:69:in `boot!'
from /opt/mikutter/usr/share/mikutter/mikutter.rb:105:in `<main>'
^C/usr/bin/mikutter: 2 行: 89761 強制終了 /opt/mikutter/AppRun

#12

Updated by Izumi Tsutsui 29 days ago

mikutter オフでとしぁさんに確認したら
  • #1397 の問題で 3.3.8 にする必要がある
  • 3.3.8 にする修正について developにマージしたけど master にマージしてなかった

とのこと。このあと master 修正されると思いまsう

#13

Updated by Izumi Tsutsui 29 days ago

  • Related to 提案 #1397: Ruby-GNOME 3.3.8を利用する added
#14

Updated by toshi_a 初音 29 days ago

起動できないということで、masterにも適用したほうが良いですね。

#15

Updated by toshi_a 初音 29 days ago

適用しました。すでに開発ブランチで検証終わってるのでこれでよしとします。

Also available in: Atom PDF