diff --git a/www/2322.jpg b/www/2322.jpg new file mode 100644 index 0000000..3258048 Binary files /dev/null and b/www/2322.jpg differ diff --git a/www/404.html b/www/404.html deleted file mode 100644 index e12d44f..0000000 --- a/www/404.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Security is an important thing - - - - - - -
-

404

- -

Oh, hello there.
Sit down.
And drink tea with the bravest knights...
...in the kingdom.

- -

Deus Vult

-
-404 - - - - - diff --git a/www/CREDITS.txt b/www/CREDITS.txt deleted file mode 100644 index c84e818..0000000 --- a/www/CREDITS.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Image Credits - -All images courtesy of Unsplash (https://unsplash.com). - -- Redd Angelo (https://unsplash.com/photos/h34WJ4T9uhw) -- Nirzar Pangarkar (https://unsplash.com/photos/EKjJSbVI7rk) -- Maxim Polishtchouk (https://unsplash.com/photos/N6q6wtJ_mkA) \ No newline at end of file diff --git a/www/Cardano.png b/www/Cardano.png deleted file mode 100644 index f9b84e0..0000000 Binary files a/www/Cardano.png and /dev/null differ diff --git a/www/ECP.html b/www/ECP.html deleted file mode 100644 index 3c6fda9..0000000 --- a/www/ECP.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - - -
-
-
-

Введение

-
- Электронная цифровая подпись – это реквизит документа, позволяющий подтвердить принадлежность ЭЦП ее владельцу, а также зафиксировать состояние документа и предотвратить изменение без повторной подписи файла. -
- -

Схема работы

-
Используя хэш функцию, мы создаем хэш нашего файла. Это необходимо для того, чтобы цифровая подпись была малого размера, т.к. подписать можно любой файл – от текстовой заметки, до архива данных из коллайдера, весом в несколько сотен терабайт. -
-
- Используя свой закрытый ключ, шифруем данный хэш. В дальнейшем, при посылании файла, прикрепляем к нему подпись и публичный ключ, который позволит клиенту проверить подпись на действительность. -
-
- При получении файла и подписи, клиент сравнивает подпись с хэшем данных. Если равенство не соблюдается, то файл был изменен в промежутке между подписанием и получением, что является недопустимым. -
- - - - -

Юридический статус

-
- Согласно законодательству РФ, электронная подпись — это эквивалент подписи, проставляемой «от руки», обладающий полной юридической силой. -
-
- В Российской Федерации существует два вида ЭЦП: - -
- -

Использование подписи

-
- Для начала нужно установить программу, для работы с ЭЦП. К примеру: -
- - -
-

Рассмотрим работу ЭЦП с использованием программы КриптоАРМ:

-
Кликнуть на документ правой кнопкой мышки, выбрать криптопровайдер и графу «Подписать».
-
- -
-
Пройти путь в диалоговых окнах криптопровайдера:
-
- - -
- -
Обзор файлов
-
- -
- -
Выбрать кодировку и формат
-
- -
- -
Добавить по желалию дополнительную информацию
-
- -
- -
Выбрать сертификат
-
- -
- -
Выбрать нужный алгоритм шифрования
-
- -
- -
Подтвердить
-
- -
- -
Готово!
-
- -
- -
В дальнейшем у документа можно будет подтвердить подпись
-
- -
- -
И узнать автора подписи
-
- -
- - -
- - - - - - - - - - - - - - diff --git a/www/ECP_RSA.html b/www/ECP_RSA.html deleted file mode 100644 index 0eaf495..0000000 --- a/www/ECP_RSA.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - - -
-
-
-

Введение

-
- Первой и наиболее известной во всем мире конкретной системой ЭЦП стала система RSА, математическая схема которой была разработана в 1977 г. в Массачуссетском технологическом институте США. - - Сначала необходимо вычислить пару ключей (секретный ключ и открытый ключ). Для этого отправитель (автор) электронных документов вычисляет два больших простых числа p и q, затем находит их произведение -
- - -
N = p * q
-
и значение функции
-
f(N) = (p - 1)(q - 1)
-
Далее отправитель вычисляет число Е из условий:
-
E <= f(N), НОД(Е, f(N)) = 1 
-
и число D из условий:
-
D < N, E*D сравнимо с единицей по модулю f(N).  
-
Пара чисел (Е, N) является открытым ключом. Эту пару чисел автор передает партнерам по переписке для проверки его цифровых подписей. Число D сохраняется автором как секретный ключ для подписывания.
- -
Допустим, что отправитель хочет подписать сообщение М перед его отправкой. Сначала сообщение М (блок информации, файл, таблица) сжимают с помощью хэш-функции h(M) в целое число m:
-
m = h(М)
-
Затем вычисляют цифровую подпись S под электронным документом М, используя хэш-значение m и секретный ключ D:
-
S = (m^D)(mod N)
-
Пара (М,S) передается партнеру-получателю как электронный документ М, подписанный цифровой подписью S, причем подпись S сформирована обладателем секретного ключа D.
-
После приема пары (М,S) получатель вычисляет хэш-значение сообидения М двумя разными способами. Прежде всего он восстанавливает хэш-значение m', применяя криптографическое преобразование подписи S с использованием открытого ключа Е:
-
m' = (S^E)(mod N)
-
Кроме того, он находит результат хэширования принятого сообщения М с помощью такой же хэш-функции h(M):
-
m = h(М)
-
Если соблюдается равенство вычисленных значений, т.е.
-
(S^E)(mod N ) = h ( М ) 
-
то получатель признает пару (М,S) подлинной. Доказано, что только обладатель секретного ключа D может сформировать цифровую подпись S по документу М, а определить секретное число D по открытому числу Е не легче, чем разложить модуль N на множители. Кроме того, можно строго математически доказать, что результат проверки цифровой подписи S будет положительным только в том случае, если при вычислении S был использован секретный ключ D, соответствующий открытому ключу Е. Поэтому открытый ключ Е иногда называют "идентификатором" подписавшего.
- - - -
- - - - - - - - - - - - - - diff --git a/www/IS.html b/www/IS.html deleted file mode 100644 index 10522c1..0000000 --- a/www/IS.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Федеральный закон «Об информации, информационных технологиях и о защите информации» в ст.2 под информационной системой понимает совокупность содержащейся в базах данных информации и информационных технологий, технических средств, обеспечивающих обработку этой информации. - Основное назначение информационной системы – это реализация информационных процессов в той области деятельности, где функционирует данная информационная система. По своей правовой природе любая информационная система – это сложный объект, который состоит из отдельно взятых элементов (модулей). Модули могут охраняться различными правовыми институтами. Например, защита результатов интеллектуальной деятельности в информационных сетях банка осуществляется в рамках института авторского права. -

-

Элементами любой информационной системы являются:

- - -

В виде информационных систем могут выступать:

- -

Признаками информационной системы являются:

-
    -
  1. Выполнение одной или нескольких функций в отношении информации.
  2. -
  3. Единство системы, т.е. наличие общей файловой базы, единые стандарты и протоколы, единое управление.
  4. -
  5. Возможность при выполнении заданных функций в одном файле объединять или композиционно изменять объекты системы.
  6. -
-
-
-

Основная информация

-

Основные требования, которые предъявляются к информационным системам, это:

-
    -
  1. эффективность
  2. -
  3. по качеству функционирования система должна быть точной, защищенной, согласованной со стандартами
  4. -
  5. надежность по качеству информации, по времени доступа и по производительности
  6. -
  7. безопасность
  8. -
-

В настоящее время основными важнейшими характеристиками, прежде всего автоматизированных информационных систем, считаются:

- -

Информационные системы можно классифицировать по разным основаниям.

-

По степени открытости информационные системы бывают

- -

По техническим характеристикам:

- -
- -
- - - -
- -
-

Малые информационные системы имеют непродолжительный жизненный цикл, невысокую цену. Для их функционирования достаточно одного персонального компьютера. У них практически отсутствуют средства обеспечения безопасности, нет средств аналитической обработки данных.

-

Средние информационные системы имеют длительный жизненный цикл, средства аналитической обработки данных, средства обеспечения безопасности. Для их функционирования необходим штат сотрудников и взаимодействие с фирмой-разработчиком.

-

Крупные информационные системы имеют длительный жизненный цикл, предназначены для решения масштабных и сложных задач. Для их функционирования необходимо разнообразное программное обеспечение. Для крупных информационных систем характерна распределяемость по территориям, миграция в другие информационные системы.

-

Автоматизированные информационные системы (АИС) по территориальному признаку подразделяются на:

- -

По сфере применения различают АИС в:

- - - -

В рамках одной сферы применения АИС можно классифицировать по видам деятельности. Например, правовые информационные системы можно условно разделить на:

- -

Эта классификация достаточно условна, так как одни и те же автоматизированные информационные системы могут использоваться в различных видах правовой деятельности.

-

По форме собственности различают:

- -

В свою очередь, государственные информационные системы подразделяются на

- -

,созданные на основании, соответственно, федеральных законов, законов субъектов РФ или правовых актов государственных органов.

-

Муниципальные информационные системы создаются на основании решения органов местного самоуправления.

-

Государственные информационные системы создаются в целях реализации полномочий государственных органов и для обмена информацией между этими органами. При создании государственных информационных систем должны соблюдаться требования ФЗ «О размещении заказов на поставки товаров, выполнение работ, оказание услуг для государственных и муниципальных нужд».

-

Перечень информации, предоставляемой в обязательном порядке в государственные информационные системы, устанавливается федеральными законами, условия предоставления информации устанавливаются Правительством РФ или соответствующими государственными органами. Если иное не установлено решением о создании государственной информационной системы, функции ее оператора осуществляет заказчик, который заключил государственный контракт на создание такой системы. При этом порядок ввода такой государственной информационной системы в эксплуатацию устанавливает заказчик.

-

Правительство вправе устанавливать обязательные требования к порядку ввода в эксплуатацию отдельных государственных информационных систем. При эксплуатации государственной информационной системы необходимо надлежащим образом оформить права на использование ее компонентов, на которые распространяется правовой режим результатов интеллектуальной деятельности.

- -

Но, так как мы программисты, нам более интересны информационные системы как программно – аппаратного продукта.

- -

Защита информационных систем

-

Безопасность информационных систем в большинстве случаев - важнейший аспект их практического использования. Задачи, решаемые с помощью данного рода инструментов, как правило, подразумевают некую конфиденциальность, наличие уровней доступа, коммерческие и промышленные секреты. К примеру, государственная информационная система, подсчитывающая результаты выборов, - объект, фактически, национальной значимости. От того, насколько она качественно работает и, что не менее важно, надежно защищена, зависит корректность подсчета голосов на выборах Президента, депутатов Госдумы - ключевых политических институтов России.

-

Эксперты выделяют два основных аспекта защиты информационных систем: -технический и социальный. -

-

Касательно первого - обеспечивается надежность алгоритмов предотвращения несанкционированного доступа к ресурсам посредством программно-аппаратных инструментов. То есть система защищается, главным образом, от профессиональных хакеров - тех лиц, которые обладают различными средствами вирусного заражения компьютеров, входящих в систему, приборами для подбора паролей, сканерами, считывателями и т. д.

-

Касательно другого аспекта, безопасность информационных систем обеспечивается посредством внедрения алгоритмов, снижающих вероятность проявления человеческого фактора в контроле доступа к ресурсам. Как правило, речь здесь идет о пользовании теми лицами, которые намереваются проникнуть в систему, неких коррупционных лазейках, сговорах, подкупах технических специалистов, обладающих штатными инструментами доступа к ресурсам.

-

Разработка информационных систем, таким образом, должна осуществляться с учетом последующей работы в рамках тех направлений, что отражают указанные аспекты безопасности. Это может означать, например, то, что IT-компания, поставляющая соответствующие решения на рынок, обязуется заложить в программный код своих продуктов алгоритмы, позволяющие осуществить протекцию системы от взлома в соответствии с теми критериями, которые определяется владельцем защищаемого ресурса. Или, как вариант, выразить готовность к совместной выработке надежных алгоритмов пресечения несанкционированного доступа.

-

Создание информационных систем - это процесс, который, как правило, требует значительной взаимной интеграции разработчика и последующего потребителя соответствующего решения, особенно если речь идет о государственных институтах. Редко бывает, что данный продукт поставляется в коробочном формате - как антивирус или, например, офисный пакет. Разработка информационных систем часто начинается с изучения специфики бизнеса компании-заказчика или задач, которые предстоит выполнять с использованием создаваемого программно-аппаратного комплекса. И только после этого IT-фирма начинает закладывать соответствующие алгоритмы - под конкретные критерии заказчика.

-

Обеспечение безопасности информационных систем не должно идти в ущерб основным задачам, которые возложены на подобного рода программно-аппаратные решения. Как считают некоторые эксперты, ни одна из мер защиты данных, какой бы надежной она ни была, не оправдает себя, если конечный пользователь IT-продукта не сможет в полной мере задействовать необходимые функции решения.

- - - -
- - - -
-

Виды информационных атак

-
- -

Введение

-

- Существует два способа повлиять на информационные функции врага - косвенно или напрямую. - Проиллюстрируем разницу между ними на примере. Пусть нашей целью является заставить врага думать, что авиаполк находится там, где он совсем не находится, - и действовать на основании этой информации таким образом, чтобы это было выгодно нам. -

-

Основная часть

-

Косвенная информационная атака: используя инженерные средства, мы можем построить макеты самолетов и ложные аэродромные сооружения, и имитировать деятельность по работе с ними. - Мы полагаемся на то, что противник будет наблюдать ложный аэродром и считать его настоящим. Только тогда эта информация станет той, которую должен иметь противник по нашему мнению. - Прямая информационная атака: если мы создаем информацию о ложном авиаполке в хранилище информации у противника, то результат будет точно такой же. Но средства, задействованные для получения - этого результата, будут разительно отличаться. - Другим примером прямой информационной атаки может быть изменение информации во вражеской базе данных об имеющихся коммуникациях в ходе боевых действий (внесение ложной информации о том, - что мосты разрушены) для изоляции отдельных вражеских частей. Этого же можно добиться бомбардировкой мостов. И в том, и в другом случае вражеские аналитики, принимая решение - на основе имеющейся у них информации, примут одно и то же решение - производить переброску войск через другие коммуникации. - Бурное развитие электронной техники, в первую очередь вычислительной, и ее все более глубокое проникновение во все сферы жизни, включая государственное и военное управление, обусловили - появление в последнее время принципиально нового вида противоборства государств - информационного (концепция ведения «информационной войны»). - Под термином «информационная война» понимается комплекс мероприятий, направленных на предотвращение несанкционированного использования, повреждения или уничтожения элементов собственной - информационной инфраструктуры (ИИ), а также использование, нарушение целостности или уничтожение элементов ИИ противника в целях обеспечения информационного превосходства - в мирное время, а также на различных этапах подготовки и ведения боевых действий. - Для ведения информационной войны разрабатываются специфические средства, которые могут быть оборонительными и наступательными. - Потребность в создании именно многоуровневой системы защиты связана с тем, что взаимосвязь всех перспективных информационных систем предполагается осуществить через средства единой для - пользователей любого уровня глобальной коммуникационной сети. Разрабатываемые средства (сетевые шифраторы, комплект программных технических средств) должны будут обеспечивать - проверку законности доступа к информационным ресурсам, идентификацию пользователей, регистрацию всех действий потребителей и персонала с возможностью оперативного и последующего анализа, - а также необходимый уровень конфиденциальности. - По способам внедрения в состав информационных ресурсов противника и воздействия на них наступательные средства программно-технического воздействия (СПТВ) подразделяются на следующие классы: -

- - -

В качестве первоочередных объектов применения СПТВ с точки зрения нанесения максимально возможного ущерба могут рассматриваться информационные элементы систем предупреждения о ракетном нападении и контроля космического пространства, пунктов управления высшего звена и обслуживающих их вычислительных центров и узлов связи. В мирное время подобного рода воздействие может оказываться на такие важные для государства цели, как банковская система, система управления воздушным движением, а также психологическое воздействие на население государства - противника (особенно в приграничных районах) с помощью средств радио- и телевизионного вещания. - К характерным чертам СПТВ можно отнести радикальность и псевдоизбирательность действия, универсальность, скрытность, внезапность, экономичность, многовариантность и свободу пространственно-временного маневра. - Примеры информационных атак: -

- - - -
- - - - -
- - - - - -
- - - - - - - - - - - - diff --git a/www/LICENSE.txt b/www/LICENSE.txt deleted file mode 100644 index 8bc5d3a..0000000 --- a/www/LICENSE.txt +++ /dev/null @@ -1,62 +0,0 @@ -# Creative Commons Attribution 3.0 Unported (http://creativecommons.org/licenses/by/3.0) - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. - -1. Definitions - - 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. - 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. - 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. - 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. - 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. - 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. - 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. - 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. - 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. - -2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. - -3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: - - 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; - 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; - 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, - 4. to Distribute and Publicly Perform Adaptations. - 5. - - For the avoidance of doubt: - 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; - 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, - 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. - -The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. - -4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: - - 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. - 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. - 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. - -5. Representations, Warranties and Disclaimer - -UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. - -6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Termination - - 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. - 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. - -8. Miscellaneous - - 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. - 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. - 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. - 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. - 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/www/Symmetric_cryptography.html b/www/Symmetric_cryptography.html deleted file mode 100644 index f9b849a..0000000 --- a/www/Symmetric_cryptography.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - -


- -
-
-

Введение

-

Исторически первыми появились симметричные криптографические системы. В симметричной криптосистеме шифрования используется один и тот же ключ для зашифровывания и расшифровывания информации. Это означает, что любой, кто имеет доступ к ключу шифрования, может расшифровать сообщение.

-
- - -
-

Общая информация

- -

Для предотвращения раскрытия зашифрованной информации все ключи шифрования в симметричных криптосистемах должны держаться в секрете, поэтому симметричные криптосистемы называют криптосистемами с секретным ключом, так как ключ шифрования должен быть доступен только тем, кому предназначено сообщение.

- -
    - -
  1. Обычно ключ шифрования представляет собой файл или массив данных.
  2. - -
  3. Фальшивое сообщение не может быть правильно зашифровано без знания секретного ключа.
  4. - -
  5. Целостность данных обеспечивается присоединением к передаваемым данным специального кода, разновидности контрольной суммы - имитовставки, вырабатываемой по секретному ключу. - -Алгоритм формирования имитовставки должен обеспечивать ее зависимость по некоторому сложному криптографическому закону от каждого бита сообщения.
  6. - -
  7. Проверка целостности сообщения выполняется получателем сообщения с помощью уже созданного секретного ключа, путем сравнения имитовставки полученного сообщения с полученным значением имитовставки секретного ключа. - При совпадении делается вывод о том, что информация не была модифицирована на пути от отправителя к получателю.
  8. - -
-

Симметричное шифрование идеально подходит для шифрования информации «для себя», например, с целью предотвращения несанкционированного доступа к ней в отсутствие владельца. Это может быть как архивное шифрование выбранных файлов, так и прозрачное (автоматическое) шифрование целых логических или физических дисков. -Обладая высокой скоростью шифрования, одноключевые криптосистемы позволяют решать многие важные задачи защиты информации. Однако автономное использование симметричных криптосистем в компьютерных сетях порождает проблему распределения ключей шифрования между пользователями.

-

-Перед началом обмена зашифрованными данными необходимо обменяться секретными ключами со всеми адресатами. Передача секретного ключа симметричной криптосистемы не может быть осуществлена по общедоступным каналам связи, секретный ключ надо передавать отправителю и получателю по защищенному каналу. Для обеспечения эффективной защиты циркулирующих в сети сообщений необходимо огромное число часто меняющихся ключей (один ключ на каждую пару пользователей). При передаче ключей пользователям необходимо обеспечить конфиденциальность, подлинность и целостность ключей шифрования, что требует больших дополнительных затрат. Эти затраты связаны с необходимостью передачи секретных ключей по закрытым каналам связи или распределением таких ключей с помощью специальной службы доставки, например с помощью курьеров. -

-

Проблема распределения секретных ключей при большом числе пользователей является весьма трудоемкой и сложной задачей. В сети на N пользователей необходимо распределить N(N- 1)/2 секретных ключей, т. е. число распределяемых секретных ключей растет по квадратичному закону с увеличением числа абонентов сети. -В разделе «Управление криптоключами» рассматриваются методы, обеспечивающие защищенное распределение ключей абонентам сети. -

-

-Один из примеров таких шифров: -

-

Перестановка «Магический квадрат»

-

Магическими квадратами называются квадратные таблицы со вписанными в их клетки последовательными натуральными числами от 1, которые дают в сумме по каждому столбцу, каждой строке и каждой диагонали одно и то же число. -

- -

Подобные квадраты широко применялись для вписывания шифруемого текста по приведенной в них нумерации. Если потом выписать содержимое таблицы по строкам, то получалась шифровка перестановкой букв. На первый взгляд кажется, будто магических квадратов очень мало. Тем не менее, их число очень быстро возрастает с увеличением размера квадрата. -

-

- Mагические квадраты больших размеров могли быть хорошей основой для надежной системы шифрования того времени, потому что ручной перебор всех вариантов ключа для этого шифра был немыслим -

-

- В квадрат размером 4 на 4 вписывались числа от 1 до 16. Его магия состояла в том, что сумма чисел по строкам, столбцам и полным диагоналям равнялась одному и тому же числу — 34. - Впервые эти квадраты появились в Китае, где им и была приписана некоторая «магическая сила». -

- - - - - - - - - - - - - - - - - - - - - - - - - -
163213
510118
96712
415141
-

-Шифрование по магическому квадрату производилось следующим образом. Например, требуется зашифровать фразу: «ПриезжаюСегодня.». - Буквы этой фразы вписываются последовательно в квадрат согласно записанным в них числам: позиция буквы в предложении соответствует порядковому числу. В пустые клетки ставится точка. -

- - - - - - - - - - - - - - - - - - - - - - - - - -
16.3 и2 р13 д
5 з10 е11 г8 ю
9 С6 ж7 а12 о
4 е15 я14 н1 П
-

- После этого шифрованный текст записывается в строку (считывание производится слева направо, построчно): -.ирдзегюСжаоеянП -

-

- При расшифровывании текст вписывается в квадрат, и открытый текст читается в последовательности чисел «магического квадрата». - Программа должна генерировать «магические квадраты» и по ключу выбирать необходимый. - Размер квадрата больше чем 3х3. -

-

Параметры алгоритмов

-

Существует множество (не менее двух десятков) алгоритмов симметричных шифров, существенными параметрами которых являются: -

- -

Виды симметричных шифров

-
    -
  1. Блочные шифры
  2. -
      -
    • AES ( Advanced Encryption Standard) — американский стандарт шифрования
    • -
    • ГОСТ 28147-89 — советский и российский стандарт шифрования, также является стандартом СНГ
    • -
    • DES (Data Encryption Standard) — стандарт шифрования данных в США
    • -
    • 3DES (Triple-DES, тройной DES)
    • -
    • RC2 (Шифр Ривеста (Rivest Cipher или Ron’s Cipher));
    • -
    • IDEA (International Data Encryption Algorithm, международный алгоритм шифрования данных)
    • -
    -
  3. Потоковые шифры
  4. -
      -
    • RC4 (алгоритм шифрования с ключом переменной длины);
    • -
    • SEAL (Software Efficient Algorithm, программно-эффективный алгоритм);
    • -
    • WAKE (World Auto Key Encryption algorithm, всемирный алгоритм шифрования на автоматическом ключе)
    • -
    -
- -

Сравнение с асимметричными криптосистемами

-
    -
  1. Достоинства
  2. -
      -
    • скорость
    • -
    • простота реализации (за счёт более простых операций)
    • -
    • меньшая требуемая длина ключа для сопоставимой стойкости
    • -
    • изученность (за счёт большего возраста)
    • - -
    -
  3. Недостатки
  4. -
      -
    • сложность управления ключами в большой сети
    • -
    • сложность обмена ключами. Для применения необходимо решить проблему надёжной передачи ключей каждому абоненту, - так как нужен секретный канал для передачи каждого ключа обеим сторонам
    • -
    -

    - Для компенсации недостатков симметричного шифрования в настоящее время широко применяется комбинированная (гибридная)криптографическая схема, - где с помощью асимметричного шифрования передаётся сеансовый ключ, используемый сторонами для обмена данными с помощью симметричного шифрования. -

    -

    - Важным недостатком симметричных шифров является невозможность их использования в механизмах формирования электронной цифровой подписи и сертификатов, так как ключ известен каждой стороне. -

    -
-
-
- - - - - - - - - - - diff --git a/www/TMZI.html b/www/TMZI.html deleted file mode 100644 index 975bb00..0000000 --- a/www/TMZI.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Техническими называются меры и мероприятия, направленные на предотвращение утечки и определение средств негласного получения конфиденциальной информации с помощью технических средств.

-

К техническим средствам пассивного типа относят:

- -

Надо упомянуть, что многие технические средства пассивного типа могут вызывать проблемы в функционировании предприятия. Так, генераторы шумов соответствующей мощности «гасят» не только переговоры и/или сигнал от радиозакладки, но и всю связь, теле- и радиовещание на здание и зачастую компьютерную и другую электронную технику.

-

К техническим средствам активного типа относят:

- -
- -
-

Основная информация

-

Все технические методы подразделяются на аппаратные, программные и комплексные. Аппаратные методы предназначены для защиты от неправомерного доступа аппаратных средств и средств связи. Аппаратные средства и методы защиты реализуются путем применения различных технических устройств специального назначения. К ним относятся:

- -

Говоря о мерах защиты персональных компьютеров, необходимо назвать ключи блокировки, применяемые для опознания пользователей. Заметим, что эффективность защиты возрастает при использовании совокупности технических методов опознания пользователей и паролей доступа. Своеобразным ключом блокировки может являться специальное внешнее устройство, находящееся непосредственно у пользователя, приемная часть которого монтируется непосредственно в персональный компьютер и за счет блокировки обеспечивает доступ к ресурсам персонального компьютера. Ключевым блокирующим устройством должно быть как средство идентификации личности по физическим параметрам, так и средство аутентификации.

-

Незаконное копирование данных с машинных носителей или непосредственно из оперативного запоминающего устройства предотвращается с помощью специального кодирования хранящейся и обрабатываемой информации. Кодирование может производиться с помощью соответствующих подпрограмм и дополнительного кодирующего оборудования. Кодирование в этом случае используется как мера защиты и безопасности данных не только при хранении и обработке информации в персональном компьютере, но и при передаче данных от одного вычислительного комплекса к другому.

-

Практическое использование технических мер по защите данных показало, что одна треть предлагаемого производителями программного обеспечения для персональных компьютеров не имеет защиты информации. В остальных же случаях эти меры в основном ограничиваются программным контролем подлинности пользователя.

-

Программные методы защиты предназначены, для непосредственной защиты машинной информации, программных средств, компьютерной техники от несанкционированного ознакомления с ней пользователей, не имеющих допуска. Кроме того, программные средства защиты должны обеспечивать контроль за правильностью осуществления процессов ввода, вывода, обработки, записи, стирания, чтения и передачи информации по каналам связи. Все программные методы защиты подразделяются на следующие виды:

- -

Обеспечение защиты компьютерной информации должно представлять совокупность различных мероприятий, осуществляемых как во время разработки, так и на всех этапах эксплуатации системы автоматизированной обработки данных.

-

Для защиты информации при ее передаче обычно используют различные способы шифрования данных перед их вводом в канал связи или на физический носитель с последующей расшифровкой, в том числе криптографические. Как показывает практика, такие способы шифрования позволяют достаточно надежно скрыть смысл сообщения.

-

Для ограничения доступа к информационным ресурсам используются средства регистрации и средства контроля. Средства контроля доступа предназначены непосредственно для защиты, а задача средств регистрации заключается в обнаружении и фиксации уже совершенных действий преступника или попыток их совершения.

-

Возможна идентификация пользователя по электронной подписи, что регламентировано федеральным законом16. Электронная подпись дает возможность не только гарантировать аутентичность документа в части его авторства, но и установить неискаженность (целостность) содержащейся в нем информации, а также зафиксировать попытки подобного искажения. Переданный получателю подписанный документ состоит из текста, электронной подписи и сертификата пользователя. Последний содержит в себе гарантированно подлинные данные пользователя, в том числе его отличительное имя и открытый ключ расшифрования для проверки подписи получателем либо третьим лицом, осуществившим регистрацию сертификата.

-

К программным методам защиты относится и защита базы данных, которая включает в себя защиту от любого несанкционированного или случайного их изменения или уничтожения. Дополнительной целью является защита от несанкционированного снятия информации внутри базы данных.

-

Следует отметить, что надежная защита компьютерной информации может быть обеспечена только при применении комплексных мер защиты. Комплексность состоит в использовании аппаратных и программных мер защиты. Только в этом случае удается достигнуть требуемого уровня защищенности как самой компьютерной техники, так и информации, находящейся в ней.

-

В целом организационные и технические меры защиты компьютерной информации должны составлять единый комплекс. Данным вопросам уделено довольно много внимания в специальной технической литературе и посвящено большое количество научных исследований и технических изысканий в нашей стране и в мире.

-

Привилегированный пользователь не может игнорировать разграничение доступа к объектам. Например, в Windows NT администратор для обращения к чужому объекту (принадлежащему другому субъекту) должен сначала объявить себя владельцем этого объекта, использовав привилегию администратора объявлять себя владельцем любого объекта, затем дать себе необходимые права и только после этого может обратиться к объекту. Последнее требование введено для реализации механизма удаления потенциально недоступных объектов.При создании объекта его владельцем назначается субъект, создавший данный объект. В дальнейшем субъект, обладающий необходимыми правами, может назначить объекту нового владельца. При этом субъект, изменяющий владельца объекта, может назначить новым владельцем объекта только себя. Такое ограничение вводится для того, чтобы владелец объекта не мог отдать «владение» объектом другому субъекту и тем самым снять с себя ответственность за некорректные действия с объектом.

- - - - - - - -
- - - - - -
- - - - - - - - - - - - - - diff --git a/www/assets/css/font-awesome.min.css b/www/assets/css/font-awesome.min.css deleted file mode 100644 index 9b27f8e..0000000 --- a/www/assets/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/www/assets/css/main.css b/www/assets/css/main.css deleted file mode 100644 index 82d100f..0000000 --- a/www/assets/css/main.css +++ /dev/null @@ -1,3364 +0,0 @@ -@charset "UTF-8"; -@import url(font-awesome.min.css); -@import "https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600"; - -/* - Projection by TEMPLATED - templated.co @templatedco - Released for free under the Creative Commons Attribution 3.0 license (templated.co/license) -*/ - -/* Reset */ - - html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - } - - article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { - display: block; - } - - body { - line-height: 1; - } - - ol, ul { - list-style: none; - } - - blockquote, q { - quotes: none; - } - - blockquote:before, blockquote:after, q:before, q:after { - content: ''; - content: none; - } - - table { - border-collapse: collapse; - border-spacing: 0; - } - - body { - -webkit-text-size-adjust: none; - } - -/* Box Model */ - - *, *:before, *:after { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - -/* Containers */ - - .container { - margin-left: auto; - margin-right: auto; - } - - .container.\31 25\25 { - width: 100%; - max-width: 100em; - min-width: 80em; - } - - .container.\37 5\25 { - width: 60em; - } - - .container.\35 0\25 { - width: 40em; - } - - .container.\32 5\25 { - width: 20em; - } - - .container { - width: 80em; - } - - @media screen and (max-width: 1680px) { - - .container.\31 25\25 { - width: 100%; - max-width: 100em; - min-width: 80em; - } - - .container.\37 5\25 { - width: 60em; - } - - .container.\35 0\25 { - width: 40em; - } - - .container.\32 5\25 { - width: 20em; - } - - .container { - width: 80em; - } - - } - - @media screen and (max-width: 1280px) { - - .container.\31 25\25 { - width: 100%; - max-width: 81.25em; - min-width: 65em; - } - - .container.\37 5\25 { - width: 48.75em; - } - - .container.\35 0\25 { - width: 32.5em; - } - - .container.\32 5\25 { - width: 16.25em; - } - - .container { - width: 65em; - } - - } - - @media screen and (max-width: 980px) { - - .container.\31 25\25 { - width: 100%; - max-width: 112.5%; - min-width: 90%; - } - - .container.\37 5\25 { - width: 67.5%; - } - - .container.\35 0\25 { - width: 45%; - } - - .container.\32 5\25 { - width: 22.5%; - } - - .container { - width: 90%; - } - - } - - @media screen and (max-width: 736px) { - - .container.\31 25\25 { - width: 100%; - max-width: 112.5%; - min-width: 90%; - } - - .container.\37 5\25 { - width: 67.5%; - } - - .container.\35 0\25 { - width: 45%; - } - - .container.\32 5\25 { - width: 22.5%; - } - - .container { - width: 90% !important; - } - - } - - @media screen and (max-width: 480px) { - - .container.\31 25\25 { - width: 100%; - max-width: 112.5%; - min-width: 90%; - } - - .container.\37 5\25 { - width: 67.5%; - } - - .container.\35 0\25 { - width: 45%; - } - - .container.\32 5\25 { - width: 22.5%; - } - - .container { - width: 90% !important; - } - - } - -/* Grid */ - - .row { - border-bottom: solid 1px transparent; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - - .row > * { - float: left; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - - .row:after, .row:before { - content: ''; - display: block; - clear: both; - height: 0; - } - - .row.uniform > * > :first-child { - margin-top: 0; - } - - .row.uniform > * > :last-child { - margin-bottom: 0; - } - - .row.\30 \25 > * { - padding: 0 0 0 0em; - } - - .row.\30 \25 { - margin: 0 0 -1px 0em; - } - - .row.uniform.\30 \25 > * { - padding: 0em 0 0 0em; - } - - .row.uniform.\30 \25 { - margin: 0em 0 -1px 0em; - } - - .row > * { - padding: 0 0 0 2em; - } - - .row { - margin: 0 0 -1px -2em; - } - - .row.uniform > * { - padding: 2em 0 0 2em; - } - - .row.uniform { - margin: -2em 0 -1px -2em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 4em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -4em; - } - - .row.uniform.\32 00\25 > * { - padding: 4em 0 0 4em; - } - - .row.uniform.\32 00\25 { - margin: -4em 0 -1px -4em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 3em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -3em; - } - - .row.uniform.\31 50\25 > * { - padding: 3em 0 0 3em; - } - - .row.uniform.\31 50\25 { - margin: -3em 0 -1px -3em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 1em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -1em; - } - - .row.uniform.\35 0\25 > * { - padding: 1em 0 0 1em; - } - - .row.uniform.\35 0\25 { - margin: -1em 0 -1px -1em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.5em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.5em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.5em 0 0 0.5em; - } - - .row.uniform.\32 5\25 { - margin: -0.5em 0 -1px -0.5em; - } - - .\31 2u, .\31 2u\24 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u, .\31 1u\24 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u, .\31 0u\24 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u, .\39 u\24 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u, .\38 u\24 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u, .\37 u\24 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u, .\36 u\24 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u, .\35 u\24 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u, .\34 u\24 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u, .\33 u\24 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u, .\32 u\24 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u, .\31 u\24 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24 + *, - .\31 1u\24 + *, - .\31 0u\24 + *, - .\39 u\24 + *, - .\38 u\24 + *, - .\37 u\24 + *, - .\36 u\24 + *, - .\35 u\24 + *, - .\34 u\24 + *, - .\33 u\24 + *, - .\32 u\24 + *, - .\31 u\24 + * { - clear: left; - } - - .\-11u { - margin-left: 91.66667%; - } - - .\-10u { - margin-left: 83.33333%; - } - - .\-9u { - margin-left: 75%; - } - - .\-8u { - margin-left: 66.66667%; - } - - .\-7u { - margin-left: 58.33333%; - } - - .\-6u { - margin-left: 50%; - } - - .\-5u { - margin-left: 41.66667%; - } - - .\-4u { - margin-left: 33.33333%; - } - - .\-3u { - margin-left: 25%; - } - - .\-2u { - margin-left: 16.66667%; - } - - .\-1u { - margin-left: 8.33333%; - } - - @media screen and (max-width: 1680px) { - - .row > * { - padding: 0 0 0 2em; - } - - .row { - margin: 0 0 -1px -2em; - } - - .row.uniform > * { - padding: 2em 0 0 2em; - } - - .row.uniform { - margin: -2em 0 -1px -2em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 4em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -4em; - } - - .row.uniform.\32 00\25 > * { - padding: 4em 0 0 4em; - } - - .row.uniform.\32 00\25 { - margin: -4em 0 -1px -4em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 3em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -3em; - } - - .row.uniform.\31 50\25 > * { - padding: 3em 0 0 3em; - } - - .row.uniform.\31 50\25 { - margin: -3em 0 -1px -3em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 1em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -1em; - } - - .row.uniform.\35 0\25 > * { - padding: 1em 0 0 1em; - } - - .row.uniform.\35 0\25 { - margin: -1em 0 -1px -1em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.5em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.5em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.5em 0 0 0.5em; - } - - .row.uniform.\32 5\25 { - margin: -0.5em 0 -1px -0.5em; - } - - .\31 2u\28xlarge\29, .\31 2u\24\28xlarge\29 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u\28xlarge\29, .\31 1u\24\28xlarge\29 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u\28xlarge\29, .\31 0u\24\28xlarge\29 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u\28xlarge\29, .\39 u\24\28xlarge\29 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u\28xlarge\29, .\38 u\24\28xlarge\29 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u\28xlarge\29, .\37 u\24\28xlarge\29 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u\28xlarge\29, .\36 u\24\28xlarge\29 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u\28xlarge\29, .\35 u\24\28xlarge\29 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u\28xlarge\29, .\34 u\24\28xlarge\29 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u\28xlarge\29, .\33 u\24\28xlarge\29 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u\28xlarge\29, .\32 u\24\28xlarge\29 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u\28xlarge\29, .\31 u\24\28xlarge\29 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24\28xlarge\29 + *, - .\31 1u\24\28xlarge\29 + *, - .\31 0u\24\28xlarge\29 + *, - .\39 u\24\28xlarge\29 + *, - .\38 u\24\28xlarge\29 + *, - .\37 u\24\28xlarge\29 + *, - .\36 u\24\28xlarge\29 + *, - .\35 u\24\28xlarge\29 + *, - .\34 u\24\28xlarge\29 + *, - .\33 u\24\28xlarge\29 + *, - .\32 u\24\28xlarge\29 + *, - .\31 u\24\28xlarge\29 + * { - clear: left; - } - - .\-11u\28xlarge\29 { - margin-left: 91.66667%; - } - - .\-10u\28xlarge\29 { - margin-left: 83.33333%; - } - - .\-9u\28xlarge\29 { - margin-left: 75%; - } - - .\-8u\28xlarge\29 { - margin-left: 66.66667%; - } - - .\-7u\28xlarge\29 { - margin-left: 58.33333%; - } - - .\-6u\28xlarge\29 { - margin-left: 50%; - } - - .\-5u\28xlarge\29 { - margin-left: 41.66667%; - } - - .\-4u\28xlarge\29 { - margin-left: 33.33333%; - } - - .\-3u\28xlarge\29 { - margin-left: 25%; - } - - .\-2u\28xlarge\29 { - margin-left: 16.66667%; - } - - .\-1u\28xlarge\29 { - margin-left: 8.33333%; - } - - } - - @media screen and (max-width: 1280px) { - - .row > * { - padding: 0 0 0 1.5em; - } - - .row { - margin: 0 0 -1px -1.5em; - } - - .row.uniform > * { - padding: 1.5em 0 0 1.5em; - } - - .row.uniform { - margin: -1.5em 0 -1px -1.5em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 3em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -3em; - } - - .row.uniform.\32 00\25 > * { - padding: 3em 0 0 3em; - } - - .row.uniform.\32 00\25 { - margin: -3em 0 -1px -3em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 2.25em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -2.25em; - } - - .row.uniform.\31 50\25 > * { - padding: 2.25em 0 0 2.25em; - } - - .row.uniform.\31 50\25 { - margin: -2.25em 0 -1px -2.25em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 0.75em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -0.75em; - } - - .row.uniform.\35 0\25 > * { - padding: 0.75em 0 0 0.75em; - } - - .row.uniform.\35 0\25 { - margin: -0.75em 0 -1px -0.75em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.375em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.375em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.375em 0 0 0.375em; - } - - .row.uniform.\32 5\25 { - margin: -0.375em 0 -1px -0.375em; - } - - .\31 2u\28large\29, .\31 2u\24\28large\29 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u\28large\29, .\31 1u\24\28large\29 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u\28large\29, .\31 0u\24\28large\29 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u\28large\29, .\39 u\24\28large\29 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u\28large\29, .\38 u\24\28large\29 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u\28large\29, .\37 u\24\28large\29 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u\28large\29, .\36 u\24\28large\29 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u\28large\29, .\35 u\24\28large\29 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u\28large\29, .\34 u\24\28large\29 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u\28large\29, .\33 u\24\28large\29 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u\28large\29, .\32 u\24\28large\29 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u\28large\29, .\31 u\24\28large\29 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24\28large\29 + *, - .\31 1u\24\28large\29 + *, - .\31 0u\24\28large\29 + *, - .\39 u\24\28large\29 + *, - .\38 u\24\28large\29 + *, - .\37 u\24\28large\29 + *, - .\36 u\24\28large\29 + *, - .\35 u\24\28large\29 + *, - .\34 u\24\28large\29 + *, - .\33 u\24\28large\29 + *, - .\32 u\24\28large\29 + *, - .\31 u\24\28large\29 + * { - clear: left; - } - - .\-11u\28large\29 { - margin-left: 91.66667%; - } - - .\-10u\28large\29 { - margin-left: 83.33333%; - } - - .\-9u\28large\29 { - margin-left: 75%; - } - - .\-8u\28large\29 { - margin-left: 66.66667%; - } - - .\-7u\28large\29 { - margin-left: 58.33333%; - } - - .\-6u\28large\29 { - margin-left: 50%; - } - - .\-5u\28large\29 { - margin-left: 41.66667%; - } - - .\-4u\28large\29 { - margin-left: 33.33333%; - } - - .\-3u\28large\29 { - margin-left: 25%; - } - - .\-2u\28large\29 { - margin-left: 16.66667%; - } - - .\-1u\28large\29 { - margin-left: 8.33333%; - } - - } - - @media screen and (max-width: 980px) { - - .row > * { - padding: 0 0 0 1.5em; - } - - .row { - margin: 0 0 -1px -1.5em; - } - - .row.uniform > * { - padding: 1.5em 0 0 1.5em; - } - - .row.uniform { - margin: -1.5em 0 -1px -1.5em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 3em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -3em; - } - - .row.uniform.\32 00\25 > * { - padding: 3em 0 0 3em; - } - - .row.uniform.\32 00\25 { - margin: -3em 0 -1px -3em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 2.25em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -2.25em; - } - - .row.uniform.\31 50\25 > * { - padding: 2.25em 0 0 2.25em; - } - - .row.uniform.\31 50\25 { - margin: -2.25em 0 -1px -2.25em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 0.75em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -0.75em; - } - - .row.uniform.\35 0\25 > * { - padding: 0.75em 0 0 0.75em; - } - - .row.uniform.\35 0\25 { - margin: -0.75em 0 -1px -0.75em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.375em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.375em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.375em 0 0 0.375em; - } - - .row.uniform.\32 5\25 { - margin: -0.375em 0 -1px -0.375em; - } - - .\31 2u\28medium\29, .\31 2u\24\28medium\29 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u\28medium\29, .\31 1u\24\28medium\29 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u\28medium\29, .\31 0u\24\28medium\29 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u\28medium\29, .\39 u\24\28medium\29 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u\28medium\29, .\38 u\24\28medium\29 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u\28medium\29, .\37 u\24\28medium\29 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u\28medium\29, .\36 u\24\28medium\29 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u\28medium\29, .\35 u\24\28medium\29 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u\28medium\29, .\34 u\24\28medium\29 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u\28medium\29, .\33 u\24\28medium\29 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u\28medium\29, .\32 u\24\28medium\29 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u\28medium\29, .\31 u\24\28medium\29 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24\28medium\29 + *, - .\31 1u\24\28medium\29 + *, - .\31 0u\24\28medium\29 + *, - .\39 u\24\28medium\29 + *, - .\38 u\24\28medium\29 + *, - .\37 u\24\28medium\29 + *, - .\36 u\24\28medium\29 + *, - .\35 u\24\28medium\29 + *, - .\34 u\24\28medium\29 + *, - .\33 u\24\28medium\29 + *, - .\32 u\24\28medium\29 + *, - .\31 u\24\28medium\29 + * { - clear: left; - } - - .\-11u\28medium\29 { - margin-left: 91.66667%; - } - - .\-10u\28medium\29 { - margin-left: 83.33333%; - } - - .\-9u\28medium\29 { - margin-left: 75%; - } - - .\-8u\28medium\29 { - margin-left: 66.66667%; - } - - .\-7u\28medium\29 { - margin-left: 58.33333%; - } - - .\-6u\28medium\29 { - margin-left: 50%; - } - - .\-5u\28medium\29 { - margin-left: 41.66667%; - } - - .\-4u\28medium\29 { - margin-left: 33.33333%; - } - - .\-3u\28medium\29 { - margin-left: 25%; - } - - .\-2u\28medium\29 { - margin-left: 16.66667%; - } - - .\-1u\28medium\29 { - margin-left: 8.33333%; - } - - } - - @media screen and (max-width: 736px) { - - .row > * { - padding: 0 0 0 1.25em; - } - - .row { - margin: 0 0 -1px -1.25em; - } - - .row.uniform > * { - padding: 1.25em 0 0 1.25em; - } - - .row.uniform { - margin: -1.25em 0 -1px -1.25em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 2.5em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -2.5em; - } - - .row.uniform.\32 00\25 > * { - padding: 2.5em 0 0 2.5em; - } - - .row.uniform.\32 00\25 { - margin: -2.5em 0 -1px -2.5em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 1.875em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -1.875em; - } - - .row.uniform.\31 50\25 > * { - padding: 1.875em 0 0 1.875em; - } - - .row.uniform.\31 50\25 { - margin: -1.875em 0 -1px -1.875em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 0.625em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -0.625em; - } - - .row.uniform.\35 0\25 > * { - padding: 0.625em 0 0 0.625em; - } - - .row.uniform.\35 0\25 { - margin: -0.625em 0 -1px -0.625em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.3125em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.3125em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.3125em 0 0 0.3125em; - } - - .row.uniform.\32 5\25 { - margin: -0.3125em 0 -1px -0.3125em; - } - - .\31 2u\28small\29, .\31 2u\24\28small\29 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u\28small\29, .\31 1u\24\28small\29 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u\28small\29, .\31 0u\24\28small\29 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u\28small\29, .\39 u\24\28small\29 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u\28small\29, .\38 u\24\28small\29 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u\28small\29, .\37 u\24\28small\29 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u\28small\29, .\36 u\24\28small\29 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u\28small\29, .\35 u\24\28small\29 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u\28small\29, .\34 u\24\28small\29 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u\28small\29, .\33 u\24\28small\29 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u\28small\29, .\32 u\24\28small\29 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u\28small\29, .\31 u\24\28small\29 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24\28small\29 + *, - .\31 1u\24\28small\29 + *, - .\31 0u\24\28small\29 + *, - .\39 u\24\28small\29 + *, - .\38 u\24\28small\29 + *, - .\37 u\24\28small\29 + *, - .\36 u\24\28small\29 + *, - .\35 u\24\28small\29 + *, - .\34 u\24\28small\29 + *, - .\33 u\24\28small\29 + *, - .\32 u\24\28small\29 + *, - .\31 u\24\28small\29 + * { - clear: left; - } - - .\-11u\28small\29 { - margin-left: 91.66667%; - } - - .\-10u\28small\29 { - margin-left: 83.33333%; - } - - .\-9u\28small\29 { - margin-left: 75%; - } - - .\-8u\28small\29 { - margin-left: 66.66667%; - } - - .\-7u\28small\29 { - margin-left: 58.33333%; - } - - .\-6u\28small\29 { - margin-left: 50%; - } - - .\-5u\28small\29 { - margin-left: 41.66667%; - } - - .\-4u\28small\29 { - margin-left: 33.33333%; - } - - .\-3u\28small\29 { - margin-left: 25%; - } - - .\-2u\28small\29 { - margin-left: 16.66667%; - } - - .\-1u\28small\29 { - margin-left: 8.33333%; - } - - } - - @media screen and (max-width: 480px) { - - .row > * { - padding: 0 0 0 1.25em; - } - - .row { - margin: 0 0 -1px -1.25em; - } - - .row.uniform > * { - padding: 1.25em 0 0 1.25em; - } - - .row.uniform { - margin: -1.25em 0 -1px -1.25em; - } - - .row.\32 00\25 > * { - padding: 0 0 0 2.5em; - } - - .row.\32 00\25 { - margin: 0 0 -1px -2.5em; - } - - .row.uniform.\32 00\25 > * { - padding: 2.5em 0 0 2.5em; - } - - .row.uniform.\32 00\25 { - margin: -2.5em 0 -1px -2.5em; - } - - .row.\31 50\25 > * { - padding: 0 0 0 1.875em; - } - - .row.\31 50\25 { - margin: 0 0 -1px -1.875em; - } - - .row.uniform.\31 50\25 > * { - padding: 1.875em 0 0 1.875em; - } - - .row.uniform.\31 50\25 { - margin: -1.875em 0 -1px -1.875em; - } - - .row.\35 0\25 > * { - padding: 0 0 0 0.625em; - } - - .row.\35 0\25 { - margin: 0 0 -1px -0.625em; - } - - .row.uniform.\35 0\25 > * { - padding: 0.625em 0 0 0.625em; - } - - .row.uniform.\35 0\25 { - margin: -0.625em 0 -1px -0.625em; - } - - .row.\32 5\25 > * { - padding: 0 0 0 0.3125em; - } - - .row.\32 5\25 { - margin: 0 0 -1px -0.3125em; - } - - .row.uniform.\32 5\25 > * { - padding: 0.3125em 0 0 0.3125em; - } - - .row.uniform.\32 5\25 { - margin: -0.3125em 0 -1px -0.3125em; - } - - .\31 2u\28xsmall\29, .\31 2u\24\28xsmall\29 { - width: 100%; - clear: none; - margin-left: 0; - } - - .\31 1u\28xsmall\29, .\31 1u\24\28xsmall\29 { - width: 91.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 0u\28xsmall\29, .\31 0u\24\28xsmall\29 { - width: 83.3333333333%; - clear: none; - margin-left: 0; - } - - .\39 u\28xsmall\29, .\39 u\24\28xsmall\29 { - width: 75%; - clear: none; - margin-left: 0; - } - - .\38 u\28xsmall\29, .\38 u\24\28xsmall\29 { - width: 66.6666666667%; - clear: none; - margin-left: 0; - } - - .\37 u\28xsmall\29, .\37 u\24\28xsmall\29 { - width: 58.3333333333%; - clear: none; - margin-left: 0; - } - - .\36 u\28xsmall\29, .\36 u\24\28xsmall\29 { - width: 50%; - clear: none; - margin-left: 0; - } - - .\35 u\28xsmall\29, .\35 u\24\28xsmall\29 { - width: 41.6666666667%; - clear: none; - margin-left: 0; - } - - .\34 u\28xsmall\29, .\34 u\24\28xsmall\29 { - width: 33.3333333333%; - clear: none; - margin-left: 0; - } - - .\33 u\28xsmall\29, .\33 u\24\28xsmall\29 { - width: 25%; - clear: none; - margin-left: 0; - } - - .\32 u\28xsmall\29, .\32 u\24\28xsmall\29 { - width: 16.6666666667%; - clear: none; - margin-left: 0; - } - - .\31 u\28xsmall\29, .\31 u\24\28xsmall\29 { - width: 8.3333333333%; - clear: none; - margin-left: 0; - } - - .\31 2u\24\28xsmall\29 + *, - .\31 1u\24\28xsmall\29 + *, - .\31 0u\24\28xsmall\29 + *, - .\39 u\24\28xsmall\29 + *, - .\38 u\24\28xsmall\29 + *, - .\37 u\24\28xsmall\29 + *, - .\36 u\24\28xsmall\29 + *, - .\35 u\24\28xsmall\29 + *, - .\34 u\24\28xsmall\29 + *, - .\33 u\24\28xsmall\29 + *, - .\32 u\24\28xsmall\29 + *, - .\31 u\24\28xsmall\29 + * { - clear: left; - } - - .\-11u\28xsmall\29 { - margin-left: 91.66667%; - } - - .\-10u\28xsmall\29 { - margin-left: 83.33333%; - } - - .\-9u\28xsmall\29 { - margin-left: 75%; - } - - .\-8u\28xsmall\29 { - margin-left: 66.66667%; - } - - .\-7u\28xsmall\29 { - margin-left: 58.33333%; - } - - .\-6u\28xsmall\29 { - margin-left: 50%; - } - - .\-5u\28xsmall\29 { - margin-left: 41.66667%; - } - - .\-4u\28xsmall\29 { - margin-left: 33.33333%; - } - - .\-3u\28xsmall\29 { - margin-left: 25%; - } - - .\-2u\28xsmall\29 { - margin-left: 16.66667%; - } - - .\-1u\28xsmall\29 { - margin-left: 8.33333%; - } - - } - -/* Basic */ - - @-ms-viewport { - width: device-width; - } - - body { - -ms-overflow-style: scrollbar; - } - - @media screen and (max-width: 480px) { - - html, body { - min-width: 320px; - } - - } - - body { - background: #fff; - } - - body.is-loading *, body.is-loading *:before, body.is-loading *:after { - -moz-animation: none !important; - -webkit-animation: none !important; - -ms-animation: none !important; - animation: none !important; - -moz-transition: none !important; - -webkit-transition: none !important; - -ms-transition: none !important; - transition: none !important; - } - -/* Type */ - - body, input, select, textarea { - color: #454545; - font-family: "Source Sans Pro", Arial, Helvetica, sans-serif; - font-size: 14pt; - font-weight: 400; - line-height: 1.65; - } - - @media screen and (max-width: 1680px) { - - body, input, select, textarea { - font-size: 12pt; - } - - } - - @media screen and (max-width: 1280px) { - - body, input, select, textarea { - font-size: 12pt; - } - - } - - @media screen and (max-width: 980px) { - - body, input, select, textarea { - font-size: 12pt; - } - - } - - @media screen and (max-width: 736px) { - - body, input, select, textarea { - font-size: 12pt; - } - - } - - @media screen and (max-width: 480px) { - - body, input, select, textarea { - font-size: 12pt; - } - - } - - a { - color: #6cc091; - text-decoration: underline; - } - - a:hover { - text-decoration: none; - } - - strong, b { - color: #555; - font-weight: 600; - } - - em, i { - font-style: italic; - } - .svdoc { - margin-bottom: 1em; - } - p { - margin: 0 0 2em 0; - } - - h1, h2, h3, h4, h5, h6 { - color: #555; - font-weight: 400; - line-height: 1.5; - margin: 0 0 1em 0; - } - - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - color: inherit; - text-decoration: none; - } - - h2 { - font-size: 1.85em; - font-weight: 300; - } - - h3 { - font-size: 1.75em; - } - - @media screen and (max-width: 480px) { - - h3 { - font-size: 1.25em; - } - - } - - h4 { - font-size: 1.5em; - } - - h5 { - font-size: 0.9em; - } - - h6 { - font-size: 0.7em; - } - - sub { - font-size: 0.8em; - position: relative; - top: 0.5em; - } - - sup { - font-size: 0.8em; - position: relative; - top: -0.5em; - } - - blockquote { - border-left: solid 4px #dbdbdb; - font-style: italic; - margin: 0 0 2em 0; - padding: 0.5em 0 0.5em 2em; - } - - code { - background: rgba(144, 144, 144, 0.075); - border-radius: 0; - border: solid 1px #dbdbdb; - font-family: "Courier New", monospace; - font-size: 0.9em; - margin: 0 0.25em; - padding: 0.25em 0.65em; - } - - pre { - -webkit-overflow-scrolling: touch; - font-family: "Courier New", monospace; - font-size: 0.9em; - margin: 0 0 2em 0; - } - - pre code { - display: block; - line-height: 1.75; - padding: 1em 1.5em; - overflow-x: auto; - } - - hr { - border: 0; - border-bottom: solid 1px #dbdbdb; - margin: 2em 0; - } - - hr.major { - margin: 3em 0; - } - - .align-left { - text-align: left; - } - - .align-center { - text-align: center; - } - - .align-right { - text-align: right; - } - - .inner { - max-width: 75em; - margin: 0 auto; - } - - @media screen and (max-width: 1280px) { - - .inner { - max-width: 90%; - } - - } - - @media screen and (max-width: 480px) { - - .inner { - max-width: 90%; - } - - } - -/* Section/Article */ - - section.special, article.special { - text-align: center; - } - - section.special article, article.special article { - text-align: left; - } - - section.wrapper, article.wrapper { - padding: 6em 0; - } - - section.wrapper header, article.wrapper header { - margin-bottom: 4em; - } - - section.wrapper header h2, article.wrapper header h2 { - font-size: 2.75em; - margin: 0 0 .5em 0; - } - - section.wrapper header p, article.wrapper header p { - font-size: 1em; - } - - section.wrapper article header, article.wrapper article header { - margin: 0; - } - - @media screen and (max-width: 980px) { - - section.wrapper, article.wrapper { - padding: 4em 0; - } - - } - - @media screen and (max-width: 736px) { - - section.wrapper, article.wrapper { - padding: 3em 0; - } - - section.wrapper header, article.wrapper header { - margin-bottom: 2em; - } - - section.wrapper header h2, article.wrapper header h2 { - font-size: 2em; - } - - section.wrapper header p, article.wrapper header p { - font-size: .9em; - } - - } - - @media screen and (max-width: 480px) { - - section.wrapper article, article.wrapper article { - text-align: center; - } - - } - - header p { - color: #bbb; - position: relative; - margin: 0 0 1.5em 0; - } - - header h2 + p { - font-size: 1.25em; - margin-top: -1em; - } - - header h3 + p { - font-size: 1.1em; - margin-top: -0.8em; - } - - header h4 + p, - header h5 + p, - header h6 + p { - font-size: 0.9em; - margin-top: -0.6em; - } - -/* Flex */ - - .flex { - display: -ms-flexbox; - -ms-flex-wrap: wrap; - -ms-flex-pack: justify; - -moz-justify-content: space-between; - -webkit-justify-content: space-between; - -ms-justify-content: space-between; - justify-content: space-between; - display: -moz-flex; - display: -webkit-flex; - display: -ms-flex; - display: flex; - -moz-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - width: 100%; - } - - .flex.flex-2 { - -moz-justify-content: space-between; - -webkit-justify-content: space-between; - -ms-justify-content: space-between; - justify-content: space-between; - } - - .flex.flex-2 article { - width: 50%; - } - - @media screen and (max-width: 980px) { - - .flex.flex-2 article { - width: 100%; - margin-bottom: 3em; - } - - .flex.flex-2 article:last-child { - margin-bottom: 0; - } - - } - - @media screen and (max-width: 480px) { - - .flex.flex-2 br { - display: none; - } - - } - -/* Form */ - - form { - margin: 0 0 2em 0; - } - - form .field { - margin-bottom: 1.5em; - } - - form .field.half { - display: inline-block; - width: 48%; - } - - form .field.half.first { - margin-right: 3%; - } - - @media screen and (max-width: 980px) { - - form .field.half { - display: block; - width: 100%; - } - - form .field.half.first { - margin-right: 0; - } - - } - - label { - color: #555; - display: block; - font-size: 0.9em; - font-weight: 600; - margin: 0 0 1em 0; - } - - input[type="text"], - input[type="password"], - input[type="email"], - input[type="tel"], - select, - textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - background: #6cc091; - border-radius: 10px; - border: none; - border: solid 2px #8dcca9; - color: #fff; - display: block; - outline: 0; - padding: 0 1em; - text-decoration: none; - width: 100%; - } - - input[type="text"]:invalid, - input[type="password"]:invalid, - input[type="email"]:invalid, - input[type="tel"]:invalid, - select:invalid, - textarea:invalid { - box-shadow: none; - } - - input[type="text"]:focus, - input[type="password"]:focus, - input[type="email"]:focus, - input[type="tel"]:focus, - select:focus, - textarea:focus { - border-color: #4bae77; - box-shadow: 0 0 0 1px #4bae77; - } - - .select-wrapper { - text-decoration: none; - display: block; - position: relative; - } - - .select-wrapper:before { - content: ""; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - text-transform: none !important; - } - - .select-wrapper:before { - color: #fff; - display: block; - height: 2.75em; - line-height: 2.75em; - pointer-events: none; - position: absolute; - right: 0; - text-align: center; - top: 0; - width: 2.75em; - } - - .select-wrapper select::-ms-expand { - display: none; - } - - input[type="text"], - input[type="password"], - input[type="email"], - select { - height: 2.75em; - } - - textarea { - padding: 0.75em 1em; - } - - input[type="checkbox"], - input[type="radio"] { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - display: block; - float: left; - margin-right: -2em; - opacity: 0; - width: 1em; - z-index: -1; - } - - input[type="checkbox"] + label, - input[type="radio"] + label { - text-decoration: none; - color: #9a9a9a; - cursor: pointer; - display: inline-block; - font-size: 1em; - font-weight: 400; - padding-left: 2.4em; - padding-right: 0.75em; - position: relative; - } - - input[type="checkbox"] + label:before, - input[type="radio"] + label:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - text-transform: none !important; - } - - input[type="checkbox"] + label:before, - input[type="radio"] + label:before { - background: rgba(144, 144, 144, 0.075); - border-radius: 0; - border: solid 1px #8dcca9; - content: ''; - display: inline-block; - height: 1.65em; - left: 0; - line-height: 1.58125em; - position: absolute; - text-align: center; - top: 0; - width: 1.65em; - } - - input[type="checkbox"]:checked + label:before, - input[type="radio"]:checked + label:before { - background: #6cc091; - border-color: #6cc091; - color: #ffffff; - content: '\f00c'; - } - - input[type="checkbox"]:focus + label:before, - input[type="radio"]:focus + label:before { - border-color: #6cc091; - box-shadow: 0 0 0 1px #6cc091; - } - - input[type="checkbox"] + label:before { - border-radius: 0; - } - - input[type="radio"] + label:before { - border-radius: 100%; - } - - ::-webkit-input-placeholder { - color: #c4e5d3 !important; - opacity: 1.0; - } - - :-moz-placeholder { - color: #c4e5d3 !important; - opacity: 1.0; - } - - ::-moz-placeholder { - color: #c4e5d3 !important; - opacity: 1.0; - } - - :-ms-input-placeholder { - color: #c4e5d3 !important; - opacity: 1.0; - } - - .formerize-placeholder { - color: #c4e5d3 !important; - opacity: 1.0; - } - -/* Box */ - - .box { - border: solid 1px #dbdbdb; - margin-bottom: 2em; - padding: 1.5em; - } - - .box > :last-child, - .box > :last-child > :last-child, - .box > :last-child > :last-child > :last-child { - margin-bottom: 0; - } - - .box.alt { - border: 0; - border-radius: 0; - padding: 0; - } - - .box.person { - border: solid 1px #8dcca9; - padding: 3em 1.5em; - } - - .box.person h3 { - margin: 0; - } - - .box.person .image { - margin-bottom: 1em; - } - - .box.person .image img { - max-width: 100%; - } - -/* Icon */ - - .icon { - text-decoration: none; - border-bottom: none; - position: relative; - } - - .icon:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - text-transform: none !important; - } - - .icon > .label { - display: none; - } - -/* Image */ - - .image { - border-radius: 0; - border: 0; - display: inline-block; - position: relative; - } - - .image img { - border-radius: 0; - display: block; - } - - .image.left, .image.right { - max-width: 40%; - } - - .image.left img, .image.right img { - width: 100%; - } - - .image.round img { - border-radius: 100%; - } - - .image.left { - float: left; - padding: 0 1.5em 1em 0; - top: 0.25em; - } - - .image.right { - float: right; - padding: 0 0 1em 1.5em; - top: 0.25em; - } - - .image.fit { - display: block; - margin: 0 0 2em 0; - width: 100%; - } - - .image.fit img { - width: 100%; - } - - .image.main { - display: block; - margin: 0 0 3em 0; - width: 100%; - } - - .image.main img { - width: 100%; - } - -/* List */ - - ol { - list-style: decimal; - margin: 0 0 2em 0; - padding-left: 1.25em; - } - - ol li { - padding-left: 0.25em; - } - - ul { - list-style: disc; - margin: 0 0 2em 0; - padding-left: 1em; - } - - ul li { - padding-left: 0.5em; - } - - ul.alt { - list-style: none; - padding-left: 0; - } - - ul.alt li { - border-top: solid 1px #dbdbdb; - padding: 0.5em 0; - } - - ul.alt li:first-child { - border-top: 0; - padding-top: 0; - } - - ul.alt.dark li { - border-top: solid 1px rgba(0, 0, 0, 0.25); - } - - ul.icons { - cursor: default; - list-style: none; - padding-left: 0; - } - - ul.icons li { - display: inline-block; - padding: 0 1em 0 0; - } - - ul.icons li:last-child { - padding-right: 0; - } - - ul.icons li .icon:before { - font-size: 2em; - } - - ul.actions { - cursor: default; - list-style: none; - padding-left: 0; - } - - ul.actions li { - display: inline-block; - padding: 0 1em 0 0; - vertical-align: middle; - } - - ul.actions li:last-child { - padding-right: 0; - } - - ul.actions.small li { - padding: 0 0.5em 0 0; - } - - ul.actions.vertical li { - display: block; - padding: 1em 0 0 0; - } - - ul.actions.vertical li:first-child { - padding-top: 0; - } - - ul.actions.vertical li > * { - margin-bottom: 0; - } - - ul.actions.vertical.small li { - padding: 0.5em 0 0 0; - } - - ul.actions.vertical.small li:first-child { - padding-top: 0; - } - - ul.actions.fit { - display: table; - margin-left: -1em; - padding: 0; - table-layout: fixed; - width: calc(100% + 1em); - } - - ul.actions.fit li { - display: table-cell; - padding: 0 0 0 1em; - } - - ul.actions.fit li > * { - margin-bottom: 0; - } - - ul.actions.fit.small { - margin-left: -0.5em; - width: calc(100% + 0.5em); - } - - ul.actions.fit.small li { - padding: 0 0 0 0.5em; - } - - @media screen and (max-width: 480px) { - - ul.actions { - margin: 0 0 2em 0; - } - - ul.actions li { - padding: 1em 0 0 0; - display: block; - text-align: center; - width: 100%; - } - - ul.actions li:first-child { - padding-top: 0; - } - - ul.actions li > * { - width: 100%; - margin: 0 !important; - } - - ul.actions li > *.icon:before { - margin-left: -2em; - } - - ul.actions.small li { - padding: 0.5em 0 0 0; - } - - ul.actions.small li:first-child { - padding-top: 0; - } - - } - - dl { - margin: 0 0 2em 0; - } - - dl dt { - display: block; - font-weight: 600; - margin: 0 0 1em 0; - } - - dl dd { - margin-left: 2em; - } - -/* Table */ - - .table-wrapper { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - } - - table { - margin: 0 0 2em 0; - width: 100%; - } - - table tbody tr { - border: solid 1px #dbdbdb; - border-left: 0; - border-right: 0; - } - - table tbody tr:nth-child(2n + 1) { - background-color: rgba(144, 144, 144, 0.075); - } - - table td { - padding: 0.75em 0.75em; - } - - table th { - color: #555; - font-size: 0.9em; - font-weight: 600; - padding: 0 0.75em 0.75em 0.75em; - text-align: left; - } - - table thead { - border-bottom: solid 2px #dbdbdb; - } - - table tfoot { - border-top: solid 2px #dbdbdb; - } - - table.alt { - border-collapse: separate; - } - - table.alt tbody tr td { - border: solid 1px #dbdbdb; - border-left-width: 0; - border-top-width: 0; - } - - table.alt tbody tr td:first-child { - border-left-width: 1px; - } - - table.alt tbody tr:first-child td { - border-top-width: 1px; - } - - table.alt thead { - border-bottom: 0; - } - - table.alt tfoot { - border-top: 0; - } - -/* Button */ - - input[type="submit"], - input[type="reset"], - input[type="button"], - button, - .button { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; - -moz-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - -webkit-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - -ms-transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; - background-color: transparent; - box-shadow: inset 0 0 0 3px #6cc091; - color: #6cc091 !important; - border-radius: 30px; - border: 0; - cursor: pointer; - display: inline-block; - font-size: .75em; - font-weight: 400; - height: 3.75em; - line-height: 3.85em; - letter-spacing: 2px; - padding: 0 4em; - text-align: center; - text-decoration: none; - text-transform: uppercase; - white-space: nowrap; - } - - input[type="submit"]:hover, - input[type="reset"]:hover, - input[type="button"]:hover, - button:hover, - .button:hover { - background-color: rgba(108, 192, 145, 0.15); - } - - input[type="submit"]:active, - input[type="reset"]:active, - input[type="button"]:active, - button:active, - .button:active { - background-color: rgba(108, 192, 145, 0.15); - } - - input[type="submit"].icon, - input[type="reset"].icon, - input[type="button"].icon, - button.icon, - .button.icon { - padding-left: 1.35em; - } - - input[type="submit"].icon:before, - input[type="reset"].icon:before, - input[type="button"].icon:before, - button.icon:before, - .button.icon:before { - margin-right: 0.5em; - } - - input[type="submit"].fit, - input[type="reset"].fit, - input[type="button"].fit, - button.fit, - .button.fit { - display: block; - margin: 0 0 1em 0; - width: 100%; - } - - input[type="submit"].small, - input[type="reset"].small, - input[type="button"].small, - button.small, - .button.small { - font-size: 0.8em; - } - - input[type="submit"].big, - input[type="reset"].big, - input[type="button"].big, - button.big, - .button.big { - font-size: 1.35em; - } - - input[type="submit"].alt, - input[type="reset"].alt, - input[type="button"].alt, - button.alt, - .button.alt { - background-color: transparent; - box-shadow: inset 0 0 0 3px #FFF; - color: #fff !important; - } - - input[type="submit"].alt:hover, - input[type="reset"].alt:hover, - input[type="button"].alt:hover, - button.alt:hover, - .button.alt:hover { - background-color: #7ec89e; - } - - input[type="submit"].alt:active, - input[type="reset"].alt:active, - input[type="button"].alt:active, - button.alt:active, - .button.alt:active { - background-color: #7ec89e; - } - - input[type="submit"].alt.icon:before, - input[type="reset"].alt.icon:before, - input[type="button"].alt.icon:before, - button.alt.icon:before, - .button.alt.icon:before { - color: #bbb; - } - - input[type="submit"].special, - input[type="reset"].special, - input[type="button"].special, - button.special, - .button.special { - background-color: #6cc091; - color: #ffffff !important; - } - - input[type="submit"].special:hover, - input[type="reset"].special:hover, - input[type="button"].special:hover, - button.special:hover, - .button.special:hover { - background-color: #7ec89e; - } - - input[type="submit"].special:active, - input[type="reset"].special:active, - input[type="button"].special:active, - button.special:active, - .button.special:active { - background-color: #5ab884; - } - - input[type="submit"].disabled, input[type="submit"]:disabled, - input[type="reset"].disabled, - input[type="reset"]:disabled, - input[type="button"].disabled, - input[type="button"]:disabled, - button.disabled, - button:disabled, - .button.disabled, - .button:disabled { - background-color: #9a9a9a !important; - box-shadow: inset 0 -0.15em 0 0 rgba(0, 0, 0, 0.15); - color: #fff !important; - cursor: default; - opacity: 0.25; - } - - @media screen and (max-width: 480px) { - - input[type="submit"], - input[type="reset"], - input[type="button"], - button, - .button { - padding: 0; - width: 100%; - } - - } - -/* Header */ - - .subpage { - padding-top: 44px; - } - - .subpage #header { - background: #6cc091; - top: 0; - height: 44px; - line-height: 44px; - position: fixed; - } - - #header { - color: #fff; - cursor: default; - height: 3.25em; - left: 0; - line-height: 3.25em; - position: absolute; - text-align: right; - top: 2em; - width: 100%; - z-index: 10001; - } - - #header .inner { - margin: 0 auto; - position: relative; - } - - #header .logo { - color: #ffffff; - display: inline-block; - font-weight: 400; - height: inherit; - left: 0; - line-height: inherit; - margin: 0; - padding: 0; - position: absolute; - top: 0; - font-size: 1em; - } - - #header .logo strong { - color: #ffffff; - font-weight: 600; - } - - #header a { - -moz-transition: color 0.2s ease-in-out; - -webkit-transition: color 0.2s ease-in-out; - -ms-transition: color 0.2s ease-in-out; - transition: color 0.2s ease-in-out; - display: inline-block; - padding: 0 0.75em; - color: inherit; - text-decoration: none; - font-size: 1em; - } - - #header a:hover { - color: #ffffff; - } - - #header a:last-child { - padding-right: 0; - } - - #header a.navPanelToggle { - display: none; - text-decoration: none; - height: 4em; - width: 4em; - z-index: 10003; - } - - #header a.navPanelToggle .fa { - font-size: 1.25em; - } - - @media screen and (max-width: 980px) { - - #header a.navPanelToggle { - display: inline-block; - } - - } - - @media screen and (max-width: 736px) { - - #header a { - padding: 0 0.5em; - } - - } - - @media screen and (max-width: 980px) { - - #header { - top: 1em; - } - - } - - @media screen and (max-width: 736px) { - - #header { - top: .5em; - } - - } - - @media screen and (max-width: 480px) { - - #header { - font-size: .9em; - } - - } - -/* Nav */ - - @media screen and (max-width: 980px) { - - #nav { - display: none; - } - - } - - #navPanel { - -moz-transform: translatex(20em); - -webkit-transform: translatex(20em); - -ms-transform: translatex(20em); - transform: translatex(20em); - -moz-transition: -moz-transform 0.2s ease-in-out, visibility 0.2s ease-in-out; - -webkit-transition: -webkit-transform 0.2s ease-in-out, visibility 0.2s ease-in-out; - -ms-transition: -ms-transform 0.2s ease-in-out, visibility 0.2s ease-in-out; - transition: transform 0.2s ease-in-out, visibility 0.2s ease-in-out; - -webkit-overflow-scrolling: touch; - visibility: hidden; - overflow-y: auto; - position: fixed; - right: 0; - top: 0; - background: #6cc091; - color: #daefe3; - height: 100%; - max-width: 80%; - width: 20em; - padding: 0.5em 1.25em; - z-index: 10010; - } - - #navPanel.visible { - -moz-transform: translatex(0); - -webkit-transform: translatex(0); - -ms-transform: translatex(0); - transform: translatex(0); - box-shadow: 0 0 1.5em 0 rgba(0, 0, 0, 0.2); - visibility: visible; - } - - #navPanel a:not(.close) { - border-top: solid 1px #8dcca9; - color: #daefe3; - font-weight: 600; - display: block; - padding: 0.75em 0; - text-decoration: none; - font-weight: 400; - } - - #navPanel a:not(.close):first-child { - border: none; - } - - #navPanel .close { - text-decoration: none; - -moz-transition: color 0.2s ease-in-out; - -webkit-transition: color 0.2s ease-in-out; - -ms-transition: color 0.2s ease-in-out; - transition: color 0.2s ease-in-out; - -webkit-tap-highlight-color: transparent; - border: 0; - color: #daefe3; - cursor: pointer; - display: block; - height: 4em; - padding-right: 1.25em; - position: absolute; - right: 0; - text-align: right; - top: 0; - vertical-align: middle; - width: 5em; - } - - #navPanel .close:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - text-transform: none !important; - content: '\f00d'; - width: 3em; - height: 3em; - line-height: 3em; - display: block; - position: absolute; - right: 0; - top: 0; - text-align: center; - } - - #navPanel .close:hover { - color: inherit; - } - -/* Banner */ - - #banner { - padding: 8em 0 9em 0; - background-image: url(../../images/banner.jpg); - background-size: cover; - background-position: bottom; - background-attachment: fixed; - background-repeat: no-repeat; - text-align: center; - position: relative; - } - - #banner:before { - content: ''; - background: rgba(75, 75, 93, 0.85); - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - } - - #banner .inner { - border-top: 2px solid rgba(255, 255, 255, 0.2); - position: relative; - z-index: 10005; - padding-top: 8em; - } - - #banner h1 { - font-size: 3.5em; - font-weight: 400; - color: #fff; - line-height: 1em; - margin: 0 0 1em 0; - padding: 0; - } - - #banner h3 { - font-weight: 400; - color: #fff; - margin: 0; - font-size: 1.5em; - } - - #banner .icon { - color: #6cc091; - font-size: 2em; - } - - #banner p { - font-size: 1em; - color: rgba(255, 255, 255, 0.55); - margin-bottom: 1.75em; - } - - #banner .flex { - -ms-flex-pack: center; - -moz-justify-content: center; - -webkit-justify-content: center; - -ms-justify-content: center; - justify-content: center; - text-align: center; - margin: 0 auto 4em auto; - } - - #banner .flex div { - border-right: 1px solid rgba(255, 255, 255, 0.2); - padding: 0 8em; - } - - #banner .flex > div { - width: 33%; - } - - #banner .flex div:last-child { - border: none; - padding-right: 0; - } - - #banner .flex div:first-child { - padding-left: 0; - } - - #banner .flex div p { - margin: 0; - } - - @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) { - - #banner { - background-attachment: scroll; - } - - } - - @media screen and (max-width: 1680px) { - - #banner .flex div { - padding: 0 6em; - } - - } - - @media screen and (max-width: 1280px) { - - #banner { - padding: 7em 0 6em 0; - } - - #banner .inner { - padding-top: 6em; - } - - #banner h1 { - font-size: 3em; - } - - #banner h3 { - font-size: 1.25em; - } - - #banner .flex div { - padding: 0 3em; - } - - } - - @media screen and (max-width: 980px) { - - #banner { - background-attachment: scroll; - padding: 5em 0 4em 0; - } - - #banner .inner { - padding-top: 4em; - } - - #banner h1 { - font-size: 2.5em; - } - - #banner h3 { - font-size: 1.25em; - } - - #banner .flex div { - font-size: .85em; - padding: 0 1.5em; - } - - } - - @media screen and (max-width: 736px) { - - #banner { - padding: 4em 0 3em 0; - } - - #banner .inner { - padding-top: 3em; - } - - #banner h1 { - font-size: 2em; - } - - #banner h3 { - font-size: 1.25em; - } - - #banner .flex { - -moz-flex-direction: column; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - margin: 0 auto 2em auto; - } - - #banner .flex div { - font-size: .85em; - padding: 0; - border: none; - margin-bottom: 1em; - } - - } - - @media screen and (max-width: 480px) { - - #banner h1 { - font-size: 1.5em; - } - - } - -/* Footer */ - -.flexcontainer{ - padding: 0; - margin: 0; - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - align-items: center; - justify-content: center; -} -.flexcontainer i:hover{ - color: #eee; -} -#myfooter{ - /* 0 flex-grow, 0 flex-shrink, auto flex-basis */ - width: 100%; - background-color: #6cc091; - flex: 1 0 auto; - color: #fff; - } -#myfooter h3{ - /* 0 flex-grow, 0 flex-shrink, auto flex-basis */ - color: #fff; - } -/* - #footer { - padding: 6em 0; - background: #6cc091; - color: #fff; - text-align: center; - } - - #footer h3 { - color: #FFF; - margin-bottom: 2em !important; - } - - #footer label { - text-align: left; - color: #FFF; - } - - #footer .copyright { - color: rgba(255, 255, 255, 0.5); - font-size: 0.8em; - margin: 0 0 2em 0; - padding: 0; - } - - #footer .copyright a { - color: rgba(255, 255, 255, 0.5); - text-decoration: none; - } - - #footer .copyright a:hover { - color: #FFF; - } - - @media screen and (max-width: 980px) { - - #footer { - padding: 4em 0; - } - - } - - @media screen and (max-width: 736px) { - - #footer { - padding: 3em 0; - } - - }*/ - - .div-button{ - padding:10px!important; - - - } - .div-button:hover { - background-color: rgba(108, 192, 145, 0.15); - cursor: pointer; - - } - - .header_for_unit { - margin-top: -50px; - - padding: 8em 0 9em 0; - background-image: url(../../images/banner.jpg); - background-size: cover; - background-position: bottom; - background-attachment: fixed; - background-repeat: no-repeat; - text-align: center; - position: relative; - } - - .startpage_images{ - max-width: 200px; - max-height: 200px; - } - - .div_404{ - align-content: center; - background-color: black; - width:auto; - height:auto; - } - .img_404{ - max-width: 100%; - max-height: 100%; - align-self: center; - display: block; - margin: 0 auto; - } - .text_404_404{ - font-weight: bold; - color: #993300; - font-size: 100px; - text-align: center; - margin-top: -20px; - text-shadow: #cad5e2 1px 1px 0, #cad5e2 2px 2px 0, - #cad5e2 3px 3px 0, #cad5e2 4px 4px 0, - #cad5e2 5px 5px 0; - } - .text_404_other{ - font-weight: bold; - color: black; - font-size: 20px; - text-align: center; - margin-top: -220px; - text-shadow: red 0 0 10px; /* Свечение красного цвета */ - } - - .text_404_deus{ - font-weight: bold; - color: black; - font-size: 20px; - text-align: center; - margin-top: -20px; - margin-left:150px; - text-shadow: #fff -1px -1px 0, - #333 1px 1px 0; - } - - .div_over{ - position: absolute; - align-self: center; - width: -webkit-fill-available; - margin-top: 90px; - margin-left:100px; - } - - .move_left{ - padding-left: 50px; - } - - - .image_fixer{ - max-width: 400px; - max-height: 400px; - } - - .footer_hover:hover{ - background-color: rgba(108, 192, 145, 0.15); - cursor: pointer; - } - - .image_lectures{ - max-width:1000px; - max-height: 800px; - display: block; - margin: 10px; - } - - .and_center{ - margin-left: auto; - margin-right: auto; - } - .and_right{ - float: right; - } - - .and_left{ - float: left; - } - .colonka1 { - width: 7%; - } - .colonka2 { - width: 50%; - border-left: 1px solid grey; - border-right: 1px solid grey; - } - .colonka3 { - width: 43%; - padding: 15px; - text-align: center; - } - th { - text-align: center !important; - } - .illustr, .t111 { - margin: 15px 30%; - border-collapse: collapse; - background-color: white; - border: 0px solid white; - width: 155px; - height: 155px; - /*display: inline-table;*/ - } - .illustr tr td, .td111 { - border: 1px solid black; - width: 25px !important; - height: 25px !important; - padding: 0px; - } - .pole { - border: 1px solid black; - height: 125px; - width: 125px; - } - .pole>div { - border: 1px solid black; - height: 20px; - width: 20px; - display: inline-block; - box-sizing: border-box; - margin: 0px 0px !important; - } - #frame { - border: 1px solid grey; - border-radius: 5px; - width: 95%; - min-height: 310px; - } - #reload { - width: 100px; - padding: 0px; - margin: 10px; - margin-left: 38%; - } - #texts { - width: 90%; - } diff --git a/www/assets/fonts/FontAwesome.otf b/www/assets/fonts/FontAwesome.otf deleted file mode 100644 index d4de13e..0000000 Binary files a/www/assets/fonts/FontAwesome.otf and /dev/null differ diff --git a/www/assets/fonts/fontawesome-webfont.eot b/www/assets/fonts/fontawesome-webfont.eot deleted file mode 100644 index c7b00d2..0000000 Binary files a/www/assets/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/www/assets/fonts/fontawesome-webfont.svg b/www/assets/fonts/fontawesome-webfont.svg deleted file mode 100644 index 8b66187..0000000 --- a/www/assets/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/www/assets/fonts/fontawesome-webfont.ttf b/www/assets/fonts/fontawesome-webfont.ttf deleted file mode 100644 index f221e50..0000000 Binary files a/www/assets/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/www/assets/fonts/fontawesome-webfont.woff b/www/assets/fonts/fontawesome-webfont.woff deleted file mode 100644 index 6e7483c..0000000 Binary files a/www/assets/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/www/assets/fonts/fontawesome-webfont.woff2 b/www/assets/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 7eb74fd..0000000 Binary files a/www/assets/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/www/assets/js/cesar.js b/www/assets/js/cesar.js deleted file mode 100644 index 90bcfd2..0000000 --- a/www/assets/js/cesar.js +++ /dev/null @@ -1,95 +0,0 @@ -var text; -var shift; -main(); -function main(){ - text = document.getElementById("originalword"); - shift = document.getElementById("key"); -} -function CesarClicked(Coding){ - if(Coding==true){ - text = document.getElementById("originalword"); - shift = document.getElementById("key"); - }else{ - text = document.getElementById("originalword4"); - shift = document.getElementById("key5"); - //shift*=(-1); - } - var code=""; - if(Coding==true){ - document.getElementById("hide_me").innerHTML = ""; - document.getElementById("litoreia_result1_header").innerHTML = "Оригинальный текст:"; - document.getElementById("litoreia_result1_header").style.width = "27%"; - document.getElementById("originalword1").innerHTML = text.value; - document.getElementById("originalword1").style.width = "65%"; - document.getElementById("litoreia_result2_header").innerHTML = "Сдвиг:"; - document.getElementById("key1").innerHTML = shift.value; - document.getElementById("litoreia_result3_header").innerHTML = "Зашифрованный текст:"; - document.getElementById("litoreia_result3_header").style.width = "27%"; - } - var tvaluet = text.value; - if((shift.value*1) != 0){ - for(var char in tvaluet){ - var ContainFlag = false; - if(((tvaluet.charCodeAt(char*1)*1)>1071)&&((tvaluet.charCodeAt(char*1)*1)<1104)){ - var a = tvaluet.charCodeAt(char*1)*1; - code += ChangeSymbol(1072,1103,a,Coding); - ContainFlag = true; - } - if(((tvaluet.charCodeAt(char*1)*1)>1039)&&((tvaluet.charCodeAt(char*1)*1)<1072)){ - var a = tvaluet.charCodeAt(char*1)*1; - code += ChangeSymbol(1040,1071,a,Coding); - ContainFlag = true; - } - if(((text.value.charCodeAt(char*1)*1)>96)&&((tvaluet.charCodeAt(char*1)*1)<123)){ - var a = tvaluet.charCodeAt(char*1)*1; - code += ChangeSymbol(97,122,a,Coding); - ContainFlag = true; - } - if(((tvaluet.charCodeAt(char*1)*1)>64)&&((tvaluet.charCodeAt(char*1)*1)<91)){ - var a = text.value.charCodeAt(char*1)*1; - code += ChangeSymbol(65,90,a,Coding); - ContainFlag = true; - } - if(((tvaluet.charCodeAt(char*1)*1)>47)&&((tvaluet.charCodeAt(char*1)*1)<58)){ - var a = tvaluet.charCodeAt(char*1)*1; - code += ChangeSymbol(48,57,a,Coding); - ContainFlag = true; - } - if(ContainFlag == false){ - code += tvaluet[char]; - } - - } - - } - if(Coding != false){ - document.getElementById("code1").innerHTML = code; - document.getElementById("code1").style.width = "65%"; - document.getElementById("code1").CodeShift = shift.value*1; - }else{ - document.getElementById("litoreia_result5_header").innerHTML = "Оригинальный текст:"; - document.getElementById("litoreia_result5_header").style.width = "27%"; - document.getElementById("originalword3").innerHTML = code; - document.getElementById("originalword3").style.width = "65%"; - //document.getElementById("originalword3").CodeShift = shift.value*1; - } -} -function ChangeSymbol(LowPos,UpPos,SymCode, code){ - var NShift = shift.value*1; - if(code==true){ - if(NShift+SymCode > UpPos){ - NShift = (SymCode+NShift)-UpPos; - SymCode = LowPos+NShift-1; - }else{ - SymCode += NShift; - } - }else{ - if(SymCode-NShift < LowPos){ - NShift = (LowPos-(SymCode-NShift)); - SymCode = UpPos-NShift+1; - }else{ - SymCode -= NShift; - } - } - return String.fromCharCode(SymCode); -} \ No newline at end of file diff --git a/www/assets/js/cipher.js b/www/assets/js/cipher.js deleted file mode 100644 index 2aed6f7..0000000 --- a/www/assets/js/cipher.js +++ /dev/null @@ -1,168 +0,0 @@ -var vowel = new String('аеёиоуыэюя'); // Гласные буквы -var voiced = new String('бвгджзлмнрхцчшщ'); // Звонкие и шипящие согласные -var deaf = new String('кпстф'); // Глухие согласные -var brief = new String('й'); // Й -var other = new String('ьъ'); // Другие -var cons = new String('бвгджзйклмнпрстфхцчшщ'); // Все согласные - - -function decipher_litoreia_divide() { - - var coded_text = document.getElementById("litoreia_coded_text_divide").value; - var divided_coded_text = getSeparatedString(coded_text); - - var decoded_text = ""; - for (i = 0; i < divided_coded_text.length; i++) { - if (divided_coded_text[i] === " ") { - i++; - } - - if (i % 2 != 0) { - decoded_text += divided_coded_text[i]; - } - } - - document.getElementById("decode_litoreia_result").innerHTML = decoded_text; -} - - -function cipher_litoreia_divide() { - var key = document.getElementById("litoreia_key_divide").value; - var text = document.getElementById("litoreia_text_divide").value; - key = key.toLowerCase(); - text = text.toLowerCase(); - var divided_text = getSeparatedString(text); - var divided_key = getSeparatedString(key); - var cipher = ""; - var cipher_with_separator = ""; - - for (i = 0; i < divided_text.length; i++) { - var key_index = (i + 1) % divided_key.length; - if (i === 0) { - cipher += divided_key[0]; - } - cipher += divided_text[i] + divided_key[key_index]; - } - - for (i = 0; i < divided_text.length; i++) { - var key_index = (i + 1) % divided_key.length; - if (i === 0) { - cipher_with_separator += divided_key[0]; - } - cipher_with_separator += "-" + divided_text[i] + "-" + divided_key[key_index]; - } - - document.getElementById("hide_me").innerHTML = ""; - - document.getElementById("litoreia_result1_header").innerHTML = "Сообщение:"; - document.getElementById("litoreia_result2_header").innerHTML = "Ключ:"; - document.getElementById("litoreia_result3_header").innerHTML = "Собираем:"; - document.getElementById("litoreia_result4_header").innerHTML = "Итоговый шифр:"; - - document.getElementById("litoreia_result1").innerHTML = divided_text.join("-"); - document.getElementById("litoreia_result2").innerHTML = divided_key.join("-"); - document.getElementById("litoreia_result3").innerHTML = cipher_with_separator; - document.getElementById("litoreia_result4").innerHTML = cipher; - - // Валидация правильности введенной строки -} - -function validateString(s) { - // Поленился делать :) - return s; -} // function validateString (s) -// Есть ли в строке гласные? -function isNotLastSep(remainStr) { - var is = false; - for (var i = 0; i < remainStr.length; i++) { - if (vowel.indexOf(remainStr.substr(i, 1)) != -1) { - is = true; - break; - } - } // for (var i = 0; i < remainStr - 1; i++) - return is; -} // function isLastSep (remainStr) -// Собственно функция разбиения слова на слоги - -function getSeparatedString(s) { - // Добавляем слог в массив и начинаем новый слог - function addSep() { - sepArr.push(tmpS); - tmpS = ''; - } // function addSep () - s = validateString(s); - var tmpL = new String(); // Текущий символ - var tmpS = new String(); // Текущий слог - var sepArr = new Array(); // Массив слогов - for (var i = 0; i < s.length; i++) { - tmpL = s.substr(i, 1); - tmpS += tmpL; - // Проверка на признаки конца слогов - // если буква равна 'й' и она не первая и не последняя и это не последний слог - if ( - (i != 0) && - (i != s.length - 1) && - (brief.indexOf(tmpL) != -1) && - (isNotLastSep(s.substr(i + 1, s.length - i + 1))) - ) { - addSep(); - continue; - } - // если текущая гласная и следующая тоже гласная - if ( - (i < s.length - 1) && - (vowel.indexOf(tmpL) != -1) && - (vowel.indexOf(s.substr(i + 1, 1)) != -1) - ) { - addSep(); - continue; - } - // если текущая гласная, следующая согласная, а после неё гласная - if ( - (i < s.length - 2) && - (vowel.indexOf(tmpL) != -1) && - (cons.indexOf(s.substr(i + 1, 1)) != -1) && - (vowel.indexOf(s.substr(i + 2, 1)) != -1) - ) { - addSep(); - continue; - } - // если текущая гласная, следующая глухая согласная, а после согласная и это не последний слог - if ( - (i < s.length - 2) && - (vowel.indexOf(tmpL) != -1) && - (deaf.indexOf(s.substr(i + 1, 1)) != -1) && - (cons.indexOf(s.substr(i + 2, 1)) != -1) && - (isNotLastSep(s.substr(i + 1, s.length - i + 1))) - ) { - addSep(); - continue; - } - // если текущая звонкая или шипящая согласная, перед ней гласная, следующая не гласная и не другая, и это не последний слог - if ( - (i > 0) && - (i < s.length - 1) && - (voiced.indexOf(tmpL) != -1) && - (vowel.indexOf(s.substr(i - 1, 1)) != -1) && - (vowel.indexOf(s.substr(i + 1, 1)) == -1) && - (other.indexOf(s.substr(i + 1, 1)) == -1) && - (isNotLastSep(s.substr(i + 1, s.length - i + 1))) - ) { - addSep(); - continue; - } - // если текущая другая, а следующая не гласная если это первый слог - if ( - (i < s.length - 1) && - (other.indexOf(tmpL) != -1) && - ((vowel.indexOf(s.substr(i + 1, 1)) == -1) || - (isNotLastSep(s.substr(0, i)))) - ) { - addSep(); - continue; - } - } // for (var i = 0; i < s.length; i++) - sepArr.push(tmpS); - // return sepArr.join('-'); - return sepArr; -} // function getSeparatedString (s) \ No newline at end of file diff --git a/www/assets/js/jquery-3.3.1.js b/www/assets/js/jquery-3.3.1.js deleted file mode 100644 index 9b5206b..0000000 --- a/www/assets/js/jquery-3.3.1.js +++ /dev/null @@ -1,10364 +0,0 @@ -/*! - * jQuery JavaScript Library v3.3.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2018-01-20T17:24Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - - - var preservedScriptAttributes = { - type: true, - src: true, - noModule: true - }; - - function DOMEval( code, doc, node ) { - doc = doc || document; - - var i, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.3.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - div.style.position = "absolute"; - scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - ) ); - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - val = curCSS( elem, dimension, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox; - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = valueIsBorderBox && - ( support.boxSizingReliable() || val === elem.style[ dimension ] ); - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - if ( val === "auto" || - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { - - val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; - - // offsetWidth/offsetHeight provide border-box values - valueIsBorderBox = true; - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra && boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ); - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && support.scrollboxSize() === styles.position ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = Date.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - -
-
-
-

Решётка Кардано

-

Джероламо Кардано

-
- -
-
-

Что такое решётка Кардано?

-

Решётка Кардано — инструмент шифрования и дешифрования, представляющий собой специальную прямоугольную (в частном случае — квадратную) таблицу-карточку, часть ячеек которой вырезана.

-

-
-
-

Как это выглядит?

- - -
-

Текст записки: Сэр Джон высоко ценит Вас и снова повторяет, что все, что доступно ему, теперь ваше, навсегда. Может ли он заслужить прощение за свои прежние промедления посредством своего обаяния.
Шифрованное послание: В мае Испания направит свои корабли на войну.

-
-
-
-
- -
-
-

Откуда появилось?

-

В 1550 году итальянский математик Джероламо Кардано предложил простую решётку для шифрования сообщений. Он планировал маскировать сообщения под обычное послание, так что в целом они не были полностью похожи на шифрованные. Решётка содержит отверстия для отдельных символов, а сообщение заполняется набором букв или цифр и представляет собой криптограмму. Одна из разновидностей решётки Кардано — вращающаяся решётка или сетка, в основе которой лежит шахматная доска, которая использовалась в конце XVI века. Вращающаяся решётка снова появилась в более сложной форме в конце XIX века, но к этому времени какая-либо связь с Кардано осталась только в названии.

-

-
-
-

Суть простыми словами

-

Решётка — квадрат N×N клеток, некоторые из которых вырезаны. Клетки должны иметь такой размер, чтобы в каждую помещалась ровно одна буква. Вырезанные клетки должны располагаться таким образом, чтобы никакие две из них не оказывались в одном и том же месте при поворотах решетки. Чтобы зашифровать сообщение, нужно разместить решётку на бумаге и вписать часть текста в вырезанные клетки, затем повернуть решетку на 90° и вписать следующую часть и т. д. После этого в оставшиеся пустыми места на бумаге нужно вписать произвольные символы.

-
-
-
-

Конструктор решёток Кардано

- -
-
- -

Алгоритм шифрования

-

Решётка квадратной формы

-

Клетки в решётке вырезаются таким образом, чтобы при её поворотах можно было записать по букве в каждое место на бумаге, и не было таких пар вырезанных клеток, которые оказываются на одном и том же месте.

-

Пример:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ШагиОписаниеИзменения
1Берём фразу, которую хотим закодироватьSecurity is an important thing. Безопасность - это важная вещь.
2Размещаем решётку на бумаге и вписываем часть текста в вырезанные клетки - - - - - - -
S
e
cu
ri
ty
3Поворачиваем решётку на 90° и вписываем следующую часть - - - - - - -
S
e
is
cu
arni
ity
4Поворачиваем решётку на 180° и вписываем следующую часть - - - - - - -
mp S
ore
ista
cu
anrni
itty
5Поворачиваем решётку на 270° и вписываем следующую часть - - - - - - -
mp Sth
oiren
gista
cu.
anrni
it ty
6Итог - - - - - - -
mp Sth
oiaren
gista
csu.
anrni
iht ty
-
-

Шифратор

-
-
- -
-
- -
-
-
-

Результат:

-

1

-

Зашифруйте сообщение чтобы увидеть результат - - - - - - - -

- -
-

Дешифратор

-
-
- -
-
- -
-
-
-

Результат:

- - - - - - - -
- -

Дешифруйте сообщение чтобы увидеть результат

-
-
- - - - - - - - - - - - diff --git a/www/cesar.html b/www/cesar.html deleted file mode 100644 index e06de97..0000000 --- a/www/cesar.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Cesar - - - - - - - - - - -
-
-
-

Шифр Цезаря

-

Шифр сдвига

-
- - - -
-
-

Что такое шифр Цезаря?

-

Шифр Цезаря- это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите.

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Откуда появилось?

-

Шифр Цезаря называют в честь Юлия Цезаря, который согласно «Жизни двенадцати цезарей» Светония использовал его со сдвигом 3, чтобы защищать военные сообщения. Хотя Цезарь был первым зафиксированным человеком, использующим эту схему, другие шифры подстановки, как известно, использовались и ранее.

-

-
-
-

Суть простыми словами?

-

Шифр Цезаря это всего лишь смещение каждой буквы в тексте на некий сдвиг общий для всего текста, а смещалась эта буква по алфавиту того языка на котором данная буква написан.

-
-
- -
- - -

Алгоритм шифрования

-

Шифр Цезаря (Шифр сдвига)

-

Секрет данного способа заключался в простом смещении каждого символа на n шагов внутри алфавита на которм написан данный символ, причём сдвиг один на весь текст.

-

Пример:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ШагиОписаниеИзменения
1Берем фразу, которую хотим закодироватьArea Z90
2Берём ключ(смещение)3
3Смещаем каждый символ на сдвиг равный ключуArea Z90 -> Duhd C23
4Пример кодирования обного символаСимвол равен "A", ключ равен 3, используется английский алфавит. Буква "A" в английском алфавите занимает 1 позицию, значит при кодировке вместо "А" будет буква чья позиция в алфавите равна 4, это буква "D".
5ИтогDuhd C23
-
- -

Шифратор

- -
-
- -
-
- -
-
- -
-
-
-

Результат:

-

Зашифруйте сообщение чтобы увидеть результат

-
-

-

-
-
-

-

-
-
-

-
- - -

Дешифратор

-
-
- -
-
- -
-
- -
-
-
-

Результат:

-
-

-

-
- - -
- - - - - - - - - - - - - - - - diff --git a/www/ciphers.html b/www/ciphers.html deleted file mode 100644 index a50a68d..0000000 --- a/www/ciphers.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -
-
-

-

История криптографии

-

Криптография древнего мира

-
    -
  • Скитала - шифр древней Спарты
  • -
  • Диск Энея
  • -
  • Линейка Энея
  • -
  • Книжный шифр Энея
  • -
  • Квадрат Полибия
  • -
  • Шифр Цезаря
  • -
- - -

Криптография в арабских странах

-
    -
  • С VIII до XV века
  • -
  • Первое упоминание об „атаке на основе открытого текста“
  • -
  • Первое упоминание о частотном криптоанализе, таблицы частотности букв арабского языка
  • -
- -

Эпоха возрождения (2-я половина XIII века - 1590-е годы)

-
    -
  • Использование криптографии церковью (включала 7 методов скрытия текста), Роджер Бэкон
  • -
  • 1452 — первая криптографическая организация (Венеция, Италия)
  • -
  • 1466 – трактат Леона Альберти, описание шифровального диска
  • -
  • 1469 – шифр „Миланский ключ“
  • -
  • 1518 – Иоганн Тритемий, „Polygraphia“, полишифры, идея использования биграмм
  • -
  • 1550 – Джероламо Кардано, решётка, стеганография и транспозиционный шифр
  • -
    - -
  • 1633 - „Polygraphia nova“ Атанасиус Кирхер, полиглотический код
  • -
  • 1580 – Френсис Бэкон, двоичный способ кодирования
  • -
  • 1585 – шифр Виженера, использование другого открытого текста в качестве ключа, пользование результата шифрования в качестве ключа
  • -
  • 1639 – первое упоминание о рукописи Войнича
  • - -
  • 1863 год – метод Касиски
  • -
  • 1883 год - „La Cryptographie Militaire“ Огюста Кергоффса
  • -
-
-
-

- -

Первая мировая война (1914 - 1918)

-
    -
  • Криптография как инструмент войны
  • -
  • Телеграмма Циммермана
  • -
- -

Вторая мировая война (1939 - 1945)

-
    -
  • Энигма
  • -
  • Бюро Шифров
  • -
  • Блейтчи-парк
  • -
  • Машина Лоренца, M-94, M-209
  • -
  • Проект „Венона“ и проект „Манхеттен“
  • -
-

20 век

-
    -
  • 1945 - „Communication Theory of Secrecy Systems“
  • -
  • 1960 – появление блочных шифров
  • -
  • 1976 год – официальное принятияе шифра DES в качестве стандарта
  • -
  • 1976 год - „New Directions in Cryptography“ (Диффи, Хелфман)
  • -
  • 1977 год – алгоритм RSA (Ривест, Шамир, Адельман)
  • -
  • 1985 год – криптография на эллиптических кривых (Коблиц, Миллер)
  • -
-

Криптография и государство

-
    -
  • 1997-2000 – Advanced Encryption Standard
  • -
  • 2000-2001 – New European Schemes for Signatures, Integrity, and Encryptions
  • -
  • 2000-2002 – Cryptography Research and Evaluation Committees
  • -
-
-
- - - - - - - - - - - diff --git a/www/commercial_laws.html b/www/commercial_laws.html deleted file mode 100644 index 97f188e..0000000 --- a/www/commercial_laws.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- - - -

Закон "О коммерческой тайне"

- -
-
-

Полное название

-

... ...

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Что это?

- -

... - ...

- -
- -
-

Как относится к безопасности?

-

...

-
- -
- -
-
-

С чем связано?

- -

Документы:

-

...

-

Область действия:

-

...

-
-
- - -

Постановление Правительства №35 -

- -
-
-

Полное название

-

Постановление Правительства №35 «О перечне сведений, которые не могут составлять коммерческую тайну» -

-
-
-

Где можно его найти?

- - Ссылка на ПП № 35 - -
- -
- -
-
-

Что это?

- -

Постановление Правительства №35 - документ, в котором описаны сведения, не подходящие под определение коммерческой тайны.

-

А именно:

-
    -
  1. - Коммерческую тайну предприятия и предпринимателя не могут составлять: -
      -
    • - учредительные документы и Устав; -
    • -
    • - документы, дающие право заниматься предпринимательством; -
    • -
    • - сведения по установленным формам отчетности, необходимые для уплаты налогов и других обязательных платежей в государственную бюджетную систему; -
    • -
    • - документы о платёжеспособности; -
    • -
    • - сведения о численности, заработной плате, условиях труда работников предприятия, а также сведения о свободных рабочих местах; -
    • -
    • - документы об уплате налогов и обязательных платежах; -
    • -
    • - сведения о загрязнении окружающей среды, нарушении антимонопольного законодательства, несоблюдении безопасных условий труда, реализации продукции, вредной для здоровья населения, а также других нарушениях законодательства и размерах причиненного ущерба; -
    • -
    • - сведения об участии должностных лиц предприятия в кооперативах, малых предприятиях, товариществах, акционерных обществах, объединениях и других организациях, занимающихся предпринимательством. -
    • -
    -
  2. -
  3. - Запрещается государственным и муниципальным предприятиям до и в процессе их приватизации относить к коммерческой тайне данные: -
      -
    • - о размерах имущества предприятия и его денежных средствах; -
    • -
    • - о вложении средств в доходные активы других предприятий, в процентные облигации и займы, в уставные фонды совместных предприятий; -
    • -
    • - о кредитных торговых и иных обязательствах предприятия; -
    • -
    • - о договорах с кооперативами, иными негосударственными предприятиями, творческими и временными трудовыми коллективами, а также с отдельными гражданами; -
    • -
    -
  4. -
  5. - Действие Постановления не распространяется на сведения, относимые к коммерческой тайне или к информации о деятельности предприятия, являющейся государственной тайной. -
  6. -
-
- -
-

Как относится к безопасности?

-

- Постановление Правительства №35 четко регламентирует те сведения, которые не должны относиться к коммерческой тайне в целях обеспечения деятельности налоговой службы, правоохранительных и контролирующих органов, а также предупреждения злоупотреблений в процессе приватизации. -

-
- -
- -
-
-

С чем связано?

- -

Область действия:

-

Конфиденциальные сведения в экономической сфере Российской Федерации.

-
-
-


- - - -

Закон "О лицензировании отдельных видов деятельности"

- -
-
-

Полное название

-

Федеральный закон от 04.05.2011 N 99-ФЗ (ред. от 03.08.2018) "О лицензировании отдельных видов деятельности"

-
-
-

Где можно его найти?

- - Ссылка на федеральный закон от 04.05.2011 N 99-ФЗ - -
-
- -
-
-

Что это и как относится к безопастности?

-

- Закон "О лицензировании отдельных видов деятельности" - устанавливает список видов деятельности, которые подлежат лицензированию. - Из этого списка к информационной безопасности относятся следующие: -

    -
  • разработка, производство, распространение и прочие услуги связанные с шифровальными средствами;
  • -
  • разработка, производство и прочая деятельность с использованием средств защиты конфиденциальной информации;
  • -
  • деятельность по выявлению электронных устройств, предназначенных для негласного получения информации (жучки, подслушивающие устройства);
  • -
  • оказание услуг связи.
  • -
-

-
-
- -
-
-

С чем связано?

-

Область действия:

-

Вся информационная и коммерческая сфера РФ

-
-
- - - - - - - - - - - diff --git a/www/constructor.js b/www/constructor.js deleted file mode 100644 index 603961b..0000000 --- a/www/constructor.js +++ /dev/null @@ -1,8 +0,0 @@ -document.getElementById('frame').src = "generator_reshetok.html"; -var button = document.getElementById('reload'); -// console.log(button); -function refr() -{ - document.getElementById('frame').src = document.getElementById('frame').src; -} -button.addEventListener("click", refr); diff --git a/www/cramm.html b/www/cramm.html deleted file mode 100644 index 190cdc2..0000000 --- a/www/cramm.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Это одна из первых методик анализа рисков в сфере информационной безопасности. Работа над данной методикой была начата в середине 80-х гг центральным агенством по компьютерам и телекоммуникациям (CCTA) Великобритании.

-
- - -
-

Общая информация

-

-

В основе метода CRAMM лежит комплексный подход к оценке рисков, который сочетает в себе количественные и качественные методы анализа. Метод является универсальным и подходит для крупных и мелких организаций правительственного или коммерческого сектора.

-

Версии программного обеспечения отличаются друг от друга базами знаний (profiles): commercial profile для коммерческого сектора и government profile для правительственного. Последний тип базы знаий позволяет проводиь аудит на соответствие требованиям американского стандарта ITSEC («Оранжевая книга»).

-

Исследование информационной безопасности системы с помощью CRAMM проводится в три стадии: -

    -
  1. -

    Анализируется все, что касается идентификации и определения ценности ресурсов системы. Решается задача по определению границ исследуемой системы: собираются сведения о конфигурации системы и о том, кто отвечает за физические и программные ресурсы, кто входит в число пользователей системы, как они ее применяют и будут применять.

    -

    Проводится идентификация ресурсов: физических, программных и информационных, содержащихся внутри границ системы. Каждый ресурс необходимо отнести к одному из предопредленных классов. Затем строится модель информационной системы с позиции безопасности. Для каждого информационного процесса, имеющего с точки зрения пользователя самостоятельное значение и называемого пользовательским сервисом, строится дерево связей используемых ресурсов. Построенная модель позволяет выделить критичные элементы.

    -

    Ценность физических ресурсов в CRAMM определяетсяя определяется стоимостью их восстановления в случае разрушения.

    -

    Ценность данных и программного обеспеченияя определяется в следующих ситуациях: -

      -
    • - недоступность ресурса в течение определнного периода времени; -
    • -
    • - разрушение ресурса - потеря информации, полученной со времени последнего резервного копировани, или ее полное разрушение; -
    • -
    • - нарушение конфиденциальности в случаях несанкционированного доступа штатных сотрудников или посторонних лиц; -
    • -
    • - модификация - рассматривается для случаев мелких ошибок персонала (ошибки ввода), программных ошибок, преднамеренных ошибок; -
    • -
    • - ошибки, связанные с передачей информации: отказ от доставки, недоставка информации, доставка по неверному адресу. -
    • -
    -

    -

    - Для оценки возможного ущерба CRAMM рекомендует использовать следующие параметры: -

      -
    • - ущерб репутации организации; -
    • -
    • - нарушение действующего законодательства; -
    • -
    • - ущерб для здоровья персонала; -
    • -
    • - ущерб, связанный с разглашением персональных данных отдельных лиц; -
    • -
    • - финансовые потери, связанные с восстановлением ресурсов; -
    • -
    • - потери, связанные с невозможностью выполнения обязательств; -
    • -
    • - дезорганизация деяятельности. -
    • -
    -

    -

    - Для данных и программного обеспечения выбираются применимые к данной информационной системе критерии, ается оценка ущерба по шкале со значениями от 1 до 10. -

    -

    - В описаниях CRAMM в качестве примера приводится шкала оценки по критерию «Финановые потери, связанные с восстановлением ресурсов»: -

      -
    • - 2 балла - менее $1000; -
    • -
    • - 6 балла - от $1000 до 10 000$; -
    • -
    • - 8 баллов - от $10 000 до 100 000$; -
    • -
    • - 10 баллов - свыше 100 000$; -
    • -
    -

    -

    - При низкой оценке по всем используемым критериям (3 балла и ниже) считается, что рассматриваемая система требует базового уровня защиты (для этого уровня не требуется подробной оценки угроз ИБ) и вторая стадия исследования пропускается. -

    -
  2. -
  3. -

    На второй стадии рассматривается все, что относится к идентификации и оценке уровней угроз для групп ресурсов и их узвимостей. В конце стадии заказчик получает идентифицированные и оцененные уровни рисков для своей системы. На этой стадии оцениваются зависимость пользовательских сервисов от определенных групп ресурсов и существующий уровень угроз и уязвимостей производится на основе исследования косвенных факторов.

    -

    - Ресурсы группируются по типам угроз и уязвимостей. Например, в случае существования угрозы пожара или кражи в качестве группы ресурсов разумно рассмотреть все ресурсы, находящиеся в одном месте (серверный зал, комната средств связи и т.д.). Оценка уровней угроз и уязвимостей производится на основе исследования косвенных факторов. -

    -

    - Программное обеспечение CRAMM для каждой группы ресурсов и каждого из 36 типов угроз генерирует список вопросов, допускающих однозначный ответ. Уровень угроз оценивается, в зависимости от ответов, как очень высокий, высокий, средний, низкий и очень низкий. Уровень уязвимости оценивается, в зависимости от ответов, как высокий, средний и низкий. -

    -

    - На основе этой информации рассчитываются уровни рисков в дискретной шкале с градациями от 1 до 7. Полученные уровни угроз, уязвимостей и рисков анализируются и согласовываются с заказчиком. -

    -

    - CRAMM объединяет угрозы и уязвимости в матрице риска. Рассмотрим, как получается эта матрица, и что каждый из уровней риска означает. -

    -

    - Основной подход для решения этой проблемы состоит в рассмотрении: -

      -
    • - уровня угрозы; -
    • -
    • - уровня уязвимости; -
    • -
    • - размера ожидаемых финансовых потерь. -
    • -
    -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Шкала оценки уровней угрозы (частота возникновения)
    ОписаниеЗначение
    Инцидент происходит в среднем не чаще, чем каждые 10 летОчень низкий
    Инцидент происходит в среднем раз в годНизкий
    Инцидент происходит в среднем один раз в четыре месяцаСредний
    Инцидент происходит в среднем раз в месяцВысокий
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -
    Шкала оценки уровня уязвимости(вероятность успешной реализации угрозы)
    ОписаниеЗначение
    В случае возникновения инцидента вероятность развития событий по наихудшему сценарию меньше 0,33Низкий
    В случае возникновения инцидента вероятность развития событий по наихудшему сценарию от 0,33 до 0,66Средний
    В случае возникновения инцидента вероятность развития событий по наихудшему сценарию выше 0,66Высокий
    -
    -

    - Исходя из оценок стоимости ресурсов защищаемой ИС, оценок угроз и уязвимостей, определяются ожидаемые годовые потери. -

    -

    - Значения ожидаемых годовых потерь переводятся в CRAMM в баллы, показывающие уровни риска. -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Степень риска в CRAMMОжидаемые годовые потери
    1<1000$
    2<10 000$
    3<100 000$
    4<1 000 000$
    5<10 000 000$
    6<100 000 000$
    7<1 000 000 000$
    -
    -

    В соответствии с приведенной ниже матрицей, выводится оценка риска

    - -
  4. -
    - -
    -
  5. -

    Третья стадия исследования заключается в поиске адекватных контрмер. По существу, это поиск варианта системы безопасности, наилучшим образом удовлетворяющий требованиям заказчика.

    -

    - На этой стадии CRAMM генерирут несколько вариантов мер противодействия, выявленным рискам и их уровняям. Контрмеры можно объединить в три категории: около 300 рекомендаций общего плана, более 1000 конкретных рекомендаций, около 900 примеров того, как можно организовать защиту в данной ситуации. -

    -

    - Таким образом, CRAMM - пример методики расчета, при которой первоначальные оценки даюся на качественном уровне, и потом производится переход к количественной оценке (в баллах). -

    -
  6. -
-

-

-
- -
- - - - - - - - - - - - - - diff --git a/www/creation_plan.html b/www/creation_plan.html deleted file mode 100644 index 0fcdba1..0000000 --- a/www/creation_plan.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Creation plan - - - - - - - - - - -
-
-
-

Создание сайта

-

И необходимая помощь в этом

-
- - - -
-
-

Зачем это нужно?

-

Разработка сайта - отличная альтернатива скучным практикам.
Создание этого сайта имеет ряд плюсов:

- -
    -
  • Вся информация в одном месте
  • -
  • Просто, наглядно, понятно
  • -
  • Практика в работе с HTML, JavaScript, Git и др.
  • -
  • Самостоятельное изучение тем
  • -
  • Развитие Soft Skills
  • -
-
-
-

И как тут помочь?

- - -

Можно выбрать в качестве практики любую тему из списка ниже, сделать её и предложить добавить к сайту!
Подробная инструкция в файле "Практика" на Google диске.

-
-
- -
- -
-
-

Темы

-

На данный момент свободны такие темы:

-

Алгоритмы

-
    -
  1. Шифр биграммного типа
  2. -
  3. Книжный шифр
  4. -
  5. Трафарет Кардано (наложение шаблона поверх текста)
  6. -
  7. Единозначный парный шифр
  8. -
  9. Простой квадратный шифр
  10. -
- -

Перенос и редактирование информации на сайт

-
    -
  1. Основные понятия ИБ (Лекция 1.Введение)
  2. -
  3. Информационные системы (Лекция 2.Виды информационных систем)
  4. -
  5. Информация с точки зрения ИБ (Лекции 3-4-5)
  6. -
  7. Руководящие документы (Лекция 6.Документы, конец)
  8. -
  9. Модель LifeCycle (Лекция 7.Модели и методики СЗИ)
  10. -
  11. Эталонная модель ЖЦ (Лекция 7.Модели и методики СЗИ)
  12. -
  13. Модели многоуровневой защиты (Лекция 7.Модели и методики СЗИ)
  14. -
  15. Методики анализа рисков. Microsoft (Лекция 7.Модели и методики СЗИ)
  16. -
  17. Методики анализа рисков. CRAMM (Лекция 7.Модели и методики СЗИ)
  18. -
  19. Методики анализа рисков. FRAP (Лекция 7.Модели и методики СЗИ)
  20. -
  21. Методики анализа рисков. OCTAVE (Лекция 7.Модели и методики СЗИ)
  22. -
  23. Методики анализа рисков. RiskWatch (Лекция 7.Модели и методики СЗИ)
  24. -
- - -
-
- -
- -
- - - - - - - - - - - - - - - - diff --git a/www/diffi.html b/www/diffi.html deleted file mode 100644 index ec351be..0000000 --- a/www/diffi.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - - -
-
-
-

Есть Alice и Bob.
- И они пользуется незашфованным каналом. Однако, хотят сохранить конфедециальность переписки

-

Для этого они договариваются об общей формуле шифорования:

-

A=gxmod p

-
-
-
-
-

Alice

-
-
-
-
-

Bob

-
-
-
-
-

Затем они задают 2 числа для этой формулы

-
-
-
-
-

Alice решает, что: g=3

-
-
-
-
-

Bob решает, что: p=7

-
-
-
-

Теперь они передают эти числа друг другу

- -
- - -

После этого каждый из них придумает секретное число и высчитавает значение формулы для него

-
-
-
-

Alica решает, что:
x=5
A=5

-
-
-
-
-

Bob решает, что:
x=7
A=3

-
-
-
-

Полученные значения формулы они передают друг другу

- -
- - -

Используя полученные числа друг от друга,каждый из них получает ещё 1 число
Причем при данной формуле оно всегда будет одинаковым

-

K=Axmod p

-
-
-
-

Alice высчитывает, что: k=5

-
-
-
-
-

Bob высчтитывает, что: k=5

-
-
-
-
-

Полученное число можно использовать для шифрования

-
-
-
- - - - - - - - - - - - - diff --git a/www/electronic_signature_with_scientists.html b/www/electronic_signature_with_scientists.html deleted file mode 100644 index edee3e9..0000000 --- a/www/electronic_signature_with_scientists.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - -
-
-
-

Схемы Эль-Гамаля и Шнорра

-
-
- Pic 01 -
-

Схема Эль-Гамаля

-

Схему Эль-Гамаля можно использовать как для цифровой подписи, так и для шифрования. - Цифровая подпись Эль-Гамаля состоит из пары блоков r,s. В механизме этой подписи используются те же параметры что и в криптосистеме Эль-Гамаля.Преобразование, естественно, производится лицом, обладающим секретным ключом. Кроме того, используется хэш-функция сообщения h(m). Лицо, подписывающее документ, должно для каждого подписываемого сообщения m выбрать рандомизатор k и вычислить «предподпись» r = g k (p) . Затем необходимо использовать секретный ключ как один из коэффициентов сравнения, из которого определяется блок подписи s. Сравнение имеет вид h = h(m)= xr + ks mod(p −1). Здесь модулем сравнения выбрано число p −1, поскольку обе части сравнения в проверочном соотношении будут участвовать в показателях. Заметим, что число r может равняться p−1, поскольку оно определяется из сравнения по модулю p. Подпись r, sсчитается действительной, если g h = g xr+ks (p). Поскольку y = g x (p) и r = gk (p), то окончательный вид проверочного соотношения следующий: gh= yrrs(p). Таким образом, для проверки подписи достаточно знания открытого ключа.

- -
- Pic 02 -
- -

Схема Шнорра

-

Одна из наиболее эффективных и теоретически обоснованных схем аутентификации. Схема является модификацией схем Эль-Гамаля. Но проблема этой схемы цифровой подписи - в том, что p должно быть очень большим. Рекомендуется длина p по крайней мере 1024 битов. Можно сделать подпись размером 2048 бит. Чтобы уменьшить размер подписи, Шнорр предложил новую схему, основанную на схеме Эль-Гамаля , но с уменьшенным размером подписи. Ниже представлен пример генерации ключей: - -Выбирается простое p=48731 и простое q=443(q|p-1) -Вычисляется g из условия gq=1 (mod p), в данном случае g=11444 -Алиса выбирает секретный ключ w=357 и вычисляет открытый y=g -w(mod (p))=7355 ключ -Открытый ключ (48731,443,11444,7355), закрытый — 357 -Проверка подлинности: - -Алиса выбирает случайное число r=274 и отсылает x=gr(mod (p))=37123 Бобу. -Боб отсылает Алисе число e=129 -Алиса считает s=(r+w*e) p (mod (q))=255 и отправляет s Бобу. -Боб вычисляет z=gs*ye(mod(p))=37123) и идентифицирует Алису, так как z=x. - - - -

-
-
- - - - - - - - - - - - diff --git a/www/elements.html b/www/elements.html deleted file mode 100644 index acc9063..0000000 --- a/www/elements.html +++ /dev/null @@ -1,482 +0,0 @@ - - - - - Elements - Projection by TEMPLATED - - - - - - - - - - - -
-
-
-

Elements

-

Aliquam erat volutpat nam dui

-
- - -
-
-

What is Baseline?

-

Baseline is a simple boilerplate for creating new projects with Skel. It features clear, concise HTML5 and CSS3 code (built on Sass), responsiveness right out of the box, off-canvas navigation, an assortment of pre-styled elements, Font Awesome icons, and everything offered by Skel + Skel.scss. Baseline is MIT licensed.

-
-
-

Sed Feugiat

-

Erat ac non lorem justo amet primis dolor adipiscing lacinia accumsan felis sed dolor interdum ut. Amet accumsan magna etiam orci faucibus interdum et lorem ipsum et nullam.

-
-
-

Lorem Ipsum

-

Erat ac non lorem justo amet primis dolor adipiscing lacinia accumsan felis sed dolor interdum ut. Amet accumsan magna etiam orci faucibus interdum et lorem ipsum et nullam.

-
-
- -
- - -

Sample Content

-

Praesent ac adipiscing ullamcorper semper ut amet ac risus. Lorem sapien ut odio odio nunc. Ac adipiscing nibh porttitor erat risus justo adipiscing adipiscing amet placerat accumsan. Vis. Faucibus odio magna tempus adipiscing a non. In mi primis arcu ut non accumsan vivamus ac blandit adipiscing adipiscing arcu metus praesent turpis eu ac lacinia nunc ac commodo gravida adipiscing eget accumsan ac nunc adipiscing adipiscing.

-
-
-

Sem turpis amet semper

-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat commodo eu sed ante lacinia. Sapien a lorem in integer ornare praesent commodo adipiscing arcu in massa commodo lorem accumsan at odio massa ac ac. Semper adipiscing varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-
-

Magna odio tempus commodo

-

In arcu accumsan arcu adipiscing accumsan orci ac. Felis id enim aliquet. Accumsan ac integer lobortis commodo ornare aliquet accumsan erat tempus amet porttitor. Ante commodo blandit adipiscing integer semper orci eget. Faucibus commodo adipiscing mi eu nullam accumsan morbi arcu ornare odio mi adipiscing nascetur lacus ac interdum morbi accumsan vis mi accumsan ac praesent.

-
- -
-

Interdum sapien gravida

-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-
-

Faucibus consequat lorem

-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-
-

Accumsan montes viverra

-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-
- -
- - -

Elements

-
-
- - -

Text

-

This is bold and this is strong. This is italic and this is emphasized. - This is superscript text and this is subscript text. - This is underlined and this is code: for (;;) { ... }.

-
-

Heading Level 2

-

Heading Level 3

-

Heading Level 4

-
Heading Level 5
-
Heading Level 6
-
-
-

Heading with a Subtitle

-

Lorem ipsum dolor sit amet nullam id egestas urna aliquam

-
-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-

Heading with a Subtitle

-

Lorem ipsum dolor sit amet nullam id egestas urna aliquam

-
-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

-
-

Heading with a Subtitle

-

Lorem ipsum dolor sit amet nullam id egestas urna aliquam

-
-

Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.

- - -

Lists

-
-
- -

Unordered

-
    -
  • Dolor pulvinar etiam magna etiam.
  • -
  • Sagittis adipiscing lorem eleifend.
  • -
  • Felis enim feugiat dolore viverra.
  • -
- -

Alternate

-
    -
  • Dolor pulvinar etiam magna etiam.
  • -
  • Sagittis adipiscing lorem eleifend.
  • -
  • Felis enim feugiat dolore viverra.
  • -
- -
-
- -

Ordered

-
    -
  1. Dolor pulvinar etiam magna etiam.
  2. -
  3. Etiam vel felis at lorem sed viverra.
  4. -
  5. Felis enim feugiat dolore viverra.
  6. -
  7. Dolor pulvinar etiam magna etiam.
  8. -
  9. Etiam vel felis at lorem sed viverra.
  10. -
  11. Felis enim feugiat dolore viverra.
  12. -
- -

Icons

- - -
-
-

Definition

-
-
Item 1
-
-

Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

-
-
Item 2
-
-

Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

-
-
Item 3
-
-

Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.

-
-
- -

Actions

- - -
-
- -
-
- -
-
- -
-
- -
-
- - -

Blockquote

-
Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis.
- - -

Table

- -

Default

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionPrice
Item 1Ante turpis integer aliquet porttitor.29.99
Item 2Vis ac commodo adipiscing arcu aliquet.19.99
Item 3 Morbi faucibus arcu accumsan lorem.29.99
Item 4Vitae integer tempus condimentum.19.99
Item 5Ante turpis integer aliquet porttitor.29.99
100.00
-
- -

Alternate

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionPrice
Item 1Ante turpis integer aliquet porttitor.29.99
Item 2Vis ac commodo adipiscing arcu aliquet.19.99
Item 3 Morbi faucibus arcu accumsan lorem.29.99
Item 4Vitae integer tempus condimentum.19.99
Item 5Ante turpis integer aliquet porttitor.29.99
100.00
-
- -
-
- - -

Buttons

- - - - - -
    -
  • Special
  • -
  • Default
  • -
  • Alternate
  • -
- - -

Form

- -
-
-
- -
-
- -
- -
-
- -
-
- -
- - -
-
- - -
-
- - -
- -
- - -
-
- - -
- -
- -
- -
-
    -
  • -
  • -
-
-
-
- -
- -
-
-
- -
-
- -
-
-
- - -

Image

- -

Fit

- -
-
-
-
-
- -
-
-
- -
-
-
-
-
- -

Left & Right

-

Lorem ipsum dolor sit accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Vestibulum ante ipsum primis in faucibus magna blandit adipiscing eu felis iaculis volutpat lorem ipsum dolor sit amet dolor consequat.

-

Lorem ipsum dolor sit accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Vestibulum ante ipsum primis in faucibus magna blandit adipiscing eu felis iaculis volutpat lorem ipsum dolor sit amet dolor consequat.

- - -

Box

-
-

Felis sagittis eget tempus primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Magna sed etiam ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus lorem ipsum dolor sit amet nullam.

-
- - -

Preformatted

-
i = 0;
-
-while (!deck.isInOrder()) {
-    print 'Iteration ' + i;
-    deck.shuffle();
-    i++;
-}
-
-print 'It took ' + i + ' iterations to sort the deck.';
-
- -
-
- -
- -
- - - - - - - - - - - diff --git a/www/ethalon_LC.html b/www/ethalon_LC.html deleted file mode 100644 index f17332a..0000000 --- a/www/ethalon_LC.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Обычно модель жизненного цикла безопасности приложений уникальна для конкретной организации и приспособлена к ее требованиям. Она используется и совершенствуется в течение многих лет. - -
В настоящее время существует много моделей жизненного цикла программных средств и систем, из которых организация может делать выбор с учетом своих внутренних потребностей. - -
Эталонная модель жизненного цикла безопасности приложений не ограничивается разработкой программных средств. Она также затрагивает мероприятия....

-
- - -
-

Общая информация

-

Графическое представление эталонной модели жизненного цикла безопасности приложений показана на изображении справа.

-

Эта эталонная модель по горизонтали разделяется на два основных этапа: - Подготовка к работе - осуществляются мероприятия по получению приложения и вводу его в действие, -и эксплуатация - осуществляются мероприятия,
выполняемые после ввода в действие. -
Этапы подготовки к работе и эксплуатации далее делятся на следующие стадии: -
a) этап подготовки к работе состоит из трех стадий: подготовка, реализация и ввод в действие; -
b) этап эксплуатации состоит из трех стадий: использование и поддержка, архивирование, уничтожение. -

-
- -
- - - -
-

Данная эталонная модель по вертикали разделяется на четыре основных уровня: -
а) менеджмент приложений: этот уровень составляют мероприятия из сферы -корпоративного управления, такие как менеджмент проектов и менеджмент эксплуатации приложений. -
b) подготовка к работе и эксплуатация приложений: этот уровень составляют мероприятия, связанные с подготовкой к работе и использованием самого приложения. -
c) менеджмент инфраструктуры: этот уровень составляют мероприятия, связанные с менеджментом поддерживающей приложение инфраструктуры услуг ИТ организации. -
d) аудит приложений: этот уровень составляют мероприятия, связанные с контролем и верификацией. -

-

Действующими субъектами являются все лица, участвующие на всех этапах всех уровней модели, такие как руководители проектов, разработчики, системные администраторы, администраторы баз данных, руководители пользователей, владельцы -приложений, аудиторы, конечные пользователи, технический персонал, обеспечивающий поддержку, сетевые администраторы и т.д.

-
-

Мероприятия, осуществляемые на этапах эталонной модели жизненного цикла

-

1)Мероприятия по менеджменту подготовки приложений к работе. -
Осуществляются: руководителями проектов и организации -
Этап: подготовка к работе.

-

2) Мероприятия по менеджменту эксплуатации приложений -
Этап: эксплуатация.

-

3)Подготовительные мероприятия -
Этап: подготовка

-

4)Подготовительные процессы -
Этап: подготовка проекта приложения.

-

5)Аутсорсинг -
Осуществляется: группой, занимающейся подготовкой к работе -
Описание: -
Если некоторые мероприятия реализации организация осуществляет через аутсорсинг, то для достижения целевого уровня доверия приложения, возможно, потребуется добавить к мероприятиям реализации специальные Advanced Security Concepts. Поэтому эталонная модель жизненного цикла безопасности приложений включает определенную сферу деятельности для аутсорсинга. -
Этап: реализация.

-

6)Разработка -
Осуществляется: группой, занимающейся подготовкой к работе -
Описание: -
Осуществляет мероприятия, связанные с внедрением программных средств. Если организация осуществляет некоторые из таких мероприятий своими силами, то ASC, добавленные к мероприятиям по внедрению, могут отличаться от тех, которые добавляются в случае приобретения или аутсорсинга внедрения компонентов приложений. Поэтому эталонная модель жизненного цикла безопасности приложений включает определенную область мероприятий разработки с последующей реализацией программных средств силами организации. -
Этап: реализация

-

7)Приобретение -
Осуществляется: группой, занимающейся подготовкой к работе -
Описание: -
Осуществляют мероприятия по приобретению с целью внешнего получения или приобретения продукта и/или услуги, отвечающих потребностям организации. К этим мероприятиям могут добавляться специальные ASC. Поэтому эталонная модель жизненного цикла безопасности приложений включает определенную сферу для мероприятий по приобретению с последующей реализацией приобретенных компонентов приложений. -
Этап: подготовка к работе

-

8)Ввод в действие -
Осуществляется: группой, занимающейся подготовкой к работе -
Описание: -
Осуществляются мероприятия по подготовке, конфигурированию, тестированию и развертыванию приложения в операционной среде, определяемой организацией. -
Этап: ввод в действие

-

9)Использование -
Осуществляется: не указано -
Описание: -
Осуществляются мероприятия, связанные с фактическим использованием приложения в операционной среде всеми пользователями, включая конечных пользователей. Такие мероприятия включают управление доступом пользователей, протоколирование, мониторинг, обучение безопасности и т.д. -
Этап: использования и поддержки

-

10)Архивирование -
Осуществляется: группой, занимающейся эксплуатацией -
Описание: -
Они включают архивирование всей информации приложения, а также архивирование всех инструментальных средств и процессов для обеспечения защиты и безопасного доступа к этой информации, даже если приложение больше уже не работает в своей операционной среде. -
Этап: приложение не нужно в активном режиме

-

11)Уничтожение -
Осуществляется: не указано -
Описание: -
Мероприятия по уничтожению связаны с безопасным разрушением всей информации приложений, включая данные пользователей, информацию организации, журналы регистрации пользователей, параметры приложений и т.д.

-

-

Менеджмент обеспечения инфраструктуры приложений

-

Осуществляется: группой, занимающейся подготовкой к работе -
Описание: -
Мероприятия, связанные с обеспечением и поддержанием безопасной технологической инфраструктуры. Эти мероприятия охватывают услуги, средства, инструменты и активы информационно-коммуникационной технологии в среде разработки и различных видах среды тестирования. -
Этап: подготовка к работе

-

Менеджмент инфраструктуры эксплуатации приложений

-

Описание: -
Мероприятия, связанные с обеспечением и поддержанием безопасной технологической инфраструктуры для этапов эксплуатации жизненного цикла приложений. Эти мероприятия охватывают услуги, средства, инструменты и активы информационно-коммуникационной технологии в операционной среде приложений. -
Этап: подготовка к работе -
Описание: -
Мероприятия для поддержания безопасной инфраструктуры, поддерживающей приложение. Поддержка инфраструктуры включает техническое обслуживание систем и сетевых аппаратных средств, резервное копирование и восстановление, восстановление после бедствия и т.д. -
Этап: эксплуатации

-

Снятие с эксплуатации

-

Описание: -Мероприятия по снятию с эксплуатации осуществляются с целью обеспечения уверенности в том, что вся информация, хранящаяся в системах, на серверах и других используемых приложениями технологических компонентах, безопасным образом удаляется. Это дает возможность утилизации или переработки этих компонентов без излишнего риска безопасности для организации. -

-

Аудит подготовки приложений к работе

-

Описание: -
Мероприятия по аудиту осуществляются для всей деятельности, всех действующих субъектов, процессов, артефактов и компонентов приложений, используемых или создаваемых во время жизненного цикла приложений. -
Эти мероприятия могут выполняться единожды или периодически, внутренними или внешними аудиторскими группами в зависимости от целевого уровня доверия проекта приложения. Они обеспечивают владельцу приложения необходимое доверие и свидетельства того, что требования безопасности приложений выполняются, как ожидалось. -
Этап: эксплуатации -


Организациям, разрабатывающим, но не эксплуатирующим приложения (таким как производители программных средств), может никогда не потребоваться проведение аудита приложений на этапе эксплуатации. -
Поэтому эталонная модель жизненного цикла безопасности приложений предоставляет определенную сферу для мероприятий по аудиту, проводимых на этапе подготовки к работе. -
Этап: подготовка к работе

-

Аудит эксплуатации приложений

-

Мероприятия по аудиту, проводимые на этапе эксплуатации, обычно отличаются от мероприятий по аудиту, осуществляемых на этапе подготовки к работе. Организациям, только эксплуатирующим приобретенные приложения, может никогда не потребоваться проведение аудита приложений на этапе подготовки к работе. Поэтому эталонная модель жизненного цикла безопасности приложений предоставляет определенную сферу для мероприятий по аудиту, проводимых на этапе эксплуатации. -

-
- - - -
- - - - - - - - - - - - - - diff --git a/www/final.js b/www/final.js deleted file mode 100644 index 7456be9..0000000 --- a/www/final.js +++ /dev/null @@ -1,253 +0,0 @@ -var texts=document.querySelector("#texts"); -var textr=document.querySelector("#textr"); -var zash=document.querySelector("#zashifr"); -var rassh=document.querySelector("#deshifr"); -function cvet() -{ - var str="Security is an important thing."; - var illustrs=document.querySelectorAll(".illustr"); - // console.log(illustrs); - var i, j, k; - for (i=0;i36) -{ - alert("Размер превышен. Введите заново."); - texts.value=""; - location.reload(); - buf=""; -} -var grid=Create2DArray(SIZE); -var grid1=Create2DArray(SIZE); -grid =[ [0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0], - [1, 0, 1, 0, 0, 0], - [0, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 1, 1]]; // решетка Кардано -// размер обоих матриц должен быть одинаковым - -// вывод зашифрованного сообщения -//for (var i = 0; i < SIZE; i++) -//cout « buf[i] « endl; -//cout « endl; - -// прямой обход решетки -// console.log("0"); -console.log(buf); -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -if (grid[i][j] == 1) -{ - - grid1[i][j]=buf[z]; - z++; -} -//console.log(grid1); -//console.log(grid); -for (j = 0; j < SIZE; j++) -for (i = SIZE-1; i >=0; i--) - -{ -// console.log(grid[i][j]); -if (grid[i][j]!=0) -{ grid1[j][SIZE-1-i]=buf[z]; -z++;} -} - -//console.log(grid1); -// console.log(grid); - -for (i = SIZE-1; i >= 0; i--) -for (j = SIZE-1; j >=0; j--) -if (grid[i][j] != 0) -{ grid1[SIZE-i-1][SIZE-j-1]=buf[z]; -z++;} -//console.log(grid); -for (j = SIZE-1; j >= 0; j--) -for (i = 0; i < SIZE; i++) -if (grid[i][j] != 0) -{ grid1[SIZE-1-j][i]=buf[z]; -z++;} -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -if(grid1[i][j]==undefined) -{ -// grid1[i][j]="й"; -grid1[i][j]=str[Math.floor(Math.random() * (str.length-1 - 0)) + 0]; -} -// console.log(grid); -var tabls=document.querySelectorAll(".illustr"); -var tabl=tabls[tabls.length-2]; -var tds=tabl.querySelectorAll("td"); -// console.log(tds); -var k=0; -for (i = 0; i < SIZE; i++) - for (j = 0; j < SIZE; j++) - { - tds[k].innerText=grid1[i][j]; - k++; - } -// console.log(grid1); -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) - -{ - - qwerty=qwerty+grid1[i][j]; -} -var strok=document.querySelector(".strok"); -strok.innerText=qwerty; -console.log(qwerty);} - -zash.addEventListener("click", main); - -function main2() -{ var z=0; -var str="Securityisanimportantthing"; -var i; -var j; -var SIZE = 6; -var buf = textr.value; -if(buf.length>36) -{ - alert("Размер превышен. Введите заново."); - texts.value=""; - location.reload(); - buf=""; -} -var res=[];// матрица с зашифрованным текстом -var grid=Create2DArray(SIZE); -var grid1=Create2DArray(SIZE); -grid =[ [0, 0, 0, 1, 0, 0], -[0, 0, 0, 0, 1, 0], -[0, 0, 0, 0, 0, 0], -[1, 0, 1, 0, 0, 0], -[0, 0, 1, 0, 0, 1], -[0, 0, 0, 0, 1, 1]]; // решетка Кардано -// размер обоих матриц должен быть одинаковым - -// вывод зашифрованного сообщения -//for (var i = 0; i < SIZE; i++) -//cout « buf[i] « endl; -//cout « endl; -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -{grid1[i][j]=buf[z]; -z++}; -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -if(grid1[i][j]==undefined) -{ -grid1[i][j]=str[Math.floor(Math.random() * (str.length-1 - 0)) + 0]; -} - -// прямой обход решетки - console.log(grid1); -for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -if (grid[i][j] == 1) -{ res.push(grid1[i][j]); -} -//console.log(grid1); -//console.log(grid); -for (j = 0; j < SIZE; j++) -for (i = SIZE-1; i >=0; i--) - -{ -// console.log(grid[i][j]); -if (grid[i][j]==1) -{ res.push(grid1[j][SIZE-1-i]); -} -} - -//console.log(grid1); -// console.log(grid); - -for (i = SIZE-1; i >= 0; i--) -for (j = SIZE-1; j >=0; j--) -if (grid[i][j] == 1) -{ res.push(grid1[SIZE-i-1][SIZE-j-1]); -} -console.log(grid); -for (j = SIZE-1; j >= 0; j--) -for (i = 0; i < SIZE; i++) -if (grid[i][j] == 1) -{ res.push(grid1[SIZE-1-j][i]); -} -/*for (i = 0; i < SIZE; i++) -for (j = 0; j < SIZE; j++) -if(grid1[i][j]==undefined) -{ -grid1[SIZE-1-j][i]="й"; -} */ -// console.log(grid); -// console.log(grid1); -// console.log(grid1); -// console.log(res); -var tabls=document.querySelectorAll(".illustr"); -var tabl=tabls[tabls.length-1]; -var tds=tabl.querySelectorAll("td"); -// console.log(tds); -var k=0; -for (i = 0; i < 36; i++) -{ - if(buf[i]==undefined) - { - tds[k].innerText=str[Math.floor(Math.random() * (str.length-1 - 0)) + 0] - k++; - } else{ - tds[k].innerText=buf[i]; - k++;} - -} -console.log(res); -var qaz=document.querySelector("#texts"); -var pp=document.querySelector("#decode_cardano_result"); -pp.innerText=""; -var oi=qaz.value.length; - - for (i = 0; i < res.length; i++) - { - pp.innerText=pp.innerText+res[i]; - if(oi!=0 && i==oi-1) - { - break; - } - } -} - -rassh.addEventListener("click", main2); \ No newline at end of file diff --git a/www/footer.html b/www/footer.html deleted file mode 100644 index e85dbc0..0000000 --- a/www/footer.html +++ /dev/null @@ -1,15 +0,0 @@ - - -
-

Ссылки на всё

-
- - -
- © Roman Zhitkov - - Email: rvzhitkov@gmail.com -
- - -
diff --git a/www/frap.html b/www/frap.html deleted file mode 100644 index 3e04ee0..0000000 --- a/www/frap.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Методика Faciliated Risk Analysis Process, предлагаемая компанией Peltier and Associates, была разработана Томасом Пелтиером. В методике обеспечение информационной безопасности информационной системы предлагается рассматривать в рамках процесса управления рисками. Управление рисками - процесс, позволяющий компаниям найти баланс между затратами средств и сил на средства защиты, и получаемым эффектом

-
- - -
-

Общая информация

- -

Управление рисками должно начинаться с оценки рисков: должным образом оформленные результаты оценки станут основой для принятия решений в области повышения безопасности системы.

- -

После завершения оценки проводится анализ соотношения затрат и получаемого эффекта (англ. cost/benefit analysis), который позволяет определить средства защиты, необходимые для снижения риска до приемлемого уровня.

- -

Ниже приведены основные этапы оценки рисков. Данный список во многом повторяет аналогичный перечень -из других методик, но во FRAP более подробно раскрываются пути получения данных о системе и ее -уязвимостях.

- -
    -
  1. Определение защищаемых активов производится с использованием опросных листов, изучения - документации на систему, использования инструментов автоматизированного анализа (сканирования) - сетей.
  2. -
  3. - Идентификация угроз. При составлении списка угроз могут использоваться разные подходы: -
      -
    • заранее подготовленный экспертами перечень угроз (checklist), из которых выбираются - актуальные для данной системы угрозы;
    • -
    • анализ статистики происшествий в данной ИС и в подобных ей - оценивается частота их - возникновения; по ряду угроз, например, угрозе возникновения пожара, подобную статистику - можно получить у соответствующих государственных организаций;
    • -
    • «мозговой штурм», проводимый сотрудниками компании.
    • -
    -
  4. -
  5. Когда список угроз закончен, каждой из них сопоставляют вероятность возникновения. После чего - оценивают ущерб, который может быть нанесен данной угрозой. Исходя из полученных значений, - оценивается уровень угрозы. - -

    При проведении анализа, как правило, принимают, что на начальном этапе в системе отсутствуют - средства и механизмы защиты. Таким образом оценивается уровень риска для незащищенной ИС, что в - последствии позволяет показать эффект от внедрения средств защиты информации (СЗИ).

    - -

    Оценка производится для вероятности возникновения угрозы и ущерба от нее по следующим шкалам.

    - -
      -
    1. - Вероятность (Probability): -
        -
      • высокая - очень вероятно, что угроза реализуется в течение следующего года;
      • -
      • средняя - возможно угроза реализуется в течение следующего года; -
      • -
      • низкая - маловероятно, что угроза реализуется в течение следующего года.
      • -
      -
    2. -
    3. - Ущерб (Impact) - мера величины потерь или вреда, наносимого активу: -
        -
      • высокий - остановка критически важных бизнес-подразделений, которая приводит к - существенному ущербу для бизнеса, потере имиджа или неполучению существенной прибыли;
      • -
      • средний - кратковременное прерывание работы критических процессов или - систем, которое приводит к ограниченным финансовым потерям в одном бизнес-подразделении;
      • -
      • низкий - перерыв в работе, не вызывающий ощутимых финансовых потерь.
      • -
      -
    4. -
    5. - Оценка определяется в соответствии с правилом, задаваемым матрицей рисков, изображенной на рис.1. Полученная оценка уровня риска может интерпретироваться следующим образом: -
        -
      • уровень A - связанные с риском действия (например, внедрение СЗИ) должны быть выполнены - немедленно и в обязательном порядке;
      • -
      • уровень B - связанные с риском действия должны быть предприняты; -
      • -
      • уровень C - требуется мониторинг ситуации (но непосредственных мер по противодействию угрозе - принимать, возможно, не надо);
      • -
      • уровень D - никаких действий в данный момент предпринимать не требуется.
      • -
        - -
        -
        Рис.1 Матрица рисков FRAP
        -
      -
    6. -
    -
  6. -
  7. - После того как угрозы идентифицированы и дана оценка риска, должны быть определены контрмеры, - позволяющие устранить риск или свести его до приемлемого уровня. При этом должны приниматься во - внимание законодательные ограничения, делающие невозможным или, наоборот, предписывающие в - обязательном порядке использование тех или иных средств и механизмов защиты. Чтобы определить - ожидаемый эффект, можно провести оценку того же риска, но при условии внедрения предлагаемого - СЗИ. Если риск снижен недостаточно, возможно, надо применить другое СЗИ. Вместе с определением - средства защиты надо определить какие затраты повлечет его приобретение и внедрение (затраты - могут быть как прямые, так и косвенные - см. ниже). Кроме того, необходимо оценить, безопасно ли - само это средство, не создает ли оно новых уязвимостей в системе. -

    Чтобы использовать экономически эффективные средства защиты, необходимо провести анализ - соотношения затрат и получаемого эффекта. Необходимо оценивать не только стоимость - приобретения решения, но и стоимость поддержания его работы. В затраты могут включаться:

    -
      -
    • стоимость реализации проекта, включая дополнительное программное и аппаратное обеспечение;
    • -
    • снижение эффективности выполнения системой своих основных задач;
    • -
    • внедрение дополнительных политик и процедур для поддержания средства;
    • -
    • затраты на найм дополнительного персонала или переобучение имеющегося.
    • -
    -
  8. -
  9. Документирование. Когда оценка рисков закончена, ее результаты должны быть подробно - задокументированы в стандартизованном формате. Полученный отчет может быть использован при - определении политик, процедур, бюджета безопасности и т.д.
  10. -
- - -
- -
- - - - - - - - - - - - - - diff --git a/www/general_laws.html b/www/general_laws.html deleted file mode 100644 index b9f7cff..0000000 --- a/www/general_laws.html +++ /dev/null @@ -1,569 +0,0 @@ - - - - Security is an important thing - - - - - - - - - - - - -


- - -

Доктрина информационной безопасности

-
-
-

Полное название

-

Доктрина -информационной безопасности Российской Федерации - (утверждена Указом Президента РФ от 5 декабря 2016 г. № 646)
Важное замечание: этот документ является обновлённой версией документа, с тем же названием, утвержденного президентом РФ 9 сентября 2000 года.

-

-
-
-

Как это выглядит?

- - - -
-
-

Области обеспечения ИБ:

-
    -
  1. Экономика: развитие конкурентоспособных информационных технологий, так как РФ очень зависима от зарубежных информационных технологий.
  2. -
  3. Оборона страны: требуется сдерживание, предотвращение, прогнозирование военных конфликтов при помощи ИБ.
  4. -
  5. Наука, технологии и образование: ее развитие, развитие кадрового потенциала, формирование навыков личной ИБ.
  6. -
  7. Государственная и общественная безопасность: тесно связано с обороной страны, требуется, чтобы были предотвращены различные утечки гос. данных, нейтрализованы различные проявления пропаганды через ИТ и т.п.
  8. -
- -
-
-
-
-

Что это?

-

Доктрина -информационной безопасности - это документ, в котором описаны официальные взгляды на обеспечение национальной безопасности РФ в информационной сфере.

-

А именно:

-
    -
  1. Обеспечение и защита прав и свобод граждан касательно информации,неприкосновенности частной жизни и духовно-нравственных ценностей.
  2. -
  3. Бесперебойное функционирование КИИ(ниже).
  4. -
  5. Развитие в России ИТ и электронной промышленности.
  6. -
  7. Доведение до общественности достоверной информации о государственной политике в РФ.
  8. -
  9. Содействие международной информационной безопасности.
  10. -
-
-
-

Как относится к безопасности?

-

-
    -
  1. В уголовном кодексе РФ прямо предусмотрены санкции за нарушение прав и свобод граждан и организации за нарушения в сфере информационных технологий.
  2. -
-
-
-
-
-

-

-

КИИ(критическая информационная инфраструктура РФ)-совокупность АСУ (автоматизированных систем управления) производственными и технологическими процессами критически важных объектов РФ, их взаимодействие по сетям, а также IT-систем предназначенных для государственного управления, обороноспособности, безопасности и правопорядка.

-

-
-
- -

Кодексы Российской Федерации

-
-
-

Полное название

-

Кодексы - Российской Федерации

-

-
-
-

Как это выглядит?

- - - -
-
-
-
-

Что это?

-

Кодекс - - законодательный акт, содержащий систематизированные нормы какой-либо отрасли или нескольких отраслей.

-

Примеры кодексов РФ:

-
    -
  1. Гражданский кодекс.
  2. -
  3. Трудовой кодекс.
  4. -
  5. Уголовный кодекс.
  6. -
  7. Кодекс об административных правонарушениях.
  8. -
  9. Уголовно-процессуальный кодекс.
  10. -
-
-
-

Как относится к безопасности?

-

-
    -
  1. В уголовном кодексе РФ прямо предусмотрены санкции за нарушение прав и свобод граждан и организации за нарушения в сфере информационных технологий.
  2. -
-
-
-
-
-

Статьи, предусматривающие санкции за правонарушения в сфере защиты информации:

-
    -
  1. Статья 13.12. Нарушение правил защиты информации.
  2. -
  3. Статья 13.13. Незаконная деятельность в области защиты информации.
  4. -
-

Область действия:

-

Вся информационная сфера РФ

-
-
- - -

Указ о стратегии национальной безопасности

- -
-
-

Полное название

-

Указ Президента РФ от 31.12.2015 N 683 "О Стратегии национальной безопасности Российской Федерации"

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Что это?

-

Указ Президента РФ от 31.12.2015 N 683 "О Стратегии национальной безопасности Российской Федерации" - это базовый документ по планированию развития системы обеспечения национальной - безопасности Российской Федерации, разработанный и принятый в 2009 году как основа для взаимодействия - органов государственной власти, организаций и общественных объединений Российской Федерации в области - защиты национальных интересов и обеспечения безопасности личности, общества и государства.

- -

Указ Президента РФ от 31.12.2015 N 683 "О Стратегии национальной безопасности Российской Федерации" - является базовым документом, определяющим национальные интересы и приоритеты России. Стратегия состоит из 6 основных разделов:

    -
  • Раздел I. Общие положения: указаны основные направления обеспечения национальной безопасности.
  • -
  • Раздел II. Россия в современном мире: изложены основные стратегические интересы России в современном мире и потенциальные проблемы.
  • -
  • Раздел III. Национальные интересы Российской Федерации и стратегические национальные приоритеты: представлены национальные интересы Российской Федерации на долгосрочную перспективу.
  • -
  • Раздел IV. Обеспечение национальной безопасности: рассмотрены основные направления обеспечения национальной безопасности.
  • -
  • Раздел V. Организационные, нормативные правовые и информационные основы реализации настоящей Стратегии: показывается, какие государственные органы за что отвечают.
  • -
  • Раздел VI. Основные характеристики состояния национальной безопасности: указываются основные характеристики состояния национальной безопасности.
-

- -
- -
-

Как относится к безопасности?

- -

В «Стратегии национальной безопасности» представлено официальное видение - стратегических приоритетов, целей и мер в области внутренней и внешней политики, определяющих - состояние национальной безопасности России и уровень устойчивого развития государства на - долгосрочную перспективу.

-

Цель «Стратегии национальной безопасности» - укрепление национальной безопасности и обеспечение устойчивого развития страны на долгосрочную перспективу. -

    -
  1. Нужна для объединения усилий органов государственной власти по созданию благоприятных условий для реализации национальных интересов.
  2. -
  3. Основа для формирования и реализации государственной политики в сфере обеспечения национальной безопасности
  4. -
  5. Основана на взаимосвязи нац. безопасности и социально-экономического развитии страны.
-

- -
-
- -
-
-

С чем связано?

-

Документы:

-
  • Стратегия 2020 — краткое наименование Концепции долгосрочного социально-экономического развития (КДР) Российской Федерации до 2020 года.
-

Область действия:

-

Все сферы деятельности в Российской Федерации

- -
-
- - - -

Указ об утверждении перечня сведений конфиденциального характера

-
-
-

Полное название

-

Указ Президента Российской Федерации «О внесении изменений в перечень сведений конфиденциального характера»(утвержден указом Президента Российской Федерации от 6 марта 1997 г. N 188)

-

-
-
-

Как это выглядит?

- - - -
-
-
-
-

Что это?

-

Указ Президента Российской Федерации №188 - это документ, в котором утверждается перечень сведений конфиденциального характера.

-

А именно:

-
    -
  1. Сведения о личной жизни гражданина, позволяющие идентифицировать его личность, за исключением сведений, подлежащих распространению в средствах массовой информации в установленных федеральными законами случаях.
  2. -
  3. Сведения, составляющие тайну следствия и судопроизводства, равно как и лиц, участвующих в данных процессах: судей, должностных лиц правоохранительных и контролирующих органов, потерпевших и свидетелей.
  4. -
  5. Служебные сведения, доступ к которым ограничен органами государственной власти в соответствии с Гражданским кодексом Российской Федерации и федеральными законами.
  6. -
  7. Сведения, связанные с профессиональной деятельностью: врачебной, нотариальной, адвокатской.
  8. -
  9. Сведения, связанные с коммерческой деятельностью.
  10. -
  11. Сведения о сущности изобретения, полезной модели или промышленного образца до официальной публикации информации о них.
  12. -
  13. Сведения, содержащиеся в личных делах осужденных, а также сведения о принудительном исполнении судебных актов или актов других органов, кроме сведений, являющихся общедоступными.
  14. -
-
-
-

Как относится к безопасности?

-

Указ Президента Российской Федерации №188 необходим для:

- Четкого регламентирования того, какие сведения являются конфиденциальными. -
-
-
-
-

С чем связано?

-

Область действия:

-

Конфиденциальные сведения в информационном пространстве внутри Российской Федерации.

-
-
- -

Об информации, информационных технологиях и о защите информации (ФЗ №149)

-
-
-

Полное название

-

Федеральный закон "Об информации, информационных технологиях и о защите информации"
- (от 27 июля 2006 г. N 149-ФЗ).

-

Принят Государственной Думой 8 июля 2006 года.
- Одобрен Советом Федерации 14 июля 2006 года.

-
-
-

Где можно его найти?

-

Закон доступен по ссылке.

-
-
-
-
-

Что это?

-

Закон "Об информации, информационных технологиях и о защите информации" - это закон регулирующий отношения, возникающие при осуществлении права на поиск, получение, передачу, производство информации, применении информационных технологий и обеспечении защиты информации. Является постоянно обновляемым законом, ежегодно в закон вносятся изменения.

-
-
-

Как относится к безопасности?

-

Закон "Об информации, информационных технологиях и о защите информации" необходим для определения:

-
    -
  • Категорий информации.
  • -
  • Прав доступа к этим категориям.
  • -
  • Ограничений на предоставление и распространение информации.
  • -
  • Правил, сроков и т.д. обжалования неправомерного ограничения доступа к информации.
  • -
  • Прав и обязанностей обладателей информации.
  • -
  • Правил использования информационно-телекоммуникационных сетей.
  • -
-
-
-
-
-

С чем связано?

-

Документы:

-

(Статья 4)

-

Законодательство Российской Федерации об информации, информационных технологиях и о защите информации основывается на:

-
    -
  1. Конституции Российской Федерации.
  2. -
  3. Международных договорах Российской Федерации.
  4. -
-

и состоит из:

-
    -
  1. Настоящего Федерального закона.
  2. -
  3. Других федеральных законов (которые регулируют отношения по использованию информации).
  4. -
-

Правовое регулирование отношений осуществляется в соответствии с законодательством РФ о средствах массовой информации.

-

Порядок хранения и использования включенной в состав архивных фондов документированной информации устанавливается законодательством об архивном деле в Российской Федерации.

-

Область действия:

-

(Статья 1) Настоящий Федеральный закон регулирует отношения, возникающие при:

-
    -
  1. Осуществлении права на поиск, получение, передачу, производство и распространение информации.
  2. -
  3. Применении информационных технологий.
  4. -
  5. Обеспечении защиты информации.
  6. -
-
-
- -

Закон о техническом регулировании

-
-
-

Полное название

-

Федеральный закон "О техническом регулировании"от 27.12.2002 N 184-ФЗ

-

-
-
-

Как это выглядит?

- - - -
-
-
-
-

Что это?

-

Закон "О техническом регулировании" - это документ, регламентирующий процессы и отношения, которые появляются в ходе разработки или применения обязательных норм к продукции.

-

Все обязательные требования к продукции и услугам по закону устанавливаются только техническими регламентам.

-

Техническое регулирование осуществляется по следующим принципам:

-
    -
  1. В правилах процессов производства, эксплуатации, хранения, перевозки, реализации, выполнении работ и оказания услуг не должно быть различий.
  2. -
  3. Правила должны соответствовать технологическому уровню развития страны.
  4. -
  5. Наличие единой системы и правил аккредитации.
  6. -
  7. Проведение оценки соответствия по единым правилам и методам.
  8. -
  9. Единство применения требований технических регламентов, независимо от видов или особенностей сделок.
  10. -
  11. Недопустимость ограничения конкуренции.
  12. -
  13. Полномочия на аккредитацию и сертификацию не только у одного органа.
  14. -
  15. Государственный контроль за соблюдением требований технического регламента финансируется только государством.
  16. -
-
-
-

Как относится к безопасности?

-

Закон "О техническом регулировании" необходим для:

-
    -
  • Контроля за качеством предоставляемых товаров или услуг.
  • -
  • Установки правил регулирования требований в сфере ИБ.
  • -
  • Установки соответствия описания товаров их реальным характеристикам.
  • -
  • Создания единой политики стандартизации и сертификации в области ИБ.
  • -
  • Установки соответствия отечественных и иностранных стандартов.
  • -
-
-
- -
-
-

Ограничение сферы регулирования

-

- Можно выделить следующие ограничения сферы технического регулирования: -

    -
  • Техническими регламентами регулируются не любые виды безопасности, а лишь связанные с возможностью непосредственного причинения вреда либо самой продукцией, либо в процессе ее производства.
  • -
  • Техническими регламентами регулируются лишь те виды деятельности, к субъектам которых государством не могут быть предъявлены обязательные требования иначе, чем посредством технического законодательства.
  • -
  • Техническими регламентами регулируется исключительно сфера технической безопасности, но не безопасности вообще.
  • -
  • Техническими регламентами покрывается преимущественно сфера регулирования государством разного рода видов деятельности, но не сфера выполнения государственными органами функций по обеспечению безопасности граждан, национальной безопасности и т.п.
  • -
-
-
-

Что заменил

-

- Федеральный Закон Российской Федерации "О техническом регулировании" № 184-ФЗ был принят 15 декабря 2002 года Государственной Думой и введен в действие с 1 июля 2003 года.
Он заменяет Законы РФ "О стандартизации", "О сертификации продукции и услуг", а также положения многих других законодательных актов, которые затрагивают правоотношения в сфере разработки, утверждения и применения нормативно-технических документов, подтверждения соответствия и осуществления надзора за их соблюдением. -

-
-
- -
-
-

Технический регламент

-

- Технический регламент — это документ, который устанавливает обязательные требования к продукции, работам, услугам и процессам.
Техническим регламентом может называться документ, принятый по специальной процедуре и устроенный особым образом. Принятие технических регламентов подразумевает, что министерства и ведомства не могут устанавливать обязательные требования в этой сфере. -

-

- Российская Федерация имеет право издать постановление о техническом регламенте до вступления в силу соответствующего федерального закона. При этом порядок принятия такого постановления должен полностью соответствовать требованиям Закона "О техническом регулировании". -
Правом издать указ о техническом регламенте, не придерживаясь процедуры, предусмотренной в Законе, обладает Президент Российской Федерации. Однако такой указ может быть издан в исключительных случаях, при возникновении обстоятельств, приводящих к непосредственной угрозе жизни и здоровью граждан, окружающей среде, жизни или здоровью животных и растений. -

-
-
-

Что регулируют технические регламенты?

- Технические регламенты (с учетом степени риска причинения вреда) устанавливают минимально необходимые требования, обеспечивающие: -
    -
  • Безопасность излучений.
  • -
  • Биологическую безопасность.
  • -
  • Взрывобезопасность.
  • -
  • Механическую безопасность.
  • -
  • Пожарную безопасность.
  • -
  • Промышленную безопасность.
  • -
  • Термическую безопасность.
  • -
  • Химическую безопасность.
  • -
  • Электрическую безопасность.
  • -
  • Ядерную и радиационную безопасность.
  • -
  • Электромагнитную совместимость в части обеспечения безопасности работы приборов и оборудования.
  • -
  • Единство измерений.
  • -
- -
-
- -
-
-

С чем связано?

-

Документы:

-

Техническими регламенты определяются Федеральными законами и постановлениями Правительства Российской Федерации.

-

Область действия:

-

Вся техническая сфера Российской Федерации.

-
-
- - -

- Указ президента Российской Федерации №334
- «О мерах по соблюдению законности в области разработки, производства, реализации и эксплуатации шифровальных средств, а также предоставления услуг в области шифрования информации» -

-
-
-

Полное название

-

- - УКАЗ ПРЕЗИДЕНТА РОССИЙСКОЙ ФЕДЕРАЦИИ №334
- «О мерах по соблюдению законности в области разработки, производства, реализации и эксплуатации шифровальных средств, а также предоставления услуг в области шифрования информации»
-
- (В редакции Указа Президента Российской Федерации от 25.07.2000 г. N 1358) -
-

-

-
-
-

Как это выглядит?

- - - -
-
-
-
-

Что это?

-

- УКАЗ ПРЕЗИДЕНТА РОССИЙСКОЙ ФЕДЕРАЦИИ - - «О мерах по соблюдению законности в области разработки, производства, реализации и эксплуатации шифровальных средств, а также предоставления услуг в области шифрования информации» - - - это документ, в котором устанавливаются следующие ограничения, предложения и постановления: -

    -
  1. - Программа создания и развития информационно-телекоммуникационной системы теперь работает на государство, её нужно доработать и сделать. -
  2. -
  3. - Государственным организациям нельзя пользоваться несертифицированными шифрованием и электронными подписями (лицензии выдает прокуратура). -
  4. -
  5. - Если они ими пользуются, то нельзя у них ничего заказывать. -
  6. -
  7. - Предложить Ценральному Банку бороться с банками, у которых нет/плохое шифрование. -
  8. -
  9. - Нельзя разработывать/использовать свое шифрование без предупреждения ФСБ. -
  10. -
  11. - Нельзя ввозить/использовать иностранные средства шифрования. -
  12. -
  13. - Комитеты, относящиеся к безопасности, должны следить за исполнением этого закона. -
  14. -
  15. - Нужно сформировать новый орган власти, обеспечивающий безопасность. -
  16. -
-

-
-
-

Как относится к безопасности?

-

Указ необходим для:

-
    -
  1. Регулирования сертифицирования.
  2. -
  3. Установления норм шифрования.
  4. -
  5. Направления благ криптографии на нужды государства.
  6. -
-

Где это найти?

-

Ссылка на документ

-
-
-
-
-

С чем связано?

-

Документы:

-
    -
  1. - Закон РФ "О федеральных органах правительственной связи и информации" N 2288. -
  2. -
-

Область действия:

-

Все виды шифорвания, а также государственные организации и предприятия

-
-
- - - - - - - - diff --git a/www/generator_reshetok.css b/www/generator_reshetok.css deleted file mode 100644 index 364ea2f..0000000 --- a/www/generator_reshetok.css +++ /dev/null @@ -1,24 +0,0 @@ -td { - width: 25px; - height: 25px; - background-color: black; -} -table { - /* position: absolute; - opacity: 0.5; */ - margin: 15px; - font-size: 0px; - border-collapse: collapse; - display: inline-table; - caption-side: bottom; -} -.p1, .p2, .p3, .p4 { - display: inline-block; - position: absolute; - top: 255px; -} -/* -.table:after { content: "Оригинал"; } -.table90:after { content: "90°"; } -.table180:after { content: "180°"; } -.table270:after { content: "270°"; } */ \ No newline at end of file diff --git a/www/generator_reshetok.html b/www/generator_reshetok.html deleted file mode 100644 index f7bb7f6..0000000 --- a/www/generator_reshetok.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Конструктор решёток - - - - - - - - - - - - -
123413951
5678141062
9101112151173
13141516161284
48121616151413
3711151211109
2610148765
159134321
- - - \ No newline at end of file diff --git a/www/generator_reshetok.js b/www/generator_reshetok.js deleted file mode 100644 index d863b28..0000000 --- a/www/generator_reshetok.js +++ /dev/null @@ -1,101 +0,0 @@ -var table=document.querySelector("table"); -var yach=document.querySelectorAll("td"); -var A=Create2DArray(8), i, j, k=0; -var massiv = [[1, 2, 3, 4, 13, 9, 5, 1], - [5, 6, 7, 8, 14, 10, 6, 2], - [9, 10, 11, 12, 15, 11, 7, 3], - [13, 14, 15, 16, 16, 12, 8, 4], - [4, 8, 12, 16, 16, 15, 14, 13], - [3, 7, 11, 15, 12, 11, 10, 9], - [2, 6, 10, 14, 8, 7, 6, 5], - [1, 5, 9, 13, 4, 3, 2, 1]]; -for(i=0;i<8;i++) - for(j=0;j<8;j++) - { - A[i][j]=parseInt(yach[k].innerText); - k++; - } - -function Create2DArray(rows) -{ - var arr = []; - for (var i=0;i - - - - Generic - Projection by TEMPLATED - - - - - - - - - - -
-
-
-

Nunc Dignissim

-

Aliquam erat volutpat nam dui

-
-
- Pic 01 -
-

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

- -
- Pic 02 -
-

At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.

- -

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.

- -
-
- - -
-
- -

Get in touch

- -
- -
- - -
-
- - -
-
- - -
-
    -
  • -
-
- - - -
-
- - - - - - - - - \ No newline at end of file diff --git a/www/government_laws.html b/www/government_laws.html deleted file mode 100644 index 9c24e6f..0000000 --- a/www/government_laws.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - -

Закон РФ «О государственной тайне»

-
-
-

Полное название

-

Закон Российской Федерации №5485-1 «О государственной тайне» - (с изменениями на 29 июля 2018 года)

-

-
-
-

Как это выглядит?

- - - -
- -
-
-
-

Что это?

- -

Закон Российской Федерации «О государственной тайне» - это документ, который регулирует отношения, возникающие в связи с отнесением сведений к государственной тайне, их засекречиванием или рассекречиванием и защитой в интересах обеспечения безопасности Российской Федерации.

-

В Законе освещены следующие основные моменты:

-
    -
  1. Приведён перечень сведений, составляющих государственную тайну в различных областях жизнедеятельности человека.
  2. -
  3. Определены принципы отнесения сведений к государственной тайне и засекречивания этих сведений.
  4. -
  5. Приведен перечень сведений, не подлежащих отнесению к государственной тайне и засекречиванию.
  6. -
  7. Установлены степени секретности сведений и грифы секретности носителей этих сведений.
  8. -
  9. Разработан порядок отнесения сведений к государственной тайне.
  10. -
  11. Рассмотрен порядок засекречивания сведений.
  12. -
  13. Рассмотрен порядок рассекречивания сведений.
  14. -
  15. Разработаны механизмы взаимной передачи сведений, составляющих государственную тайну, между организациями или иностранными государствами.
  16. -
  17. Определены органы защиты государственной тайны.
  18. -
  19. Определен порядок допуска должностных лиц и граждан к государственной тайне.
  20. -
  21. Приведены основания для отказа должностному лицу или гражданину в допуске к государственной тайне.
  22. -
  23. Определены условия прекращения допуска должностного лица или гражданина к государственной тайне.
  24. -
  25. Определена ответственность за нарушение законодательства Российской Федерации о государственной тайне.
  26. -
  27. Установлен порядок сертификации средств защиты информации.
  28. -
  29. Рассмотрены вопросы финансирования мероприятий по защите государственной тайны.
  30. -
  31. Определен порядок контроля за обеспечением защиты государственной тайны.
  32. -
-
- -
-

Как относится к безопасности?

- -

Закон Российской Федерации №5485-1 «О государственной тайне» (с изменениями на 29 июля 2018 года) необходим для: -
обеспечения безопасности Российской Федерации на международной арене.

-
- -
- -
-
-

С чем связано?

-

Документы:

-

Распоряжение Правительства РФ от 28 февраля 1996 г. N 286-р

-

Указ Президента РФ от 30 ноября 1995 г. N 1203 "Об утверждении перечня сведений, отнесенных к государственной тайне"

-

Постановление "О внесении изменений в некоторые акты Правительства Российской Федерации по вопросам государственной тайны"

-

Область действия:

-

Российская Федерация

-
-
- - -

Указ №1203 "Об утверждении перечня сведений, отнесенных к государственной тайне"

- -
-
-

Полное название

-

Указ Президента РФ от 30 ноября 1995 г. N 1203 "Об утверждении перечня сведений, отнесенных к государственной тайне" (с изменениями и дополнениями)

-
-
-

Как это выглядит?

- - Изображение указа №1203 - -
-
- -
-
-

Что это?

- -

Указ "Об утверждении перечня сведений, отнесенных к государственной тайне" - это документ, в котором утверждается перечень сведений, отнесенных к государственной тайне, а именно:

- -
    -
  1. Сведения в военной области:
  2. -
      -
    1. Планы применения вооруженных сил.
    2. -
    3. Планы контртеррорестических операций.
    4. -
    5. Технологии производств ядерных боеприпасов, ракетных топлив и т.д.
    6. -
    7. Сведения, раскрывающие дислокацию, назначение, степень готовности и прочие даненые не подлежащие открытому объявлению.
    8. -
    9. Сведения, раскрывающие распределение, использование полос радиочастот радиоэлектронными средствами военного или специального назначения.
    10. -
    11. Сведения, раскрывающие направления развития, содержание разработки вооружения, военной техники.
    12. - -
    -
  3. Сведения в области экономики, науки и техники:
  4. -
      -
    1. Объемы выпуска и поставок стратегических видов сельскохозяйственного сырья.
    2. -
    3. Сведения о горных выработках, метрополитенах или других сооружениях, которые могут быть использованы в интересах обороны страны.
    4. -
    5. Сведения об объемах производства, поставок стратегических видов сырья, материалов
    6. -
    7. Сведения о дислокации, предназначении, степени защищенности объектов административного управления
    8. -
    9. Сведения о подготовке и об использовании ресурсов единой сети связи Российской Федерации или ведомственных сетей связи в интересах обеспечения обороны, безопасности государства
    10. -
    11. Сведения о достижениях науки и техники, о технологиях, которые могут быть использованы в создании принципиально новых изделий, технологических процессов в различных отраслях экономики
    12. -
    13. Схемы водоснабжения городов с населением более 200 тыс. человек или железнодорожных узлов.
    14. -
    -
  5. Сведения в области внешней политики и экономики:
  6. -
      -
    1. Вопросы внешней политики, внешней торговли, раскрывающие стратегию, тактику внешней политики Российской Федерации, распространение которых может нанести ущерб безопасности государства.
    2. -
    3. Сведения, раскрывающие объемы перевозок экспортно-импортных грузов между Российской Федерацией и государствами - участниками СНГ в военное время.
    4. -
    5. Сведения об источнике информации по политическим, военным, научно-техническим или экономическим вопросам в отношении одного или ряда иностранных государств, полученные в доверительном порядке
    6. -
    7. Сведения, раскрывающие платежный баланс Российской Федерации с зарубежными странами в целом на военный период
    8. -
    9. Сведения о методах и способах защиты паспортов, иных изделий или полиграфической продукции, изготавливаемых по заказу МВД России, от подделок, методах проверки их подлинности, предназначенных только для представителей МВД России и ФСБ России
    10. -
    11. Сведения о финансовой или денежно-кредитной деятельности, преждевременное распространение которых может нанести ущерб безопасности государства
    12. -
    -
  7. Cведения в области разведывательной дейтельности и обеспечения безопасности лиц, в отношении которых принято решение о государственной защите.
  8. -
      -
    1. Сведения, раскрывающие силы, средства, результаты разведывательной деятельности.
    2. -
    3. Сведения о лицах, изучаемых в целях их привлечения к сотрудничеству на конфиденциальной основе, сотрудничающих или сотрудничавших на конфиденциальной основе с органами, осуществляющими оперативно-разыскную деятельность
    4. -
    5. Сведения о сотрудниках, выполняющих или выполнявших специальные задания в преступных группах.
    6. -
    7. Сведения об организации или о фактическом состоянии защиты государственной тайны
    8. -
    9. Сведения, раскрывающие результаты финансового мониторинга в отношении организаций и физических лиц, полученные в связи с проверкой их возможной причастности к террористической деятельности
    10. -
    -
-
- -
-

Как относится к безопасности?

- -

Указ необходим для:

-
    -
  1. Формирования государственной политики в области ИБ.
  2. -
  3. Утверджения конкретных областей информации, отнесенных к государственной тайне, для их дальнейшей защиты.
  4. -
-
-
-

С чем связано?

-

Документы:

-

Cт. 4 Закона Российской Федерации "О государственной тайне"

-

Об организации работы по отнесению сведений к государственной тайне см. распоряжение Правительства РФ от 28 февраля 1996 г. N 286-р

-

Область действия:

-

Любые сведения, находящиеся в распоряжении государства или затрагивающие национальную безопастность.

-
-
- - -

Постановление Правительства Российской Федерации N 333

-
-
-

Полное название

-

Постановление Правительства Российской Федерации №333
«О лицензировании деятельности предприятий, учреждений и организаций по проведению работ, связанных с использованием сведений, составляющих государственную тайну, созданием средств защиты информации, а также с осуществлением мероприятий и (или) оказанием услуг по защите государственной тайны» - (от 15 апреля 1995 г.)

-
-
-

Как это выглядит?

- - - -
-
-
-

Что это?

-

Постановление Правительства Российской Федерации №333 - это документ, который регулирует отношения, возникающие при лицензировании детельности различных предприятий, учреждений и организаций.

-

В Постановлении освещены следующие основные моменты:

-
    -
  1. Перечислены случаи, в которых мероприятиям необходимо пройти лицензирование.
  2. -
  3. Перечислен перечень органов, уполномоченных на ведение лицензионной деятельности и их обязанности.
  4. -
  5. Работа этих органов координируется Межведомственной комиссией по защите государственной тайны.
  6. -
  7. Перечислен перечень документов, необходимых заявителю для получения лицензии.
  8. -
  9. Описаны сроки, отведенные на решение о выдаче или об отказе в выдаче лицензии, которые увеличиваются в случае необходимости проведения дополнительной экспертизы, или если руководитель органа, уполномоченного на ведение лицензионной деятельности, считает это необходимым.
  10. -
  11. Лицензии выдаются на основании результатов специальных экспертиз предприятий и государственной аттестации их руководителей.
  12. -
  13. Перечислены указываемые в лицензии данные, факторы, влияющие на установление срока действия лиценций.
  14. -
  15. Перечислены основания для отказа в выдаче лицензии и действия, которые должен произвести орган, уполномоченный на ведение лицензионной деятельности, в случае отказа.
  16. -
  17. Описано, как экспертиза проводит проверку на защиту информации от внешнего воздействия или вмешательства в систему.
  18. -
  19. Описано, как проходит государственная аттестация руководителей предприятий и кем она проводится.
  20. -
  21. Перечислены случаи, в которых органы, уполномоченные на ведение лицензионной деятельности, приостанавливают действие лицензии
  22. -
  23. Органы, уполномоченные на ведение лицензионной деятельности, ежеквартально представляют в Межведомственную комиссию сведения о выданных и аннулированных лицензиях.
  24. -
  25. Описан контроль за соблюдением лицензионных условий лицензиатами.
  26. -
  27. Ответственность за нарушение или ненадлежащее исполнение этого постановления.
  28. -
  29. Описание того, как могут быть обжалованы решения в установленном порядке.
  30. - -
-
- -
-

Как относится к безопасности?

- -

Служит для предоставления доступа к секретной государственной информации лишь определённым предприятиям в целях защиты от утечки данных.

-
- - - -
-
-

Область действия:

-

Российская Федерация

-
-
- -

Постановление N870 "Об утверждении Правил отнесения сведений, составляющих -государственную тайну, к различным степеням секретности"

- -
-
-

Полное название

-

Постановление №870 "Об утверждении Правил отнесения сведений, составляющих - государственную тайну, к различным степеням секретности"

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Что это?

- -

Постановление N870 "Об утверждении Правил отнесения сведений, составляющих - государственную тайну, к различным степеням секретности" - это документ, в котором перечислены правила присуждения сепеней секретности различным государственным сведениям. -
Сведения по степени секретности подразделяются на:
- -

    -
  1. Сведения особой важности
  2. -
  3. Совершенно секретные сведения
  4. -
  5. Секретные сведения
  6. -
-

-

В документе утверждено следующее:

- -
    -
  1. Соответствие областей, к которым принадлежат сведения, и степеней секретности.
  2. -
  3. Формальный процесс присуждения сведениям степени секретности.
  4. -
- -
- -
-

Как относится к безопасности?

- -

Постановление необходимо для:

-
    -
  1. Формирования государственной практики определения секретности сведений
  2. - -
- -
- -
- -
-
-

С чем связано?

- -

Документы:

-

Постановление О внесении изменений в некоторые акты - Правительства Российской Федерации - по вопросам государственной тайны

-

Область действия:

-

Любые сведения, находящиеся в распоряжении государства или государственных корпораций, таких как "Росатом".

- -
-
- - - - - - - - - - - - - diff --git a/www/hash.html b/www/hash.html deleted file mode 100644 index 3dff141..0000000 --- a/www/hash.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -
-
-
-

-В общем случае в основе построения хеш-функции лежит итеративная последовательная схема. Ядром алгоритма является сжимающая функция — преобразование k входных в n выходных бит, где n — разрядность хеш-функции, а k — произвольное число, большее n. При этом сжимающая функция должна удовлетворять всем условиям криптостойкости. - -

-

-Входной поток разбивается на блоки по (k − n) бит. Алгоритм использует временную переменную размером в n бит, в качестве начального значения которой берется некое общеизвестное число. Каждый следующий блок данных объединяется с выходным значением сжимающей функции на предыдущей итерации. Значением хеш-функции являются выходные n бит последней итерации. Каждый бит выходного значения хеш-функции зависит от всего входного потока данных и начального значения. Таким образом достигается лавинный эффект. - -

-

-При проектировании хеш-функций на основе итеративной схемы возникает проблема с размером входного потока данных. Размер входного потока данных должен быть кратен (k − n). Как правило, перед началом алгоритма данные расширяются неким, заранее известным, способом. - -

-

-Помимо однопроходных алгоритмов, существуют многопроходные алгоритмы, в которых ещё больше усиливается лавинный эффект. В этом случае данные сначала повторяются, а потом расширяются до необходимых размеров. -

- -
-
- - - - - - - - - - - - diff --git a/www/header.html b/www/header.html deleted file mode 100644 index 76bce30..0000000 --- a/www/header.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/www/icon.png b/www/icon.png deleted file mode 100644 index 21ccdfe..0000000 Binary files a/www/icon.png and /dev/null differ diff --git a/www/images/404.jpg b/www/images/404.jpg deleted file mode 100644 index 021c4a2..0000000 Binary files a/www/images/404.jpg and /dev/null differ diff --git a/www/images/404_2.jpg b/www/images/404_2.jpg deleted file mode 100644 index de40291..0000000 Binary files a/www/images/404_2.jpg and /dev/null differ diff --git a/www/images/banner.jpg b/www/images/banner.jpg deleted file mode 100644 index 11d14d5..0000000 Binary files a/www/images/banner.jpg and /dev/null differ diff --git a/www/images/ciphers/Cesar.PNG b/www/images/ciphers/Cesar.PNG deleted file mode 100644 index b912f0a..0000000 Binary files a/www/images/ciphers/Cesar.PNG and /dev/null differ diff --git a/www/images/ciphers/crypt1.png b/www/images/ciphers/crypt1.png deleted file mode 100644 index acf0019..0000000 Binary files a/www/images/ciphers/crypt1.png and /dev/null differ diff --git a/www/images/ciphers/crypt2.png b/www/images/ciphers/crypt2.png deleted file mode 100644 index 8ebb0d8..0000000 Binary files a/www/images/ciphers/crypt2.png and /dev/null differ diff --git a/www/images/ciphers/crypt3.png b/www/images/ciphers/crypt3.png deleted file mode 100644 index 6c5d876..0000000 Binary files a/www/images/ciphers/crypt3.png and /dev/null differ diff --git a/www/images/ciphers/crypt4.png b/www/images/ciphers/crypt4.png deleted file mode 100644 index 98c018b..0000000 Binary files a/www/images/ciphers/crypt4.png and /dev/null differ diff --git a/www/images/ciphers/crypt5.png b/www/images/ciphers/crypt5.png deleted file mode 100644 index 34e6d26..0000000 Binary files a/www/images/ciphers/crypt5.png and /dev/null differ diff --git a/www/images/ciphers/crypt6.png b/www/images/ciphers/crypt6.png deleted file mode 100644 index 00035a4..0000000 Binary files a/www/images/ciphers/crypt6.png and /dev/null differ diff --git a/www/images/ciphers/crypt7.png b/www/images/ciphers/crypt7.png deleted file mode 100644 index aee4f32..0000000 Binary files a/www/images/ciphers/crypt7.png and /dev/null differ diff --git a/www/images/ciphers/linear congruential.svg b/www/images/ciphers/linear congruential.svg deleted file mode 100644 index 9f94e75..0000000 --- a/www/images/ciphers/linear congruential.svg +++ /dev/null @@ -1,46 +0,0 @@ - -{\displaystyle X_{n+1}=(aX_{n}+c)~~{\bmod {~}}~m,} - - - \ No newline at end of file diff --git a/www/images/ciphers/litoreia.jpg b/www/images/ciphers/litoreia.jpg deleted file mode 100644 index 2b728be..0000000 Binary files a/www/images/ciphers/litoreia.jpg and /dev/null differ diff --git a/www/images/ciphers/permutation.png b/www/images/ciphers/permutation.png deleted file mode 100644 index b0da5de..0000000 Binary files a/www/images/ciphers/permutation.png and /dev/null differ diff --git a/www/images/ciphers/shift register.jpg b/www/images/ciphers/shift register.jpg deleted file mode 100644 index 8bcf78f..0000000 Binary files a/www/images/ciphers/shift register.jpg and /dev/null differ diff --git a/www/images/ciphers/square.png b/www/images/ciphers/square.png deleted file mode 100644 index 9fef18e..0000000 Binary files a/www/images/ciphers/square.png and /dev/null differ diff --git a/www/images/hash.png b/www/images/hash.png deleted file mode 100644 index 7679485..0000000 Binary files a/www/images/hash.png and /dev/null differ diff --git a/www/images/interactive/left.jpg b/www/images/interactive/left.jpg deleted file mode 100644 index 6a79c47..0000000 Binary files a/www/images/interactive/left.jpg and /dev/null differ diff --git a/www/images/interactive/right.jpg b/www/images/interactive/right.jpg deleted file mode 100644 index ed193e3..0000000 Binary files a/www/images/interactive/right.jpg and /dev/null differ diff --git a/www/images/knight.jpg b/www/images/knight.jpg deleted file mode 100644 index fc14562..0000000 Binary files a/www/images/knight.jpg and /dev/null differ diff --git a/www/images/knight2.jpg b/www/images/knight2.jpg deleted file mode 100644 index fc3f181..0000000 Binary files a/www/images/knight2.jpg and /dev/null differ diff --git a/www/images/laws/.picasa.ini b/www/images/laws/.picasa.ini deleted file mode 100644 index 6e22fdb..0000000 --- a/www/images/laws/.picasa.ini +++ /dev/null @@ -1,2 +0,0 @@ -[doktrina.jpg] -backuphash=5108 diff --git a/www/images/laws/.picasaoriginals/.picasa.ini b/www/images/laws/.picasaoriginals/.picasa.ini deleted file mode 100644 index 57a17fa..0000000 --- a/www/images/laws/.picasaoriginals/.picasa.ini +++ /dev/null @@ -1,7 +0,0 @@ -[doktrina.jpg] -filters=crop64=1,41eb006dc6b8fe4a; -crop=rect64(41eb006dc6b8fe4a) -moddate=15ba92daad51d401 -width=800 -height=600 -textactive=0 diff --git a/www/images/laws/.picasaoriginals/doktrina.jpg b/www/images/laws/.picasaoriginals/doktrina.jpg deleted file mode 100644 index 80e1814..0000000 Binary files a/www/images/laws/.picasaoriginals/doktrina.jpg and /dev/null differ diff --git a/www/images/laws/1203.png b/www/images/laws/1203.png deleted file mode 100644 index 0c9886d..0000000 Binary files a/www/images/laws/1203.png and /dev/null differ diff --git a/www/images/laws/1358.png b/www/images/laws/1358.png deleted file mode 100644 index 50a8a39..0000000 Binary files a/www/images/laws/1358.png and /dev/null differ diff --git a/www/images/laws/184.jpg b/www/images/laws/184.jpg deleted file mode 100644 index 8c482cb..0000000 Binary files a/www/images/laws/184.jpg and /dev/null differ diff --git a/www/images/laws/188.png b/www/images/laws/188.png deleted file mode 100644 index 6f5481e..0000000 Binary files a/www/images/laws/188.png and /dev/null differ diff --git a/www/images/laws/333.png b/www/images/laws/333.png deleted file mode 100644 index 59289aa..0000000 Binary files a/www/images/laws/333.png and /dev/null differ diff --git a/www/images/laws/35.jpg b/www/images/laws/35.jpg deleted file mode 100644 index 5450fef..0000000 Binary files a/www/images/laws/35.jpg and /dev/null differ diff --git a/www/images/laws/36.png b/www/images/laws/36.png deleted file mode 100644 index c259890..0000000 Binary files a/www/images/laws/36.png and /dev/null differ diff --git a/www/images/laws/870.jpg b/www/images/laws/870.jpg deleted file mode 100644 index 44088a3..0000000 Binary files a/www/images/laws/870.jpg and /dev/null differ diff --git a/www/images/laws/codes.jpg b/www/images/laws/codes.jpg deleted file mode 100644 index b954884..0000000 Binary files a/www/images/laws/codes.jpg and /dev/null differ diff --git a/www/images/laws/doktrina.jpg b/www/images/laws/doktrina.jpg deleted file mode 100644 index 372dffa..0000000 Binary files a/www/images/laws/doktrina.jpg and /dev/null differ diff --git a/www/images/laws/gostaina.png b/www/images/laws/gostaina.png deleted file mode 100644 index 23d9232..0000000 Binary files a/www/images/laws/gostaina.png and /dev/null differ diff --git a/www/images/laws/law.png b/www/images/laws/law.png deleted file mode 100644 index 48c4730..0000000 Binary files a/www/images/laws/law.png and /dev/null differ diff --git a/www/images/laws/nationalsec.png b/www/images/laws/nationalsec.png deleted file mode 100644 index 1040bf8..0000000 Binary files a/www/images/laws/nationalsec.png and /dev/null differ diff --git a/www/images/laws/shield.png b/www/images/laws/shield.png deleted file mode 100644 index 0763897..0000000 Binary files a/www/images/laws/shield.png and /dev/null differ diff --git a/www/images/laws/strategia.jpg b/www/images/laws/strategia.jpg deleted file mode 100644 index 73f1978..0000000 Binary files a/www/images/laws/strategia.jpg and /dev/null differ diff --git a/www/images/laws/ukaz.png b/www/images/laws/ukaz.png deleted file mode 100644 index 0c9886d..0000000 Binary files a/www/images/laws/ukaz.png and /dev/null differ diff --git a/www/images/laws/zakon_pers_d.jpg b/www/images/laws/zakon_pers_d.jpg deleted file mode 100644 index 51e3c77..0000000 Binary files a/www/images/laws/zakon_pers_d.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/1.jpg b/www/images/lectures/ECP/1.jpg deleted file mode 100644 index a7ccf6c..0000000 Binary files a/www/images/lectures/ECP/1.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/10.jpg b/www/images/lectures/ECP/10.jpg deleted file mode 100644 index 138054e..0000000 Binary files a/www/images/lectures/ECP/10.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/11.jpg b/www/images/lectures/ECP/11.jpg deleted file mode 100644 index 75c6cf3..0000000 Binary files a/www/images/lectures/ECP/11.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/12.jpg b/www/images/lectures/ECP/12.jpg deleted file mode 100644 index a6d5c29..0000000 Binary files a/www/images/lectures/ECP/12.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/2.jpg b/www/images/lectures/ECP/2.jpg deleted file mode 100644 index 094fd31..0000000 Binary files a/www/images/lectures/ECP/2.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/3.jpg b/www/images/lectures/ECP/3.jpg deleted file mode 100644 index 4edcaf2..0000000 Binary files a/www/images/lectures/ECP/3.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/4.jpg b/www/images/lectures/ECP/4.jpg deleted file mode 100644 index bdda1cc..0000000 Binary files a/www/images/lectures/ECP/4.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/5.jpg b/www/images/lectures/ECP/5.jpg deleted file mode 100644 index 5d170d2..0000000 Binary files a/www/images/lectures/ECP/5.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/6.jpg b/www/images/lectures/ECP/6.jpg deleted file mode 100644 index d6d83b6..0000000 Binary files a/www/images/lectures/ECP/6.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/7.jpg b/www/images/lectures/ECP/7.jpg deleted file mode 100644 index f242035..0000000 Binary files a/www/images/lectures/ECP/7.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/8.jpg b/www/images/lectures/ECP/8.jpg deleted file mode 100644 index 1996495..0000000 Binary files a/www/images/lectures/ECP/8.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/9.jpg b/www/images/lectures/ECP/9.jpg deleted file mode 100644 index 52d99b4..0000000 Binary files a/www/images/lectures/ECP/9.jpg and /dev/null differ diff --git a/www/images/lectures/ECP/rsa.png b/www/images/lectures/ECP/rsa.png deleted file mode 100644 index bcc41a8..0000000 Binary files a/www/images/lectures/ECP/rsa.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/A5Registr.png b/www/images/lectures/Stream_Encryption/A5Registr.png deleted file mode 100644 index 793ad7d..0000000 Binary files a/www/images/lectures/Stream_Encryption/A5Registr.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Formul.PNG b/www/images/lectures/Stream_Encryption/Formul.PNG deleted file mode 100644 index 9fe27ee..0000000 Binary files a/www/images/lectures/Stream_Encryption/Formul.PNG and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Formul_2.PNG b/www/images/lectures/Stream_Encryption/Formul_2.PNG deleted file mode 100644 index 624f349..0000000 Binary files a/www/images/lectures/Stream_Encryption/Formul_2.PNG and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Formul_3.PNG b/www/images/lectures/Stream_Encryption/Formul_3.PNG deleted file mode 100644 index 8d3c870..0000000 Binary files a/www/images/lectures/Stream_Encryption/Formul_3.PNG and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr1.png b/www/images/lectures/Stream_Encryption/Registr1.png deleted file mode 100644 index 9e421ab..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr1.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr2.png b/www/images/lectures/Stream_Encryption/Registr2.png deleted file mode 100644 index e38ec98..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr2.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr3.png b/www/images/lectures/Stream_Encryption/Registr3.png deleted file mode 100644 index 153499a..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr3.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr4.png b/www/images/lectures/Stream_Encryption/Registr4.png deleted file mode 100644 index fbb16ec..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr4.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr5.png b/www/images/lectures/Stream_Encryption/Registr5.png deleted file mode 100644 index 7039e01..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr5.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Registr_shift.jpg b/www/images/lectures/Stream_Encryption/Registr_shift.jpg deleted file mode 100644 index 930674d..0000000 Binary files a/www/images/lectures/Stream_Encryption/Registr_shift.jpg and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/ShemeOfRegistr.png b/www/images/lectures/Stream_Encryption/ShemeOfRegistr.png deleted file mode 100644 index ace1731..0000000 Binary files a/www/images/lectures/Stream_Encryption/ShemeOfRegistr.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Stream_encryption.jpg b/www/images/lectures/Stream_Encryption/Stream_encryption.jpg deleted file mode 100644 index ea4d58d..0000000 Binary files a/www/images/lectures/Stream_Encryption/Stream_encryption.jpg and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Table.PNG b/www/images/lectures/Stream_Encryption/Table.PNG deleted file mode 100644 index afbbc77..0000000 Binary files a/www/images/lectures/Stream_Encryption/Table.PNG and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Teor1.png b/www/images/lectures/Stream_Encryption/Teor1.png deleted file mode 100644 index 2ca2c6b..0000000 Binary files a/www/images/lectures/Stream_Encryption/Teor1.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Teor2.png b/www/images/lectures/Stream_Encryption/Teor2.png deleted file mode 100644 index ef51966..0000000 Binary files a/www/images/lectures/Stream_Encryption/Teor2.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Teor3.png b/www/images/lectures/Stream_Encryption/Teor3.png deleted file mode 100644 index d2346c5..0000000 Binary files a/www/images/lectures/Stream_Encryption/Teor3.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Teor4.png b/www/images/lectures/Stream_Encryption/Teor4.png deleted file mode 100644 index e591d18..0000000 Binary files a/www/images/lectures/Stream_Encryption/Teor4.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/Teor5.png b/www/images/lectures/Stream_Encryption/Teor5.png deleted file mode 100644 index 0ddf444..0000000 Binary files a/www/images/lectures/Stream_Encryption/Teor5.png and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/fourRegistr.jpg b/www/images/lectures/Stream_Encryption/fourRegistr.jpg deleted file mode 100644 index dba3a0c..0000000 Binary files a/www/images/lectures/Stream_Encryption/fourRegistr.jpg and /dev/null differ diff --git a/www/images/lectures/Stream_Encryption/line_registr.png b/www/images/lectures/Stream_Encryption/line_registr.png deleted file mode 100644 index 1897bc5..0000000 Binary files a/www/images/lectures/Stream_Encryption/line_registr.png and /dev/null differ diff --git a/www/images/lectures/Tcoibl11_2_new.png b/www/images/lectures/Tcoibl11_2_new.png deleted file mode 100644 index 038aacb..0000000 Binary files a/www/images/lectures/Tcoibl11_2_new.png and /dev/null differ diff --git a/www/images/lectures/a5/1.PNG b/www/images/lectures/a5/1.PNG deleted file mode 100644 index 4e75d7c..0000000 Binary files a/www/images/lectures/a5/1.PNG and /dev/null differ diff --git a/www/images/lectures/chema_sc.png b/www/images/lectures/chema_sc.png deleted file mode 100644 index 9753429..0000000 Binary files a/www/images/lectures/chema_sc.png and /dev/null differ diff --git a/www/images/lectures/cramm/1.jpg b/www/images/lectures/cramm/1.jpg deleted file mode 100644 index 3be737e..0000000 Binary files a/www/images/lectures/cramm/1.jpg and /dev/null differ diff --git a/www/images/lectures/ethalon_LC/ethalon_model.jpg b/www/images/lectures/ethalon_LC/ethalon_model.jpg deleted file mode 100644 index 8ff0c0f..0000000 Binary files a/www/images/lectures/ethalon_LC/ethalon_model.jpg and /dev/null differ diff --git a/www/images/lectures/frap/1.png b/www/images/lectures/frap/1.png deleted file mode 100644 index df709e7..0000000 Binary files a/www/images/lectures/frap/1.png and /dev/null differ diff --git a/www/images/lectures/info_attacks/ba.png b/www/images/lectures/info_attacks/ba.png deleted file mode 100644 index 2881777..0000000 Binary files a/www/images/lectures/info_attacks/ba.png and /dev/null differ diff --git a/www/images/lectures/info_attacks/badpo.png b/www/images/lectures/info_attacks/badpo.png deleted file mode 100644 index 201c5c9..0000000 Binary files a/www/images/lectures/info_attacks/badpo.png and /dev/null differ diff --git a/www/images/lectures/info_attacks/infoattack.jpg b/www/images/lectures/info_attacks/infoattack.jpg deleted file mode 100644 index 6870d3d..0000000 Binary files a/www/images/lectures/info_attacks/infoattack.jpg and /dev/null differ diff --git a/www/images/lectures/info_attacks/site.jpg b/www/images/lectures/info_attacks/site.jpg deleted file mode 100644 index 98236ee..0000000 Binary files a/www/images/lectures/info_attacks/site.jpg and /dev/null differ diff --git a/www/images/lectures/microsoft/1.png b/www/images/lectures/microsoft/1.png deleted file mode 100644 index 1ff2e63..0000000 Binary files a/www/images/lectures/microsoft/1.png and /dev/null differ diff --git a/www/images/lectures/microsoft/2.png b/www/images/lectures/microsoft/2.png deleted file mode 100644 index 1750ebd..0000000 Binary files a/www/images/lectures/microsoft/2.png and /dev/null differ diff --git a/www/images/lectures/microsoft/3.png b/www/images/lectures/microsoft/3.png deleted file mode 100644 index adc03f4..0000000 Binary files a/www/images/lectures/microsoft/3.png and /dev/null differ diff --git a/www/images/lectures/microsoft/4.png b/www/images/lectures/microsoft/4.png deleted file mode 100644 index aa77c67..0000000 Binary files a/www/images/lectures/microsoft/4.png and /dev/null differ diff --git a/www/images/lectures/microsoft/5.png b/www/images/lectures/microsoft/5.png deleted file mode 100644 index 5d0dce6..0000000 Binary files a/www/images/lectures/microsoft/5.png and /dev/null differ diff --git a/www/images/lectures/microsoft/8.png b/www/images/lectures/microsoft/8.png deleted file mode 100644 index 221f569..0000000 Binary files a/www/images/lectures/microsoft/8.png and /dev/null differ diff --git a/www/images/lectures/octave/1.png b/www/images/lectures/octave/1.png deleted file mode 100644 index 838f59f..0000000 Binary files a/www/images/lectures/octave/1.png and /dev/null differ diff --git a/www/images/lectures/riskwatch/1.png b/www/images/lectures/riskwatch/1.png deleted file mode 100644 index cb7d015..0000000 Binary files a/www/images/lectures/riskwatch/1.png and /dev/null differ diff --git a/www/images/lectures/riskwatch/2.png b/www/images/lectures/riskwatch/2.png deleted file mode 100644 index 2517ac0..0000000 Binary files a/www/images/lectures/riskwatch/2.png and /dev/null differ diff --git a/www/images/lectures/ruk_doc/rd1.JPG b/www/images/lectures/ruk_doc/rd1.JPG deleted file mode 100644 index 8eb1a38..0000000 Binary files a/www/images/lectures/ruk_doc/rd1.JPG and /dev/null differ diff --git a/www/images/lectures/ruk_doc/rd2.JPG b/www/images/lectures/ruk_doc/rd2.JPG deleted file mode 100644 index 95c32f7..0000000 Binary files a/www/images/lectures/ruk_doc/rd2.JPG and /dev/null differ diff --git a/www/images/lectures/ruk_doc/rd3.JPG b/www/images/lectures/ruk_doc/rd3.JPG deleted file mode 100644 index 684fde7..0000000 Binary files a/www/images/lectures/ruk_doc/rd3.JPG and /dev/null differ diff --git a/www/images/lectures/ruk_doc/rd4.JPG b/www/images/lectures/ruk_doc/rd4.JPG deleted file mode 100644 index 52190fe..0000000 Binary files a/www/images/lectures/ruk_doc/rd4.JPG and /dev/null differ diff --git a/www/images/lectures/shennon/names.jpg b/www/images/lectures/shennon/names.jpg deleted file mode 100644 index 60d130d..0000000 Binary files a/www/images/lectures/shennon/names.jpg and /dev/null differ diff --git a/www/images/main/cat.png b/www/images/main/cat.png deleted file mode 100644 index 8994e06..0000000 Binary files a/www/images/main/cat.png and /dev/null differ diff --git a/www/images/pic01.jpg b/www/images/pic01.jpg deleted file mode 100644 index be4fa14..0000000 Binary files a/www/images/pic01.jpg and /dev/null differ diff --git a/www/images/pic02.jpg b/www/images/pic02.jpg deleted file mode 100644 index 44d28d3..0000000 Binary files a/www/images/pic02.jpg and /dev/null differ diff --git a/www/index.html b/www/index.html index db889c1..7a9e59b 100644 --- a/www/index.html +++ b/www/index.html @@ -1,121 +1,96 @@ - - + - - Security is an important thing - - - - - - - + + + ����������� ����� "� ������������ �����" �� 29.07.2004 N 98-�� + + + + - + - - +


��������� ��������� ������ � ������������ �����


+ ��������� ��������� ��������� ��-98 � 2014 ����. �� ������ ���� ������ ������� ����-��� � ������� ������������, ������� ���� �������� � ���������� �����, ����������������� ����������� �������� ��.

+����� ���� ������� ������ 6.1, � ����� ������������ ������������ ������ ������������ �����. ������ ������������� ���� �� ���������������� ����������, �� ���������, ������ � ������ �������� ����� �������������� ������ ����� ������������ ������� ������. ����� �������� ���� ������ ���������� ���������� ������ ��������� ���������� ������������������ �� ���, ������� � ��� ������. + +

��������� ��������� ��������� 11 ������ ������, ���������������� ������ ������. ���, ������ ������������ ������:


+ � ��������� �� ����������� ��������� ������������������ ����� ����������� �������� ���������;
+� ��������� �� ���������� ���������� �������, ��������� � ������������ ������������ �����, ���� ��� ������ ���� �� ��������. + + +

����� ������ ������������� ����������� ������������ �� ��������� �� ����������, ����������� ������������ ����� (�. 1) � ������������, ����������� �� ��������� �������� (�. 6, 7). + + + + - -
-
-
-
-
- Pic 01 -
-
-

Deus Vult

-
-

Maybe there is will be something important

- -
-
-
- Pic 02 -
-
-

We are the Light in the Darkness

-
-

Maybe there is will be something important

- -
-
-
-
+ - - - - - - + - - +
+ < +
+ + + \ No newline at end of file diff --git a/www/interactive.html b/www/interactive.html deleted file mode 100644 index 7725154..0000000 --- a/www/interactive.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -
-
-
-
-
- Pic 01 -
-
-

Deus Vult

-
-

Maybe there is will be something important

- -
-
-
- Pic 02 -
-
-

We are the Light in the Darkness

-
-

Maybe there is will be something important

- -
-
-
-
- - - - - - - - - - - diff --git a/www/introduction.html b/www/introduction.html deleted file mode 100644 index e97246c..0000000 --- a/www/introduction.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - - -
-
-

О чем предмет ИБ?

-

Информационная безопасность это:

-
    -
  • состояние сохранности информационных ресурсов и -защищенности законных прав личности и общества в информационной сфере.
  • -
  • процесс обеспечения конфиденциальности, -целостности и доступности информации.
  • -
  • все аспекты, связанные с определением, достижением и -поддержанием конфиденциальности, целостности, доступности, неотказуемости, -подотчётности, аутентичности и достоверности информации или средств её обработки.
  • -
- -

Конфиденциальность: Обеспечение доступа к информации только авторизованным -пользователям.

-

Целостность: Обеспечение достоверности и полноты информации и методов ее обработки.

-

Доступность: Обеспечение доступа к информации и связанным с ней активам авторизованных -пользователей по мере необходимости.

- -

Безопасность информации — состояние защищенности данных, при котором обеспечиваются -их конфиденциальность, доступность и целостность.

- -

Принципы и концепция информационной безопасности.

-

Доктрина информационной безопасности Российской Федерации — совокупность официальных -взглядов на цели, задачи, принципы и основные направления обеспечения -информационной безопасности Российской Федерации.

-

Основные понятия :

-

Информация — это сведения о лицах, предметах, фактах, событиях и процессах. На -сегодняшний день в научно-правовой литературе выделяется более двадцати видов -информации по ее отраслевой принадлежности и востребованности в обществе -(правовая, научная, финансовая, банковская, коммерческая, медицинская и т.д.).

-

Информационная сфера (среда) — сфера деятельности субъектов, связанная с -созданием, преобразованием и потреблением информации.

-

Информация:

-
    -
  • Открытая
  • -
  • Ограниченного доступа -
      -
    • Конфиденциальная информация(сведения)
    • -
    • Государственная тайна
    • -
    -
  • -
-

Конфиденциальная информация — доверительная, не подлежащая огласке -информация, доступ к которой ограничивается в соответствии с законодательством.(тайна частной жизни, профессиональная, служебная, коммерческая тайна)

- -

Тайна частной жизни — это охраняемые законом конфиденциальные сведения, -составляющие личную и семейную тайну лица, незаконное собирание или -распространение которых причиняет вред правам и законным интересам этого лица и -предоставляет ему право на защиту в соответствии с законодательством Российской -Федерации.

-

Профессиональная тайна — это охраняемые законом конфиденциальные сведения, -доверенные или ставшие известными лицу исключительно в силу исполнения им -своих профессиональных обязанностей, не связанных с государственной или -муниципальной службой, незаконное получение или распространение которых может -повлечь за собой вред правам и законным интересам другого лица, доверившего эти -сведения, и привлечение к ответственности в соответствии с действующим -законодательством.

-

Служебная тайна — это охраняемая законом конфиденциальная информация о -деятельности государственных органов, доступ к которой ограничен федеральным -законом или в силу служебной необходимости, а также ставшая известной в -государственных органах и органах местного самоуправления только на законном -основании и в силу исполнения их представителями служебных обязанностей, -имеющая действительную или потенциальную ценность в силу неизвестности ее -третьим лицам.

-

Коммерческая тайна — это охраняемые законом конфиденциальные сведения в -области производственно-хозяйственной, управленческой, финансовой деятельности -организации, имеющие действительную или потенциальную ценность в силу -неизвестности их третьим лицам, к ним нет свободного доступа на законном -основании, обладатель сведений принимает меры к их конфиденциальности, -незаконное получение, использование или разглашение которых создает угрозу -причинения вреда владельцу этих сведений и предоставляет ему право на -возмещение причиненных убытков или уголовно-правовую защиту в соответствии с -законодательством Российской Федерации.

-

Государственная тайна — защищаемые государством сведения в области его военной, -внешнеполитической, экономической, разведывательной, контрразведывательной и -оперативно-розыскной деятельности, распространение которых может нанести ущерб -безопасности Российской Федерации. Указанные в данном определении сведения -конкретизированы в Перечне сведений, относящихся к государственной тайне.

-

Право на информацию:

-
    -
  • право на получение информации(публичное право)
  • -
  • право на распоряжение информацией(исключительное право)
  • -
-

В основе понятия «информационная безопасность» лежит понятие «безопасность»

-

Безопасность — это состояние защищенности жизненно важных интересов личности, -общества, государства от внутренних и внешних угроз. К жизненно важным интересам -закон относит совокупность потребностей, удовлетворение которых надежно -обеспечивает существование и возможности прогрессивного развития личности, -общества и государства.

-

Основные объекты безопасности:

-
    -
  • личность, ее права и свободы
  • -
  • общество, его материальные и духовные ценности
  • -
  • государство, его конституционный строй, суверенитет и территориальная целостность
  • -
-

Таким образом,информационная безопасность — это состояние защищенности жизненно -важных интересов личности, общества, государства в информационной сфере от -внешних и внутренних угроз, обеспечивающее ее формирование, использование и -развитие.

-

Защищённость — совокупность правовых, научно-технических, -специальных, организационных мер, направленных на своевременное выявление, -предупреждение и пресечение неправомерного получения и распространения -защищаемой информации.

-

Правовые меры — деятельность законодательных органов по созданию правовой -базы, обеспечивающей надлежащее формирование, распространение и -использование информации.

-

Научно-технические меры — деятельность субъектов, осуществляющих свою работу в -информационной сфере, направленная на своевременное и активное использование -достижений научно-технического прогресса в обеспечении информационной -безопасности, а также участие в разработке новых технологий, программ, научно -обоснованных способов защиты информации.

-

Специальные меры — деятельность государственных органов, уполномоченных -осуществлять разведывательные, контрразведывательные, оперативно-розыскные -мероприятия, направленные на упреждающее получение информации о планах, -намерениях, устремлениях специальных служб, информационных и иных -организаций, конкурентов и частных лиц, с использованием специальных технических -средств, иных источников информации.

-

Организационные меры — деятельность субъектов по обеспечению физической, -технической защиты информации, оборудования и носителей информации.

-

Одним из важнейших аспектов информационной безопасности является определение -и классификация возможныхугроз безопасности.

- -

Что такое угроза безопасности?

-

Угроза безопасности — совокупность условий и факторов, создающих опасность -жизненно важным интересам личности, общества и государства. В Законе РФ «О безопасности» и Доктрине информационной безопасности РФ угрозы подразделяются на внешние и внутренние.

-

Квнешнимисточникам угроз информационной безопасности РФ относятся:

-
    -
  • деятельность иностранных разведывательных и информационных структур, а также международных террористических организаций;
  • -
  • обострение международной конкуренции за обладание информационными технологиями и ресурсами;
  • -
  • увеличение технологического отрыва ведущих государств мира и наращивание их возможностей по противодействию созданию конкурентоспособных российских информационных технологий.
  • -
-

Квнутреннимисточникам угроз относятся:

-
    -
  • критическое состояние отечественных отраслей промышленности;
  • -
  • неблагоприятная криминогенная обстановка;
  • -
  • недостаточная координация деятельности федеральных органов власти, в области обеспечения информационной безопасности РФ;
  • -
  • недостаточная разработанность нормативной правовой базы, регулирующей отношения в информационной сфере, а также недостаточная правоприменительная практика;
  • -
  • низкое финансирование мероприятий по обеспечению информационной безопасности;
  • -
  • отставание России от ведущих стран мира по уровню информатизации в жизненно важных сферах государственной деятельности и ряд других источников угроз.
  • -
-

Классификации угроз безопасности -автоматизированным информационным системам:

-

по источнику угрозы:

-
    -
  • внешние — связанные со стихийными бедствиями, техногенными, политическими, -социальными факторами, развитием информационных и коммуникационных -технологий, другими внешними воздействиями;
  • -
  • внутренние — связанные с отказами вычислительной и коммуникационной техники, -ошибками программного обеспечения.
  • -
-

по природе возникновения:

-
    -
  • естественные (объективные) — вызванные воздействием на информационную среду -объективных физических процессов или стихийных природных явлений, не зависящих -от воли человека;
  • -
  • искусственные (субъективные) — вызванные воздействием на информационную -сферу человека. -
      -
    • непреднамеренные (случайные) угрозы — -ошибки программного обеспечения, персонала, отказы вычислительной и коммуникационной техники и т.д.;
    • -
    • преднамеренные (умышленные) угрозы — -неправомерный доступ к информации, разработка специального программного обеспечения, используемого для осуществления неправомерного доступа, разработка и распространение вирусных программ и т.д.
    • -
    -
  • -
-

по принципу воздействия:

-
    -
  • с использованием доступа;
  • -
  • с использованием скрытых каналов.
  • -
-

по цели реализации, нарушение:

-
    -
  • конфиденциальности;
  • -
  • целостности;
  • -
  • доступности.
  • -
-

по характеру воздействия:

-
    -
  • активные;
  • -
  • пассивные.
  • -
-

по объекту воздействия, угрозы, воздействующие:

-
    -
  • на информационную среду в целом;
  • -
  • на ее отдельные элементы.
  • -
-

Классификация основных угрозпо степени их опасности:

-
    -
  • несанкционированный доступ;
  • -
  • пожары;
  • -
  • умышленное нарушение нормальной работы (заражение вирусами, умышленный ввод искаженных данных, умышленный вывод из строя оборудования и его хищения);
  • -
  • использование программного обеспечения, содержащего ошибки.
  • -
-

Основныепринципы обеспечения безопасности из закона РФ «О безопасности» :

-
    -
  • законность;
  • -
  • соблюдение баланса жизненно важных интересов личности, общества и государства;
  • -
  • взаимная ответственность личности, общества и государства по обеспечению безопасности;
  • -
  • интеграция с международными системами безопасности.
  • -
-

Применительно к информационной безопасности, можно выделитьпринципы обоснованности, своевременности и прогноза.

-
    -
  • Принцип обоснованности. Защите подлежит прежде всего информация ограниченного доступа, т.е. информация, незаконное получение и распространение которой может причинить вред гражданину, обществу и государству. Необоснованная защита информации, прежде всего ограничение доступа к ней, посягает на конституционные права граждан на информацию, а в отдельных случаях препятствует развитию экономики, научно-технического прогресса, отношений в жизненно важных областях деятельности общества и государства. Принцип обоснованности заключается в установлении путем экспертной оценки целесообразности ограничения доступа к конкретной информации, выделении вероятных экономических и иных последствий этого акта исходя из баланса жизненно важных интересов личности, общества, государства, разработки адекватных мер противодействия внешним и внутренним угрозам информационной безопасности.
  • -
  • Принцип своевременности защитыинформационной сферы позволяет реализовать процедуру предварительного ограничения доступа к защищаемой информации, осуществлять ее защиту и заключается в установлении ограничений на распространение этой информации с момента ее получения, разработки или заблаговременно. Значение этого принципа заключается прежде всего в том, что ограничение доступа к защищаемой информации, информационным системам, если не исключает полностью, то делает маловероятной возможность совершения преступных посягательств в данной сфере. На практике своевременность достигается путем разработки и четкого исполнения положений концепции и системы защиты объекта, на котором сконцентрированы технические средства, средства связи, информация, подлежащая защите. Система защиты включает в себя совокупность правовых, научно-технических, специальных и организационных мер. Особое значение данного принципа проявляется в тех случаях, когда та или иная тема, проект, исследование находятся на стадии разработки, изучения, анализа, и при этом разработчики не уделяют должного внимания ограничению доступа к результатам работы, используют незащищенные каналы и средства связи, ЭВМ, привлекают к работе непроверенных специалистов и т.д. Как известно, новые разработки, направления исследований, технологии представляют повышенный интерес и являются приоритетным направлением в деятельности разведывательных органов иностранных государств, промышленного шпионажа, конкурентов, преступных элементов.
  • -
  • Принцип прогноза информационной безопасностизаключается в выделении конкретных внешних и внутренних угроз к охраняемой информационной сфере и базируется на объективной, реальной оценке охраняемых объектов - информации, инфраструктуры, субъектов, связанных с созданием, преобразованием и потреблением информации; моделировании возможной противоправной деятельности, посягающей на информационную безопасность. Прогноз осуществляется на основе уже имеющихся материалов о работе российских и зарубежных правоохранительных органов по выявлению, предупреждению и пресечению противоправной деятельности в информационной сфере, изучения и анализа практики защиты информации, информационной инфраструктуры, а также путем активного применения достижений науки и техники, особенно в области модернизации и совершенствования возможностей ЭВМ. Значение данного принципа заключается в том, что создается вероятность осуществлять мероприятия по обеспечению информационной безопасности в упреждающем режиме и за счет этого снизить потери, ущерб от преступных устремлений противников, конкурентов, преступников.
  • -
-
- - - -
- - - - - - - - - - - - - - diff --git a/www/laws.html b/www/laws.html deleted file mode 100644 index cbff9c3..0000000 --- a/www/laws.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Security is an important thing - - - - - - - - - - - - - - - - -


-

Введение в нормативно-правовые руководящие документы и законы РФ

- -
-
-

Введение

-

Широкое распространение вычислительной техники как средства обработки информации привело к информатизации - общества - и появлению принципиально новых, так называемых, информационных технологий.

-

Появление любых новых технологий, как правило, имеет как положительные, так и отрицательные стороны. Тому - множество - примеров. Атомные и химические технологи, решая проблемы энергетики и производства новых материалов, породили - экологические проблемы. Интенсивное развитие транспорта обеспечило быструю и удобную доставку людей, сырья, - материалов и товаров в нужных направлениях, но и материальный ущерб и человеческие жертвы при транспортных - катастрофах возросли.

-

Информационные технологии не являются исключением из этого правила, поэтому следует заранее позаботиться о - безопасности при разработке и использовании таких технологий.

-

От степени безопасности информационных технологий в настоящее время зависит благополучие, а порой и жизнь многих - людей. Такова плата за усложнение и повсеместное распространение автоматизированных систем обработки информации.

-

Под информационной безопасностью понимается защищенность информационной системы от случайного или преднамеренного - вмешательства, наносящего ущерб владельцам или пользователям информации.

-

Чтобы обеспечить режим информационной безопасности, необходимо создать нормативно-правовую базу документов.

-

В Российской Федерации существуют законы и нормативно-правовые руководящие документы, которые обеспечивают режим - информационной безопасности.

- -

К группе общих законов относятся нормативно-правовые документы, являющиеся основополагающими для информационной - безопасности РФ в целом.

-

К группе законов, посвященных государственной тайне, относятся нормативно-правовые документы, в которых - описывается:

-
    -
  • перечень сведений, отнесенных к государственной тайне;
  • -
  • правило присуждения степеней секретности;
  • -
  • отношения, возникающие в связи с отнесением сведений к государственной тайне, их засекречиванием или - рассекречиванием и защитой в интересах обеспечения безопасности РФ;
  • -
  • список случаев, когда необходимо лицензировать деятельность различных организаций, занимающихся обработкой - сведений, составляющих государственную тайну.
  • -
-

К группе законов, посвященных персональным данным, относятся нормативно-правовые документы, в которых - описывается:

-
    -
  • перечень сведений, относящихся к персональным данным;
  • -
  • требования, предъявляемые к защите персональных данных при их обработке;
  • -
  • правила работы с электронной подписью.
  • -
-

К группе законов, посвященных коммерческой тайне, относятся нормативно-правовые документы, в которых описывается:

-
    -
  • перечень сведений, относящихся к коммерческой тайне;
  • -
  • правила передачи такой информации, охраны ее конфиденциальности и предупреждение недобросовестной конкуренции;
  • -
  • список видов деятельности, которые подлежат лицензированию.
  • -
-
-
-

Как это выглядит?

- - - -
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/www/lectures.html b/www/lectures.html deleted file mode 100644 index 40f83a1..0000000 --- a/www/lectures.html +++ /dev/null @@ -1,553 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - -
-
- - - - -
- - |
|
|
|
v -
- - -
- |
|
|
|
v -
- - - - -
- |
|
|
|
v -
- - - - -
- |
|
|
|
v -
- - - - -
- |
|
|
|
v -
- - - - - -
- |
|
|
|
v -
- - - - -
- - - - - - -
-
- |
|
|
|
v -
- - - - - - - - - - -
- |
|
|
|
v -
- - - - - - - -
- |
|
|
|
v -
- - - - - -
- |
|
|
|
v -
- - - - - - -
-
- - - - - - - - - - - - - - - diff --git a/www/lifecycle_security.html b/www/lifecycle_security.html deleted file mode 100644 index 21d306e..0000000 --- a/www/lifecycle_security.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- -
-
-

LifecycleSecurity

-

LifecycleSecurity — это обобщенная схема построения комплексной защиты компьютерной сети предприятия. Выполнение описываемого в ней набора процедур позволяет системно решать задачи, связанные с защитой информации, и дает возможность оценить эффект от затраченных средств и ресурсов. С этой точки зрения, идеология LifecycleSecurity может быть противопоставлена тактике “точечных решений”, заключающейся в том, что все усилия сосредотачиваются на внедрении отдельных частных решений (например, межсетевых экранов или систем аутентификации пользователей по смарт-картам).

-

7 этапов построения системы защиты

-

Назначение каждого компонента — постоянно улучшать стойкость системы к атакам любого рода (внутренние или внешние).

-
-
- Политики безопасности, стандарты, процедуры и метрики. -

Этот компонент определяет рамки, в которых осуществляются мероприятия по обеспечению безопасности информации, и задает критерии оценки полученных результатов. Метрика определяет, в чем и как измеряем защищенность системы, и позволяет соотнести сделанные затраты и полученный эффект.

-
-
- Анализ рисков -

Этот этап является отправной точкой для установления и поддержания эффективного управления системой защиты. Проведение анализа рисков позволяет подробно описать состав и структуру информационной системы (если по каким-то причинам это не было сделано ранее), расположить имеющиеся ресурсы по приоритетам, основываясь на степени их важности для нормальной работы предприятия, оценить угрозы и идентифицировать уязвимости системы.

-
-
- Стратегический план построения системы защиты -

Результаты анализа рисков используются как основа для разработки стратегического плана построения системы защиты. Наличие подобного плана помогает распределить по приоритетам бюджеты и ресурсы, и в последующем осуществить выбор продуктов и разработать стратегию их внедрения.

-
-
- Выбор и внедрение решений -

Хорошо структурированные критерии выбора решений в сфере защиты информации и наличие программы внедрения уменьшает вероятность приобретения продуктов, становящихся «мертвым грузом», мешающим развитию информационной системы предприятия. Кроме непосредственно выбора решений, также должно учитываться качество предоставляемых поставщиками сервисных и обучающих услуг. Кроме того, необходимо четко определить роль внедряемого решения в выполнении разработанных планов и достижении поставленных целей в сфере безопасности.

-
-
- Обучение персонала -

Знания в области компьютерной безопасности и технические тренинги необходимы для построения и обслуживания безопасной вычислительной среды. Усилия, затраченные на обучение персонала, значительно повышают шансы на успех мероприятий по защите сети.

-
-
- Мониторинг защиты -

Он помогает обнаруживать аномалии или вторжения в ваши компьютеры и сети и является средством контроля над системой защиты, чтобы гарантировать эффективность программ защиты информации.

-
-
- Разработка методов реагирования в случае инцидентов и восстановление -

Без наличия заранее разработанных и «отрепетированных» процедур реагирования на инциденты в сфере безопасности невозможно гарантировать, что в случае обнаружения атаки ей будут противопоставлены эффективные меры защиты, и работоспособность системы будет быстро восстановлена. Все компоненты программы взаимосвязаны и предполагается, что процесс совершенствования системы защиты идет непрерывно.

-
-
-

Остановимся чуть более подробно на этапе анализа рисков. По мнению разработчиков модели LifecycleSecurity, он должен проводиться в следующих случаях:

-
    -
  1. до и после обновления или существенных изменений в структуре системы;
  2. -
  3. до и после обновления или существенных изменений в структуре системы;
  4. -
  5. до и после перехода на новые технологии;
  6. -
  7. до и после подключения к новым сетям (подключения локальной сети филиала к сети головного офиса);
  8. -
  9. до и после подключения к глобальным сетям (в первую очередь, Интернет);
  10. -
  11. до и после изменений в порядке ведения бизнеса (например, при открытии электронного магазина);
  12. -
  13. периодически, для проверки эффективности системы защиты.
  14. -
-
-
- - - - - - - - - - - - - - diff --git a/www/litoreia.html b/www/litoreia.html deleted file mode 100644 index 9e48949..0000000 --- a/www/litoreia.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - Litoreia - - - - - - - - - - -
-
-
-

Литорея

-

Тарабарская грамота

-
- - - -
-
-

Что такое литорея?

-

Литоре́я (от лат. littera — буква) — вид шифровального письма, которое употреблялось в древнерусской рукописной литературе.

-

-
-
-

Как это выглядит?

- - -
-

Один из примеров тарабарского письма, относящегося к простым литореям

-
-
-
- -
- -
-
-

Откуда появилось?

-

Известна была эта тайнопись ещё в 15 веке. Её называли также литореей или риторским письмом. Сначала тарабарская грамота служила дипломатической шифровкой. Потом долгое время использовалась старообрядцами в их тайной переписке. Название же риторское письмо делает возможным предположение о том, что эта тайнопись воспринималось как письмо риторов, учёных книжников.

-

-
-
-

Суть простыми словами?

-

Это, по-существу, не шифрование, а намеренное искажение слов, которое могло быть и письменным, и устным: произношение (написание) задом-наперед, добавление после каждого слова (или каждого слога в слове) какого-либо условленного заранее слога, произношение слогов, образующих слова, в обратном порядке.

-
-
- -
- - -

Алгоритмы шифрования

-

Разбиение на слоги (Затейное письмо)

-

Секрет данного способа заключался в простой перестановке, когда текст сообщения разбивался на слоги, и последние переставляли вместе с буквами по заранее заданному принципу, иногда каждая буква заменялась своим особым, причудливым знаком.

-

Пример:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ШагиОписаниеИзменения
1Берем фразу, которую хотим закодироватьВОЗЬМИ СУМУ
2Разбиваем на слогиВОЗЬ-МИ СУ-МУ
3Берем слово, которое будет ключомСЕКРЕТ
4Разбиваем ключ по слогамСЕ-КРЕТ
5Перемешиваем слоги, начиная с ключаСЕ-ВОЗЬ-КРЕТ-МИ-СЕ-СУ-КРЕТ-МУ
6ИтогСЕВОЗЬКРЕТМИСЕСУКРЕТМУ
-
- -

Шифратор

- -
-
- -
-
- -
-
- -
-
-
-

Результат:

-

Зашифруйте сообщение чтобы увидеть результат

-
-

-
-
-

-
-
-

-
-
-

-
- -
- -

Дешифратор

- -
-
- -
-
- -
-
-
-

Результат:

-

Дешифруйте сообщение чтобы увидеть результат

- - -
- - - - - - - - - - - - - - - - diff --git a/www/md5.html b/www/md5.html deleted file mode 100644 index 19df430..0000000 --- a/www/md5.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
- -
-

История возникновения

-

MD5 (англ. Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или дайджестов сообщения произвольной длины и последующей проверки их подлинности. Широко применялся для проверки целостности информации и хранения хешей паролей.

-

Был разработан в 1991 году как более надёжный вариант предыдущего алгоритма MD4. Описан в RFC 1321. Позже Гансом Доббертином были найдены недостатки алгоритма MD4.

-

В 1993 году Берт ден Бур (Bert den Boer) и Антон Босселарс (Antoon Bosselaers) показали, что в алгоритме возможны псевдоколлизии, когда разным инициализирующим векторам соответствуют одинаковые дайджесты для входного сообщения. - В 1996 году Ганс Доббертин (Hans Dobbertin) объявил о коллизии в алгоритме, и уже в то время было предложено использовать другие алгоритмы хеширования, такие как Whirlpool, SHA-1 или RIPEMD-160. - Из-за небольшого размера хеша в 128 бит можно рассматривать birthday-атаки.

-

18 марта 2006 года исследователь Властимил Клима (Vlastimil Klima) опубликовал алгоритм, который может найти коллизии за одну минуту на обычном компьютере, метод получил название «туннелирование». - В конце 2008 года US-CERT призвал разработчиков программного обеспечения, владельцев веб-сайтов и пользователей прекратить использовать MD5 в любых целях, так как исследования продемонстрировали ненадёжность этого алгоритма.

-
- -
-

Схема работы

-
-
- -

Схема работы алгоритма MD5

-
-
-
-

На вход алгоритма поступает входной поток данных, хеш которого необходимо найти. Длина сообщения измеряется в битах и может быть любой (в том числе нулевой). Запишем длину сообщения в L. Это число целое и неотрицательное. Кратность каким-либо числам необязательна. После поступления данных идёт процесс подготовки потока к вычислениям.

-
-

1. Выравнивание потока.

Сначала к концу потока дописывают единичный бит. Затем добавляют некоторое число нулевых бит такое, чтобы новая длина потока L' стала сравнима с 448 по модулю 512, (L' = 512 × N + 448). Выравнивание происходит в любом случае, даже если длина исходного потока уже сравнима с 448.

-

2. Добавление длины сообщения.

В конец сообщения дописывают 64-битное представление длины данных (количество бит в сообщении) до выравнивания. Сначала записывают младшие 4 байта, затем старшие. Если длина превосходит 264-1 , то дописывают только младшие биты (эквивалентно взятию по модулю 264 ). После этого длина потока станет кратной 512. Вычисления будут основываться на представлении этого потока данных в виде массива слов по 512 бит.

-

3. Инициализация буфера.

Для вычислений инициализируются 4 переменных размером по 32 бита и задаются начальные значения шестнадцатеричными числами (порядок байтов little-endian, сначала младший байт):

-
-

А = 01 23 45 67; // 67452301h

-

В = 89 AB CD EF; // EFCDAB89h

-

С = FE DC BA 98; // 98BADCFEh

-

D = 76 54 32 10. // 10325476h

-
-

В этих переменных будут храниться результаты промежуточных вычислений. Начальное состояние ABCD называется инициализирующим вектором.

Определим ещё функции и константы, которые нам понадобятся для вычислений.

-
    -
  • Потребуются 4 функции для четырёх раундов. Введём функции от трёх параметров — слов, результатом также будет слово: -

    1-й раунд: FunF(X,Y,Z) = (X ∧ Y) ∨ (¬X ∧ Z),

    -

    2-й раунд: FunG(X,Y,Z) = (X ∧ Y) ∨ (¬Z ∧ Y),

    -

    3-й раунд: FunH(X,Y,Z) = (X ⊕ Y ⊕ Z),

    -

    4-й раунд: FunI(X,Y,Z) = Y ⊕ (¬Z ∨ X),

    -

    где ⊕ ,∧ ,∨ ,¬ побитовые логические операции XOR, AND, OR и NOT соответственно.

  • -
  • Определим таблицу констант T[1...64] — 64-элементная таблица данных, построенная следующим образом: T[n] = int(232 ⋅ |sin n|).
  • -
  • Каждый 512-битный блок проходит 4 этапа вычислений по 16 раундов. Для этого блок представляется в виде массива X из 16 слов по 32 бита. Все раунды однотипны и имеют вид: [abcd k s i], определяемый как a = b + ((a + Fun(b,c,d) + X[k] + T[i]) <<< s), где k — номер 32-битного слова из текущего 512-битного блока сообщения, и ... <<< s — циклический сдвиг влево на s бит полученного 32-битного аргумента. Число s задается отдельно для каждого раунда.
  • -
-

4. Вычисление в цикле.

Заносим в блок данных элемент n из массива 512-битных блоков. Сохраняются значения A, B, C и D, оставшиеся после операций над предыдущими блоками (или их начальные значения, если блок первый).

-
-

AA = A

-

BB = B

-

CC = C

-

DD = D

-
-

Этап 1

-
-

/* [abcd k s i] a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

-

[ABCD 0 7 1][DABC 1 12 2][CDAB 2 17 3][BCDA 3 22 4]

-

[ABCD 4 7 5][DABC 5 12 6][CDAB 6 17 7][BCDA 7 22 8]

-

[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA 11 22 12]

-

[ABCD 12 7 13][DABC 13 12 14][CDAB 14 17 15][BCDA 15 22 16]

-
-

Этап 2

-
-

/* [abcd k s i] a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */

-

[ABCD 1 5 17][DABC 6 9 18][CDAB 11 14 19][BCDA 0 20 20]

-

[ABCD 5 5 21][DABC 10 9 22][CDAB 15 14 23][BCDA 4 20 24]

-

[ABCD 9 5 25][DABC 14 9 26][CDAB 3 14 27][BCDA 8 20 28]

-

[ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA 12 20 32]

-
-

Этап 3

-
-

/* [abcd k s i] a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

-

[ABCD 5 4 33][DABC 8 11 34][CDAB 11 16 35][BCDA 14 23 36]

-

[ABCD 1 4 37][DABC 4 11 38][CDAB 7 16 39][BCDA 10 23 40]

-

[ABCD 13 4 41][DABC 0 11 42][CDAB 3 16 43][BCDA 6 23 44]

-

[ABCD 9 4 45][DABC 12 11 46][CDAB 15 16 47][BCDA 2 23 48]

-
-

Этап 4

-
-

/* [abcd k s i] a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

-

[ABCD 0 6 49][DABC 7 10 50][CDAB 14 15 51][BCDA 5 21 52]

-

[ABCD 12 6 53][DABC 3 10 54][CDAB 10 15 55][BCDA 1 21 56]

-

[ABCD 8 6 57][DABC 15 10 58][CDAB 6 15 59][BCDA 13 21 60]

-

[ABCD 4 6 61][DABC 11 10 62][CDAB 2 15 63][BCDA 9 21 64]

-
-

Суммируем с результатом предыдущего цикла:

-
-

A = AA + A

-

B = BB + B

-

C = CC + C

-

D = DD + D

-
-

После окончания цикла необходимо проверить, есть ли ещё блоки для вычислений. Если да, то переходим к следующему элементу массива (n + 1) и повторяем цикл.

-

5. Результат вычислений.

Результат вычислений находится в буфере ABCD, это и есть хеш. Если выводить побайтово, начиная с младшего байта A и закончив старшим байтом D, то мы получим MD5-хеш. 1, 0, 15, 34, 17, 18…

- -
- -
-

Сравнение MD5 и MD4

-

Алгоритм MD5 происходит от MD4. В новый алгоритм добавили ещё один раунд, теперь их стало 4 вместо 3 в MD4. Добавили новую константу для того, чтобы свести к минимуму влияние входного сообщения, в каждом раунде на каждом шаге и каждый раз константа разная, она суммируется с результатом F и блоком данных. Изменилась функция G = XZ ∨ (Y¬Z) вместо XY ∨ XZ ∨ YZ . Результат каждого шага складывается с результатом предыдущего шага, из-за этого происходит более быстрое изменение результата. Для этой же цели оптимизирована величина сдвига на каждом круге. Изменился порядок работы с входными словами в раундах 2 и 3.

-

Пример MD5: (Хеш содержит 128 бит (16 байт) и обычно представляется как последовательность из 32 шестнадцатеричных цифр)

-

MD5("md5") = 1BC29B36F623BA82AAF6724FD3B16718

- -
-
-

Примеры использования

-

Ранее считалось, что MD5 позволяет получать относительно надёжный идентификатор для блока данных. На данный момент данная хеш-функция не рекомендуется к использованию, так как существуют способы нахождения коллизий с приемлемой вычислительной сложностью. Свойство уникальности хеша широко применяется в разных областях. Стоит отметить, что приведенные примеры относятся и к другим криптографическим хеш-функциям.

-

С помощью MD5 проверяли целостность и подлинность скачанных файлов — так, некоторые программы поставляются вместе со значением контрольной суммы. Например, пакеты для инсталляции свободного ПО.

-

MD5 использовался для хеширования паролей. В системе UNIX каждый пользователь имеет свой пароль и его знает только пользователь. Для защиты паролей используется хеширование. Предполагалось, что получить настоящий пароль можно только полным перебором. При появлении UNIX единственным способом хеширования был DES (Data Encryption Standard), но им могли пользоваться только жители США, потому что исходные коды DES нельзя было вывозить из страны. Во FreeBSD решили эту проблему. Пользователи США могли использовать библиотеку DES, а остальные пользователи имеют метод, разрешённый для экспорта. Поэтому в FreeBSD стали использовать MD5 по умолчанию. Некоторые Linux-системы также используют MD5 для хранения паролей.

-

Многие системы используют базы данных для аутентификации пользователей и существует несколько способов хранения паролей:

-
    -
  1. Пароли хранятся как есть. При взломе такой базы все пароли станут известны.
  2. -
  3. Хранятся только хеши паролей. Найти пароли можно используя заранее подготовленные таблицы хешей. Такие таблицы составляются из хешей простых или популярных паролей.
  4. -
  5. К каждому паролю добавляется несколько случайных символов (их называют «соль») и результат хешируется. Полученный хеш вместе с «солью» сохраняются в открытом виде. Найти пароль с помощью таблиц таким методом не получится.
  6. -
-

Существует несколько надстроек над MD5.

-
    -
  • MD5 (HMAC) — Keyed-Hashing for Message Authentication (хеширование с ключом для аутентификации сообщения) — алгоритм позволяет хешировать входное сообщение L с некоторым ключом K, такое хеширование позволяет аутентифицировать подпись.
  • -
  • MD5 (Base64) — здесь полученный MD5-хеш кодируется алгоритмом Base64.
  • -
  • MD5 (Unix) — алгоритм вызывает тысячу раз стандартный MD5, для усложнения процесса. Также известен как MD5crypt.
  • -
-
-
- - - - - - - - - - - - - - - \ No newline at end of file diff --git a/www/md5.png b/www/md5.png deleted file mode 100644 index ef898c5..0000000 Binary files a/www/md5.png and /dev/null differ diff --git a/www/microsoft.html b/www/microsoft.html deleted file mode 100644 index d1a8c43..0000000 --- a/www/microsoft.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

В файле ничего не найдено.

-
- - -
-

Общая информация

-

Процесс управления рисками, предлагаемый корпорацией Майкрософт, разбивает этап оценки рисков на - следующие три шага:

-
    -
  1. Планирование - разработка основы для успешной оценки рисков.
  2. -
  3. Координированный сбор данных - cбор информации о рисках в ходе координированных обсуждений - рисков.
  4. -
  5. Приоритизация рисков - ранжирование выявленных рисков на основе непротиворечивого и - повторяемого процесса.
  6. -
-

Для проведения оценки требуется собрать данные о:

-
    -
  • Активах организации.
  • -
  • Угрозах безопасности.
  • -
  • Уязвимостях.
  • -
  • Текущей среде контроля (прим. в принятой авторами перевода руководства терминологии средства и - меры защиты информации называются элементами контроля, соответственно, среда контроля - совокупность - элементов).
  • -
  • Предлагаемые элементы контроля.
  • -
-

Активами считается все, что представляет ценность для организации. К материальным активам относится - физическая инфраструктура (например, центры обработки данных, серверы и имущество). К нематериальным - активам относятся данные и другая ценная для организации информация, хранящаяся в цифровой форме - (например, банковские транзакции, расчеты платежей, спецификации и планы разработки продуктов). В - некоторых организациях может оказаться полезным определение третьего типа активов - ИТ-служб. ИТ- - служба представляет собой сочетание материальных и нематериальных активов. Например, это может быть - корпоративная служба электронной почты.

-

Процесс управления рисками безопасности, предлагаемый корпорацией Майкрософт, определяет следующие - три качественных класса активов:

-
    -
  1. высокое влияние на бизнес (ВВБ) - влияние на конфиденциальность, целостность и доступность этих - активов может причинить организации значительный или катастрофический ущерб. Например, к этому - классу относятся конфиденциальные деловые данные.
  2. -
  3. среднее влияние на бизнес (СВБ) - влияние на конфиденциальность, целостность и доступность этих - активов может причинить организации средний ущерб. Средний ущерб не вызывает значительных или - катастрофических изменений, однако нарушает нормальную работу организации до такой степени, что - это требует проактивных элементов контроля для минимизации влияния в данном классе активов. К - этому классу могут относиться внутренние коммерческие данные, такие как перечень сотрудников или - данные о заказах предприятия.
  4. -
  5. низкое влияние на бизнес (НВБ) - активы, не попадающие в классы ВВБ и СВБ, относятся к классу - НВБ. К защите подобных активов не выдвигаются формальные требования, и она не требует - дополнительного контроля, выходящего за рамки стандартных рекомендаций по защите - инфраструктуры. Например, это могут быть общие сведения о структуре организации.
  6. -
-

Далее определяется перечень угроз и уязвимостей и выполняется оценка уровня потенциального ущерба, - называемого степенью подверженности актива воздействию. Оценка ущерба может проводиться по - различным категориям:

-
    -
  • Конкурентное преимущество.
  • -
  • Законы и регулятивные требования.
  • -
  • Операционная доступность.
  • -
  • Репутация на рынке.
  • -
-

Оценку предлагается проводить по следующей шкале:

-
    -
  • Высокая подверженность воздействию - значительный или полный ущерб для актива.
  • -
  • Средняя подверженность воздействию - средний или ограниченный ущерб.
  • -
  • Низкая подверженность воздействию - незначительный ущерб или отсутствие такового.
  • -
-

Следующий шаг - оценка частоты возникновения угроз:

-
    -
  • Высокая - вероятно возникновение одного или нескольких событий в пределах года.
  • -
  • Средняя - влияние может возникнуть в пределах двух-трех лет.
  • -
  • Низкая - возникновение влияния в пределах трех лет маловероятно.
  • -
-

Следующий шаг этапа оценки рисков - приоритизация рисков, т.е. создание упорядоченного по приоритетам - списка рисков. Формирование данного списка сначала предлагается выполнить на обобщенном уровне, после - чего описания наиболее существенных рисков детализируются.

-

Исходя из значения класса актива и оценки подверженности актива воздействию по таблице, приведенной - на рис.1 определяется уровень влияния.

-
- -
-
Рис.1 Определение уровня влияния по классу актива и уровню подверженности воздействию
-
-

Итоговый уровень риска определяется исходя из уровня влияния и оценки частоты возникновения риска, для - которой используется шкала:

-
    -
  • Высокая - вероятно возникновение одного или нескольких влияний в течение года
  • -
  • Средняя - влияние может хотя бы один раз возникнуть в течение двух или трех лет
  • -
  • Низкая - возникновение влияния в течение трех лет маловероятно.
  • -
-
- -
-
Рис.2 Определение итогового уровня риска
-
-

Полученные оценки заносятся в таблицу

-
- -
-
Рис.3 Пример перечня рисков на обобщенном уровне
-
-

Для детального изучения (составления «перечня на уровне детализации») отбираются риски, отнесенные по - результатам оценки на обобщенном уровне к одной из трех групп:

-
    -
  • риски высокого уровня;
  • -
  • граничные риски: риски среднего уровня, которые необходимо снижать;
  • -
  • противоречивые риски: риск является новым и знаний об этом риске у организации недостаточно или - различные заинтересованные лица оценивают этот риск по-разному.
  • -
-

Формирование перечня рисков на уровне детализации является последней задачей процесса оценки рисков. В - этом перечне каждому риску в итоге сопоставляется оценка в числовой (денежной) форме.

-

Вновь определяются:

-
    -
  • величина влияния и подверженности воздействию;
  • -
  • текущие элементы контроля;
  • -
  • вероятности влияния;
  • -
  • уровень риска.
  • -
-

Уровень подверженности воздействию оценивается по пятибалльной шкале. Шкала для угрозы целостности и - конфиденциальности приведена на рис. 4. Для угрозы отказа в обслуживании - на рис. 5. В качестве - итогового уровня подверженности воздействию предлагается выберите максимальное значение.

-
- -
-
Рис.4 Уровни подверженности воздействию для угроз конфиденциальности и целостности
-
- -
- -
-
Рис.5 Уровни подверженности воздействию для доступности
-
-

После определения уровня подверженности воздействию производится оценка величины влияния. Каждому - уровню подверженности воздействию сопоставляется значение в процентах, отражающее величину ущерба, - причиненного активу, и называемое фактором подверженности воздействию. Майкрософт, рекомендует - использовать линейную шкалу подверженности воздействию от 100 до 20%, которая может изменяться в - соответствии с требованиями организации. Кроме того, каждой величине влияния сопоставляется - качественная оценка: высокая, средняя или низкая.

- -

Следующая задача - определение вероятности влияния. Результирующий уровень вероятности определяется - на основании двух значений. Первое значение определяет вероятность существования уязвимости в текущей - среде. Второе значение определяет вероятность существования уязвимости исходя из эффективности текущих - элементов контроля. Каждое значение изменяется в диапазоне от 1 до 5. Определение оценки проводится на - основе ответов на вопросы, перечень которых представлен на рис. 6, с последующим переходом к - результирующей оценке (рис. 7). При этом разработчики руководства указывают, что оценка вероятности - взлома имеет субъективный характер и предлагают при проведении оценки уточнять приведенный перечень.

-

Переход от числовой оценки к оценке по шкале «высокий», «средний» или «низкий» можно сделать в - соответствии с таблицей, представленной на рис. 8

-
- -
-
Рис.8 Результирующее качественное ранжирование
-
- -

В заключение процедуры оценки рисков, проводится количественный анализ. Чтобы определить - количественные характеристики, необходимо выполнить следующие задачи.

-
    -
  • Сопоставить каждому классу активов в организации денежную стоимость.
  • -
  • Определить стоимость актива для каждого риска.
  • -
  • Определить величину ожидаемого разового ущерба
  • -
  • Определить ежегодную частоту возникновения
  • -
  • Определить ожидаемый годовой ущерб
  • -
-

Количественную оценку предлагается начать с активов, соответствующих описанию класса ВВБ. Для каждого - актива определяется денежная стоимость с точки зрения его материальной и нематериальной ценности для - организации. Также учитывается:

-
    -
  • Стоимость замены.
  • -
  • Затраты на обслуживание и поддержание работоспособности.
  • -
  • Затраты на обеспечение избыточности и доступности.
  • -
  • Влияние на репутацию организации.
  • -
  • Влияние на эффективность работы организации.
  • -
  • Годовой доход.
  • -
  • Конкурентное преимущество.
  • -
  • Внутренняя эффективность эксплуатации.
  • -
  • Правовая и регулятивная ответственность.
  • -
-

После определения стоимостей классов активов необходимо определить и выбрать стоимость каждого риска.

-

Следующей задачей является определение степени ущерба, который может быть причинен активу. Для - расчетов предлагается использовать ранее определенный уровень подверженности воздействию, на основе - которого определяется фактор подверженности воздействию (рекомендуемая формула пересчета - - умножение значения уровня (в баллах) на 20%).

-

И после этого вычисляется по особым формулам.

-

Подводя итог, можно еще раз отметить, что процесс управления рисками безопасности, предлагаемый - корпорацией Майкрософт, использует комбинированный подход включающий оценку рисков на качественном - уровне на начальном этапе и количественную оценку - на заключительном.

-
- -
- - - - - - - - - - - - - - diff --git a/www/multi_level_protection.html b/www/multi_level_protection.html deleted file mode 100644 index 8f3afd7..0000000 --- a/www/multi_level_protection.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- -
-
-

Модель многоуровневой защиты

-

Понятие многоуровневой защиты или эшелонированной обороны, а в английской версии - Defence (амер. Defense) in depth, пришло в информационные технологии из военных руководств.

-

С точки зрения информационной безопасности, модель многоуровневой защиты определяет набор уровней защиты информационной системы. Модель часто используется корпорацией Майкрософт в руководствах по безопасности. Корректная организация защиты на каждом из выделенных уровней, позволяет уберечь систему от реализации угроз информационной безопасности.

-

Политика безопасности должна описывать все аспекты работы системы с точки зрения обеспечения информационной безопасности. Поэтому уровень политики безопасности можно рассматривать как базовый. Этот уровень также подразумевает наличие документированных организационных мер защиты (процедур) и порядка информирования о происшествиях, обучение пользователей в области информационной безопасности и прочие меры аналогичного характера (например, рекомендуемые стандартом ISO/IEC 17799). -

-
-
- Уровень физической защиты -

Включает меры по ограничению физического доступа к ресурсам системы - защита помещений, контроль доступа, видеонаблюдение и т.д. Сюда же относятся средства защиты мобильных устройств, используемых сотрудниками в служебных целях.

-
-
- Уровень защиты периметра -

Определяет меры безопасности в "точках входа" в защищаемую сеть из внешних, потенциально опасных. Классическим средством защиты периметра является межсетевой экран (англ. термин - firewall), который на основании заданных правил определяет, может ли проходящий сетевой пакет быть пропущен в защищаемую сеть. Другие примеры средств защиты периметра - системы обнаружения вторжений, средства антивирусной защиты для шлюзов безопасности и т.д.

-
-
- Уровень защиты внутренней сети -

Отвечает за обеспечение безопасности передаваемого внутри сети трафика и сетевой инфраструктуры. Примеры средств и механизмов защиты на этом уровне - создание виртуальных локальных сетей (VLAN) с помощью управляемых коммутаторов, защита передаваемых данных с помощью протокола IPSec и т.д. Нередко внутри сети также используют средства, характерные для защиты периметра, например, межсетевые экраны, в том числе и персональные (устанавливаемые на защищаемый компьютер). Связано это с тем, что использование беспроводных сетевых технологий и виртуальных частных сетей (VPN) приводит к "размыванию" периметра сети. Например, если атакующий смог подключиться к точке беспроводного доступа внутри защищаемой сети, его действия уже не будут контролироваться межсетевым экраном, установленным "на границе" сети, хотя формально атака будет производиться с внешнего по отношению к нашей сети компьютера. Поэтому иногда при анализе рассматривают "уровень защиты сети", включающий и защиту периметра, и внутренней сети.

-
-
- Уровень защиты узлов -

Здесь рассматриваются атаки на отдельный узел сети и, соответственно, меры защиты от них. Может учитываться функциональность узла и отдельно рассматриваться защита серверов и рабочих станций. В первую очередь, необходимо уделять внимание защите на уровне операционной системы - настройкам, повышающим безопасностьконфигурации (в том числе, отключению не использующихся или потенциально опасных служб), организации установки исправлений и обновлений, надежной аутентификации пользователей. Исключительно важную роль играет антивирусная защита.

-
-
- Уровень защиты приложений -

Отвечает за защиту от атак, направленных на конкретные приложения - почтовые серверы, web-серверы, серверы баз данных. В качестве примера можно назвать SQL-инъекции - атаки на сервер БД, заключающиеся в том, что во входную текстовую строку включаются операторы языка SQL, что может нарушить логику обработки данных и привести к получению нарушителем конфиденциальной информации. Сюда же можно отнести модификацию приложений компьютерными вирусами. Для защиты от подобных атак используются настройки безопасности самих приложений, установка обновлений, средства антивирусной защиты.

-
-
- Уровень защиты данных -

Определяет порядок защиты обрабатывающихся и хранящихся в системе данных от несанкционированного доступа и других угроз. В качестве примеров контрмер можно назвать разграничение доступа к данным средствами файловой системы, шифрование данных при хранении и передаче.

-

В процессе идентификации рисков определяется, что является целью нарушителя, и на каком уровне или уровнях защиты можно ему противостоять. Соответственно выбираются и контрмеры. Защита от угрозы на нескольких уровнях снижает вероятность ее реализации, а значит, и уровень риска.

-

На основе концепции DiD разработан ряд методик управления рисками и поддерживающих их программных продуктов. В частности, это программа Microsoft Security Assessment Tool (MSAT).

-
-
- - - - - - - - - - - - - - diff --git a/www/octave.html b/www/octave.html deleted file mode 100644 index d88cc8d..0000000 --- a/www/octave.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

OCTAVE (Operationally Critical Threat, Asset, and Vulnerability Evaluation) - методика поведения оценки рисков в - организации, разрабатываемая институтом Software Engineering Institute (SEI) при университете Карнеги - Меллон (Carnegie Mellon University).

-
- - -
-

Общая информация

-

Особенность данной методики заключается в том, что весь процесс анализа производится силами - сотрудников организации, без привлечения внешних консультантов. Для этого создается смешанная группа, - включающая как технических специалистов, так и руководителей разного уровня, что позволяет всесторонне - оценить последствия для бизнеса возможных инцидентов в области безопасности и разработать контрмеры.

- -

OCTAVE предполагает три фазы анализа:

-
    -
  1. разработка профиля угроз, связанных с активом;
  2. -
  3. идентификация инфраструктурных уязвимостей;
  4. -
  5. угрозы, связанные со сбоями в работе системы;
  6. -
- -

Профиль угрозы включает в себя указания на актив (asset), тип доступа к активу (access), источник - угрозы (actor), тип нарушения или мотив (motive), результат (outcome) и ссылки на описания угрозы в - общедоступных каталогах. По типу источника, угрозы в OCTAVE делятся на:

-
    -
  1. угрозы, исходящие от человека-нарушителя, действующего через сеть передачи данных;
  2. -
  3. угрозы, исходящие от человека-нарушителя, использующего физический доступ;
  4. -
  5. разработка стратегии и планов безопасности.
  6. -
  7. прочие.
  8. -
- -

Результат может быть раскрытие (disclosure), изменение (modification), потеря или разрушение - (loss/destruction) информационного ресурса или разрыв подключения. Отказ в обслуживании (interruption).

-

Методика OCTAVE предлагает при описании профиля использовать «деревья вариантов», пример подобного - дерева для угроз класса 1 приведен на рис. 1. При создании профиля угроз рекомендуется избегать обилия - технических деталей - это задача второго этапа исследования. Главная задача первой стадии - - стандартизованным образом описать сочетание угрозы и ресурса.

-
- -
-
Рис1. Дерево вариантов, использующееся при описании профиля
-
-

Вторая фаза исследования системы в соответствии с методикой - идентификация инфраструктурных - уязвимостей. В ходе этой фазы определяется инфраструктура, поддерживающая существование выделенного - ранее актива (например, если это БД отдела кадров, то для работы с ней нужен сервер, на котором база - размещена, рабочая станция служащего отдела кадров и т.д.) и то окружение, которое может позволить - получить к ней доступ (например, соответствующий сегмент локальной сети). Рассматриваются компоненты - следующих классов: сервер, сетевое оборудование, СЗИ, персональные компьютеры, домашние - персональные компьютеры «надомных» пользователей, работающих удаленно, но - имеющих доступ в сеть организации, мобильные компьютеры, системы хранения, беспроводные устройства и прочее.

-

Группа, проводящая анализ для каждого сегмента сети, отмечает, какие компоненты в нем проверяются на - наличие уязвимостей. Уязвимости проверяются сканерами безопасности уровня операционной системы, - сетевыми сканерами безопасности, специализированными сканерами (для конкретных web-серверов, СУБД и - проч.), с помощью списков уязвимостей (checklists), тестовых скриптов.

-

Для каждого компонента определяется:

-
    -
  • список уязвимостей, которые надо устранить немедленно (high-severity vulnerabilities);
  • -
  • список уязвимостей, которые надо устранить в ближайшее время (middle-severity vulnerabilities);
  • -
  • список уязвимостей, в отношении которых не требуется немедленных действий (low-severity vulnerabilities).
  • -
-

По результатам стадии готовится отчет, в котором указывается, какие уязвимости обнаружены, какое влияние - они могут оказать на выделенные ранее активы, какие меры надо предпринять для устранения уязвимостей.

-

Разработка стратегии и планов безопасности - третья стадия исследования системы. Она начинается с оценки - рисков, которая проводится на базе отчетов по двум предыдущим этапам. В OCTAVE при оценке риска дается - только оценка ожидаемого ущерба, без оценки вероятности. Шкала: высокий (high), средний (middle), низкий - (low). Оценивается финансовый ущерб, ущерб репутации компании, жизни и здоровью клиентов и - сотрудников, ущерб, который может вызвать судебное преследование в результате того или иного инцидента. - Описываются значения, соответствующие каждой градации шкалы (например, для малого предприятия - финансовый ущерб в $10000 - высокий, для более крупного - средний).

-

Далее, разрабатывают планы снижения рисков нескольких типов:

-
    -
  • долговременные;
  • -
  • на среднюю перспективу;
  • -
  • списки задач на ближайшее время.
  • -
-

Для определения мер противодействия угрозам в методике предлагаются каталоги средств.

-

Хотелось бы еще раз подчеркнуть, что в отличие от прочих методик, OCTAVE не предполагает привлечения - для исследования безопасности ИС сторонних экспертов, а вся документация по OCTAVE общедоступна и - бесплатна, что делает методику особенно привлекательной для предприятий с жестко ограниченным - бюджетом, выделяемым на цели обеспечения ИБ.

-
- -
- - - - - - - - - - - - - - diff --git a/www/other_laws.html b/www/other_laws.html deleted file mode 100644 index 502b33f..0000000 --- a/www/other_laws.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- - - -

ПП №608 "О сертификации средств защиты информации"

- -
-
-

Полное название

-

... ...

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Что это?

- -

... - это ...

- -
- -
-

Как относится к безопасности?

- -

... ...

- -
- -
- -
-
-

С чем связано?

- -

Документы:

-

...

-

Область действия:

-

...

-
-
- - - - - - - - - - - - - diff --git a/www/permutation.html b/www/permutation.html deleted file mode 100644 index ec18881..0000000 --- a/www/permutation.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - Permutation - - - - - - - - - - -
-
-
-

Шифр перестановки

-

Шифр одинарной перестановки

-
- - - -
-
-

Что такое шифр перестановки?

-

Шифр перестано́вки — это метод симметричного шифрования, в котором элементы исходного открытого текста меняют местами. Элементами текста могут быть отдельные символы (самый распространённый случай), пары букв, тройки букв, комбинирование этих случаев и так далее. Типичными примерами перестановки являются анаграммы. В классической криптографии шифры перестановки можно разделить на два класса: - - Шифры одинарной (простой) перестановки — при шифровании символы открытого текста перемещаются с исходных позиций в новые один раз. - - Шифры множественной (сложной) перестановки — при шифровании символы открытого текста перемещаются с исходных позиций в новые несколько раз.

-

-
-
-

Как это выглядит?

- - -
-

Скитала — инструмент, используемый для осуществления перестановочного шифрования, в криптографии известный также как шифр Древней Спарты. Представляет собой цилиндр и узкую полоску пергамента, на которой писалось сообщение, обматывавшуюся вокруг него по спирали.

-
-
-
- -
- -
-
-

Откуда появилось?

-

Точное время появления шифра перестановки не известно. Вполне возможно, что писцы в древности переставляли буквы в имени своего царя ради того, чтобы скрыть его подлинное имя или в ритуальных целях. - -Одно из древнейших известных нам шифровальных устройств — Скитала. Бесспорно известно, что скитала использовалась в войне Спарты против Афин в конце V века до н. э. - -Прародителем анаграммы считают поэта и грамматика Ликофрона, который жил в Древней Греции в III веке до н. э. Как сообщал византийский автор Иоанн Цец, из имени царя Птоломея он составил первую из известных нам анаграмм: Ptolemaios — Аро Melitos, что в переводе означает «из мёда», а из имени царицы Арсинои — как «Ion Eras» (фиалка Геры).

-

-
-
-

Суть простыми словами?

-

Мы переставляем буквы местами и записываем, в каком порядке ти буквы стояли до этого. Человек, получающий этот записанный порядок может расшифровать наше сообщение.

-
-
- -
- - -

Алгоритмы шифрования

-

Перестановка букв

-

Мы переставляем буквы изначального слова местами, вместе с ними переставляя номера их позиций, в которых они стояли до этого. Зная, какая буква на какой позиции стояла до шифрования, мы можем с легкостью дешифровать.

-

Пример:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ШагиОписаниеИзменения
1Берем фразу, которую хотим закодироватьПРИВЕТ
2Записываем, какая буква на какой позиции стоит123456
3Переставляем буквы местамиРПЕВИТ
4Цифры переставляем вместе с буквами на соответсвующие места215436
5ИтогРПЕВИТ
-
- -

Шифратор

- -
- -
- -
-
- -
-
-
-

Результат:

-

Зашифруйте сообщение чтобы увидеть результат

-
-

-
-
-

-
-
- - - - - - - - - - -
-
-

-
- -
- -

Дешифратор

- -
-
- -
-
- -
-
- -
-
-
-

Результат:

-

Дешифруйте сообщение чтобы увидеть результат

- - -
- - - - - - - - - - - - - - - - diff --git a/www/personal_data.html b/www/personal_data.html deleted file mode 100644 index da8e972..0000000 --- a/www/personal_data.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- - - -

Закон "О персональных данных"

- -
-
-

Полное название

-

Федеральный закон от 27.07.2006 N 152-ФЗ(ред. от 31.12.2017) "О персональных данных"

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Что это?

- -

Федеральный закон "О персональных данных" - это документ, который регулирует отношения, связанные с обработкой персональных данных (далее ПД).

-

Законодательство РФ в области ПД основывается на Конституции РФ и международных договорах. Состоит из настоящего Федерального закона и других, определяющих случаи и особенности обработки ПД.
Целью закона является защита прав и свобод человека и гражданина при обработке его ПД (в том числе защиты прав на неприкосновенность частной жизни, личную и семейную тайну).

- -
- -
-

Как относится к безопасности?

- -

С правовой точки зрения защищают персональные данные от несанкционированного распространения.

- -
- -
- -
-
-

С чем связано?

- -

Документы:

-

    -
  • конституция Российской Федерации;
  • -
  • федеральный закон «об электронной подписи»;
  • -
  • федеральный закон №261 «О внесении изменений в Федеральный закон «О персональных данных».
  • -

-

Область действия:

-

Отношения, связанные с обработкой персональных данных.

-
-
- - -
-

Федеральный закон «об электронной подписи»

- -
-
-

Полное название

-

Федеральный закон от 06.04.2011 N 63-ФЗ (ред. от 23.06.2016) "Об электронной подписи" (с изм. и доп., вступ. в силу с 31.12.2017).

-

-
-
-

Как это выглядит?

- - - -
-
-
-
-

Что это?

-

Федеральный закон «об электронной подписи» - это документ, который устанавливает правила работы с электронной подписью. Согласно этому закону существуют простые, усиленные квалифицированные и неквалифицированные электронные подписи.

-

Простая электронная подпись посредством использования кодов, паролей или иных средств подтверждает факт формирования ЭП определенным лицом.
Усиленную неквалифицированную ЭП получают в результате криптографического преобразования информации с использованием закрытого ключа подписи.
Усиленная квалифицированная электронная подпись соответствует всем признакам неквалифицированной электронной подписи, но для создания и проверки ЭП используются средства криптозащиты, которые сертифицированы ФСБ РФ.
ЭП позволяет определить лицо, подписавшее электронный документ, и обнаружить факт внесения изменений после подписания электронных документов.

-
-
-

Как относится к безопасности?

- -

Этот документ устанавливает правовой статус электронной подписи. Благодаря установленным правилам и условию о неразглашении данных, относящихся к ЭП, пользователи могут быть уверены в безопасности и подлинности передаваемой через Интернет информации.

- -
- -
- -
-
-

С чем связано?

- -

Документы:

-

Закон РФ №152 о персональных данных

-

Область действия:

-

    -
  • гражданско-правовые сделки;
  • -
  • государственные и муниципальные услуги;
  • -
  • государственные и муниципальные функции.
  • -

-
-
- - - - - - - - - - - - diff --git a/www/progress_board.html b/www/progress_board.html deleted file mode 100644 index 952349a..0000000 --- a/www/progress_board.html +++ /dev/null @@ -1,987 +0,0 @@ - - - - - The Big Board - - - - - - - - - - -
-
-
-

Текущий прогресс

-

Большой брат следит за тобой

-
- - - -
-
-

Допуск к зачету

-

Для того чтобы получить допуск к зачету необходимо:

- -
    -
  • Сдать единственную лабораторную работу
  • -
  • Сделать хотя бы одну практику
  • -
-
-
-

Зачет автоматом

-

Есть шанс получить зачет автоматом. Для этого надо:

-
    -
  • Получить допуск к зачету
  • -
  • Сделать больше одной практики
  • -
-
- -
- -
-
-

Важные моменты

-
    -
  • Без сданного минимума в одну лабораторную работу и практику, допуска к зачету не будет
  • -
  • Чем лучше посещаемость, тем меньше вопросов будет на зачете
  • -
-
-
-

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

-
    -
  • Выделенные красным - это те, кому стоит задуматься о том, как они будут сдавать предмет
  • -
  • Выделенные зеленым полностью - это те, у кого автомат
  • -
  • Выделенные зеленым только имена - это те, у кого есть допуск к зачету
  • -
  • Все остальные - кто что-то сделал, но еще недостаточно для допуска
  • -
  • Информация обновляется каждую неделю, в субботу или воскресенье вечером
  • -
  • !!!!! Если с чем-то в этой таблице не согласны - пишите, или подходите на паре, возможно я что-то забыл отметить
  • -
-
- -
- -
- -
-
-

Таблица прогресса

-

Y2432+Y2434

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ИмяТекущая тема практикиДедлайнКол-во сделанных практикСдана лаба?ПосещаемостьДопуск
1. Батра А.--2Да91%да
2. Беликов Я.--0Нет8%нет
3. Богданова Ю.--1Да45%да
4. Бондаренко М.--2Да83%да
5. Борисенко Н.(тема устарела)20.10.20180Нет25%нет
6. Виткалов Е.--0Нет0%нет
7. Голосовская К.Поправить ЭЦП Эль-Гамаля и Шнорра29.12.20181Да45%да
8. Горшков Д.--1Нет58%нет
9. Гусева Эльхе Н.SHA-1 (Перенос на сайт)29.12.20182Да79%да
10. Демченко К.--0Нет0%нет
11. Дрягунов М.--0Нет8%нет
12. Кабакова А.--2Да91%да
13. Кирюхина В.--3Да58%да
14. Колесова В.--3Да79%да
15. Коловай В.Поправить ЭЦП Эль-Гамаля и Шнорра29.12.20181Да54%да
16. Кривокорытов К.--1Да37%да
17. Кузнецова В.--0Нет8%нет
18. Кухто А.--3Да62%да
19. Латышев И.(тема устарела)20.10.20180Нет33%нет
20. Лунин М.--3Да83%да
21. Никаноров С.--3Да91%да
22. Панов К.(тема устарела)20.10.20180Нет16%нет
23. Петунин Д.--2Нет66%нет
24. Почетный В.--3Да58%да
25. Привалихин А.--1Нет83%нет
26. Розов М.Постановление правительства №608 О сертификации средств защиты - информации20.10.20180Да75%нет
27. Романько М.--2Да83%да
28. Рубель Д.--3Да58%да
29. Сагалов Е.(тема устарела)20.10.20180Нет20%нет
30. Сербин А.Сжимающий генератор (интерактивная визуализация)29.12.20180Да0%нет
31. Смирнов Ф.--0Нет0%нет
32. Смирнов М.--0Нет0%нет
33. Соколов М.SHA-1 (Перенос на сайт)29.12.20182Нет70%нет
34. Хасанова А.--2Да66%да
35. Холодов Ф.--0Нет0%нет
36. Якимчук И.--2Нет95%нет
37. Ясенко И.(тема устарела)20.10.20180Нет91%нет
- - - -
- - -

Y2435

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ИмяТекущая тема практикиДедлайнКол-во сделанных практикСдана лаба?ПосещаемостьДопуск
1. Барабаш В.(тема устарела)20.10.20180Нет37%нет
2. Бурганов С.--5Да83%да
3. Веселовский Ф.Периодический раздельный шифр (Гамбеттовский)27.10.20180Нет0%нет
4. Генина А.--0Нет8%нет
5. Казанский А.--5Да75%да
6. Курышев Д.Шифр Виженера/Сеть Фейстеля (интерактивная визуализация)29.12.20189Да100%да
7. Марданова М.608 Постановление правительстваДо зачета1Да8%да
8. Петренко А.--3Да45%да
9. Поляничко К.Потоковое шифрование с разными генераторами (интерактивная визуализация)27.11.20180Нет8%нет
10. Понаэтов С.Единозначный парный шифр24.11.20181Нет12%нет
11. Саенко А.Периодический раздельный шифр (Гамбеттовский)27.10.20180Нет16%нет
12. Самчук Р.--0Нет8%нет
13. Симонов С.Единозначный парный шифр24.11.20181Нет29%нет
14. Сохранов Е.Шифр Виженера/Сеть Фейстеля (интерактивная визуализация)29.12.20189Да100%да
15. Теричев М.Шифр четырех квадратов29.12.20182Нет62%нет
16. Филиппова Т.Информация с точки зрения ИБ (перенос на сайт)24.11.20181Нет33%нет
17. Шеренкова А.--3Да37%да
- - -
- - -

Y2431+Y2436

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ИмяТекущая тема практикиДедлайнКол-во сделанных практикСдана лаба?ПосещаемостьДопуск
1. Белозеров Д.--1Нет27%нет
2. Бобровский Д.--1Нет50%нет
3. Веретельников Д.--2Да81%да
4. Волков Н.--0Нет0%нет
5. Галактионов П.--1Нет45%нет
6. Ермолин Д.--2Нет81%нет
7. Жаринов А.О коммерческой тайне №9818.10.20180Нет72%нет
8. Закиров Л.Генератор переменного шага (интерактивная визуализация)27.12.20180Нет72%нет
9. Зидерер А.--2Да81%да
10. Кравцова А.--2Да59%да
11. Лямкин А.--2Да40%да
12. Максимов А.Генератор Геффа(интерактивная визуализация)27.12.20180Нет0%нет
13. Малебская М.Система цифровой подписи DSS (перенос на сайт)27.12.20180Нет0%нет
15. Марченко И.--2Да90%да
16. Михайлов С.--0Нет0%нет
17. Нестеров К.--2Да90%да
18. Пантелеева Л.--2Да77%да
19. Погорелов К.ФЗ №152 О персональных данных18.10.20180Нет50%нет
21. Прокофьева Д.Основные понятия в Информационной Безопасности (Лекция 1. Введение)08.11.20180Нет13%нет
22. Реннике М.--2Да81%да
23. Родионов Д.--0Нет4%нет
24. Сидорова С.--2Нет90%нет
25. Силакова А.--2Да54%да
26. Соловьев Д.Шифр биграммного типа29.11.20181Нет59%нет
27. Соловьева А.Основные понятия в Информационной Безопасности (Лекция 1. Введение)08.11.20180Нет27%нет
28. Таран Ф.AES, ГОСТ (перенос на сайт)29.11.20180Нет31%нет
29. Чахоян А.AES, ГОСТ (перенос на сайт)/Мобильная версия сайта29.11.20180Нет50%нет
30. Шахбазов Э.--2Да90%да
31. Штыхина М.--2Да90%да
32. Щелгачев Р.--1Да27%да
33. Яковлев А.1119 Об утверждении требований к защите ПД18.10.20180Да77%нет
- -
-
-
- - -
- - - - - - - - - - - - - - diff --git a/www/riskwatch.html b/www/riskwatch.html deleted file mode 100644 index f2fbd4b..0000000 --- a/www/riskwatch.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Компания RiskWatch разработала собственную методику анализа рисков и семейство программный средств, в - которых она в той либо иной мере реализуется.

-
- - -
-

Общая информация

-

В семейство RiskWatch входят программные продукты для проведения различных видов аудита безопасности:

-
    -
  1. RiskWatch for Physical Security - для анализа физической защиты ИС;
  2. -
  3. RiskWatch for Information Systems - для информационных рисков;
  4. -
  5. HIPAA-WATCH for Healthcare Industry - для оценки соответствия требованиям стандарта HIPAA (US Healthcare - Insurance Portability and Accountability Act), актуальных в основном для медицинских учреждений, - работающих на территории США;
  6. -
  7. RiskWatch RW17799 for ISO 17799 - для оценки соответствия ИС требованиям стандарта международного - стандарта ISO 17799.
  8. -
- -

В методе RiskWatch в качестве критериев для оценки и управления рисками используются ожидаемые - годовые потери (Annual LossExpectancy, ALE) и оценка возврата инвестиций (Return on Investment, ROI). - RiskWatch ориентирована на точную количественную оценку соотношения потерь от угроз безопасности и - затрат на создание системы защиты. В основе продукта RiskWatch находится методика анализа рисков, - которая состоит из четырех этапов.

- -
    -
  1. Первый этап - определение предмета исследования. Здесь описываются такие параметры, как тип - организации, состав исследуемой системы (в общих чертах), базовые требования в области безопасности. Для - облегчения работы аналитика, в шаблонах, соответствующих типу организации (коммерческая - информационная система, государственная/военная информационная система и т.д.), есть списки - категорий защищаемых ресурсов, потерь, угроз, уязвимостей и мер защиты. Из них нужно выбрать те, что - реально присутствуют в организации. -
    -

    Например, категории потерь:

    -
      -
    • задержки и отказ в обслуживании;
    • -
    • раскрытие информации;
    • -
    • прямые потери (например, от уничтожения оборудования огнем);
    • -
    • жизнь и здоровье (персонала, заказчиков и т.д.);
    • -
    • изменение данных;
    • -
    • косвенные потери (например, затраты на восстановление);
    • -
    • репутация.
    • -
    -
  2. -
  3. Второй этап - ввод данных, описывающих конкретные характеристики системы. Данные могут вводиться - вручную или импортироваться из отчетов, созданных инструментальными средствами исследования - уязвимости компьютерных сетей. На этом этапе, в частности, подробно описываются ресурсы, потери и - классы инцидентов. Классы инцидентов получаются путем сопоставления категории потерь и категории - ресурсов. -

    Для выявления возможных уязвимостей используется вопросник, база которого содержит более 600 вопросов. - Вопросы связаны с категориями ресурсов.

    -

    Также задается частота возникновения каждой из выделенных угроз, степень уязвимости и ценность - ресурсов. Если для выбранного класса угроз в системе есть среднегодовые оценки возникновения (LAFE - и SAFE), то используются они. Все это используется в дальнейшем для расчета эффекта от внедрения средств - защиты.

    -
    - -
    -
    Рис.1 Определение категорий защищаемых ресурсов
    -
    -
  4. -
  5. Третий этап - количественная оценка риска. На этом этапе рассчитывается профиль рисков, и выбираются - меры обеспечения безопасности. Сначала устанавливаются связи между ресурсами, потерями, угрозами и - уязвимостями, выделенными на предыдущих шагах исследования. По сути, риск оценивается с помощью - математического ожидания потерь за год. Например, если стоимостьсервера $150000, а вероятность того, что - он будет уничтожен пожаром в течение года, равна 0.01, то ожидаемые потери составят $1500.
  6. -
    -
  7. Четвертый этап - генерация отчетов. Типы отчетов: -
      -
    • Краткие итоги.
    • -
    • Полные и краткие отчеты об элементах, описанных на стадиях 1 и 2.
    • -
    • Отчет от стоимости защищаемых ресурсов и ожидаемых потерях от реализации угроз.
    • -
    • Отчет об угрозах и мерах противодействия.
    • -
    • Отчет о ROI (фрагмент - на рис. 2).
    • -
    • Отчет о результатах аудита безопасности.
    • -
    -
  8. -
    - -
    -
    Рис.2 Пример графика показателя ROI для различных мер защиты
    -
-

Таким образом, рассматриваемое средство позволяет оценить не только те риски, которые сейчас существуют - у предприятия, но и ту выгоду, которую может принести внедрение физических, технических, программных и - прочих средств и механизмов защиты. Подготовленные отчеты и графики дают материал, достаточный - для принятия решений об изменении системы обеспечения безопасности предприятия.

- -
- -
- - - - - - - - - - - - - - diff --git a/www/ruk_doc.html b/www/ruk_doc.html deleted file mode 100644 index 7e37872..0000000 --- a/www/ruk_doc.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Гостехкомиссия России в период своего существования вела весьма активную нормотворческую деятельность, выпуская Руководящие документы (РД), играющие роль национальных оценочных стандартов в области информационной безопасности. В качестве стратегического направления Гостехкомиссия России выбрала ориентацию на «Общие критерии» ,что можно только приветствовать. -

-
- -

Общая информация

-

В своем обзоре мы рассмотрим подробно два важных, хотя и не новых, Руководящих документа - Классификацию автоматизированных систем (АС) по уровню защищенности от несанкционированного доступа (НСД) и аналогичную Классификацию межсетевых экранов (МЭ). -

Согласно первому из них, устанавливается девять классов защищенности АС от НСД к информации.

-

Каждый класс характеризуется определенной минимальной совокупностью требований по защите.

-

Классы подразделяются на три группы, отличающиеся особенностями обработки информации в АС.

-

В пределах каждой группы соблюдается иерархия требований по защите в зависимости от ценности (конфиденциальности) информации и, следовательно, иерархия классов защищенности АС.

-

Третья группа классифицирует АС, в которых работает один пользователь, имеющий доступ ко всей информации АС, размещенной на носителях одного уровня конфиденциальности. Группа содержит два класса - 3Б и 3А.

-

Вторая группа классифицирует АС, в которых пользователи имеют одинаковые права доступа (полномочия) ко всей информации АС, обрабатываемой и (или) хранящейся на носителях различного уровня конфиденциальности.

-

Группа содержит два класса - 2Б и 2А.

-

Первая группа классифицирует многопользовательские АС, в которых одновременно обрабатывается и (или) хранится информация разных уровней конфиденциальности и не все пользователи имеют право доступа ко всей информации АС. Группа содержит пять классов - 1Д, 1Г, 1В, 1Б и 1А.

-

Сведем в таблицу требования ко всем девяти классам защищенности АС, где: -
«-» нет требований к данному классу; -
«+» есть требования к данному классу; -

-

-
-
- - - -
-
- - - -
-
- - - -
- -
- -
-
-
-

-

Классификация межсетевых экранов

-

По существу перед нами - минимум требований, которым необходимо следовать, чтобы обеспечить конфиденциальность информации. Целостность представлена отдельной подсистемой. Доступность (точнее, восстановление) предусмотрено только для самих средств защиты.

-

Переходя к рассмотрению второго РД Гостехкомиссии России - Классификации межсетевых экранов - укажем, что данный РД представляется нам принципиально важным, поскольку в нем идет речь не о целостном продукте или системе, а об отдельном сервисе безопасности, обеспечивающем межсетевое разграничение -доступа.

-

Данный РД важен не столько содержанием, сколько самим фактом своего существования.

-

Основным критерием классификации МЭ служит протокольный уровень (в соответствии с эталонной семиуровневой моделью), на котором осуществляется фильтрация информации. Это понятно: чем выше уровень, тем больше информации на нем доступно и, следовательно, тем более тонкую и надежную фильтрацию можно реализовать.

-

Значительное внимание в РД уделено собственной безопасности служб обеспечения защиты и вопросам согласованного администрирования распределенных конфигураций.

- -

Концепция защиты средств вычислительной техники и автоматизированных систем от несанкционированного доступа (НСД) к информации

-

В этом документе излагается система взглядов, основных принципов, которые закладываются в основу проблемы защиты информации от несанкционированного доступа (НСД), являющейся частью общей проблемы безопасности информации. -Содержанием документа является определение НСД, основные принципы защиты от НСД, модель нарушителя в автоматизированной системе, основные способы НСД, направления обеспечения защиты от НСД, основные характеристики технических средств защиты от НСД, классификация АС и организация работ по защите информации от НСД. -

-

Защита от несанкционированного доступа. Термины и определения

-

-Этот документ устанавливает термины и определения понятий в области защиты средств вычислительной техники и автоматизированных систем от несанкционированного доступа к информации. Установленные термины обязательны для применения во всех видах документации. Для каждого понятия установлен один термин. Применение терминов-синонимов не допускается. В качестве справочных приведены иностранные эквиваленты русских терминов на английском языке. -

-

Средства вычислительной техники. Защита от несанкционированного доступа к информации. Показатели защищенности от несанкционированного доступа к информации

-

-Этот руководящий документ устанавливает классификацию средств вычислительной техники (СВТ) по уровню защищенности от НСД к информации на базе перечня показателей защищенности и совокупности описывающих их требований. -

-

Автоматизированные системы. Защита от несанкционированного доступа к информации. Классификацию автоматизированных систем и требования по защите информации

-

-Документ устанавливает классификацию автоматизированных систем (АС), подлежащих защите от НСД к информации, и требования по защите информации в АС различных классов. Руководящий документ разработан в дополнение ГОСТ 34.003-90, ГОСТ 34.601-90, РД 50-680-88, РД 50-34 680-90 и других документов. Документ может использоваться как нормативно-методический материал для заказчиков и разработчиков АС при формулировании и реализации требований по защите. -

-

Временное положение по организации разработки, изготовления и эксплуатации программных и технических средств защиты информации от несанкционированного доступа в автоматизированных системах и средствах вычислительной техники

-

-Настоящее положение устанавливает единый на территории Российской Федерации -порядок исследований и разработок в области:

-

-
• защиты информации, обрабатываемой автоматизированными системами -различного уровня и назначения, от НСД; -
• создания средств вычислительной техники общего и специального -назначения, защищенных от утечки, искажения или уничтожения -информации за счет НСД, в том числе программных и технических средств -защиты информации от НСД; -
• создания программных и технических средств защиты информации от НСД -в составе систем защиты секретной информации в создаваемых АС.

-

-Положение определяет:

-

-
• организационную структуру и порядок проведения работ по защите -информации от НСД и взаимодействия при этом на государственном -уровне; -
• систему государственных нормативных актов, стандартов, руководящих -документов и требований по этой проблеме; -
• порядок разработки и приемки защищенных СВТ, в том числе программных -и технических (в частности, криптографических) средств и систем защиты -информации от НСД; -
• порядок приемки указанных средств и систем перед сдачей в эксплуатацию -в составе АС, порядок их эксплуатации и контроля за работоспособностью -этих средств и систем в процессе эксплуатации. -

-

Средства вычислительной техники. Межсетевые экраны. Защита от НСД к -информации. Показатели защищенности от НСД к информации

-

-Настоящий руководящий документ устанавливает классификацию межсетевых -экранов (МЭ) по уровню защищенности от НСД к информации на базе перечня -показателей защищенности и совокупности описывающих их требований. Руководящий -документ разработан в дополнение к Руководящим документам Гостехкомиссии России -«Средства вычислительной техники. Защита от несанкционированного доступа к -информации. Показатели защищенности от несанкционированного доступа к -информации» и «Автоматизированные системы. Защита от несанкционированного -доступа к информации. Классификацию автоматизированных систем и требования по -защите информации». -

-

Защита информации. Специальные защитные знаки. Классификация и -общие требования

-

- Настоящий руководящий документ устанавливает классификацию по классам -защиты специальных защитных знаков, предназначенных для контроля доступа к -объектам защиты, а также для защиты документов от подделки. Документ является -руководством для заказчиков специальных защитных знаков и испытательных -лабораторий, проводящих сертификационные испытания в Системе сертификации средств -защиты по требованиям безопасности информации. - -

-

Защита от несанкционированного доступа к информации

-

-Настоящий документ устанавливает классификацию программного обеспечения -(как отечественного, так и импортного производства) средств защиты информации, в том -числе и встроенных в общесистемное и прикладное ПО, по уровню контроля отсутствия в - -нем недекларированных возможностей. Действие документа не распространяется на -программное обеспечение средств криптографической защиты информации. - -

-

Документы лицензирования и сертификации средств защиты информации

-

Положение о государственном лицензировании деятельности в области -защиты информации

-

-Документ устанавливает основные принципы, организационную структуру системы -лицензирования деятельности предприятий в сфере оказания услуг в области защиты -информации, а также правила осуществления лицензирования и надзора за деятельностью -предприятий, получивших лицензию. -

-

Положение о сертификации средств защиты информации

-

-Настоящее Положение устанавливает порядок сертификации средств защиты -информации, составляющей государственную тайну, в Российской Федерации. -

В развитие этого положения разработан целый ряд дополнительных, таких -как, Положение о сертификации средств защиты информации по требованиям -безопасности информации, Положение по аттестации объектов информатики по -требованиям безопасности информации, Положение об аккредитации -испытательных лабораторий экспертных комитетов по сертификации средств -защиты информации по требованиям безопасности информации и ряд других. -

-

-
- - - - -
- - - - - - - - - - - - - - diff --git a/www/shear_linear_congruential_generator.html b/www/shear_linear_congruential_generator.html deleted file mode 100644 index 9814c12..0000000 --- a/www/shear_linear_congruential_generator.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -


- - -
-
-

Введение

-

Линейный конгруэнтный метод — один из методов генерации псевдослучайных чисел.

-
-
-

Общая информация

-

Применяется в простых случаях и не обладает криптографической стойкостью. Входит в стандартные библиотеки различных компиляторов. -

-

- Линейный конгруэнтный метод был предложен Д. Г. Лемером в 1949 году. -

-

Описание алгоритма генерации

-
    -
  1. -

    - Генерация первого псевдослучайного числа (далее зерно).
    - Это число должно быть «наиболее случайным», так как генератор линеен
    - (то есть, зная зерно, можно с точностью узнать дальнейшие числа).
    - Обычно это число берется из счётчика TSC (Time Stamp Counter), который возвращает в регистрах EDX:EAX 64-битное количество тактов с момента последнего сброса процессора. -

    -
  2. -
  3. -

    - Вычисление очередного значения по следующей формуле (рисунок 1). -

    - Линейный конгруэнтный метод -
    -
    Рис.1 Формула вычисления n+1-ого значения
    -

    -
  4. -
  5. -

    - Сдвиговая часть генератора (рисунок 2). -

    - Сдвиговый регистр -
    -
    Рис.2 Формула сдвига
    -

    -
  6. -
-
-
-

Пример работы генератора

-
-
-
Зерно:
-
0
-
-
- -
-
-
-
-
-
Значение A:
-
-
- -
-
-
-
-
-
Значение B:
-
-
- -
-
-
-
-
-
Значение M:
-
-
- -
-
-
-
-
-
Значение: после использования линейного конгруэнтного метода
-
-
-
0
-
-
-
-
-
-
Значение: после сдвиговой операции
-
-
-
0
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - - - - - - - - - - diff --git a/www/shennon.html b/www/shennon.html deleted file mode 100644 index 7af8434..0000000 --- a/www/shennon.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - Теорема о совершенно стойком шифре (Шеннон) - - - - - - - - - - - - - - -
-
-
-

Требования к криптографическим системам

-

Теорема о совершенно стойком шифре (Шеннон)

-
- - - -
-

Основные определения

-
-
-

Символ - это любой знак, в том числе буква, цифра или знак препинания.

-

Алфавит - конечное множество используемых для кодирования информации символов.


-
-
-
-
-
- Например, русский алфавит содержит 33 буквы от А до Я . Однако этих тридцати трех знаков обычно бывает недостаточно для записи сообщений, поэтому их дополняют символом пробела, точкой, запятой и другими знаками. Алфавит арабских цифр – это символы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 . Этот алфавит содержит 10 знаков и с его помощью можно записать любое натуральное число. Любое сообщение может быть записано также с помощью двоичного алфавита, то есть с использованием только нулей и единиц. -
-
-
-
-

Исходные сообщения обычно называют открытыми текстами. Также для открытого текста используют термин plaintext.

-

Шифр – совокупность заранее оговоренных способов преобразования исходного секретного сообщения с целью его защиты.

-
-
-

Сообщение, полученное после преобразования с использованием любого шифра, называется шифрованным сообщением (закрытым текстом, криптограммой). В иностранной литературе для закрытого текста используют термин ciphertext.

-

Преобразование открытого текста в криптограмму называется зашифрованием. Обратное действие называется расшифрованием. В англоязычной литературе терминам "зашифрование/расшифрование" соответствуют термины "enciphering/deciphering".

-
-
-

Ключинформация, необходимая для шифрования и расшифрования сообщений.

-

-
-
-
-
-

С точки зрения русского языка термины "расшифрование" и "дешифрование" являются синонимами. Однако в работах по криптографии последних десятилетий часто эти слова различают. Будем считать, что термины "расшифрование" и "дешифрование" не являются синонимами. Примем, что расшифрованием занимается легальный получатель сообщения (тот, кто знает ключ), а человек, которому послание не предназначено, пытаясь понять его смысл, занимается дешифрованием.

-
-
- - - - - - - - - -
Процесс шифрованияПроцесс расшифровывания
$C = E_{k}(m)$$m = D_{k}(C)$
- $E \text{ (Encrypt)}$ - шифрующая функция
- $D \text{ (Decrypt)}$ - расшифровывающая функция
- $C \text{ (Cipher)}$ - шифротекст
- $m \text{ (message)}$ - открытый текст
- $k \text{ (key)}$ - секретный ключ
-
-
-
-
-

Система шифрования (шифрсистема) – это любая система, которую можно использовать для обратимого изменения текста сообщения с целью сделать его непонятным для всех, кроме тех, кому оно предназначено.

-

Криптостойкостью называется характеристика шифра, определяющая его стойкость к дешифрованию без знания ключа (т.е. способность противостоять криптоанализу).

-
-
-

Криптография изучает построение и использование систем шифрования, в том числе их стойкость, слабости и степень уязвимости относительно различных методов вскрытия.

-

-
-
-
-
- Все методы преобразования информации с целью защиты от несанкционированного доступа делятся на две большие группы: -
    -
  • методы шифрования с закрытым ключом;
  • -
  • методы шифрования с открытым ключом.
  • -
- В шифровании с закрытым ключом (шифрование с секретным ключом или симметричное шифрование) используется один и тот же ключ, который обе стороны стараются хранить в секрете от противника.
- В шифровании с открытым ключом (асимметричное шифрование) для шифрования и расшифрования данных используются два разных ключа. При этом один из ключей (открытый ключ) может передаваться по открытому (незащищенному) каналу связи. -
-
-
-
-

Электронной (цифровой) подписью называется обычно присоединяемый к сообщению блок данных, полученный с использованием криптографического преобразования. Электронная подпись позволяет при получении текста другим пользователем проверить авторство и подлинность сообщения.

-

Криптографическая система защиты информации – система защиты информации, в которой используются криптографические методы для шифрования данных.

-
- -
-

Устоявшиеся имена в криптографии

-
-
-
    -
  • Алиса и Боб (Alice and Bob) – Наиболее часто Алиса хочет послать сообщение Бобу.
    Эти имена были использованы Роном Ривестом (Ron Rivest) в 1978 году в журнале «Communications of the ACM» в статье «A Method for Obtaining Digital Signatures and Public-Key Cryptosystems».
  • -
  • Ева (Eve) – пассивный злоумышленник, от англ. eavesdropper (подслушивающий). Она может прослушивать сообщения между Алисой и Бобом, но она не может влиять на них.
  • -
  • Мэллори (Mallory, от malicious) – активный злоумышленник; в отличие от Евы, Мэллори может изменять сообщения, воспроизводить старые сообщения, подменять сообщения и так далее.
  • -
  • Трент (Trent) – доверенный арбитр, своего рода нейтральная третья сторона, чья точная роль изменяется в зависимости от стадии обсуждения протокола.
  • -
-
- -
-

Требования к криптографическим системам защиты информации

-
-
-
- -

- Процесс криптографического шифрования данных может осуществляться как программно, так и аппаратно. -
Аппаратная реализация отличается существенно большей стоимостью, однако ей присущи и преимущества: высокая производительность, простота, защищенность и т.д. -
Программная реализация более практична, допускает известную гибкость в использовании. -

-

- Для современных криптографических систем защиты информации сформулированы следующие общепринятые требования. -

    -
  1. Знание алгоритма шифрования не должно снижать криптостойкости шифра. Это фундаментальное требование было сформулировано в XIX в. Кирхгофом и разделяет криптосистемы на системы общего использования (когда алгоритм доступен потенциальному нарушителю)
  2. -
  3. Зашифрованное сообщение должно поддаваться чтению только при наличии ключа. Используемое в программе MS Word 6.0 “шифрование” документа на самом деле только запрещало его открытие в данной программе. Сам же текст не шифровался и был доступен для чтения в любом текстовом редакторе.
  4. -
  5. Шифр должен быть стойким даже в случае, если нарушителю известно достаточно большое количество исходных данных и соответствующих им зашифрованных данных.
  6. -
  7. Число операций, необходимых для расшифровывания информации путем перебора всевозможных ключей, должно иметь строгую нижнюю оценку и должно либо выходить за пределы возможностей современных компьютеров (с учетом возможности организации сетевых вычислений), либо требовать создания использования дорогих вычислительных систем.
  8. -
  9. Незначительное изменение ключа или исходного текста должно приводить к существенному изменению вида зашифрованного текста. Этому требованию не соответствуют практически все шифры донаучной криптографии.
  10. -
  11. Структурные элементы алгоритма шифрования должны быть неизменными.
  12. -
  13. Длина шифрованного текста должна быть равной длине исходного текста.
  14. -
  15. Дополнительные биты, вводимые в сообщение в процессе шифрования, должны быть полностью и надежно скрыты в шифрованном тексте.
  16. -
  17. Не должно быть простых и легко устанавливаемых зависимостей между ключами, последовательно используемыми в процессе шифрования.
  18. -
  19. Любой ключ из множества возможных должен обеспечивать надежную защиту информации.
  20. -
-

- -
-
-
-

Теорема о совершенно стойком шифре (Шеннон)

-
-
-
- -

- $\mathbb P$ - множество возможных открытых текстов, т.е. пространство сообщений; -
$\mathbb K$ - совокупность возможных ключей; -
$\mathbb C$ - множество шифротекстов. -

-
- Определение. Криптосистема обладает абсолютной криптостойкостью, если равенство, - $$p(C = c|C = c) = p(P = m)$$ - имеет место для всех открытых текстов $m \in \mathbb P$ и всех криптограмм $c \in \mathbb C$ -
-
- Лемма. Криптосистема является абсолютной стойкой, если - $$p(C = c|P = m) = p(C = c)$$ - для всех $m$ и $с$ -
Доказательство. Утверждение леммы немедленно следует из определения абсолютной стойкости и формулы - $$p(P = m|C = c) = \frac{p(P = m)p(C = c|P = m)}{p(C = c)}$$ -
-
- Лемма. Для абсолютно стойкой криптосистемы имеет место неравенство: - $$ \# \mathbb K \geqslant \# \mathbb C \geqslant \# \mathbb P$$ -
-
- Шифр называется совершенно стойким по Шеннону, если открытый и шифрованный тексты статистически независимы, то есть для " M,C в случае P(C)>0 имеет место равенство условной и безусловной вероятности: - $$ P(M/C) = P(M)$$ -
-

Иначе говоря, перехват шифрованного сообщения (криптограммы) не увеличивает объема информации об открытом тексте, если ключ шифрования неизвестен. При этом распределения вероятностей на множестве открытых текстов до и после перехвата шифрованного сообщения (апостериорное и априорное распределение) совпадают.

-

- По Шеннону шифр является совершенно стойким, если открытый и шифрованный тексты $P(x) = P(x|y) $для любого открытого текста $x \in X^n$ и любой криптограммы $y \in Y^n$, при условии $P(y) > 0$. Перехват сообщения, зашифрованного таким шифром, не содержит для криптоаналитика никакой информации, если ключ ему неизвестен. Шеннон доказал, что совершенно стойкие шифры существуют. Примером может служить уже рассмотренный выше шифр Вернама. Каждый символ криптограммы получается по формуле - $$y_{i} = (x_{i} \oplus z_{i})\operatorname{mod}N,$$ - где $x_{i}, y_{i}, z_{i} \in {0,1,...,N - 1}$ и $x_{i}$ обозначает символ открытого текста $z_{i}$ - символ ключа. Длина ключа и криптограммы совпадают с длиной открытого текста. -

-
- Теорема. Шифр Вернама по модулю N является совершенно стойким шифром, если символы ключа выбираются независимо и равновероятно из множества ${0,1,...,N-1}$. -
-

- Шифр Вернама (другое название: англ. One-time pad — схема одноразовых блокнотов) — в криптографии система симметричного шифрования, изобретённая в 1917 году сотрудниками AT&TМейджором Джозефом Моборном и Гильбертом Вернамом. Шифр Вернама является единственной системой шифрования, для которой доказана абсолютная криптографическая стойкость. -

- Для произведения шифртекста открытый текст объединяется операцией «исключающее ИЛИ» с ключом (называемым одноразовым блокнотом или шифроблокнотом). При этом ключ должен обладать тремя критически важными свойствами: -
    -
  • быть истинно случайным;
  • -
  • совпадать по размеру с заданным открытым текстом;
  • -
  • применяться только один раз.
  • -
-

- Шифр назван в честь телеграфиста AT&T Гильберта Вернама, который в 1917 году построил телеграфныйаппарат, который выполнял эту операцию автоматически — надо было только подать на него ленту с ключом. Не будучи шифровальщиком, тем не менее, Вернам верно заметил важное свойство своего шифра — каждая лента должна использоваться только один раз и после этого уничтожаться. Это трудноприменимо на практике — поэтому аппарат был переделан на несколько закольцованных лент с взаимно простыми периодами. -

-

- В 1949 году Клод Шеннон опубликовал работу, в которой доказал абсолютную стойкость шифра Вернама. Других шифров с этим свойством не существует. Это по сути означает, что шифр Вернама является самой безопасной криптосистемой из всех возможных. При этом условия, которым должен удовлетворять ключ, настолько сильны, что практическое использование шифра Вернама становится трудно осуществимым. Поэтому он используется только для передачи сообщений наивысшей секретности. -

-

-

Недостатки

-Для работы шифра Вернама необходима истинно случайная последовательность нулей и единиц (ключ). По определению, последовательность, полученная с использованием любого алгоритма, является не истинно случайной, а псевдослучайной. То есть, нужно получить случайную последовательность неалгоритмически (например, используя распад ядер, создаваемый электронным генератором белый шум или другие достаточно случайные события). Чтобы сделать распределение предельно близким к равномерному, случайная последовательность обычно прогоняется через хэш-функцию наподобие MD5. - -

-

- Проблемой является тайная передача последовательности и сохранение её в тайне. Если существует надёжно защищённый от перехвата канал передачи сообщений, шифры вообще не нужны: секретные сообщения можно передавать по этому каналу. Если же передавать ключ системы Вернама с помощью другого шифра (например, DES), то полученный шифр окажается защищённым ровно настолько, насколько защищён DES. При этом, поскольку длина ключа та же, что и длина сообщения, передать его не проще, чем сообщение. Шифроблокнот на физическом носителе можно украсть или скопировать. -

-

- Возможны проблемы с надёжным уничтожением использованной страницы. Этому подвержены как бумажные страницы блокнота, так и современные электронные реализации с использованием компакт-дисков или флэш-памяти. -

-

- Если третья сторона каким-то образом узнает сообщение, она легко восстановит ключ и сможет подменить послание на другое такой же длины. -

-

- Шифр Вернама чувствителен к любому нарушению процедуры шифрования. Например, контрразведка США часто расшифровывала советские и немецкие послания из-за неточностей генератора случайных чисел (программный генератор псевдослучайных чисел у немцев и машинистка, бьющая по клавишам, в СССР). Бывали случаи, когда одна и та же страница блокнота применялась дважды — США также расшифровывали такие послания. -

- - -
- -
-
- - - - - - - - - - - - - - - - diff --git a/www/square.html b/www/square.html deleted file mode 100644 index cecf90c..0000000 --- a/www/square.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - simple square cipher - - - - - - - - - -
-
-
-

Простой квадратный шифр

-
- - -
-
-

Что такое простой квадратный шифр?

-

Простой квадратный шифр- это вид шифра подстановки, в котором каждая буква алфавита в открытом тексте шифруется с помощью двузначных чисел – номеров строки и столбца.

-

-
-
-

Как это выглядит?

- - - -
- -
- -
-
-

Откуда появилось?

-

Простой квадратный шифр активно использовался в революционном подполье, хотя имел некоторую ненадежность при шифровке длинных текстов.

-

-
-
-

Суть простыми словами?

-

Запоминается лозунг, состоящий из десяти букв, который придумывается таким образом, чтобы в таблице появились все буквы алфавита. Затем составляется квадрат 10х10, лозунг записывается в первый столбец квадрата, далее по горизонталям таблицы записываются буквы в порядке алфавита. Теперь каждая буква алфавита шифруется с помощью двузначных чисел – номеров строки и столбца.

-
-
- -
- - -

Алгоритм шифрования

-

Простой квадратный шифр

-

Секрет данного способа заключался в том, что каждая буква алфавита шифруется с помощью двузначных чисел – номеров строки и столбца таблицы, образованной на 10-буквенном лозунге.

-

Пример:

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ШагиОписаниеИзменения
1Берем фразу, которую хотим закодироватьМилый котейка
2Берем лозунгЭта коробка
3Зменяем каждый символ номером столбца и строки буквы в таблице, основанной на лозунгеМилый котейка -> 348824920008543663031441
4Пример кодирования обного символаСимвол равен "М", лозунг - "ЭТАКОРОБКА", составляем таблицу 10х10 на основе лозунга, находим букву "М" в таблице и выписываем номер ее столбца и строки. Буква "М" находится на позициях "34" и "39", выбираем любую из позиций, в данном случае выбрали "34".
5Итог348824920008543663031441
-
- -

Шифратор

- -
-
- -
-
- -
-
- -
-
-
-

Результат:

-

Зашифруйте сообщение чтобы увидеть результат

-
-

-

-
- -
-

-

-
- -
-

-

-
- -
-

-

-
- - -

Дешифратор

-
-
- -
-
- -
-
- -
-
-
-

Результат:

-

Дешифруйте сообщение чтобы увидеть результат

-
-

-

-
- -
-

-

-
- -
-

-

-
- -
-

-

-
-
-
- - - - - - - - - - - - - diff --git a/www/standarts.html b/www/standarts.html deleted file mode 100644 index e15187b..0000000 --- a/www/standarts.html +++ /dev/null @@ -1,812 +0,0 @@ - - - - - Security is an important thing - - - - - - - - - - - - - -
-
-
-

Оранжевая книга

-

Мы приступаем к обзору стандартов и спецификаций двух разных видов: -

• оценочных стандартов, направленных на классификацию информационных систем и средств защиты по требованиям безопасности;

-

• технических спецификаций, регламентирующих различные аспекты реализации средств защиты.

-

-

-Важно отметить, что между этими видами нормативных документов нет глухой стены. Оценочные стандарты выделяют важнейшие, с точки зрения ИБ, аспекты ИС, играя роль архитектурных спецификаций. -

-

-Другие технические спецификации определяют, как строить ИС предписанной архитектуры. -

-

-Исторически первым оценочным стандартом, получившим широкое распространение и оказавшим огромное влияние на базу стандартизации ИБ во многих странах, стал стандарт Министерства обороны США "Критерии оценки доверенных компьютерных систем". -

-

-Данный труд, называемый чаще всего по цвету обложки "Оранжевой книгой", был впервые опубликован в августе 1983 года. Уже одно его название требует комментария. -

-

-Речь идет не о безопасных, а о доверенных системах, то есть системах, которым можно оказать определенную степень доверия. -

-

-"Оранжевая книга" поясняет понятие безопасной системы, которая "управляет, с помощью соответствующих средств, доступом к информации так,
что только должным образом авторизованные лица или процессы, действующие от их имени, получают право читать, записывать, создавать и удалять информацию". -

-

-Очевидно, однако, что абсолютно безопасных систем не существует, это абстракция. Есть смысл оценивать лишь степень доверия, которое можно
оказать той или иной системе. -

-

-В "Оранжевой книге" доверенная система определяется как "система, использующая достаточные аппаратные и программные средства,
чтобы обеспечить одновременную обработку информации разной степени секретности группой пользователей без нарушения прав доступа". -

-

-Обратим внимание, что в рассматриваемых Критериях и безопасность, и доверие оцениваются исключительно с точки зрения управления доступом к данным, что является одним из средств обеспечения конфиденциальности и целостности (статической). Вопросы доступности "Оранжевая книга" не затрагивает. -

-

-Степень доверия оценивается по двум основным критериям. -

-

- 1. Политика безопасности - набор законов, правил и норм поведения, определяющих, как организация обрабатывает, защищает и распространяет информацию. В частности, правила определяют, в каких случаях пользователь может оперировать конкретными наборами данных. Чем выше степень доверия системе, тем строже и многообразнее должна быть политика безопасности. В зависимости от сформулированной политики можно выбирать конкретные механизмы обеспечения безопасности. Политика безопасности - это активный аспект защиты, включающий в себя анализ возможных угроз и выбор мер противодействия. -

-

- 2. Уровень гарантированности - мера доверия, которая может быть оказана архитектуре и реализации ИС. Доверие безопасности может проистекать как из анализа результатов тестирования, так и из проверки (формальной или нет) общего замысла и реализации системы в целом и отдельных ее компонентов. Уровень гарантированности показывает, насколько корректны механизмы, отвечающие за реализацию политики безопасности. Это пассивный аспект защиты. -

-

-Важным средством обеспечения безопасности является механизм подотчетности (протоколирования). Доверенная система должна фиксировать все события, касающиеся безопасности. Ведение протоколов должно дополняться аудитом, то есть анализом регистрационной информации. -

-

-Концепция доверенной вычислительной базы является центральной при оценке степени доверия безопасности. Доверенная вычислительная база - это совокупность защитных механизмов ИС (включая аппаратное и программное обеспечение), отвечающих за проведение в жизнь политики безопасности. Качество вычислительной базы определяется исключительно ее реализацией и корректностью исходных данных, которые вводит системный администратор. -

-

-Вообще говоря, компоненты вне вычислительной базы могут не быть доверенными, однако это не должно влиять на безопасность системы в целом. В результате, для оценки доверия безопасности ИС достаточно рассмотреть только ее вычислительную базу, которая, как можно надеяться, достаточно компактна. -

-

-Основное назначение доверенной вычислительной базы - выполнять функции монитора обращений, то есть контролировать допустимость выполнения субъектами (активными сущностями ИС, действующими от имени пользователей) определенных операций над объектами (пассивными сущностями). Монитор проверяет каждое обращение пользователя к программам или данным на предмет согласованности с набором действий, допустимых для пользователя. -

-

-Монитор обращений должен обладать тремя качествами: -

-

-1. Изолированность. Необходимо предупредить возможность отслеживания работы монитора.
-2. Полнота. Монитор должен вызываться при каждом обращении, не должно быть способов обойти его.
-3. Верифицируемость. Монитор должен быть компактным, чтобы его можно было проанализировать и протестировать, будучи уверенным в полноте тестирования. -

-

-Реализация монитора обращений называется ядром безопасности. Ядро безопасности - это основа, на которой строятся все защитные механизмы. Помимо перечисленных выше свойств монитора обращений, ядро должно гарантировать собственную неизменность. -

-

-Границу доверенной вычислительной базы называют периметром безопасности. Как уже указывалось, компоненты, лежащие вне периметра безопасности, вообще говоря, могут не быть доверенными. С развитием распределенных систем понятию "периметр безопасности" все чаще придают другой смысл, имея в виду границу владений определенной организации. То, что находится внутри владений, считается доверенным, а то, что вне, - нет. -

-

Механизмы безопасности

-

-Согласно "Оранжевой книге", политика безопасности должна обязательно включать в себя следующие элементы:
-• произвольное управление доступом ;
-• безопасность повторного использования объектов ;
-• метки безопасности ;
-• принудительное управление доступом. - -

-

-Произвольное управление доступом (называемое иногда дискреционным) - это метод разграничения доступа к объектам, основанный на учете личности субъекта или группы, в которую субъект входит. Произвольность управления состоит в том, что некоторое лицо (обычно владелец объекта) может по своему усмотрению предоставлять другим субъектам или отбирать у них права доступа к объекту. -

-

-Безопасность повторного использования объектов - важное дополнение средств управления доступом, предохраняющее от случайного или преднамеренного извлечения конфиденциальной информации из "мусора". Безопасность повторного использованиядолжна гарантироваться для областей оперативной памяти (в частности, для буферов с образами экрана, расшифрованными паролями и т.п.), для дисковых блоков и магнитных носителей в целом. -

-

-Как мы указывали ранее, современный объектно-ориентированный подход резко сужает область действия данного элемента безопасности, затрудняет его реализацию. То же верно и для интеллектуальных устройств, способных буферизовать большие объемы данных. -

-

-Для реализации принудительного управления доступом с субъектами и объектами ассоциируются метки безопасности. Метка субъекта описывает его благонадежность, метка объекта - степень конфиденциальности содержащейся в нем информации. -

-

-Согласно "Оранжевой книге", метки безопасности состоят из двух частей - уровня секретности и списка категорий. Уровни секретности образуют упорядоченное множество, категории - неупорядоченное. Назначение последних - описать предметную область, к которой относятся данные. -

-

-Принудительное (или мандатное) управление доступом основано на сопоставлении меток безопасности субъекта и объекта. -

-

-Субъект может читать информацию из объекта, если уровень секретности субъекта не ниже, чем у объекта, а все категории, перечисленные в метке безопасности объекта, присутствуют в метке субъекта. В таком случае говорят, что метка субъекта доминирует над меткой объекта. Смысл сформулированного правила понятен - читать можно только то, что положено. -

-

-Субъект может записывать информацию в объект, если метка безопасности объекта доминирует над меткой субъекта. В частности, "конфиденциальный" субъект может записывать данные в секретные файлы, но не может - в несекретные (разумеется, должны также выполняться ограничения на набор категорий). -

-

-Описанный способ управления доступом называется принудительным, поскольку он не зависит от воли субъектов (даже системных администраторов). После того, как зафиксированы метки безопасности субъектов и объектов, оказываются зафиксированными и права доступа. -

-

-Если понимать политику безопасности узко, то есть как правила разграничения доступа, то механизм подотчетности является дополнением подобной политики. Цель подотчетности - в каждый момент времени знать, кто работает в системе и что делает. Средства подотчетности делятся на три категории: -

-

-• идентификация и аутентификация ;
-• предоставление доверенного пути ;
-• анализ регистрационной информации. -

-

-Обычный способ идентификации - ввод имени пользователя при входе в систему. Стандартное средство проверки подлинности ( аутентификации ) пользователя - пароль. -

-

-Доверенный путь связывает пользователя непосредственно с доверенной вычислительной базой, минуя другие, потенциально опасные компоненты ИС. Цель предоставления доверенного пути - дать пользователю возможность убедиться в подлинности обслуживающей его системы. -

-

-Анализ регистрационной информации (аудит) имеет дело с действиями (событиями), так или иначе затрагивающими безопасность системы. -

-

-Если фиксировать все события, объем регистрационной информации, скорее всего, будет расти слишком быстро, а ее эффективный анализ станет невозможным. "Оранжевая книга" предусматривает наличие средств выборочного протоколирования, как в отношении пользователей (внимательно следить только за подозрительными), так и в отношении событий. -

-

-Переходя к пассивным аспектам защиты, укажем, что в "Оранжевой книге" рассматривается два вида гарантированности - операционная и технологическая. Операционная гарантированность относится к архитектурным и реализационным аспектам системы, в то время как технологическая - к методам построения и сопровождения. -

-

-Операционная гарантированность включает в себя проверку следующих элементов:
-• архитектура системы;
-• целостность системы;
-• проверка тайных каналов передачи информации;
-• доверенное администрирование;
-• доверенное восстановление после сбоев.
- -

-

-Операционная гарантированность - это способ убедиться в том, что архитектура системы и ее реализация действительно реализуют избранную политику безопасности . -

-

-Технологическая гарантированность охватывает весь жизненный цикл ИС, то есть периоды проектирования, реализации, тестирования, продажи и сопровождения. Все перечисленные действия должны выполняться в соответствии с жесткими стандартами, чтобы исключить утечку информации и нелегальные "закладки". -

-

Классы безопасности

-

-"Критерии ..." Министерства обороны США открыли путь к ранжированию информационных систем по степени доверия безопасности. -

-

-В "Оранжевой книге" определяется четыре уровня доверия - D, C, B и A. Уровень D предназначен для систем, признанных неудовлетворительными. По мере перехода от уровня C к A к системам предъявляются все более жесткие требования. Уровни C и B подразделяются на классы (C1, C2, B1, B2, B3) с постепенным возрастанием степени доверия. -

-

-Всего имеется шесть классов безопасности - C1, C2, B1, B2, B3, A1. Чтобы в результате процедуры сертификации систему можно было отнести к некоторому классу, ее политика безопасности и уровень гарантированности должны удовлетворять заданным требованиям, из которых мы упомянем лишь важнейшие. -

-

-Класс C1:
-• доверенная вычислительная база должна управлять доступом именованных пользователей к именованным объектам;
-• пользователи должны идентифицировать себя, прежде чем выполнять какие-либо иные действия, контролируемые доверенной вычислительной базой. Для аутентификации должен использоваться какой-либо защитный механизм, например пароли. Аутентификационная информация должна быть защищена от несанкционированного доступа;
-• доверенная вычислительная база должна поддерживать область для собственного выполнения, защищенную от внешних воздействий (в частности, от изменения команд и/или данных) и от попыток слежения за ходом работы;
-• должны быть в наличии аппаратные и/или программные средства, позволяющие периодически проверять корректность функционирования аппаратных и микропрограммных компонентов доверенной вычислительной базы ;
-• защитные механизмы должны быть протестированы на предмет соответствия их поведения системной документации. Тестированиедолжно подтвердить, что у неавторизованного пользователя нет очевидных способов обойти или разрушить средства защиты доверенной вычислительной базы ;
-• должны быть описаны подходы к безопасности, используемые производителем, и применение этих подходов при реализациидоверенной вычислительной базы. -

-

-Класс C2 (в дополнение к C1):
-• права доступа должны гранулироваться с точностью до пользователя. Все объекты должны подвергаться контролю доступа;
-• при выделении хранимого объекта из пула ресурсов доверенной вычислительной базы необходимо ликвидировать все следы его использования;
-• каждый пользователь системы должен уникальным образом идентифицироваться. Каждое регистрируемое действие должно ассоциироваться с конкретным пользователем;
-• доверенная вычислительная база должна создавать, поддерживать и защищать журнал регистрационной информации, относящейся к доступу к объектам, контролируемым базой;
-• тестирование должно подтвердить отсутствие очевидных недостатков в механизмах изоляции ресурсов и защиты регистрационной информации.
-

-

-Класс B1 (в дополнение к C2):
-• доверенная вычислительная база должна управлять метками безопасности, ассоциируемыми с каждым субъектом и хранимым объектом;
-• доверенная вычислительная база должна обеспечить реализацию принудительного управления доступом всех субъектов ко всем хранимым объектам;
-• доверенная вычислительная база должна обеспечивать взаимную изоляцию процессов путем разделения их адресных пространств;
-• группа специалистов, полностью понимающих реализацию доверенной вычислительной базы, должна подвергнуть описание архитектуры, исходные и объектные коды тщательному анализу и тестированию ;
-• должна существовать неформальная или формальная модель политики безопасности, поддерживаемой доверенной вычислительной базой.
-

-

-Класс B2 (в дополнение к B1):
-• снабжаться метками должны все ресурсы системы (например, ПЗУ), прямо или косвенно доступные субъектам;
-• к доверенной вычислительной базе должен поддерживаться доверенный коммуникационный путь для пользователя, выполняющего операции начальной идентификации и аутентификации;
-• должна быть предусмотрена возможность регистрации событий, связанных с организацией тайных каналов обмена с памятью;
-• доверенная вычислительная база должна быть внутренне структурирована на хорошо определенные, относительно независимые модули;
-• системный архитектор должен тщательно проанализировать возможности организации тайных каналов обмена с памятью и оценить максимальную пропускную способность каждого выявленного канала;
-• должна быть продемонстрирована относительная устойчивость доверенной вычислительной базы к попыткам проникновения;
-• модель политики безопасности должна быть формальной. Для доверенной вычислительной базы должны существовать описательные спецификации верхнего уровня, точно и полно определяющие ее интерфейс;
-• в процессе разработки и сопровождения доверенной вычислительной базы должна использоваться система конфигурационного управления, обеспечивающая контроль изменений в описательных спецификациях верхнего уровня, иных архитектурных данных, реализационной документации, исходных текстах, работающей версии объектного кода, тестовых данных и документации;
-• тесты должны подтверждать действенность мер по уменьшению пропускной способности тайных каналов передачи информации.
-

-

-Класс B3 (в дополнение к B2):
-• для произвольного управления доступом должны обязательно использоваться списки управления доступом с указанием разрешенных режимов;
-• должна быть предусмотрена возможность регистрации появления или накопления событий, несущих угрозу политике безопасностисистемы. Администратор безопасности должен немедленно извещаться о попытках нарушения политики безопасности, а система, в случае продолжения попыток, должна пресекать их наименее болезненным способом;
-• доверенная вычислительная база должна быть спроектирована и структурирована таким образом, чтобы использовать полный и концептуально простой защитный механизм с точно определенной семантикой;
-• процедура анализа должна быть выполнена для временных тайных каналов;
-• должна быть специфицирована роль администратора безопасности. Получить права администратора безопасности можно только после выполнения явных, протоколируемых действий;
-• должны существовать процедуры и/или механизмы, позволяющие произвести восстановление после сбоя или иного нарушения работы без ослабления защиты;
-• должна быть продемонстрирована устойчивость доверенной вычислительной базы к попыткам проникновения. -

-

-Класс A1 (в дополнение к B3):
-• тестирование должно продемонстрировать, что реализация доверенной вычислительной базы соответствует формальным спецификациям верхнего уровня;
-• помимо описательных, должны быть представлены формальные спецификации верхнего уровня. Необходимо использовать современные методы формальной спецификации и верификации систем;
-• механизм конфигурационного управления должен распространяться на весь жизненный цикл и все компоненты системы, имеющие отношение к обеспечению безопасности;
-• должно быть описано соответствие между формальными спецификациями верхнего уровня и исходными текстами.
-

-

-Такова классификация, введенная в "Оранжевой книге". Коротко ее можно сформулировать так:
-• уровень C - произвольное управление доступом ;
-• уровень B - принудительное управление доступом ;
-• уровень A - верифицируемая безопасность.
-

-

-Конечно, в адрес "Критериев ..." можно высказать целый ряд серьезных замечаний (таких, например, как полное игнорирование проблем, возникающих в распределенных системах). Тем не менее, следует подчеркнуть, что публикация "Оранжевой книги" без всякого преувеличения стала эпохальным событием в области информационной безопасности. Появился общепризнанный понятийный базис, без которого даже обсуждение проблем ИБ было бы затруднительным. -

-

-Отметим, что огромный идейный потенциал "Оранжевой книги" пока во многом остается невостребованным. Прежде всего это касается концепции технологической гарантированности, охватывающей весь жизненный цикл системы - от выработки спецификаций до фазы эксплуатации. При современной технологии программирования результирующая система не содержит информации, присутствующей в исходных спецификациях, теряется информация о семантике программ. Важность данного обстоятельства мы планируем продемонстрировать далее, в лекции об управлении доступом. -

-

Информационная безопасность распределенных систем. Рекомендации X.800

-

Сетевые сервисы безопасности

-

-Следуя скорее исторической, чем предметной логике, мы переходим к рассмотрению технической спецификации X.800, появившейся немногим позднее "Оранжевой книги", но весьма полно и глубоко трактующей вопросы информационной безопасности распределенных систем. -

-

-Рекомендации X.800 - документ довольно обширный. Мы остановимся на специфических сетевых функциях (сервисах) безопасности, а также на необходимых для их реализации защитных механизмах. -

-

-Выделяют следующие сервисы безопасности и исполняемые ими роли: -

-

-Аутентификация. Данный сервис обеспечивает проверку подлинности партнеров по общению и проверку подлинности источника данных. Аутентификация партнеров по общению используется при установлении соединения и, быть может, периодически во время сеанса. Она служит для предотвращения таких угроз, как маскарад и повтор предыдущего сеанса связи. Аутентификация бывает односторонней (обычно клиент доказывает свою подлинность серверу) и двусторонней (взаимной). -

-

-Управление доступом. Обеспечивает защиту от несанкционированного использования ресурсов, доступных по сети. -

-

-Конфиденциальность данных. Обеспечивает защиту от несанкционированного получения информации. Отдельно упомянем конфиденциальность трафика (это защита информации, которую можно получить, анализируя сетевые потоки данных). -

-

-Целостность данных подразделяется на подвиды в зависимости от того, какой тип общения используют партнеры - с установлением соединения или без него, защищаются ли все данные или только отдельные поля, обеспечивается ли восстановление в случае нарушения целостности. -

-

-Неотказуемость (невозможность отказаться от совершенных действий) обеспечивает два вида услуг: неотказуемость с подтверждением подлинности источника данных и неотказуемость с подтверждением доставки. Побочным продуктом неотказуемости является аутентификация источника данных. -

-

-В следующей таблице указаны уровни эталонной семиуровневой модели OSI, на которых могут быть реализованы функции безопасности. Отметим, что прикладные процессы, в принципе, могут взять на себя поддержку всех защитных сервисов. -

-

Таблица 5.1. Распределение функций безопасности по уровням эталонной семиуровневой модели OSI

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Функции безопасности Уровень
1234567
Аутентификация--++--+
Управление доступом--++--+
Конфиденциальность соединения++++-++
Конфиденциальность вне соединения-+++-++
Избирательная конфиденциальность-----++
Конфиденциальность трафика+-+---+
Целостность с восстановлением---+--+
Целостность без восстановления--++--+
Избирательная целостность------+
Целостность вне соединения--++--+
Неотказуемость------+
-

- Таблица 5.2. Взаимосвязь функций и механизмов безопасности -

-

-"+" данный уровень может предоставить функцию безопасности;
-"-" данный уровень не подходит для предоставления функции безопасности. -

-

-Сетевые механизмы безопасности -

-

-Для реализации сервисов (функций) безопасности могут использоваться следующие механизмы и их комбинации:
- • шифрование ;
-• электронная цифровая подпись ;
-• механизмы управления доступом. Могут располагаться на любой из участвующих в общении сторон или в промежуточной точке;
-• механизмы контроля целостности данных. В рекомендациях X.800 различаются два аспекта целостности: целостность отдельного сообщения или поля информации и целостность потока сообщений или полей информации. Для проверки целостности потока сообщений (то есть для защиты от кражи, переупорядочивания, дублирования и вставки сообщений) используются порядковые номера, временные штампы, криптографическое связывание или иные аналогичные приемы;
-• механизмы аутентификации. Согласно рекомендациям X.800, аутентификация может достигаться за счет использования паролей, личных карточек или иных устройств аналогичного назначения, криптографических методов, устройств измерения и анализа биометрических характеристик;
-• механизмы дополнения трафика ;
-• механизмы управления маршрутизацией. Маршруты могут выбираться статически или динамически. Оконечная система, зафиксировав неоднократные атаки на определенном маршруте, может отказаться от его использования. На выбор маршрута способна повлиять метка безопасности, ассоциированная с передаваемыми данными;
-• механизмы нотаризации. Служат для заверения таких коммуникационных характеристик, как целостность, время, личности отправителя и получателей. Заверение обеспечивается надежной третьей стороной, обладающей достаточной информацией. Обычно нотаризация опирается на механизм электронной подписи. -

-

-В следующей таблице сведены сервисы (функции) и механизмы безопасности. Таблица показывает, какие механизмы (по отдельности или в комбинации с другими) могут использоваться для реализации той или иной функции. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Механизмы
ФункцииШифрованиеЭлектронная подписьУправление доступомЦелостностьАутентификацияДополнение трафикаУправление маршрутизациейНотаризация
Аутентификация партнеров++--+---
Аутентификация источника++------
Управление доступом--+-----
Конфиденциальность+-+---+-
Избирательная конфиденциальность+-------
Конфиденциальность трафика+----++-
Целостность соединения+--+----
Целостность вне соединения++-+----
Неотказуемость-+-+---+
-

-"+" механизм пригоден для реализации данной функции безопасности;
-"-" механизм не предназначен для реализации данной функции безопасности. -

-

-Администрирование средств безопасности -

-

-Администрирование средств безопасности включает в себя распространение информации, необходимой для работы сервисов и механизмов безопасности, а также сбор и анализ информации об их функционировании. Примерами могут служить распространение криптографических ключей, установка значений параметров защиты, ведение регистрационного журнала и т.п. -

-

-Концептуальной основой администрирования является информационная база управления безопасностью. Эта база может не существовать как единое (распределенное) хранилище, но каждая из оконечных систем должна располагать информацией, необходимой для реализации избранной политики безопасности. -

-

-Согласно рекомендациям X.800, усилия администратора средств безопасности должны распределяться по трем направлениям:
-• администрирование информационной системы в целом;
-• администрирование сервисов безопасности;
-• администрирование механизмов безопасности.
-

-

-Среди действий, относящихся к ИС в целом, отметим обеспечение актуальности политики безопасности, взаимодействие с другими административными службами, реагирование на происходящие события, аудит и безопасное восстановление. -

-

-Администрирование сервисов безопасности включает в себя определение защищаемых объектов, выработку правил подбора механизмов безопасности (при наличии альтернатив), комбинирование механизмов для реализации сервисов, взаимодействие с другими администраторами для обеспечения согласованной работы. -

-

-Обязанности администратора механизмов безопасности определяются перечнем задействованных механизмов. Типичный список таков: -

-

-• управление ключами (генерация и распределение) ;
-• управление шифрованием (установка и синхронизация криптографических параметров). К управлению шифрованием можно отнести и администрирование механизмов электронной подписи. Управление целостностью, если оно обеспечивается криптографическими средствами, также тяготеет к данному направлению;
-• администрирование управления доступом (распределение информации, необходимой для управления - паролей, списков доступа и т.п.);
-• управление аутентификацией (распределение информации, необходимой для аутентификации - паролей, ключей и т.п.);
-• управление дополнением трафика (выработка и поддержание правил, задающих характеристики дополняющих сообщений - частоту отправки, размер и т.п.);
-• управление маршрутизацией (выделение доверенных путей);
-• управление нотаризацией (распространение информации о нотариальных службах, администрирование этих служб).
-

-

-Мы видим, что администрирование средств безопасности в распределенной ИС имеет много особенностей по сравнению с централизованными системами. -

-

Стандарт ISO/IEC 15408 "Критерии оценки безопасности информационных технологий"

-

-Основные понятия -

-

-Мы возвращаемся к теме оценочных стандартов, приступая к рассмотрению самого полного и современного среди них - "Критериев оценки безопасности информационных технологий" (издан 1 декабря 1999 года). Этот международный стандарт стал итогом почти десятилетней работы специалистов нескольких стран, он вобрал в себя опыт существовавших к тому времени документов национального и межнационального масштаба. -

-

-По историческим причинам данный стандарт часто называют "Общими критериями" (или даже ОК). Мы также будем использовать это сокращение. -

-

-"Общие критерии" на самом деле являются метастандартом, определяющим инструменты оценки безопасности ИС и порядок их использования. В отличие от "Оранжевой книги", ОК не содержат предопределенных "классов безопасности". Такие классы можно строить, исходя из требований безопасности, существующих для конкретной организации и/или конкретной информационной системы. -

-

-С программистской точки зрения ОК можно считать набором библиотек, помогающих писать содержательные "программы" - задания по безопасности, типовые профили защиты и т.п. Программисты знают, насколько хорошая библиотека упрощает разработку программ, повышает их качество. Без библиотек, "с нуля", программы не пишут уже очень давно; оценка безопасности тоже вышла на сопоставимый уровень сложности, и "Общие критерии" предоставили соответствующий инструментарий. -

-

-Важно отметить, что требования могут быть параметризованы, как и полагается библиотечным функциям. -

-

-Как и "Оранжевая книга", ОК содержат два основных вида требований безопасности: -

-

-• функциональные, соответствующие активному аспекту защиты, предъявляемые к функциям безопасности и реализующим их механизмам;
-• требования доверия, соответствующие пассивному аспекту, предъявляемые к технологии и процессу разработки и эксплуатации. -

-

-Требования безопасности предъявляются, а их выполнение проверяется для определенного объекта оценки - аппаратно-программного продукта или информационной системы. -

-

-Очень важно, что безопасность в ОК рассматривается не статично, а в привязке к жизненному циклу объекта оценки. Выделяются следующие этапы:
-• определение назначения, условий применения, целей и требований безопасности;
-• проектирование и разработка;
-• испытания, оценка и сертификация;
-• внедрение и эксплуатация.
- -

-

-В ОК объект оценки рассматривается в контексте среды безопасности, которая характеризуется определенными условиями и угрозами. -

-

-В свою очередь, угрозы характеризуются следующими параметрами:
-• источник угрозы;
-• метод воздействия;
-• уязвимые места, которые могут быть использованы;
-• ресурсы (активы), которые могут пострадать.
- -

-

-Уязвимые места могут возникать из-за недостатка в:
-• требованиях безопасности;
-• проектировании ;
-• эксплуатации.
- -

-

-Слабые места по возможности следует устранить, минимизировать или хотя бы постараться ограничить возможный ущерб от их преднамеренного использования или случайной активизации. -

-

-С точки зрения технологии программирования в ОК использован устаревший библиотечный (не объектный) подход. Чтобы, тем не менее, структурировать пространство требований, в "Общих критериях" введена иерархия класс-семейство-компонент-элемент. -

-

-Классы определяют наиболее общую, "предметную" группировку требований (например, функциональные требования подотчетности). -

-

-Семейства в пределах класса различаются по строгости и другим нюансам требований. -

-

-Компонент - минимальный набор требований, фигурирующий как целое. -

-

-Элемент - неделимое требование. -

-

-Как и между библиотечными функциями, между компонентами ОК могут существовать зависимости. Они возникают, когда компонент сам по себе недостаточен для достижения цели безопасности. Вообще говоря, не все комбинации компонентов имеют смысл, и понятие зависимости в какой-то степени компенсирует недостаточную выразительность библиотечной организации, хотя и не заменяет объединение функций в содержательные объектные интерфейсы. -

-

-Как указывалось выше, с помощью библиотек могут формироваться два вида нормативных документов: профиль защиты и задание по безопасности. -

-

-Профиль защиты (ПЗ) представляет собой типовой набор требований, которым должны удовлетворять продукты и/или системы определенного класса (например, операционные системы на компьютерах в правительственных организациях). -

-

-Задание по безопасности содержит совокупность требований к конкретной разработке, выполнение которых обеспечивает достижение поставленных целей безопасности. -

-

-Выше мы отмечали, что в ОК нет готовых классов защиты. Сформировать классификацию в терминах "Общих критериев" - значит определить несколько иерархически упорядоченных (содержащих усиливающиеся требования) профилей защиты, в максимально возможной степени использующих стандартные функциональные требования и требования доверия безопасности. -

-

-Выделение некоторого подмножества из всего множества профилей защиты во многом носит субъективный характер. По целому ряду соображений (одним из которых является желание придерживаться объектно-ориентированного подхода) целесообразно, на наш взгляд, сформировать сначала отправную точку классификации, выделив базовый (минимальный) ПЗ, а дополнительные требования компоновать в функциональные пакеты. -

-

-Функциональный пакет - это неоднократно используемая совокупность компонентов, объединенных для достижения определенных целей безопасности. "Общие критерии" не регламентируют структуру пакетов, процедуры верификации, регистрации и т.п., отводя им роль технологического средства формирования ПЗ. -

-

-Базовый профиль защиты должен включать требования к основным (обязательным в любом случае) возможностям. Производные профили получаются из базового путем добавления необходимых пакетов расширения, то есть подобно тому, как создаются производные классы в объектно-ориентированных языках программирования. -

-

Функциональные требования

-

-Функциональные требования сгруппированы на основе выполняемой ими роли или обслуживаемой цели безопасности. Всего в "Общих критериях" представлено 11 функциональных классов, 66 семейств, 135 компонентов. Это, конечно, значительно больше, чем число аналогичных сущностей в "Оранжевой книге". -

-

-Перечислим классы функциональных требований ОК:
-• идентификация и аутентификация ;
-• защита данных пользователя ;
-• защита функций безопасности (требования относятся к целостности и контролю данных сервисов безопасности и реализующих их механизмов);
-• управление безопасностью (требования этого класса относятся к управлению атрибутами и параметрами безопасности);
-• аудит безопасности (выявление, регистрация, хранение, анализ данных, затрагивающих безопасность объекта оценки, реагирование на возможное нарушение безопасности);
-• доступ к объекту оценки ;
-• приватность (защита пользователя от раскрытия и несанкционированного использования его идентификационных данных);
-• использование ресурсов (требования к доступности информации);
-• криптографическая поддержка (управление ключами);
-• связь ( аутентификация сторон, участвующих в обмене данными);
-• доверенный маршрут/канал (для связи с сервисами безопасности).
- -

-

-Опишем подробнее два класса, демонстрирующие особенности современного подхода к ИБ. -

-

-Класс "Приватность" содержит 4 семейства функциональных требований. -

-

-Анонимность. Позволяет выполнять действия без раскрытия идентификатора пользователя другим пользователям, субъектам и/или объектам. Анонимность может быть полной или выборочной. В последнем случае она может относиться не ко всем операциям и/или не ко всем пользователям (например, у уполномоченного пользователя может оставаться возможность выяснения идентификаторов пользователей). -

-

-Псевдонимность. Напоминает анонимность, но при применении псевдонима поддерживается ссылка на идентификатор пользователя для обеспечения подотчетности или для других целей. -

-

-Невозможность ассоциации. Семейство обеспечивает возможность неоднократного использования информационных сервисов, но не позволяет ассоциировать случаи использования между собой и приписать их одному лицу. Невозможность ассоциации защищает от построения профилей поведения пользователей (и, следовательно, от получения информации на основе подобных профилей). -

-

-Скрытность. Требования данного семейства направлены на то, чтобы можно было использовать информационный сервис с сокрытием факта использования. Для реализации скрытности может применяться, например, широковещательное распространение информации, без указания конкретного адресата. Годятся для реализации скрытности и методы стеганографии, когда скрывается не только содержание сообщения (как в криптографии), но и сам факт его отправки. -

-

-Еще один показательный (с нашей точки зрения) класс функциональных требований - "Использование ресурсов", содержащий требования доступности. Он включает три семейства. -

-

-Отказоустойчивость. Требования этого семейства направлены на сохранение доступности информационных сервисов даже в случае сбоя или отказа. В ОК различаются активная и пассивная отказоустойчивость. Активный механизм содержит специальные функции, которые активизируются в случае сбоя. Пассивная отказоустойчивость подразумевает наличие избыточности с возможностью нейтрализации ошибок. -

-

-Обслуживание по приоритетам. Выполнение этих требований позволяет управлять использованием ресурсов так, что низкоприоритетные операции не могут помешать высокоприоритетным. -

-

-Распределение ресурсов. Требования направлены на защиту (путем применения механизма квот) от несанкционированной монополизации ресурсов. -

-

-Мы видим, что "Общие критерии" - очень продуманный и полный документ с точки зрения функциональных требований. В то же время, хотелось бы обратить внимание и на некоторые недостатки. -

-

-Первый мы уже отмечали - это отсутствие объектного подхода. Функциональные требования не сгруппированы в осмысленные наборы (объектные интерфейсы), к которым могло бы применяться наследование. Подобное положение, как известно из технологии программирования, чревато появлением слишком большого числа комбинаций функциональных компонентов, несопоставимых между собой. -

-

-В современном программировании ключевым является вопрос накопления и многократного использования знаний. Стандарты - одна из форм накопления знаний. Следование в ОК "библиотечному", а не объектному подходу сужает круг фиксируемых знаний, усложняет их корректное использование. -

-

-К сожалению, в "Общих критериях" отсутствуют архитектурные требования, что является естественным следствием избранного старомодного программистского подхода "снизу вверх". На наш взгляд, это серьезное упущение. Технологичность средств безопасности, следование общепризнанным рекомендациям по протоколам и программным интерфейсам, а также апробированным архитектурным решениям, таким как менеджер/агент, - необходимые качества изделий информационных технологий, предназначенных для поддержки критически важных функций, к числу которых, безусловно, относятся функции безопасности. Без рассмотрения интерфейсных аспектов системы оказываются нерасширяемыми и изолированными. Очевидно, с практической точки зрения это недопустимо. В то же время, обеспечение безопасности интерфейсов - важная задача, которую желательно решать единообразно. -

-

Требования доверия безопасности

-

-Установление доверия безопасности, согласно "Общим критериям", основывается на активном исследовании объекта оценки. -

-

-Форма представления требований доверия, в принципе, та же, что и для функциональных требований. Специфика состоит в том, что каждый элемент требований доверия принадлежит одному из трех типов:
-• действия разработчиков ;
-• представление и содержание свидетельств ;
-• действия оценщиков.
- -

-

-Всего в ОК 10 классов, 44 семейства, 93 компонента требований доверия безопасности. Перечислим классы:
-• разработка (требования для поэтапной детализации функций безопасности от краткой спецификации до реализации );
-• поддержка жизненного цикла (требования к модели жизненного цикла, включая порядок устранения недостатков и защиту среды разработки);
-• тестирование ;
-• оценка уязвимостей (включая оценку стойкости функций безопасности);
-• поставка и эксплуатация ;
-• управление конфигурацией;
-• руководства (требования к эксплуатационной документации);
-• поддержка доверия (для поддержки этапов жизненного цикла после сертификации);
-• оценка профиля защиты;
-• оценка задания по безопасности.
- -

-

-Применительно к требованиям доверия в "Общих критериях" сделана весьма полезная вещь, не реализованная, к сожалению, для функциональных требований. А именно, введены так называемые оценочные уровни доверия (их семь), содержащие осмысленные комбинации компонентов. -

-

-Оценочный уровень доверия 1 (начальный) предусматривает анализ функциональной спецификации, спецификации интерфейсов, эксплуатационной документации, а также независимое тестирование. Уровень применим, когда угрозы не рассматриваются как серьезные. -

-

-Оценочный уровень доверия 2, в дополнение к первому уровню, предусматривает наличие проекта верхнего уровня объекта оценки, выборочное независимое тестирование, анализ стойкости функций безопасности, поиск разработчиком явных уязвимых мест. -

-

-На третьем уровне ведется контроль среды разработки и управление конфигурацией объекта оценки. -

-

-На уровне 4 добавляются полная спецификация интерфейсов, проекты нижнего уровня, анализ подмножества реализации, применение неформальной модели политики безопасности, независимый анализ уязвимых мест, автоматизация управления конфигурацией. Вероятно, это самый высокий уровень, которого можно достичь при существующей технологии программирования и приемлемых затратах. -

-

-Уровень 5, в дополнение к предыдущим, предусматривает применение формальной модели политики безопасности, полуформальных функциональной спецификации и проекта верхнего уровня с демонстрацией соответствия между ними. Необходимо проведение анализа скрытых каналов разработчиками и оценщиками. -

-

-На уровне 6 реализация должна быть представлена в структурированном виде. Анализ соответствия распространяется на проект нижнего уровня. -

-

-Оценочный уровень 7 (самый высокий) предусматривает формальную верификацию проекта объекта оценки. Он применим к ситуациям чрезвычайно высокого риска. -

-

-На этом мы заканчиваем краткий обзор "Общих критериев" -

-
- -
- - - - - - - - - - - - - - diff --git a/www/stream_cipher.html b/www/stream_cipher.html deleted file mode 100644 index 5b452e0..0000000 --- a/www/stream_cipher.html +++ /dev/null @@ -1,290 +0,0 @@ - - - Security is an important thing - - - - - - - - - - - - - - - -


- - - - - -
-
-

Введение

-

Поточный шифр (stream cipher) выполняет преобразование входного сообщения по одному биту (или байту) за операцию. Поточный алгоритм шифрования устраняет необходимость разбивать сообщение на целое число блоков достаточно большой длины, следовательно, он может работать в реальном времени. Таким образом, если передается поток символов, каждый символ может шифроваться и передаваться сразу. - - -

- - -
-

Общая информация

-

Работа типичного поточного шифра показана на картинке справа.

-
- -
- - - -
- -
-

Как правило в качестве генераторов ключей в поточных шифрах используются генераторы псевдослучайных чисел(ГПСЧ). Целью использования таких генераторов является получение "бесконечного" ключевого слова, располагая относительно малой длиной самого ключа. ГПСЧ создает последовательность битов, похожую на случайную. На самом деле, конечно же, такие последовательности вычисляются по определенным правилам и не являются случайными, поэтому они могут быть абсолютно точно воспроизведены как на передающей, так и на принимающей стороне. Но для использвания генератора псевдослучайных чисел в поточных шфирах, генератор должен иметь определенные свойства. -
-
Необходмые свойства ГПСЧ для использование его в криптографии: -

    -
  • период последовательности должен быть очень большой;
  • -
  • порождаемая последовательность должна быть "почти" неотличима от действительно случайной;
  • -
  • вероятности порождения различных значений должны быть в точности равны;
  • -
  • для того, чтобы только законный получатель мог расшифровать сообщение, следует при получении потока ключевых битов ki использовать и учитывать некоторый секретный ключ, причем вычисление числа ki+1 по известным предыдущим элементам последовательности ki без знания ключа должно быть трудной задачей.
  • -

- -

Генераторы псевдослучайных чисел на основе сдвиговых регистров с обратной связью

-

- - В теории кодирования и криптографии широко применяются так называемые сдвиговые регистры с обратной связью. Они использовались в аппаратуре шифрования еще до начала массового использования ЭВМ и современных высокоскоростных программных шифраторов. - Сдвиговые регистры с обратной связью могут применяться для получения потока псевдослучайных бит. Сдвиговый регистр с обратной связью состоит из двух частей: собственно n-битного сдвигового регистра и устройства обратной связи. -


Сдвиговый регистр с обратой связью.
- - Извлекать биты из сдвигового регистра можно только по одному. Если необходимо извлечь следующий бит, все биты регистра сдвигаются вправо на 1 разряд. При этом на вход регистра слева поступает новый бит, который формируется устройством обратной связи и зависит от всех остальных битов сдвигового регистра. За счет этого биты регистра изменяются по определенному закону, который и определяет схему получения ПСЧ. Понятно, что через некоторое количество тактов работы регистра последовательность битов начнет повторяться. Длина получаемой последовательности до начала ее повторения называется периодом сдвигового регистра. -

- - Простейшим видом сдвигового регистра с обратной связью является линейный сдвиговый регистр с обратной связью (linear feedbackshift register – LFSR). Обратная связь в этом устройстве реализуется просто как сумма по модулю 2 всех (или некоторых) битов регистра. Биты, которые участвуют в обратной связи, образуют отводную последовательность. Линейные сдвиговые регистры с обратной связью или их модификации часто применяется в криптографии. - Для того, чтобы стало понятнее, как работает сдвиговый регистр с обратной связью, рассмотрим 4-битовый LFSR с отводом от первого и четвертого разрядов, представленный на рисунке ниже. - - - На каждом шаге все содержимое регистра сдвигается вправо на один разряд. При этом можно получить в качестве результата один бит. На освободившееся слева место поступает бит, равный результату вычисления функции обратной связи f=b1⊕b4. Выходную последовательность генератора псевдослучайных бит образует последний столбец таблицы (извлекаемый бит). -
Последовательность работы линейного сдвигового регистра.
- - - Линейный сдвиговый регистр размером n бит может находиться в одном из 2n-1 состояний (исключается состояние регистра из одних нулей - при появлении такого состояния далее будут порождаться лишь нули, и о псевдослучаности порождаемой последовательности говорить не приходится). Поэтому теоретически такой регистр может генерировать псевдослучайную последовательность с максимальным периодом 2n-1. Линейный сдвиговый регистр с обратной связью будет генерировать циклическую последовательность битов с максимальным периодом только при выборе в качестве отводной последовательности определенных бит. Разработана математическая теория, позволяющая выбрать подходящие номера разрядов для бит отводной последовательности. - -

Линейные сдвиговые регистры с обратной связью часто использовались и используются до сих пор при шифровании потоков данных. Для повышения криптостойкости в таких устройствах шифрования применяются комбинации нескольких сдвиговых регистров с обратной связью, а также вводятся дополнительные перемешивающие операции. Такие электронные схемы предлагались и выпускались еще до второй мировой войны. Аналогичные принципы заложены и в некоторые поточные шифры, созданные в конце XX века, например, в алгоритм А5, использовавшийся в Европе для шифрования сотовых цифровых каналов связи стандарта GSM. Несмотря на то, что некоторые криптоаналитики высказывают сомнения в надежности алгоритмов поточного шифрования с использованием линейных сдвиговых регистров с обратной связью, они положены в основу функционирования различных военных и гражданских устройств связи, используемых до настоящего времени. - -

Основным недостатком генераторов псевдослучайных чисел на базе линейных сдвиговых регистров является сложность программной реализации. Сдвиги и битовые операции легко и быстро выполняются в электронной аппаратуре, поэтому в разных странах выпускаются микросхемы и устройства для поточного шифрования на базе алгоритмов с использованием сдвиговых регистров с обратной связью. -

- Есть несколько причин использования линейных регистров сдвига в криптографии: - -
  • высокое быстродействие криптографических алгоритмов;
  • -
  • применение только простейших операций сложения и умножения, аппаратно реализованных практически во всех вычислительных устройствах;
  • -
  • хорошие криптографические свойства (генерируемые последовательности имеют большой период и хорошие статистические свойства);
  • -
  • легкость анализа с использованием алгебраических методов за счет линейной структуры;
  • -
    - - -

    -

    Нелинейная комбинация генераторов -

    -
    Нелинейная комбинация генераторов
    - -
    -

    Генератор Геффа. В этом генераторе потока ключей используются три LFSR, объединенные нелинейным образом. Два LFSR являются входами мультиплексора, а третий LFSR управляет выходом мультиплексора. Если а1, а2 и а3 - выходы трех LFSR, выход генератора Геффа (Geffe) можно описать как: -
    b= a1a2 — a1a3.
    - Если длины LFSR равны n1 n2 и n3, соответственно, то линейная сложность генератора равна: -
    (n1+1)*n2+n1*n3.
    - -Период генератора равен наименьшему общему делителю периодов трех генераторов. При условии, что степени трех примитивных многочленов обратной связи взаимно просты, период этого генератора будет равен произведению периодов трех LFSR. -

    -
    Генератор Геффа
    - -
    - - -

    Генераторы на нелинейных фильтрах

    -
    Генератор на нелинейном фильтре
    - -

    - В нелинейных комбинациях генераторов и генераторах на нелинейных фильтрах перемещение данных во всех РСЛОС контролируется одним синхросигналом. - Основная идея функционирования рассматриваемого типа генераторов — внести нелинейность в работу генераторов потока ключей, основанных на РСЛОС, путём управления синхросигналом одного регистра выходной последовательностью другого. - Есть 2 типа генераторов, основанных на управлении синхросигналом: - -

  • генератор переменного шага;
  • -
  • сжимающий генератор.
  • - - -

    Основная идея: РСЛОС 1 используется для управления передвижением битов двух других РСЛОС 2 и 3.

    -
    Генератор переменного шага.
    - - -
    Сжимающий генератор.
    - - Контролирующий регистр РСЛОС 1 используется для управления выходом РСЛОС 2. -

    - -

    Криптоанализ. Атаки на поточные шифры

    -

    - Силовые атаки -

    - К этому классу относятся атаки, осуществляющие полный перебор всех возможных вариантов. Сложность полного перебора зависит от количества всех возможных решений задачи (в частности, размера пространства ключей или пространства открытых текстов). Этот класс атак применим ко всем видам систем поточного шифрования. При разработке систем шифрования разработчики стремятся сделать так, чтобы этот вид атак был наиболее эффективным по сравнению с другими существующими методами взлома. -

    - Статистические атаки -

    - Статистические атаки делятся на два подкласса: -

      -
    • метод криптоанализа статистических свойств шифрующей гаммы: направлен на изучение выходной последовательности криптосистемы; криптоаналитик пытается установить значение следующего бита последовательности с вероятностью выше вероятности случайного выбора с помощью различных статистических тестов.
    • -
    • метод криптоанализа сложности последовательности: криптоаналитик пытается найти способ генерировать последовательность, аналогичную гамме, но более просто реализуемым способом. -
    - Оба метода используют принцип линейной сложности. -

    - Аналитические атаки -

    - Этот вид атак рассматривается в предположении, что криптоаналитику известны описание генератора, открытый и соответствующий закрытый тексты. Задача криптоаналитика определить использованный ключ (начальное заполнение регистров). Виды аналитических атак, применяемые к синхронным поточным шифрам: -
      -
    • корреляционные
    • -
    • компромисс “время-память”
    • -
    • инверсионная
    • -
    • “предполагай и определяй”
    • -
    • на ключевую загрузку и реинициализацию
    • -
    • XSL-атака
    • -
    - Корреляционные атаки
    -Являются наиболее распространёнными атаками для взлома поточных шифров. -Известно, что работа по вскрытию криптосистемы может быть значительно сокращена, если нелинейная функция пропускает на выход информацию о внутренних компонентах генератора. Поэтому для восстановления начального заполнения регистров корреляционные атаки исследуют корреляцию выходной последовательности шифросистемы с выходной последовательностью регистров. -

    Компромисс «время-память»
    -Цель данной атаки — восстановление исходного состояния регистра сдвига (нахождение ключа), используя известную схему устройства и фрагмент шифрующей последовательности. Сложность атаки зависит от размера шифра и длины перехваченной гаммы. -
    Состоит из двух этапов: - -
  • построение большого словаря, в котором записаны всевозможные пары «состояние-выход»;
  • -
  • предположение о начальном заполнении регистра сдвига, генерация выхода, просмотр перехваченной выходной последовательности и поиск соответствия со сгенерированным выходом. Если произошло совпадение, то данное предположительное заполнение с большой вероятностью является начальным.
  • -
    -
    -«Предполагай и определяй»
    -Атака основывается на предположении, что криптоаналитику известны гамма, полином обратной связи, количество сдвигов регистра между выходами схемы и фильтрующая функция. -
    Состоит из трёх этапов: - -
  • предположение о заполнении некоторых ячеек регистра;
  • -
  • определение полного заполнения регистра на основании предположения о знании криптоаналитика;
  • -
  • генерация выходной последовательности; если она совпадает с гаммой, то предположение на первом этапе было верно; если не совпадает, то возвращаемся к этапу 1.
  • -Сложность алгоритма зависит от устройства генератора и от количества предположений. -
    -

    - - - - - -

    -

    Алгоритм А5

    - - А5 — это поточный алгоритм шифрования, используемый для обеспечения конфиденциальности передаваемых данных между телефоном и базовой станцией в европейской системе мобильной цифровой связи GSM (Groupe Spécial Mobile). -Шифр основан на побитовом сложении по модулю два (булева операция «исключающее или») генерируемой псевдослучайной последовательности и шифруемой информации. В A5 псевдослучайная последовательность реализуется на основе трёх линейных регистров сдвига с обратной связью. Регистры имеют длины 19, 22 и 23 бита соответственно. Сдвигами управляет специальная схема, организующая на каждом шаге смещение как минимум двух регистров, что приводит к их неравномерному движению. Последовательность формируется путём операции «исключающее или» над выходными битами регистров. -Изначально французскими военными специалистами-криптографами был разработан поточный шифр для использования исключительно в военных целях. В конце 80-х для стандарта GSM потребовалось создание новой, современной системы безопасности. В её основу легли три секретных алгоритма: аутентификации — A3, шифрования потока — A5, генерации сеансового ключа — А8. В качестве алгоритма A5 была использована французская разработка. Этот шифр обеспечивал достаточно хорошую защищённость потока и, следовательно, конфиденциальность разговора. Изначально экспорт стандарта из Европы не предполагался, но вскоре в этом появилась необходимость. Именно поэтому А5 переименовали в А5/1 и стали распространять как в Европе, так и в США. Для остальных стран (в том числе и России) алгоритм модифицировали, значительно понизив криптостойкость шифра. А5/2 был специально разработан как экспортный вариант для стран, не входивших в Евросоюз. Криптостойкость А5/2 была понижена добавлением ещё одного регистра (17 бит), управляющего сдвигами остальных. В А5/0 шифрование отсутствует совсем. В настоящее время разработан также алгоритм А5/3, основанный на алгоритме Касуми и утверждённый для использования в сетях 3G. Эти модификации обозначают как A5/x. -

    - - Алгоритм A5 в настоящее время — это целое семейство шифров. Для описания возьмем А5/1, как родоначальника этого семейства. Изменения в производных алгоритмах опишем отдельно. -
    Схема поточного шифра: сложение открытого текста и последовательности бит даёт шифротекст
    - -
    - В этом алгоритме каждому символу открытого текста соответствует символ шифротекста. Текст не делится на блоки (как в блочном шифровании) и не изменяется в размере. Для упрощения аппаратной реализации и, следовательно, увеличения быстродействия используются только простейшие операции: сложение по модулю 2 (XOR) и сдвиг регистра. -Формирование выходной последовательности происходит путём сложения потока исходного текста с генерируемой последовательностью (гаммой). Особенность операции XOR заключается в том, что применённая чётное число раз, она приводит к начальному значению. Отсюда, декодирование сообщения происходит путём сложения шифротекста с известной последовательностью. -Таким образом, безопасность системы полностью зависит от свойств последовательности. В идеальном случае каждый бит гаммы — это независимая случайная величина, и сама последовательность является случайной. Такая схема была изобретена Вернамом в 1917 году и названа в его честь. Как доказал Клод Шеннон в 1949 году, это обеспечивает абсолютную криптостойкость. Но использование случайной последовательности означает передачу по защищённому каналу сообщения, равного по объёму открытому тексту, что значительно усложняет задачу и практически нигде не используется. -В реальных системах создаётся ключ заданного размера, который без труда передаётся по закрытому каналу. Последовательность генерируется на его основе и является псевдослучайной. Большой класс поточных шифров (в том числе A5) составляют шифры, генератор псевдослучайной последовательности которой основан на регистрах сдвига с линейной обратной связью. -
    Система РСЛОС в А5
    - -

    - Сам по себе РСЛОС легко поддаётся криптоанализу и не является достаточно надёжным для использования в шифровании. Практическое применение имеют системы регистров переменного тактирования с различными длинами и функциями обратной связи. -

    Структура алгоритма А5 выглядит следующим образом: -
      -
    • Три регистра(R1, R2, R3) имеют длины 19, 22 и 23 бита
    • -
    • Многочлены обратных связей: -
      -
    • -
    • Управление тактированием осуществляется специальным механизмом: -
        -
      • в каждом регистре есть биты синхронизации: 8 (R1), 10 (R2), 10 (R3);
      • -
      • вычисляется функция F = x&y|x&z|y&z, где & — булево AND, | - булево OR, а x, y и z — биты синхронизации R1, R2 и R3 соответственно;
      • -
      • сдвигаются только те регистры, у которых бит синхронизации равен F;
      • -
      • фактически, сдвигаются регистры, синхробит которых принадлежит большинству;
      • -
      -
    • -
    • Выходной бит системы — результат операции XOR над выходными битами регистров.
    • -
    -

    - -

    Функционирование алгоритма А5

    -

    - Рассмотрим особенности функционирования алгоритма на основе известной схемы. Передача данных осуществляется в структурированном виде — с разбивкой на кадры (114 бит). Перед инициализацией регистры обнуляются, на вход алгоритма поступают сеансовый ключ (K — 64 бита), сформированный А8, и номер кадра (Fn — 22 бита). Далее последовательно выполняются следующие действия: -

      -
    • Инициализация: -
        -
      • 64 такта, при которых очередной бит ключа XOR-ится с младшим битом каждого регистра, регистры при этом сдвигаются на каждом такте;
      • -
      • аналогичные 22 такта, только операция XOR производится с номером кадра;
      • -
      • 100 тактов с управлением сдвигами регистров, но без генерации последовательности;
      • -
    • -
    • 228 (114 + 114) тактов рабочие, происходит шифрование передаваемого кадра (первые 114 бит) и дешифрование (последние 114 бит) принимаемого;
    • -
    • далее инициализация производится заново, используется новый номер кадра.
    • -
    -

    - -

    Криптостойкость

    -

    - Разработка стандарта GSM подразумевала мощный аппарат шифрования, не поддающийся взлому (особенно в реальном времени). Используемые разработки при надлежащей реализации обеспечивали качественное шифрование передаваемых данных. Именно такую информацию можно получить от компаний, распространяющих этот стандарт. Но стоит отметить важный нюанс: прослушивание разговоров — неотъемлемый атрибут, используемый спецслужбами. Они были заинтересованы в возможности прослушивания телефонных разговоров для своих целей. Таким образом, в алгоритм были внесены изменения, дающие возможность взлома за приемлемое время. Помимо этого, для экспорта A5 модифицировали в A5/2. В MoU (Memorandum of Understand Group Special Mobile standard) признают, что целью разработки A5/2 было понижение криптостойкости шифрования, однако в официальных результатах тестирования говорится, что неизвестно о каких-либо недостатках алгоритма. -

    -
    Известные уязвимости
    - С появлением данных о стандарте A5 начались попытки взлома алгоритма, а также поиска уязвимостей. Огромную роль оказали особенности стандарта, резко ослабляющие защиту, а именно: -

      -
    • 10 бит ключа принудительно занулены;
    • -
    • отсутствие перекрестных связей между регистрами (кроме управления сдвигами);
    • -
    • шифрование служебной информации, известной криптоаналитику;
    • -
    • свыше 40 % ключей приводит к минимальной длине периода генерируемой последовательности, а именно (4/3)*(223-1)
    • -
    • в начале сеанса осуществляется обмен нулевыми сообщениями (по одному кадру);
    • -
    • одинаковое дополнение (padding) для всех пакетов;
    • -
    • в A5/2 движение осуществляется отдельным регистром длиной 17 бит.
    • -
    - На основе этих «дыр» в алгоритме построены схемы взлома. -

    -
    Известные атаки
    - Ключом является сеансовый ключ длиной 64 бита, номер кадра считается известным. Таким образом, сложность атаки, основанной на прямом переборе, равна 264. -Первые обзоры шифра (работа Росса Андерсона) сразу выявили уязвимость алгоритма — из-за уменьшения эффективной длины ключа (зануление 10 бит) сложность упала до 245 (сразу на 6 порядков). Атака Андерсона основана на предположении о начальном заполнении коротких регистров и по выходным данным получения заполнения третьего. -В 1997 году Йован Голич опубликовал результаты анализа А5. Он предложил способ определения первоначального заполнения регистров по известному отрезку гаммы длиной всего 64 бита. Этот отрезок получают из нулевых сообщений. Атака имеет среднюю сложность 240. -В 1999 году Вагнеру и Голдбергу без труда удалось продемонстрировать, что для вскрытия системы достаточно перебором определить начальное заполнение R4. Проверка осуществляется за счёт нулевых кадров. Сложность этой атаки равна 217, таким образом, на современном компьютере вскрытие шифра занимает несколько секунд. -В декабре 1999 года группа израильских учёных (Ади Шамир, Алекс Бирюков, а позже и американец Дэвид Вагнер (англ.)) опубликовали весьма нетривиальный, но теоретически очень эффективный метод вскрытия A5/1: - -
    Это весьма сложная идея, реализуя которую мы наступаем на многих фронтах, чтобы накопить несколько небольших преимуществ, но сложенные все вместе, они дают большой выигрыш.
    - -

    - -
    -
    - - - - - - - - - - - - - diff --git a/www/style.css b/www/style.css new file mode 100644 index 0000000..1383d6b --- /dev/null +++ b/www/style.css @@ -0,0 +1,75 @@ +* { + margin: 0; + padding: 0; +} +html { + height: 100%; +} +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} +body { + font: 12px/18px Arial, sans-serif; + width: 100%; + height: 100%; +} +.wrapper { + width: 1200px; + margin: 0 auto; + min-height: 100%; + height: auto !important; + height: 100%; + font-size: 125%; +} + + +/* Header +-----------------------------------------------------------------------------*/ +.header { + height: 100px; + /*background: #FFE680;*/ +} + + +/* Middle +-----------------------------------------------------------------------------*/ +.middle { + width: 100%; + padding: 0 0 100px; + position: relative; +} +.middle:after { + display: table; + clear: both; + content: ''; +} +.container { + width: 100%; + float: left; + overflow: hidden; +} +.content { + padding: 0 270px 0 0; +} + + +/* Right Sidebar +-----------------------------------------------------------------------------*/ +.right-sidebar { + float: left; + width: 250px; + margin-left: -250px; + position: relative; + /*background: #FFACAA;*/ +} + + +/* Footer +-----------------------------------------------------------------------------*/ +.footer { + width: 1000px; + margin: -100px auto 0; + height: 100px; + /*background: #BFF08E;*/ + position: relative; +} \ No newline at end of file