Apache Commons: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
+ книга
Строка 293: Строка 293:
|lang=en
|lang=en
|ref=Iverson}}
|ref=Iverson}}
* {{книга
|автор = Oak, Harshad
|заглавие = Pro Jakarta Commons
|ответственный =
|ссылка =
|место =
|издательство = Apress
|год=2004
|allpages=304
|isbn=1-59059-283-2
|lang=en
|ref=Oak
}}
* {{cite web
* {{cite web
| url = http://jakarta.apache.org/site/news/news-2001.html
| url = http://jakarta.apache.org/site/news/news-2001.html

Версия от 11:12, 29 ноября 2012

Apache Commons — проект фонда Apache Software Foundation, имеющий своей целью разработку и поддержку открытого программного обеспечения повторного использования на языке Java, т.е. библиотек Java. Apache Commons ранее являлся частью проекта Jakarta Project и носил название «Jakarta Commons»[1]. Apache Commons содержит набор библиотек утилит Java самого разного назначения, доступных по лицензии Apache License, и использующихся во многих других проектах с открытым исходным кодом. Утилиты проекта Apache Commons лежат в основе таких проектов как Apache Tomcat, Struts, Hibernate и др.[2][3]

Цели проекта

Согласно уставу проекта, проект должен «создавать и поддерживать пакеты, написанные на языке Java, предназначенные для использования в разработке серверных приложений, и спроектированные таким образом, чтобы их можно было использовать независимо в любом более крупном продукте или фреймворке. Каждый пакет будет поддерживаться таким же образом, как и сам продукт Jakarta» (англ. "The subproject shall create and maintain packages written in the Java language, intended for use in server-related development, and designed to be used independently of any larger product or framework. Each package will be managed in the same manner as a larger Jakarta product.")[4].

История

История Apache Commons восходит к 1999 году, когда, в июне, была зарегистрирована ранее известная под названием «Apache Group» некоммерческая организация Apache Software Foundation (далее ASF)[5]. Основным проектом, поддерживаемым фондом, был Apache HTTPD Web Server, созданный между 1995 и 1999 гг. Одним из проектов Apache Software Foundation стал Jakarta Project (проект Jakarta), который являлся результатом сотрудничества компаний Sun Microsystems, IBM, Oracle и сообщества разработчиков веб-сервера (Apache HTTP Server). Несколько позже в рамках проекта Jakarta был создан проект Jakarta Commons, в котором начали активно создавать компоненты на Java. 19 марта 2001 Комитет проект-менеджмента Jakarta утвердил устав проекта[4], в котором оговаривались основные правила и условия работы в проекте[6]. Согласно уставу, первые пакеты были основаны на существующей кодовой базе ASF, включая код работающий с источниками данных и пулами баз данных, с конфигурирациями XML, ресурсами сообщений, интернационализацией, JNDI и именованием, тестовыми наборами. Первым пакетом, вошедшим в состав Commons, был пакет Database Connection Pool. В период 2001-2005 был разработан основной набор библиотек, ставший базисом для Apache Commons. К 2003 секция proper уже содержала 21 компонент[7]. 19 мая 2004 была утверждена новая версия устава, с поправками в старый вариант[4]. К 2005 в Commons было уже 29 компонентов[8]. 20 июня 2007 Apache Board (Совет Apache) по результату анонимного голосования выделил проект Commons из состава проекта Jakarta, после чего Commons стал проектом верхнего уровня (т.е. отдельным независимым проектом) и стал называться Apache Commons[9].

Структура

В иерархии проектов Apache Software Foundation Apache Commons является «проектом верхнего уровня». Библиотеки проекта Commons делятся на 3 секции: proper (корректные), sandbox (песочница) и dormant (спящие). Секция proper — основная секция библотек, которая на октябрь 2012 года включала 43 проекта. Модули секции proper поддерживаются в рабочем состоянии, и обновляются, сохраняя свои интерфейсы насколько возможно неизменными, чтобы не создавать проблемы существующим пользователям. Секция sanbox предназначена для создания новых проектов и подготовки их к включению в секцию proper или в другие проекты apache. На момент 2012 года секция sandbox включала 16 проектов. Доступ для внесения изменений в проекты этой секции открыт для всех зарегистрированных участников Apache. В секцию Dormant переводят старые проекты, в которых была замечена слишком низкая активность по внесениям изменений, или полное отсутствие активности, и которые Apache не планирует в будущем обновлять (выпускать новые версии). На момент 2012 года туда было включено 15 проектов.

Компоненты

Пояснения к таблице:

  • proper — компоненты секции proper (корректные), «зрелые» компоненты, т.е. активные и обновляемые, API которых стабилизирован;
  • sandbox — компоненты секции sandbox (песочница), «сырые» компоненты, т.е. находящиеся в стадии разработки и тестирования;
  • dormant — компоненты секции dormant (спящие), т.е. устаревшие и необновляемые, релизов по данным компонентам не планируется;
  • Первый релиз — дата первого официального релиза или первого стабильного релиза, как правило версии 1.0, библиотеки как отдельного компонента (альфа-релизы, dev-релизы, релиз-кандидаты, pre-релизы, релизы в составе других компонентов и релизы вне Apache/Jakarta Commons не учитываются)
  • таблица отражает состояние на момент октября 2012
Название Сайт Статус Первый релиз Полное название и назначение
Attributes [1] proper 2004-08-15, v2.1[10] Поддержка атрибутов в стиле C#/.Net
BCEL [2] proper 2001-12-12, v5.0[11] Byte Code Engineering Library. Манипуляция java-классами
BeanUtils [3] proper 2001-07-14, v1.0[12] Удобные для использования обертки над пакетами java.lang.reflect и java.beans (API для отражения и самодиагностики)
Betwixt [4] proper 2004-07-03, v0.5[13][14] Связывание JavaBeans с XML-документами
BSF [5] proper 2006-10-06, v2.4.0[15] Bean Scripting Framework. Интерфейс для скриптовых языков
Chain [6] proper 2004-12-09, v1.0[16] Реализация паттерна Цепочка обязанностей
CLI [7] proper 2002-11-06, v1.0[17] Command Line Interface. Парсер аргументов командной строки
Codec [8] proper 2003-05-11, v1.1[18] Кодирование и декодирование алгоритмов, таких как Base64, Hex, Phonetic; и URL.
Collections [9] proper 2002-04-05, v2.0[19] Расширение и дополнение Java Collections Framework.
Compress [10] proper 2010-08-24, v1.1[20] API для работы с файлами ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 и bzip2.
Configuration [11] proper 2004-10-11, v1.0[21] Чтение файлов конфигурации и настроек различных форматов
CSV [12] proper планируется v1.0[22] Чтение и запись файлов табличных данных формата CSV (от англ. Comma-Separated Values — значения, разделенные запятыми).
Daemon [13] proper 2004-01-13, v1.0[23] API для создания сервисов на платформе WIN32 и демонов на платформе UNIX
DBCP [14] proper 2002-08-12, v1.0[24][25] Database connection pooling services. Создание пула соединений к базе данных, в котором каждое соединение может последовательно обслуживать множество клиентов.
DbUtils [15] proper 2003-11-11, v1.0[26] Обёртка над пакетом Java JDBC для упрощения кода.
Digester [16] proper 2002-01-12, v1.2[27] Обработка файлов конфигурации формата xml, построение дерева объектов на основе структуры xml. Надстройка над парсером xml SAX.
Discovery [17] proper 2006-12-03, v0.4[28][29] Обнаружение реализаций для подключаемых интерфейсов (т.е. нахождение классов по заданному Java-интерфейсу).
EL [18] proper 2003-06-20, v1.0[30] Интерпретатор JSP 2.0 Expression Language (Язык Выражений).
Email [19] proper 2005-09-27, v1.0[31] API для отправки электронной почты.
Exec [20] proper 2009-03-26, v1.0[32] Исполнение внешних процессов из приложения Java и работа с переменными окружения.
FileUpload [21] proper 2003-06-24, v1.0[33][34] Пересылка файлов на сервер через веб-приложение, парсинг HTTP-заголовков, соответствующих RFC 1867.
Functor [22] proper нет[35] Объект-функция, для использования в паттернах Посетитель, Стратегия, Цепочка обязанностей и др.
Imaging (Sanselan) [23] proper нет Библиотека для работы с изображениями
IO [24] proper 2004-05-13, v1.0[36][37] Утилиты ввода/вывода
JCI [25] proper 2007-06-18, v1.0[38][39] Java Compiler Interface. Интерфейс компилятора Java. Используется для компилирования Java из Java-приложений.
JCS [26] proper 2007-06-05, v1.3[40][41][42] Java Caching System. Кэширование данных различной природы для ускорения приложений.
Jelly [27] proper 2005-06-16, v1.0[43] Скриптовый механизм, основанный на XML. Превращение XML в исполняемый код.
Jexl [28] proper 2004-09-07, v1.0[44] Java Expression Language. Язык выражений, расширяющий язык JSTL. Синтаксис похож на ECMAScript и shell-script.
JXPath [29] proper 2002-06-25, v1.0[45] Интерпретатор языка выражений XPath. Манипулирование классами JavaBeans.
Lang [30] proper 2002-10-04, v1.0[46][47][48] Дополнительная функциональность, расширяющая java.lang
Launcher [31] proper 2004-08-22 v1.1[49][50] Кроссплатформенный стартер приложений
Logging [32] proper 2002-08-13, v1.0.1[51][52] Обёртка над множеством реализаций логирования. Тонкий мост между приложением и библиотекой логирования.
Math [33] proper 2004-12-09, v1.0[53][54] Математические и статистические функции
Modeler [34] proper 2002-04-30, v1.0[55] Содание Model MBeans, совместимых с JMX
Net [35] proper 2003-02-23, v1.0[56][57] Реализации различных Интернет-протоколов (на клиентской стороне)
OGNL [36] proper 2011-09-22, v4.0[58] Object-Graph Navigation Language. Язык навигации по графу объектов. Установка и получение свойств Java-объектов. Более мощная альтернатива для BeanUtils и EL/JSTL.
Pool [37] proper 2002-05-04, v1.0[59] API для создания пулов объектов
Primitives [38] proper 2003-11-05, v1.0[60][61] Работа с простыми типами данных и коллекциями.
Proxy [39] proper 2008-03-06, v1.0[62] Создание динамических прокси
SCXML [40] proper 2006-07-28, v0.5[63][64] State Chart XML. Машина состояний (конечный автомат), определённая документом SCXML.
Transaction [41] proper 2004-12-15, v1.0[65][66] Многоуровненые блокировки, транзакционные коллекции, транзакционный доступ к файлам
Validator [42] proper 2002-11-01, v1.0[67][68] Фреймворк для проверки правильности данных с возможностью указания правил в XML-файле
VFS [43] proper 2006-12-30, v1.0[69][70] Virtual File System. Виртуальная файловая система, обращающаяся с обычными файлами, FTP, SMB, ZIP и т.п. как с единой логической файловой системой
Cache [44] dormant нет Кэширование объектов. API для хранения/извлечения объектов на основе ключа. Не получил развития, так как был вытеснен компонентами Stratum, JCS, EHCache и др., и кроме того зачастую может быть замещён классом LRUMap из Commons Collections[71]. Переведен в dormant в сентябре 2005[72][73].
Clazz [45] dormant нет Расширенный вариант java.lang.Class, который позволяет изменять определение класса во время исполнения. Предназначен для обработки Java-бинов в JDK при работе с классами List и Map и предоставляет альтернативу java.beans.Introspector. Переведен в dormant в сентябре 2005[74][72].
Contract [46] dormant нет API для контрактного программирования в Java. Переведен в dormant в декабре 2005[75] после 6 месяцев отсутствия активности в проекте[76]

Примечания

  1. Marx, Dustin. Apache Commons ToStringBuilder (англ.). JavaWorld (11 января 2008). Дата обращения: 19 сентября 2012. Архивировано 31 октября 2012 года.
  2. Iverson, p. XIII.
  3. Iverson, p. 1.
  4. 1 2 3 Jakarta Commons Charter v1.1
  5. The Apache Group Incorporates as the Apache Software Foundation (англ.) (30 июня 1999). Дата обращения: 19 сентября 2012. Архивировано 31 октября 2012 года.
  6. Jakarta Commons Charter v1.0
  7. Goyal, Vikram. Using the Jakarta Commons, Part 1 (англ.). onjava.com by O’Reilly (06/25/2003). Дата обращения: 19 сентября 2012. Архивировано 31 октября 2012 года.
  8. Iverson, pp. 2,3.
  9. Apache Commons Charter: Scope of Apache Commons
  10. Apache Jakarta Project, 2004b, Commons Attributes 2.1 Released.
  11. Apache Jakarta Project, 2001, BCEL 5.0 Released.
  12. Commons BeanUtils - Older Releases
  13. Apache Jakarta Project, 2004b, Commons Betwixt 0.5 Released.
  14. Donkin, Robert Burrell (03 Jul 2004). "[ANNOUNCEMENT] Jakarta Commons Betwixt 0.5 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  15. Apache Jakarta Project, 2006b, Jakarta BSF 2.4.0 released.
  16. Apache Jakarta Project, 2004b, Commons Chain 1.0 Released.
  17. Apache Jakarta Project, 2002, Commons CLI 1.0 Released.
  18. Apache Jakarta Project, 2003, 2003 Commons Codec 1.1 Released.
  19. Apache Jakarta Project, 2002, Jakarta Commons Collections 2.0 Released.
  20. Grobmeier, Christian (24 Aug 2010). "[ANNOUNCE] Commons Compress 1.1 released". Apache Announce List (Mailing list) (англ.). Дата обращения: 20 августа 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  21. Commons Configuration - Changes Report
  22. Gary Gregory. Commons CSV. Contents of changes.xml. Apache SVN (2012-09-11)
  23. Yoav Shapira. Commons Daemon Package. Version 1.0. Release Notes. Apache SVN (2004-01-13)
  24. Apache Jakarta Project, 2003, Commons DBCP 1.1 Released.
  25. Nielsen, Glenn (16 Aug 2002). "[VOTE][DBCP] 1.0 Release Plan". Commons Developer List (Mailing list) (англ.). Дата обращения: 7 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  26. Apache Jakarta Project, 2003, Jakarta Commons DbUtils 1.0 Released.
  27. Scott Sanders. Commons Digester Package. Version 1.2. Release Notes. Apache SVN (2002-01-12)
  28. Apache Jakarta Project, 2006b, Commons Discovery 0.4 released.
  29. Yandell, Henri (04 Dec 2006). "[ANNOUNCEMENT] Commons Discovery 0.4 released". Apache Commons User (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  30. Apache Jakarta Project, 2003, Commons EL 1.0 Released.
  31. Apache Jakarta Project, 2005b, Jakarta Commons Email 1.0 released .
  32. Benson, Matt (26 Mar 2009). "[ANN] commons-exec 1.0 released". Apache Commons User (Mailing list) (англ.). Дата обращения: 29 августа 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  33. Apache Jakarta Project, 2003, Commons FileUpload 1.0 Released.
  34. Cooper, Martin (26 Jun 2003). "[ANNOUNCEMENT] Commons FileUpload 1.0 Released". Apache Commons User (Mailing list) (англ.). Дата обращения: 30 августа 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  35. Apache Commons Functor - Overview
  36. Apache Jakarta Project, 2004a, Commons/IO 1.0 Released.
  37. Yandell, Henri (14 May 2004). "[ANNOUNCEMENT][IO] Jakarta-Commons/IO 1.0 released". Apache Commons User (Mailing list) (англ.). Дата обращения: 4 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  38. Apache Commons JCI - Downloads
  39. Curdt, Torsten (20 Jun 2007). "[ANNOUNCEMENT] release of common jci 1.0". Apache Commons User (Mailing list) (англ.). Дата обращения: 4 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  40. Apache Commons JCS - Change Log
  41. Apache Jakarta Project. News & Status. 2007 Apr-Jun
  42. Vandahl, Thomas (11 Jun 2007). "[ANNOUNCE] JCS 1.3 released". Apache Announce List (Mailing list) (англ.). Дата обращения: 20 августа 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  43. Apache Jakarta Project, 2005b, Commons-Jelly 1.0 released .
  44. Apache Jakarta Project, 2004b, Commons JEXL 1.0 Released.
  45. Plotnikov, Dmitri (25 Jun 2002). "[ANNOUNCEMENT] JXPath 1.0 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  46. Apache Commons Lang — Release History
  47. Apache Jakarta Project, 2002, Commons Lang 1.0 released.
  48. Yandell, Henri (04 Oct 2002). "[ANN] Commons Lang 1.0 Released!". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  49. Apache Jakarta Project, 2004b, Commons Launcher 1.1 Released.
  50. Shapira, Yoav (22 Aug 2004). "[ANNOUNCEMENT] Commons Launcher 1.1 released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  51. Apache Jakarta Project, 2002, Commons Logging 1.0.1 released.
  52. Sanders, Scott (13 Aug 2002). "[ANNOUNCEMENT] Commons Logging 1.0.1 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  53. Apache Jakarta Project, 2004b, Commons Math 1.0 Released.
  54. Steitz, Phil (09 Dec 2004). "[ANNOUNCEMENT] Commons Math 1.0 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 8 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  55. Craig R. McClanahan. Commons Modeler Package. Version 1.0. Release Notes. Apache Commons Modeler
  56. Apache Jakarta Project, 2003, Commons Net 1.0.0 Released.
  57. Brekke, Jeffrey D. (23 Feb 2003). "[ANNOUNCE] Commons Net 1.0.0 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 8 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  58. Simone Tripodi. Commons OGNL Package. Version 4.0. Release Notes. Apache SVN (2011-09-22)
  59. Commons Pool — Changes Report. Apache Commons.
  60. Apache Jakarta Project, 2003, Jakarta Commons Primitives 1.0 Released.
  61. Waldhoff, Rodney (06 Nov 2003). "[ANN] Jakarta Commons Primitives 1.0 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 8 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  62. Carman, James (06 Mar 2008). "[ANNOUNCE] Release of Commons Proxy 1.0". Apache Commons User (Mailing list) (англ.). Дата обращения: 8 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  63. Apache Jakarta Project, 2006a, Commons SCXML 0.5 released.
  64. Akolkar, Rahul (31 Jul 2006). "[ANNOUNCEMENT] Commons SCXML 0.5 Released". Apache Announce List (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  65. Apache Jakarta Project, 2004b, Commons Transaction 1.0 Released.
  66. Zeigermann, Oliver (15 Dec 2004). "[ANNOUNCE] Commons Transaction 1.0 final released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  67. Apache Jakarta Project, 2002, Commons Validator 1.0 Released.
  68. Turner, James (01 Nov 2002). "[ANNOUNCEMENT] Commons Validator 1.0 Released". The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  69. Apache Jakarta Project, 2006b, Commons VFS 1.0 released.
  70. Ivankovits, Mario (30 Dec 2006). "[ANNOUNCEMENT] Commons VFS 1.0 released". Apache Commons User (Mailing list) (англ.). Дата обращения: 13 октября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  71. Waldhoff, Rodney (31 Dec 2002). "[cache] Release?". Commons Developer List (Mailing list) (англ.). Дата обращения: 27 ноября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  72. 1 2 Yandell, Henri (28 Aug 2005). "[sandbox] September archive of components". Commons Developer List (Mailing list) (англ.). Дата обращения: 27 ноября 2012. {{cite mailing list}}: Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)
  73. Henri Yandell (bayard). Revision 267380. Dormant under the new rules. Apache SVN (2005-09-03)
  74. Henri Yandell (bayard). Revision 267381. Dormant under the new rules. Apache SVN (2005-09-03)
  75. Henri Yandell (bayard). Revision 354665. moving to dormancy. Apache SVN (2005-12-07)
  76. Yandell, Henri (01 Dec 2005). "[sandbox] December dormancy proposal". Commons Developer List (Mailing list) (англ.). Дата обращения: 29 ноября 2012. {{cite mailing list}}: Проверьте значение даты: |date= (справка); Неизвестный параметр |mailinglist= игнорируется (|mailing-list= предлагается) (справка)

Литература

Ссылки

  • commons.apache.org — официальный сайт проекта
  • Goyal, Vikram. Using the Jakarta Commons. 2003. Part 1, Part 2, Part 3. — серия статей об использовании Jakarta Commons (ныне Apache Commons)
  • Narayanan A.R. Extend the JDK Classes with Jakarta Commons. 2005. Part 1, Part 2, Part 3 - серия статей об использовании Jakarta Commons (ныне Apache Commons)