四谷ラボ公式ブログ

四谷ラボはいつでも誰でも自由に参加・研究・交流・発信のできる街のオープンイノベーションラボ

The Nostr 2023 (with Bluesky) - 僕が四谷ラボとともに歩んだ一年間

今日のこのブログ記事は Nostr Advent Calender 第2会場 の25日目の記事になります。

昨日のアドベントカレンダーはkaijiさんの「Nostrではじめる、分散型アプリケーション開発 」と、雨鹿茶房/fei🫑さんの「2023年 Nostrの思い出」でした。

adventar.org

adventar.org

Shino3 こと、しのさんで、しのはらです。

The Nostr (with Bluesky)

2023年という歳をあらためて振り返ってみると、僕にとっても四谷ラボにとっても、Nostr (Blueskyも含む) を主軸として共に過ごしてきた一年だったと改めて思います。今年は僕も久しぶりに四谷ラボの名前をお借りして複数のイベントとともに歩いたとても濃い一年間でした。この記事にて活動を振り返るとともに、今年様々なイベントでご協力いただいた皆様、参加していただいた皆様、また同時に Nostr (with Bluesky) でご一緒させていただいた皆様への感謝とともに、まだ見ぬ Nostr ユーザー、四谷ラボメンバーにも思うことを伝えていければと考えております。

私と Nostr と四谷ラボ

全ては四谷ラボの Discord で kojira さんが呼びかけたところからスタートしています。先日の記事でも軽く振り返りましたが、ちょうど Twitter は大規模な凍結騒動の真っ只中におり、同時にジャック・ドーシーが「こんなのあるよ」と Damus を紹介したことが大きく広めた第一歩となりました。私が Nostr を見始めたのは 2023/2/8 のことで、その当初はユーザーの多くがエンジニアや、また著名なエンジニアもいたことを記憶しています。

その頃、私はというと「約二週間後に引っ越しを控えており」めっちゃ時間がなかった記憶があります。タイムラインの流れが早く、話題の切り替わりも早く、一瞬でも目を話すともう全然ついていけなくなる感じ・・・。

当時はまだ全然で、ほとんどのユーザーが「どのアプリを使えばいいの?」「どの設定をすればいいの?」「どういう仕組なの?」・・・?と未開拓な地だった用に感じます。手探りでその荒野を均すように使い方を探っていた感じがあり、半日もあると新しいツールや手法が提案されていたり、とにかく情報の流れがとても早かった感じでした。

Nostr とは

ここ数日、四谷ラボのブログに頻出している Nostr とは??という感じですが全てを説明するとこのブログ記事だけでは説明しきれません。ざっと概略だけ記載させていただきまして、主要なポイントや詳細はなるべく別のわかりやすい解説記事などにお願いしていきます。

※すでに Nostr に触れていて、そんなの知っとるがな!!という方は読み飛ばしていただいて構いません。

fiatjaf 氏が提唱し、2022年より小規模ながら運用が始まっていました。またこの分散型ネットワークの仕組みに着目したジャック・ドーシー(Twitter創設者)が注目し、多大な支援を行っていることもあります。

Nostr 自体はは略語です。Notes and Other Stuff Transmitted by Relays の頭文字を取って呼ばれています。和訳すると「複数のリレーによって通信されるノートやそれ以外のもの」という意味で、投稿やプロフィールなどは「リレー」というサーバーによって伝播されてクライアントの元に届きます。

また「複数の」と書いてあるとおりリレーは複数存在し、クライアントは複数のリレーを選択することができます。この「複数のリレー」に接続が可能という仕組みが「分散型 SNS」を説明することになります。

この Nostr におけるデータ構造や、その内容を定義したものは Nostr Implementation Possibilities (NIP) というプロトコルにおいて定義されています。これに関しては後述します。また通信の仕組みも独特で、比較的枯れた技術とも言われている WebSocket を使用しています。

この2つが大きなポイントでこれを使っているからこそ面白い特徴があります。

Nostr の通信方式

一般的に使用されるアプリケーションとサーバー間の通信、APITCP/IPによるREST方式などを使用していることがほとんどです。アプリケーションからサーバーに対して

「新規投稿ある?ない?」
「あるで?ほい。これや」
「うけとったで。ありがと。ほなまた」

とこちらのほうがハンドシェイクを確実に行うため通信の失敗・成功に関しては厳密に管理されるため、もちろんメリットはとても大きいです。

Nostr はその TCP/IP を使用せず WebSocket を使用し UDP で即時性と軽さを求めました。そのためサーバーとの通信がなされている間はストリームが延々と流れ続け、まるで川のように常に情報が振ってくるようになります。10年以上前から Twitter を使用していた方はTweetDeckのほか、Tween、Shooting Star などのサードパーティアプリケーションが馴染み深いのではないでしょうか。

ただし前項でも説明しました。WebSocket でも通信していることは他のアプリケーションやサービスでは当たり前にやっていたことです。では Nostr の「通信」に着目した新規性とはなんでしょうか・・・?

それは複数のリレーサーバーを自身で選択して接続できることです

以下のようなメリットがあります。

  • システム障害やネットワーク障害に強い
  • 中央集権的にならず、配信したい情報のコントロールがされにくい

これはそれぞれのクライアントが複数のリレーを介して多重なネットワークを形成することができるためとても冗長的な構成になります。

NIP とは

改めて、NIP とは Nostr Implementation Possibilities (NIP) という Nostr というプロトコルを定義するための仕様です。この NIP に関しては GitHub 上で日々議論され、更新されています。

github.com

この NIP に関して詳細の内容に興味のある方は以下の参考リンクを覗いてみてください。

github.com

また日本の Nostr コミュニティにおいても日本語訳の活動は活発に行われており、以下のリポジトリで確認いただくことも可能です。

github.com

またこの NIP-01 の和訳に関しては後述する Hello Nostr! および Hello Nostr! Yo Bluesky! の中でも取り上げられています。

techbookfest.org

もう一冊、技術評論社から発刊されている Software Design 10月号 「詳説 Nostr プロトコル」にも詳しく記載されいていますので、合わせてこちらも御覧ください。

gihyo.jp

Nostr の通信においては「NIP-01」が Nostr の基本と言える JSON 構造を定義しております。

{
  "id": "シリアライズされたイベントデータのSHA-256(32バイト)を小文字の16進数で表記したもの",
  "pubkey": "公開鍵(32バイト)を小文字の16進数で表記したもの",
  "created_at": "秒単位の生成時刻",
  "kind": "イベントの種類",
  "tags": [
    ["e", "..."],
    ["...", "他の種類のタグが後に追加される可能性がある"]
  ],
  "content":"任意の文字列",
  "sig": "シリアライズされたイベントデータのSHA-256(IDフィールドと同じ)に対する署名を16進数で表記したもの"
}

この JSON はイベントと呼ばれます。

Nostr におけるユーザー管理

各項目を説明する前に Nostr におけるアカウント管理について簡単に説明します。

いきなりですが、Nostr には直接的にアカウントと呼べる概念はありません。ただ一つだけ npub/nsec といわれる公開鍵、秘密鍵のキーペアが存在するのみです。このキーペアは generate コマンド(環境による)でランダムに生成され、桁数は天文学的数字なので実質一意といっても差し支えはないでしょう。通常は SNS 含め各種 Web サービスにおけるユーザーの操作は「ユーザーID/パスワード」によって認証された本人であることをサーバーが保証します。

しかし Nostr は構造上サーバーが分離しており、ユーザーのログイン情報を秘匿することはほぼ不可能に等しいです。そのため投稿されるイベントの中に「それが特定のユーザーが行った操作であることを証明する仕組み」を実装する必要がありました。これを可能にするのが「公開鍵と秘密鍵のキーペア」になります。プロトコルに沿ってやり取りするイベントはそれぞれ「所有者」を示すための pubkey (npub・・・) を含みます。この pubkey や content などイベントの内容(タイムスタンプ含む)に対して秘密鍵を用いて署名を行います。署名の結果は sig に記載され、その sig に対して公開鍵を用いて検証を行うことで、イベントが npub 本人のものであることを確認します。

疑問に思ったかもしれません。アカウント乗っ取り騒動もですが、あふれるフェイクニュースやフェイクアカウントに寄る投稿はどのように防ぐ?誰でも鍵を無限生成することができる状態で本人を確認するのは困難です。そのため、Nostr には NIP-05 という仕組みがあり、これによってユーザーは自分自身を証明することができます。

書き始めるとこのまま朝を迎えてしまいかねないので、詳細は NIP-05 の詳細をご覧ください :bow:

github.com

ここまでが Nostr におけるイベントの JSON のお話です。ここからはその Nostr イベントの「種別」その名の通り Kind に付いてのお話になります。

Nostr イベントの種類(ざっくり)

主に使われる Kind は以下の通りで、これらがユーザーのタイムラインを構成しています。

  • 0: プロフィール情報を示します。content には name, display_name, about, pictrue など、各SNSと同様にユーザーのプロフィール情報を格納します
  • 1: 投稿を示します。思ったことのポストなどはこれにそって成り立ちます。また、tagsに親となるイベントの note_id などを格納すると、リプライなどが行なえます
  • 6: リポストを示します。特定の投稿に対しての repost を行います。
  • 7: リアクションを示します。ユーザーに対していいねなどのリアクションを行うことができます。

Nostr のネットワークにおいてこの Kind 0, Kind 1 をあちこちにばらまくことによって「この人が書いたこの記事」というものが広く世界中に拡散されることとなります。

その他、それぞれ拡張され以下のようなものも例にあります

  • 40, 41: グループチャットのチャンネル・チャンネル情報の更新内容で、グループチャットはもっと流行って欲しいと思っている
  • 42: グループチャットに対する投稿で、この投稿に対してリアクションやリプライをすることも可能
  • 30023: Long Text Content という、めっちゃ長い投稿で、ブログのように使うことも可能
  • 30078: 30023 を拡張し汎用性を高くしたもの。テキストベースの Key-Value Store のような使い方が可能です

勉強会の立ち上げ(四谷ラボ)

「Nostrとはなんぞや!!!」と kojira さんが動きます。世界初?かもしれない Nostr のオンライン勉強会が立ち上がりました。このイベントは開催日は猫の日にちなんで、2/22 22:22 ~ とやさしくないような時間に設定されておりましたが、登壇者は満員。時間もギリギリで、同時接続数はおよそ 200 人と、この手の YouTube Live においてはとても大盛況だったことを覚えています。

僕の記憶が正しければ、kojira さんって結構忙しかったはず?なのです。僕もかねてより四谷ラボの活動は支援しておりまして、最初は登壇まえの準備や連絡、Connpass の更新といった事務的な作業をお手伝いしておりました。

この勉強会の内容は YouTubeアーカイブを御覧ください。

継続的な勉強会の開催に向けて

その後、僕は「この勉強会の火は絶やしてはいけない!!」と思い立ち、2回目を準備することとなりました。翌日にはイベントを立ち上げ、募集を開始しています。
まだ上手く言語化もできていないのですが「継続的に活動をやりたい、そのノウハウを蓄積したい」ということも僕の中でありました。なるべく活動を続けていくためにどうすればいいか、勉強会を継続していくにはどうするか。待ってるだけでは違うなと思い、開催しようとなりました。

その2回目の開催は 2023/3/10 22:00~ と設定しました。またしても一般人にはやさしくない時間ですが・・・。これまた登壇してくれる皆様が集まりまして、無事に開催に至りました!!後述しますが、その直前に Bluesky の招待コードが手に入り、翼を授かった人たちもいっぱいいましたが・・・

この様子も含めて2回目の勉強会で振り返っております。

勉強会の流れは、Nostr だけにはとどまりませんでした。Nostr のユーザーをを中心として参加した Bluesky ですが、当時は「Bluesky ってなに?」「他の分散型 SNS となにが違うの?」「どういう構造なの」という感じでした。
なにもわからないなら、勉強会建てよう!!!!となり、3/17 22:00~ Bluesky の勉強会を立ち上げてみました。Bluesky に触り始めた当初、Nostr にいたメンバーの活動は活発で・・・ この話は四谷ラボの kojira さんの Bluesky アドベントカレンダーの24日目の記事をご覧ください。

blog.428lab.net

以降、継続的に勉強会が開催されることとなりました。当時は半日で一週間が過ぎるような、そんな情報量の中にいたため勉強会の頻度は高かったのですが、ここ最近はスピード感が落ち着いてきており、勉強会開催の頻度を調整しています。

以下の YouTubeアーカイブは2023年に行われた、過去の Nostr 勉強会に関する内容です

また、早いうちから勉強会の副音声会場 Discord を用意し副音声をわいわい配信してくれたつるるんには感謝します。

そしてオフライン勉強会へ(Blueskyと合同)

この様子は後日またイベントレポート記事が上がると思います。2023/12/8 に LINEヤフー株式会社の紀尾井町オフィスにて、なんと!!!オフラインの勉強会を開催するに至りました!!! 四谷ラボとしてこの規模のイベント開催は始めてでありながら、場所をお借りすることもでき、またラボのメンバー含めイベントの開催経験や登壇経験もいただけてとても嬉しく思っています。こういったイベントも年に何回か、継続的にできればいいなと思いながら・・・

YouTube での配信も行っており、その模様は以下のアーカイブ御覧ください。

今後も四谷ラボはオンライン、オフラインともにイベントを続けていけたらと考えています。もちろん企画した中で振り返る点もあります。これは次回でまた改善していければいいことと思っており、どんどんノウハウのアップデートを続けていく方針です。

技術書典の参加

このお話が出たのは3月末ぐらいのことでした。技術者も多く、同人活動的なこともしたいね!という空気感がありました。動くのは早いほうがいいよね・・・ってことで一番近く、早いイベントを探したらそれは「技術書典14」がありました。ではイベントに出展しようということで、タイムライン上で著者を集めて共同著書の形としてリリースする方向で活動が開始しました。

Hello Nostr!

当時 kojira さんが生み出した対話 Bot の「Nostr ちゃん」の影響もあり、サークル名は「Nostr Idol Project」として登録をおこない技術書典へ参加する運びとなりました。

techbookfest.org

Nostr 上で本への参加者が集まり、結構なメンバーが関わるその本の厚さは「132ページ」という、薄くない薄い本が完成しました。当日販売は僕と kojira さんの2名で参戦しており、14:00 手前ぐらいには物理在庫の100部完売するという状況でした。
後日、本のDTPなどを担当してくださった、よそいちさんに伺ったところ「技術書典で30部売れることもまあまあないですから」とのこと。マジか。

また最初の著書「Hello Nostr!」は技術書典の刺され部門などでもノミネートされるなど、いっとき話題になったことを覚えています。私の中でもかなり印象的な出来事は、この本を 11/1 のイベント「Nostrasia」にて、ジャック・ドーシー本人へ手渡せたことだと思っています。ジャック・ドーシーも自らが支援しているプロジェクトの本を、日本で受け取るとは思っていなかったのでは!?と。
また、前後のイベントで Damus の開発者である Will にも手渡すことができました!(これに関しても後述します)

Hello Nostr! Yo Bluesky!

僕らが関わる二冊目の本、Hello Nostr! Yo Bluesky! に関しては完全に僕の「やりたい」でスタートしました。一作目はバタついてて内容を書く余裕がなく、ちょっと離れたところから関わる形となっていたことも心残りで・・・
そして、前回の技術書典を前に始まった Bluesky・・・私達は Nostr Idol Project として活動を開始しており、それも含むことができませんでした。Hello Nostr! も含めサークルや Booth などの販売ルートも管理していたのが僕だったこともあり、サークル名を活動の幅広げるために「四谷ラボ」と変更をしております。

techbookfest.org

2回目の本は、Nostr に関わらず Bluesky からも著者・お手伝いを広く募集したところ、前回よりもさらに多いメンバーに関わっていただけることとなりました。また、ページ数も前作を大幅に超える 214 ページとなり、さらに分厚い同人誌となりました。

前回を超える150部ほど印刷し、実売状況は5冊のこして完売ならず・・・という感じ、少し悔しく感じます。またこの本に関しては原価計算がバグっており、収益はギリ完売で確保できたという状況でした。次回以降は考えるかもしれません(純粋に量が多いので分けてもよかったかも?)

今回の冊子の中では Nostr および Bluesky を中心として集まった四谷ラボのメンバー(kojiraさん、発火大根さん、つるるん、私)で座談会を行い「継続的な勉強会の運営にはなにが必要か」ということを話しています。その様子は冊子の中でも対話形式で見ることができる上に、どういった活動を行っているのかは YouTube にも動画が公開されています。

かかった経費の現実的な話は、以前のBluesky アドベントカレンダー一日目で取り上げさせていただいております。また、実際に Hello Nostr! にかかった金額などに関しては「新時代の分散型SNS」勉強会にて登壇しましたので、その様子も先程の YouTubeからご覧いただけます。

blog.428lab.net

今回のイベントでも「刺され!部門」にノミネートされ、受賞することができました!本の内容的にも、構成的にも「この本の全体的な完成度が高い」と評価していただいており、また内容も他のサークルでは取り扱っていなかった話題も相まっての受賞となったようでした。ありがとうございました。

(受賞時の模様は、以下の YouTube より御覧ください)

www.youtube.com

技術書典への今後

もちろん、今後も技術書典への参加は続けていきたいと思っています。まだ Nostr も Bluesky も発展途上で、実装もどんどん改善するでしょうし、進化も止まらないと思います。もちろん個人開発のものも増えるでしょうし、同時に SNS との向き合い方も社会に合わせて変化するでしょう。これら「新時代の分散型 SNS」を継続的に追いかけていければと思っています。

この先も共著の方式は進めていきますが、同時に「この話題で出してみたい」など、ご一緒に楽しんでいただけるメンバーも募集しています。

僕と Nostr と Blueksy

ここから先はこのブログ記事の本題かもしれません。

僕が Nostr に対してどのように向き合ってきたのかを振り返ってみます。僕が Nostr 始めた頃は、ちょっとバタバタしていてあまりその詳しい仕組みまでは理解しておりませんでした。ざっくり理解していたことは、アカウントの認証は NIP-05 で行うんだろなー、ってことと、リレーサーバーが複数 WebSocket で接続できるんだろなーぐらいの認識でした。どちらかというと、純粋に新しい SNS というかコミュニティの場でどんなことができるのか、どんな話題が流れているのかに興味があったように感じます。

技術的な部分の興味などに本格的に興味を持ったのは、Nostr 勉強会 #0 の頃からでした。実際、以降の私の登壇内容は技術的な部分に触れた内容は少なく、それに関連したコラム的なものをお届けできるようにしていたと思います。どちらかというと勉強会などは振り返りや、自分がその時見ている景色を共有できるようにしていきたいなとはずっと思っています。細かい登壇をさせていただき、かなり私自身の経験にもなりました。同時に真面目な話や雰囲気でもネタを必ず入れて、思わずその場で投稿したくなるような登壇を続けています。これには一つの意図で、継続的に他の方も登壇していただきたいことや、敷居を下げるため、その他には閑話休題なども含みます。

勉強会の中では Nostr の仕組みや、既にいくつかWEB系のサービスなどもリリースされており、それらどんな仕組みで動いていますよ!という内容が多かったように思います。

同時に勉強会で技術の話に触れるようになってから触発されました。突然ですが話題は 2017年頃、Mastodon や仮想通貨ブームの頃に遡ります。その当時、僕は組み込み系や C, C++, PHP 系から出身し個人で Nuxt を始めとして JavaScript などの勉強をしていました。仮想通貨コミュニティで知り合った学生のエンジニアや、新卒ぐらいのエンジニアを見ている中で「あ、僕なにも理解できてない。プログラムは一丁前に10年近く書いてるけど、なにも知らないんだな・・・」と井の中の蛙が大海を知り始めた頃でした。今でもその頃知り合った方々との付き合いも続いており、結果的にその関係は長く続いています。

あらためて Nostr との出会いを振り返ってみると、僕はその当時に比べて「ある程度、WEB 関係の知識も、インフラも、スクリプト系言語も触っている」状態からスタートすることができました。なら、もうやることは一つ。作るしかないじゃないですか。そう思い立って触って、作ったのが NosTx になります。

NosTx を作る

Nostr はユーザーのアカウントは npub1... で管理され、投稿は note1... で始まるのですがクライアントは複数あります。みんなが好き放題に URL を設定するので、開くと飛ばされる先は Iris, snort, etc... 使い慣れたクライアントで開きたいと思ったのは正直ありました。Nostr には NIP-21 で定義された nostr://... のスキームがあり、これを使用すればモバイルアプリケーションでも開くことは可能です。

それなら https://your-domain/[npub, note, other] を指定してジャンプするクライアントがあってもいいじゃん?ということで作るに至りました。その当時は僕が一番使い慣れていたフレームワークが Nuxt 2 でした。2023年末にサポートが切れるというのに。スピード感を優先して作成→リリースするに至っています。これに関しては登壇の内容で、以下のスライドを御覧ください

Bluesky への旅立ちと、それを眺める

3/3 に Nostr へ Bluesky の招待コードが降り注ぎました。これによって、私も Nostr から Bluesky へ旅立つことができたものの・・・「Bluesky は iOS アプリしかない」という事実。

kojiraさんの記事でこのあたりの詳細は記載があります。

blog.428lab.net

4/7 に開催されました、Bluesky Meetup in Tokyo にはお手伝いさせていただきました。結果、ITmediaの記事でトップに載るなど、新たな実績解除も行っています。

また Bluesky では自分のキャラ付けを少し考えました。SNS との向き合い方においては、親しみやすいネタ要素みたいなのがあったほうがいいよなーと思いながら。
引っ越した先は、偶然にもくら寿司の近く。Nostrでも私は週5でくら寿司を食べる人と認識されており、これそのまま使えるなーと思いながら私は Bluesky に「サーモンしか注文していないくら寿司の写真」を上げました。結果として「サーモン大好きなしのさん」というキャラ付けに成功しました。

※サーモンは大好きで、年に数回こういう食べ方は以前からしておりました。→それが表に出ただけです

Bluesky において、僕は Web クライアントを作ってリリースしていました。その頃ぐらいまでお恥ずかしながら TypeScript を触ったことがなく、このままではちょっとヤバいということで言語機能の習得のために触ることになりました。また 2022 年よりリリースされた ChatGPT(GPT4) は大変優秀で、私のそんな活動をずっと後押ししていただけてました。

クライアントを作った他、複数の Bot も稼働させています。これを私が動かす理由はいくつかあり、定時バッチの実行やインフラの勉強も兼ねています。コードは node/JS, TS で記載されていて GCP 上の Linux で稼働しており、Supervisor でデーモン化されています。定期的に動かすために node-cron を使用するなど実務では触る機会のなかったものを取り入れつつ。

Nostr-jp の立ち上げ

技術書典の近辺にて、一つ議論がありました。中央集権的にならずある程度のリソースを維持管理する方法を検討する必要がありました。その頃はのす本リリースで Web サイトが必要になりそうであったり、Nostr をこれから始めようとする人むけの入り口のような、記事を管理する仕組みが欲しかったり、その他にも原稿管理や、民主的な活動を行う場が必要でした。

私は nostr-jp.org のドメインを取得し、そのドメイン管理をおこなっています。nostr.jp などが取りたかったのですが、もう手遅れだったような感じもあり。mattn さんの助言もあり、vim-jp.org を真似して nostr-jp.org ドメインの取得に踏み切りました。

また GitHub において Nostr-jp の Organization を立ち上げました。Owner 権限をある程度 GitHub の操作が可能かつ、Nostr に貢献があると思われる方を個人的に判断してメンバーにご招待しました。立ち上げから半年ほど経ちまして、ここ最近は nostr/nips を翻訳する活動も活発に行われています。

github.com

Nostr の思い出

とにかく、Nostr のコミュニティと技術に、常に触り続けていた結果、先程までの記載の内容はとても記憶に残ったと思っています。

そこに含むこともなく、他にkojiraさんもレポート上げております故少々省略しながらになりますが、印象に残ったのは「ジャック・ドーシーとハグをして、Hello Nostr!を手渡したこと」だと思っています。

まとめ

その他、私が Nostr や Bluesky で活動してきた内容は多岐にわたり、書き切ることはできない気がしてきました。このまま進むとアドベントカレンダーの公開が歳をまたぎそうな雰囲気もあり、このへんで一区切りとさせていただきます。記事の内容のように、2023年なにがあったのかを改めて振り返ってみると、今年一年はかなり濃い日々を過ごしてきたことと思います。技術者として刺激をいただき、同時に楽しいことをやりたい仲間も増え。四谷ラボのメンバーとしても、ラボの活動が大きく前に進む展開となったことは激アツです。

2023年の末、改めて振り返ると僕にとってのクリスマスプレゼントはこの一番最後にアドベントカレンダーを書かせていただき、改めて今年なし得たことを振り返る機会だったのかもしれません。

全ての分散型SNSユーザーおよび四谷ラボの関係者に感謝します。

メリークリスマス!!(※48時間遅れ)