diff --git a/ru_RU.KOI8-R/books/design-44bsd/Makefile b/ru_RU.KOI8-R/books/design-44bsd/Makefile
new file mode 100644
index 0000000000..102212b4ab
--- /dev/null
+++ b/ru_RU.KOI8-R/books/design-44bsd/Makefile
@@ -0,0 +1,24 @@
+#
+# $FreeBSD$
+# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/design-44bsd/Makefile,v 1.2 2001/07/25 10:37:21 phantom Exp $
+#
+# Original revision: 1.2
+
+DOC?= book
+
+FORMATS?= html
+
+IMAGES= fig1.eps fig2.eps
+
+INSTALL_COMPRESSED?=gz
+INSTALL_ONLY_COMPRESSED?=
+
+SRCS= book.sgml
+
+# Use the local DSSSL file
+DSLHTML?= ${.CURDIR}/freebsd.dsl
+DSLPRINT?= ${.CURDIR}/freebsd.dsl
+
+DOC_PREFIX?= ${.CURDIR}/../../..
+
+.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/ru_RU.KOI8-R/books/design-44bsd/book.sgml b/ru_RU.KOI8-R/books/design-44bsd/book.sgml
new file mode 100644
index 0000000000..e80bb2423a
--- /dev/null
+++ b/ru_RU.KOI8-R/books/design-44bsd/book.sgml
@@ -0,0 +1,2398 @@
+
+
+
+%man;
+]>
+
+
+
+ Архитектура и реализация операционной системы 4.4BSD
+
+
+
+ Marshall
+ Kirk
+ McKusick
+
+
+
+ Keith
+ Bostic
+
+
+
+ Michael
+ J.
+ Karels
+
+
+
+ John
+ S.
+ Quarterman
+
+
+
+
+ 1996
+ Addison-Wesley Longman, Inc
+
+
+
+ 2001
+ Перевод на русский язык: Андрей Захватов
+
+
+
+
+
+ Вторая глава книги Архитектура и реализация
+ Операционной Системы 4.4BSD представлена здесь с
+ разрешения издателя. Никакая из частей этого текста не может
+ воспроизводится, либо распространятся без письменного
+ разрешения
+ издателя. Оставшаяся
+ часть
+ книги очень подробно исследует и раскрывает концепции
+ представленные в этой главе и является прекрасным материалом для
+ всех кто интересуется BSD UNIX. Более подробную информацию об этой
+ книге Вы можете получить от издателя, у которого Вы также можете
+ подписатся на получение новостей о
+ подобных книгах.
+ Информация о Курсах о
+ BSD доступна у Кирка МакКусика.
+
+
+
+
+ Обзор архитектуры 4.4BSD
+
+
+ Системные сервисы 4.4BSD и ядро
+
+ Ядро 4.4BSD предоставляет четыре основных системных сервиса:
+ процессы, файловую систему, коммуникации и запуск системы. Этот раздел
+ перечисляет, в каком месте этой книги описана каждая из этих
+ служб.
+
+
+
+ Процессы образуют поток управления в адресном пространстве.
+ Механизмы создания, завершения и другие управляющие процессы
+ описаны в Главе 4. Для каждого процесса система мультиплексирует
+ отдельное виртуальное адресное пространство; такое управление
+ памятью обсуждается в Главе 5.
+
+
+
+ Механизм доступа пользователя к файловой системе и устройствам
+ один и тот же; общие аспекты обсуждаются в Главе 6. Файловая
+ система является набором именованных файлов, организованных в
+ древовидную иерархию каталогов, а операции по управлению ими
+ представлены в Главе 7. Файлы располагаются на таких физических
+ носителях, как диски. 4.4BSD поддерживает несколько типов
+ организации данных на диске, как описано далее в Главе 8. Доступ к
+ файлам на удаленных машинах является предметом обсуждения в Главе
+ 9. Для доступа к системе Терминалы используются терминалы; их
+ функционированию посвящена глава 10.
+
+
+
+ Механизмы коммуникаций, предоставляемые традиционными
+ UNIX-системами, включают однонаправленные потоки байтов между
+ связанными процессами (смотрите материал о конвейерах в Разделе
+ 11.1) и извещение об исключительных событиях (смотрите материал о
+ сигналах в Разделе 4.7). В 4.4BSD имеется также механизм
+ межпроцессного взаимодействия между процессами. Этот механизм,
+ описываемый в Главе 11, использует способы доступа, отличающиеся от
+ тех, что используются в файловой системе, но, как только соединение
+ установлено, процесс может работать с ним, как будто это конвейер.
+ Имеется и механизм работы с сетью, описываемый в Главе 12, который
+ обычно используется как слой ниже механизма IPC. В Главе 13 дается
+ детальное описание конкретной реализации механизма работы с
+ сетью.
+
+
+
+ В любой операционной системе присутствуют вопросы управления,
+ такие, как ее запуск. Запуск и вопросы управления обсуждаются в
+ Главе 14.
+
+
+
+ Разделы с 2.3 по 2.14 представляют собой вводный материал,
+ относящийся к главам с 3 по 14. Мы определим понятия, коснемся
+ основных системных вызовов и рассмотрим исторические разработки.
+ Наконец, мы расскажем о причинах многих ключевых архитектурных
+ решений.
+
+
+ Ядро
+
+ Ядро является частью системы, которая
+ работает в защищенном режиме и управляет доступом всех
+ пользовательских программ к низкоуровнему аппаратному обеспечению
+ (к примеру, ЦПУ, дискам, терминалам, сетевым связям) и программным
+ компонентам (к примеру, файловой системе, сетевым протоколам). Ядро
+ предоставляет основные системные услуги; оно создает процессы и
+ управляет ими, предоставляет функции для доступа к файловой системе
+ и службам связи. Такие функции, называемые системными
+ вызовами, доступны процессам пользователей в виде
+ библиотечных подпрограмм. Эти системные вызовы являются единственным
+ способом доступа к таким услугам. Подробно механизм работы системных
+ вызовов дается в Главе 3, вместе с описанием некоторых механизмов
+ ядра, работа которых не является прямым результатом процесса,
+ выполняющего системный вызов.
+
+ Ядро, по традиционной терминологии
+ операционных систем, является маленьким куском программного
+ обеспечения, которое предоставляет только минимальный набор услуг,
+ необходимый для реализации дополнительных служб операционной системы.
+ В современных исследовательских операционных системах -- таких, как
+ Chorus , Mach , Tunis , и
+ V Kernel -- такое разделение
+ функциональности выполнено не только логически. Такие службы, как
+ файловые системы и сетевые протоколы, выполнены в виде прикладных
+ процессов клиентов ядра или микроядра.
+
+ Ядро 4.4BSD не разбивается на несколько процессов. Это
+ основополагающее архитектурное решение было сделано в самых ранних
+ версиях UNIX. В первых двух реализациях Кена Томпсона (Ken Thompson)
+ не было отображаемой памяти, и поэтому не было аппаратного различия
+ между адресным пространством пользователя и ядра . Могла бы быть придумана система обмена
+ сообщениями как реально реализуемая модель процессов ядра и
+ пользователя. Для простоты и увеличения производительности было
+ выбрано монолитное ядро. К тому же ранние ядра были маленькими;
+ включение таких служб, как сетевые коммуникации, в ядро увеличило его
+ размер. Современные тенденции в области операционных систем сводятся
+ к уменьшению размера ядра за счет перевода таких служб в
+ пользовательское адресное пространство.
+
+ Пользователи обычно общаются с системой через интерпретатор языка
+ команд, называемый оболочкой (shell), и, может
+ быть, через дополнительные прикладные пользовательские программы.
+ Такие программы и оболочка реализованы в виде процессов. Подробное
+ описание таких программ выходит за рамки этой книги, которая
+ практически полностью посвящена работе ядра.
+
+ В разделах 2.3 и 2.4 описываются сервисы, предоставляемые ядром
+ 4.4BSD, и дается обзор их архитектуры. Последующие главы описывают
+ подробности архитектуры и реализации этих сервисов в 4.4BSD.
+
+
+
+
+ Организация ядра
+
+ В этом разделе мы рассматриваем организацию ядра 4.4BSD с двух
+ точек зрения:
+
+
+
+ Как статический блок программного обеспечения, категоризуемый
+ по функциональности модулей, составляющих ядро
+
+
+
+ В его динамике, категоризуемой по услугам, предоставляемым
+ пользователям
+
+
+
+ Самая большая часть ядра реализует системные услуги, к которым
+ приложения обращаются через системные вызовы. В 4.4BSD это программное
+ обеспечение организуется по следующим принципам:
+
+
+
+ Базовые услуги ядра: обработка таймеров и системного таймера,
+ управление дескрипторами и процессами
+
+
+
+ Поддержка управления памятью: подкачка и выгрузка
+
+
+
+ Общесистемные интерфейсы: ввод/вывод, управление и
+ мультиплексирование операций, выполняемых над дескрипторами
+
+
+
+ Файловая система: файлы, каталоги, преобразование маршрутов,
+ блокировка файлов и управление буфером ввода/вывода
+
+
+
+ Поддержка работы с терминалами: драйвер терминального
+ интерфейса и режимы работы терминального канала
+
+
+
+ Службы межпроцессного взаимодействия: сокеты
+
+
+
+ Поддержка сетевых коммуникаций: коммуникационные протоколы и
+ общесетевые службы, такие, как маршрутизация
+
+
+
+
+
+ Большая часть программного обеспечения в этих категориях является
+ машинно-независимой и переносима между различными аппаратными
+ архитектурами.
+
+ Машинно-зависимые аспекты ядра отделены от основного кода. В
+ частности, ни в одной части машинно-независимого кода не содержится
+ кода, зависимого от конкретной архитектуры. Когда требуется произвести
+ действия, зависимые от архитектуры, машинно-независимый код вызывает
+ функцию, зависимую от архитектуры машины, которая находится в
+ машинно-зависимой части кода. Машинно-зависимое программное
+ обеспечение включает в себя
+
+
+
+ Низкоуровневые действия по запуску системы
+
+
+
+ Обработка исключительных ситуаций и прерываний
+
+
+
+ Низкоуровневые манипуляции процессом во время работы
+
+
+
+ Конфигурация и инициализация аппаратных устройств
+
+
+
+ Поддержка устройств ввода/вывода во время работы
+
+
+
+
+ Машинно-зависимое программное обеспечение для HP300 в ядре
+ 4.4BSD
+
+
+
+
+ Категория
+ Количество строк кода
+ Процент от всего ядра
+
+
+
+
+
+ всего машинно-зависимая часть
+ 39,634
+ 19.6
+
+
+
+
+
+ машинно-зависимые заголовки
+ 1,562
+ 0.8
+
+
+
+ заголовки драйверов устройств
+ 3,495
+ 1.7
+
+
+
+ исходные тексты драйверов устройств
+ 17,506
+ 8.7
+
+
+
+ виртуальная память
+ 3,087
+ 1.5
+
+
+
+ остальная машинно-зависимая часть
+ 6,287
+ 3.1
+
+
+
+ процедуры на ассемблере
+ 3,014
+ 1.5
+
+
+
+ совместимость с HP/UX
+ 4,683
+ 2.3
+
+
+
+
+
+ суммаризует машинно-независимый
+ код, который составляет ядро 4.4BSD для HP300. Числа во второй колонке
+ обозначают количество строк исходного кода на языке C, заголовочных
+ файлов и ассемблерного кода. Практически весь код ядра написан на
+ языке программирования C; менее двух процентов написано на языке
+ ассемблера. Как показывает статистика в , машинно-зависимый код, не включающий
+ поддержку HP/UX и устройств, составляет менее 6.9 процента ядра.
+
+ Лишь малая часть ядра отвечает за инициализацию системы. Этот код
+ используется при начальной загрузке системы для
+ перехода в рабочий режим и отвечает за настройку аппаратного и
+ программного окружения ядра (обратитесь к Главе 14). Некоторые
+ операционные системы (особенно те, что ограничены объемом физической
+ памяти) выполняют действия по выгрузке или
+ перекрытию программного кода, выполняющего эти
+ функции, после окончания его работы. Ядро 4.4BSD не работает повторно
+ с памятью, использованной начальным кодом, потому что этот объем памяти
+ составляет менее 0.5 процентов ресурсов ядра, используемых на типичной
+ машине. Также начальный код не находится только в одном месте ядра --
+ он рассредоточен везде, и обычно появляется там, где логически связан с
+ объектом инициализации.
+
+
+
+ Службы ядра
+
+ Разграничение между кодом уровней ядра и пользователя
+ обеспечивается аппаратными методами, предоставляемыми оборудованием.
+ Ядро работает в отдельном адресном пространстве, которое недоступно
+ процессам пользователя. Привилегированные операции -- такие, как
+ осуществление ввода/вывода и остановка модуля центрального процессора
+ (CPU) -- доступны только ядру. Приложения делают запросы ядру на
+ доступ к его сервисам при помощи системных
+ вызовов. Системные вызовы используются для указания ядру на
+ выполнение как сложных операций, таких, как запись данных во вторичный
+ носитель, так и простых, таких, как получение текущего времени. Все
+ системные вызовы выполняются синхронно с
+ приложением: Приложение не будет продолжать работу, пока ядро не
+ выполнит действия, соответствующие системному вызову. Ядро может
+ завершить некоторые операции, связанные с системным вызовом, после его
+ окончания. Например, системный вызов write
+ будет копировать записываемые данные от пользовательского процесса в
+ буфер ядра, пока процесс находится в ожидании, но, как правило, будет
+ немедленно завершаться до того, как буфер ядра реально будет записан на
+ диск.
+
+ Системный вызов обычно реализуется как аппаратное прерывание,
+ которое изменяет режим работы CPU и текущее отображение адресного
+ пространства. Параметры, передаваемые пользователями системным
+ вызовам, перед использованием проверяются ядром. Такая проверка
+ обеспечивает целостность системы. Все параметры, передаваемые в ядро,
+ копируются в адресное пространство ядра, для того, чтобы проверенные
+ параметры не могли быть изменены в результате побочного действия
+ системного вызова. Результаты выполнения системного вызова
+ возвращаются ядром либо в аппаратных регистрах, либо копированием их
+ значений в области памяти, указанные пользователем. Как и параметры,
+ переданные в ядро, адреса, используемые для возвращения результатов,
+ должны быть проверены на то, что они являются частью адресного
+ пространства приложения. Если при обработке системного вызова ядром
+ возникает ошибка, код ошибки возвращается пользователю. В случае
+ языка программирования C код этой ошибки сохраняется в глобальной
+ переменной errno, а функция, соответствующая
+ системному вызову, возвращает в качестве результата значение -1.
+
+ Пользовательские приложения и ядро работают независимо друг от
+ друга. 4.4BSD не хранит управляющие блоки ввода/вывода и другие
+ связанные с операционной системой структуры данных в адресном
+ пространстве приложения. Каждому пользовательскому приложению
+ предоставляется независимое адресное пространство, в котором оно и
+ выполняется. Ядро выполняет большинство управляющих действий, таких,
+ как приостановка процесса на время выполнения другого, незаметно для
+ участвующих процессов.
+
+
+
+ Управление процессами
+
+ 4.4BSD поддерживает многозадачность. Каждая задача или
+ выполняющийся поток называется процессом.
+ Контекст процесса 4.4BSD состоит из состояния
+ пользовательского уровня, включая содержимое его адресного
+ пространства и окружения времени выполнения, и состояния уровня ядра,
+ в который включаются параметры планировщика задач, управляющие ресурсы
+ и идентифицирующая информация. В контекст включается все, что
+ используется ядром при предоставлении своих сервисов процессу.
+ Пользователи могут создавать процессы, управлять их выполнением и
+ получать уведомления при изменении состояния выполнения процессов.
+ Каждому процессу назначается уникальное число, называемое
+ идентификатором процесса (PID). Это число
+ используется ядром для идентификации процесса при сообщении
+ пользователю об изменении его состояния, и пользователем для указания
+ процесса в системном вызове.
+
+ Ядро создает процесс, дублируя контекст другого процесса. Новый
+ процесс считается порожденным процессом исходного
+ родительского процесса. Контекст, копируемый в
+ ходе создания процесса, включает как состояние выполнения процесса
+ уровня пользователя, так и системное состояние процесса, управляемое
+ ядром. Важные компоненты состояния ядра описаны в Главе 4.
+
+
+ Жизненный цикл процесса
+
+
+
+
+
+
+
+
++----------------+ wait +----------------+
+| parent process |--------------------------------->| parent process |--->
++----------------+ +----------------+
+ | ^
+ | fork |
+ V |
++----------------+ execve +----------------+ wait +----------------+
+| child process |------->| child process |------->| zombie process |
++----------------+ +----------------+ +----------------+
+
+
+
+
+ Системные вызовы управления процессами
+
+
+
+
+ Жизненный цикл процесса изображен на . Процесс может создать новый процесс,
+ который является копией исходного процесса с помощью системного вызова
+ fork. Возврат из вызова fork
+ происходит два раза: один раз в родительском процессе, в котором
+ возвращаемое значение является идентификатором порожденного процесса, и
+ второй раз в порожденном процессе, в котором возвращаемое значение
+ равно 0. Связь родитель-потомок порождает иерархическую структуру
+ процессов в системе. Новый процесс имеет доступ ко всем ресурсам его
+ родителя, таким, как файловые дескрипторы, состояние обработки
+ сигналов и распределение памяти.
+
+ Хотя есть ситуации, когда процесс должен быть копией своего
+ родителя, наиболее типичным и полезным действием является загрузка и
+ выполнение другой программы. Процесс может заместить себя образом
+ памяти другой программы, передавая вновь созданному образу набор
+ параметров, при помощи системного вызова execve.
+ Одним из параметров является имя файла, содержимое которого имеет
+ формате, распознаваемый системой -- это либо двоичный выполняемый файл,
+ либо файл, который приводит к запуску указанной программы интерпретации
+ для обработки его содержимого.
+
+ Процесс может завершить работу, выполнив системный вызов
+ exit, посылающий 8-битовое значение состояния
+ завершения своему родителю. Если процесс хочет передать родительскому
+ процессу информацию, превышающую один байт, он должен либо создать
+ канал межпроцессных коммуникаций при помощи конвейеров или сокетов,
+ или при помощи промежуточного файла. Коммуникации между процессами
+ подробно обсуждаются в Главе 11.
+
+ Процесс может приостановить выполнение до тех пор, пока не завершит
+ работу любой из порожденных им процессов, при помощи системного вызова
+ wait, который возвращает PID и статус завершения
+ выполненного сыновьего процесса. Родительский процесс может быть
+ настроен на получение сигнала в случае, когда порожденный процесс
+ завершает работу или аварийно прекращает выполнение. При помощи
+ системного вызова wait4 родитель может получить
+ информацию о событии, приведшем к завершению порожденного процесса и о
+ ресурсах, использованных процессом за время его работы. Если процесс
+ становится сиротой из-за того, что процесс, его породивший, завершил
+ работу до окончания работы потомка, то ядро перенаправляет состояние
+ завершения порожденного процесса особому системному процессу
+
+ init: обратитесь к разделам 3.1 и 14.6).
+
+ Подробное описание того, как ядро создает и уничтожает процессы,
+ дается в Главе 5.
+
+ Планирование выполнения процессов осуществляется согласно параметру
+ приоритетности процесса. Этот приоритет
+ управляется алгоритмом планирования задач в ядре. Пользователи могут
+ влиять на выполнение процесса, задавая этот параметр
+ (nice), который влияет на суммарный приоритет, но
+ но ограничен использованием ресурсов CPU согласно алгоритму
+ планировщика задач ядра.
+
+
+ Сигналы
+
+ В системе определен набор сигналов, которые
+ могут быть отправлены процессу. Сигналы в 4.4BSD сделаны по образу
+ аппаратных прерываний. Процесс может определить пользовательскую
+ подпрограмму, которая будет являться
+ обработчиком, и которой должен будет
+ перенаправляться сигнал. Когда сигнал генерируется, он блокируется
+ от повторного появления до тех пор, пока не будет
+ перехвачен обработчиком. Перехват сигнала
+ включает в себя сохранение контекста текущего процесса и построение
+ нового, в котором запускается обработчик. Затем сигнал направляется
+ обработчику, который может либо прервать процесс, либо передать
+ управление обратно выполняемому процессу (может быть, после установки
+ значения глобальной переменной). Если обработчик возвратил
+ управление, сигнал разблокировывается и может быть сгенерирован (и
+ получен) снова.
+
+ Либо процесс может определить, что сигнал будет
+ игнорироваться или будет выполняться действие
+ по умолчанию, определяемое ядром. Действием по умолчанию для
+ некоторых сигналов является прекращение процесса. Это завершение
+ работы может сопровождаться созданием файла
+ дампа, содержащего текущий образ памяти процесса для
+ использования в последующей отладке.
+
+ Некоторые сигналы не могут быть перехвачены или проигнорированы.
+ К таким сигналам относятся SIGKILL, прерывающий
+ неуправляемый процесс, и сигнал управления заданиями
+ SIGSTOP.
+
+ Процесс может выбрать получение сигналов в специальный стек для
+ выполнения хитроумных программных манипуляций стеком. Например,
+ подпрограммам поддержки языка нужно иметь стек для каждой
+ подпрограммы. Система времени выполнения языка может выделять эти
+ стеки, разделяя единственный стек, предоставляемый в 4.4BSD. Если
+ ядро не поддерживает отдельный стек сигналов, то пространство,
+ выделяемое каждой подпрограмме, должно быть расширено на объем,
+ требуемый для перехвата сигнала.
+
+ Все сигналы имеют один и тот же приоритет.
+ Если обработки ожидают несколько сигналов, то порядок их направления
+ процессу зависит от реализации. Обработчики сигналов, выполняемые по
+ сигналу, который их вызвал, блокируются, но при этом могут быть
+ сгенерированы дополнительные сигналы. Имеется механизм, позволяющий
+ защитить критический участок кода от появления заданных
+ сигналов.
+
+ Подробное описание архитектуры и реализации механизма сигналов
+ дается в Разделе 4.7.
+
+
+
+ Группы управления и сеансы
+
+ Процессы организованы в группы управления.
+ Группы управления используются для управления доступом к терминалам и
+ для обеспечения передачи сигналов наборам связанных процессов.
+ Процесс наследует группу управления от своего родительского процесса.
+ Ядром обеспечиваются механизмы, позволяющие процессу изменять свою
+ группу управления или группу управления своих наследников. Создание
+ новой группы управления просто; значение, соответствующее новой
+ группе управления, обычно является идентификатором создающего ее
+ процесса.
+
+ Группу процессов в группе управления иногда называют
+ заданием и оно управляется высокоуровневым
+ системным программным обеспечением, таким, как командный процессор.
+ Типичным примером задания, созданного командным процессором, является
+ конвейер из нескольких связанных процессов, так
+ что выходной поток первого процесса является входным потоком для
+ второго, выходной поток второго процесса является входным потоком для
+ третьего, и так далее. Командный процессор создает такое задание,
+ порождая процесс для каждого участка конвейера, а затем помещая все
+ эти процессы в отдельную группу обработки.
+
+ Пользовательский процесс может послать сигнал как всем процессам
+ в группе управления, так и конкретному процессу. Процесс в заданной
+ группе управления может получать программные прерывания, отражающиеся
+ на группе, приводящие к приостановке или продолжению выполнения, или
+ к прерыванию или завершению работы.
+
+ Терминалу ставится в соответствие идентификатор группы
+ управления. Этот идентификатор обычно равен идентификатору группы
+ управления, соответствующей терминалу. Управляющий заданиями
+ командный процессор может создать несколько групп управления,
+ связанных с одним и тем же терминалом; терминал является
+ управляющим терминалом для каждого процесса в
+ этих группах. Процесс может выполнять чтение из дескриптора своего
+ управляющего терминала, если только идентификатор группы управления
+ соответствует идентификатору группы этого процесса. Если
+ идентификаторы не совпадают, процесс будет блокирован при попытке
+ чтения с терминала. Изменяя идентификатор группы управления
+ терминала, командный процессор может распределять терминал между
+ несколькими различными заданиями. Такое распределение называется
+ управлением заданиями и описывается вместе с
+ группами управления в Разделе 4.8.
+
+ Так же, как и наборы связанных процессов могут объединяться в
+ группы управления, набор групп управления может быть объединен в
+ сеанс. Основное назначение сеансов заключается
+ создании изолированного окружения для процесса-даемона и порожденных
+ им процессов, а также для объединения начального командного
+ процессора пользователя и заданий, которые он порождает.
+
+
+
+
+ Управление памятью
+
+ Каждый процесс имеет собственное адресное пространство. Адресное
+ пространство изначально разделяется на три логических сегмента:
+ код, данные и
+ стек. Сегмент кода доступен только для
+ чтения и содержит машинные коды программы. Сегменты данных и стека оба
+ доступны как для чтения, так и для записи. Сегмент данных содержит как
+ инициализированные, так и неинициализированные области данных
+ программы, когда как стековый сегмент представляет собой стек программы
+ на этапе выполнения. На большинстве машин сегмент стека автоматически
+ расширяется ядром в процессе работы программы. Процесс может расширять
+ или уменьшать свой сегмент данных, выполняя системный вызов, когда как
+ размер сегмента кода процесс может изменить только когда содержимое
+ сегмента перекрывается данными файловой системы или в процессе отладки.
+ Начальное содержимое сегментов порожденного процесса копируется из
+ сегментов родительского процесса.
+
+ Для выполнения процесса вовсе не обязательно постоянно хранить в
+ памяти полное содержимое его адресного пространства. Если процесс
+ обращается к области адресного пространства, которая не присутствует в
+ оперативной памяти, то система подгружает страницу
+ с необходимой информацией в память. Когда возникает нехватка системных
+ ресурсов, то система использует двухуровневый подход к управлению
+ имеющимися ресурсами. Если не хватает памяти, то система будет
+ забирать ресурсы памяти от процессов, если они давно не использовались.
+ Если ресурсов не хватает очень сильно, то система будет прибегать
+ к выгрузке всего контекста процесса во вторичную
+ подсистему хранения данных. Постраничная подгрузка по
+ требованию и выгрузка выполняются
+ системой абсолютно незаметно для процессов. Процесс может, однако,
+ указать системе объем памяти, который будет использоваться, в качестве
+ помощи.
+
+
+ Решения BSD по архитектуре управления памятью
+
+ В 4.2BSD требовалось реализовать поддержку больших несвязанных
+ адресных пространств, отображаемых в память файлов и совместно
+ используемой памяти. Был спроектирован интерфейс, который назвали
+ mmap, позволяющий несвязанным процессам
+ запрашивать отображение в их адресное пространство файла в режиме
+ совместного использования. Если несколько процессов отображают в
+ свое адресное пространство один и тот же файл, то изменение адресного
+ пространства процесса, соответствующего файлу, в одном процессе,
+ будет отображено в области отображения этого файла в другом процессе,
+ а также и в самом файле. Однако в конце концов 4.2BSD была выпущена
+ без интерфейса mmap из-за необходимости сделать
+ в первую очередь другие возможности, такие, как работа с
+ сетью.
+
+ Затем разработка интерфейса mmap
+ продолжалась во время работы над 4.3BSD. Более 40 компаний и
+ исследовательских групп принимали участие в обсуждениях, которые
+ привели к появлению обновленной концепции, описанной в Berkeley
+ Software Architecture Manual .
+ Несколько компаний реализовали этот обновленный интерфейс
+ .
+
+ И снова сроки разработки не позволили включить в 4.3BSD
+ реализацию этого интерфейса. Хотя позже она могла быть встроена в
+ имеющуюся подсистему виртуальной памяти 4.3BSD, разработчики решили
+ не включать ее сюда. потому что этой реализации было уже более 10
+ лет. Более того, оригинальная архитектура виртуальной памяти была
+ основана на предположении, что компьютерная память мала и дорога, а
+ диски подключены непосредственно к компьютеру, быстры и дешевы.
+ Поэтому подсистема виртуальной памяти была разработана с упором на
+ бережное использование памяти ценой более частых обращений к диску.
+ Вдобавок реализация в 4.3BSD была пронизана зависимостями от
+ аппаратной системы управления памятью машин VAX, что препятствовало
+ ее переносу на другие аппаратные платформы. И наконец, подсистема
+ виртуальной памяти не была предназначена для поддержки связных
+ многопроцессорных систем, которые сейчас становятся все более
+ распространенными и необходимыми.
+
+ Попытки постепенно усовершенствовать старую реализацию заведомо
+ были обречены на неудачу. Полностью новая архитектура, с другой
+ стороны, могла бы использовать большие объемы памяти, уменьшить
+ дисковые операции и обеспечивать работу с несколькими процессорами.
+ Наконец, система виртуальной памяти в 4.4BSD была полностью изменена.
+ Система виртуальной памяти 4.4BSD основана на системе виртуальной
+ памяти (VM) Mach 2.0 с
+ заимствованиями из Mach 2.5 и Mach 3.0. В ней была эффективная
+ поддержка совместного использования, полное разделение
+ машинно-зависимой и машинно-независимой частей, а также (сейчас не
+ используемая) поддержка работы с несколькими процессорами. Процессы
+ могут отображать файлы в любую область своего адресного пространства.
+ Они могут совместно использовать части своих адресных пространств
+ посредством отображения в память одного и того же файла. Изменения,
+ сделанные одним процессом, видны в адресном пространстве другого
+ процесса, а также записываются и в сам файл. Процессы могут также
+ запрашивать эксклюзивное отображение файла в память, при котором
+ любые изменения, сделанные процессом, не видны другим процессам,
+ которые отображают файл в память и не записываются обратно в
+ файл.
+
+ Еще одной проблемой с системой виртуальной памяти является
+ способ, которым информация передается ядру при выполнении системного
+ вызова. 4.4BSD всегда копирует данные из адресного пространства
+ процесса в буфер ядра. Для операций чтения и записи, при которых
+ передаются большие объемы данных, выполнение копирования может
+ оказаться занимающим время процессом. Альтернативным способом
+ является манипуляции с адресным пространством процесса в ядре. Ядро
+ 4.4BSD всегда копирует данные о нескольким причинам:
+
+
+
+ Зачастую пользовательские данные не выравнены по границе
+ страницы памяти и их объем не кратен размеру аппаратной
+ страницы памяти.
+
+
+
+ Если страница памяти забирается от процесса, он не может
+ больше ссылаться на эту страницу. Некоторые программы зависят от
+ данных, остающихся в буфере, даже после записи этих
+ данных.
+
+
+
+ Если процесс позволяет хранить копию страницы памяти (как это
+ делается в существующей 4.4BSD), то страница должна иметь атрибут
+ копирования-при-записи. Такая страница
+ является одной из таковых, что защищается от записи при помощи
+ атрибута только-для-чтения. Если процесс пытается модифицировать
+ страницу памяти, в ядре возникает ситуация ошибки записи. После
+ этого ядро делает копию страницы, которую процесс может изменять.
+ К несчастью, большинство процессов будет немедленно пытаться
+ записать новые данные в свой буфер вывода, что приводит в любом
+ случае к копированию данных.
+
+
+
+ Когда страницы переносятся в новые адреса виртуальной памяти,
+ большинство аппаратных менеджеров памяти требуют, чтобы кэш
+ аппаратного переназначения адресов был выборочно очищен.
+ Очистка кэша зачастую выполняется медленно. В итоге получается,
+ что переназначение адресов оказывается медленнее, чем копирование
+ блоков данных, не превышающих 4 или 8 килобайт.
+
+
+
+ Больше всего отображение памяти нужно для работы к большими
+ файлами и передачи больших объемов данных между процессами.
+ Интерфейс mmap дает методы для выполнения обеих
+ этих операций без копирования.
+
+
+
+ Управление памятью внутри ядра
+
+ Ядро часто выполняет выделение памяти, которое нужно только для
+ выполнения единственного системного вызова. В пользовательском
+ процессе такая кратковременно используемая память будет выделяться в
+ стеке во время выполнения. Так как ядро имеет ограниченный объем
+ стека времени выполнения, то неэффективно выделять в нем даже блоки
+ памяти среднего размера. Таким образом, такая память должна
+ выделяться посредством более гибкого механизма. Например, когда
+ системный вызов должен преобразовать имя каталога, он должен выделить
+ буфер размером 1 Кбайт для хранения имени. Другие блоки памяти
+ должны выделяться на более продолжительный срок, чем один системный
+ вызов, и поэтому не могут выделяться в стеке, даже если там есть
+ место. В качестве примера можно взять блоки управления протоколами,
+ которые существуют на всем протяжении сетевого соединения.
+
+ Необходимость в динамическом выделении памяти в ядре становилась
+ все более острой вместе с добавлением количества сервисов. Общий
+ механизм выделения памяти уменьшает сложность написания кода в ядре.
+ Поэтому в 4.4BSD ядро имеет единый механизм выделения памяти, который
+ может использоваться в любой части системы. У него есть интерфейс,
+ похожий на функции библиотеки языка C malloc и
+ free, которые обеспечивают выделение памяти в
+ прикладных программах . Как
+ интерфейс библиотеки языка C, функция выделения памяти получает
+ параметр, указывающий на размер памяти, который необходим. Диапазон
+ запрашиваемых объемов выделяемой памяти не ограничен; однако
+ выделяемая физическая память не подвергается постраничной подгрузке.
+ Функции освобождения памяти передается указатель на освобождаемый
+ участок памяти, но указывать размер освобождаемого участка памяти не
+ нужно.
+
+
+
+
+ Система ввода/вывода
+
+ Базовой моделью системы ввода/вывода UNIX является
+ последовательность байт, доступ к которым может осуществляться как
+ последовательно, так и в в произвольном порядке. В типичном
+ пользовательском процессе UNIX нет таких понятий, как
+ методы доступа или управляющие
+ блоки.
+
+ Различные программы используют разнообразные структуры данных, но
+ ядро не связывает ввод/вывод с используемыми структурами. Например,
+ текстовым файлом считается файл из строк символов набора ASCII, которые
+ разделены одним символом новой строки (символ ASCII перевода строки),
+ но ядро не знает ничего об этом соглашении. Для удовлетворения
+ потребностей большинства программ модель еще более упрощена и сводится
+ к потоку байт данных, или потоку ввода/вывода.
+ Такое единое представление данных позволяет работать характерному для
+ UNIX подходу на основе инструментов .
+ Поток ввода/вывода одной программы может быть подан в качестве входной
+ информации практически любой другой программе. (Этот тип традиционных
+ для UNIX потоков ввода/выводы не нужно путать с потоковой системой
+ ввода/вывода из Eighth Edition или с потоками из System V, Release 3
+ (STREAMS), оба из которых доступны как обычные потоки
+ ввода/вывода.)
+
+
+ Дескрипторы и ввод/вывод
+
+ Процессы UNIX для работы с потоками ввода/вывода используют
+ дескрипторы. Дескрипторы представляют собой
+ беззнаковые целые числа, получаемые после выполнения системных вызовов
+ open и socket. Системный
+ вызов open получает в качестве аргументов имя
+ файла и режим доступа, который определяет, должен ли файл открываться
+ для чтения, для записи или для обеих операций. Этот системный вызов
+ может также использоваться для создания нового пустого файла.
+ Системные вызовы read и
+ write могут применяться к дескриптору для
+ переноса данных. Системный вызов close может
+ использоваться для уничтожения любого дескриптора.
+
+ Дескрипторы представляют низкоуровневые объекты, поддерживаемые
+ ядром, и создаваемые системными вызовами, специфичными для каждого
+ типа объектов. В 4.4BSD дескрипторы могут представлять три типа
+ таких объектов: файлы, каналы и сокеты.
+
+
+
+ Файл представляет собой линейную
+ последовательность байт, имеющую по крайней мере одно имя. Файл
+ существует, пока все его имена не удалены и ни один из процессов
+ не хранит его дескриптор. Процесс получает дескриптор файла,
+ открывая имя файла посредством системного вызова
+ open. Работа с устройствами ввода/вывода
+ осуществляется как с файлами.
+
+
+
+ Каналом является линейная
+ последовательность байт, такая же, как файл, но используемая
+ исключительно как поток ввода/вывода, причем однонаправленный.
+ У канала нет имени, и поэтому он не может быть открыт при помощи
+ open. Вместо этого он создается посредством
+ системного вызова pipe, который возвращает
+ два дескриптора, один из которых принимает входные данные,
+ без искажений, без повторений и в той же самой последовательности
+ посылаемый на другой дескриптор. Система также поддерживает
+ именованный канал, или FIFO. FIFO имеет те же самые свойства,
+ что и канал, за исключением того, что он располагается в файловой
+ системе; поэтому он может быть открыт системным вызовом
+ open. Процессы, которые хотят обмениваться
+ данными, открывают FIFO: Один процесс открывает его для чтения, а
+ другой для записи.
+
+
+
+ Сокет является промежуточным объектом,
+ который используется для межпроцессных коммуникаций; он
+ существует, пока какой-либо процесс хранит дескриптор,
+ ссылающийся на него. Сокет создается системным вызовом
+ socket, который возвращает его дескриптор.
+ Имеется несколько типов сокетов, которые поддерживают различные
+ коммуникационные возможности, такие, как надежную доставку
+ данных, сохранение последовательности передаваемых сообщений,
+ и сохранение границ сообщений.
+
+
+
+ В системах, предшествующих 4.2BSD, каналы были реализованы в
+ файловой системе, когда в 4.2BSD появились сокеты, то каналы были
+ повторно реализованы как сокеты.
+
+ Для каждого процесса ядро хранит таблицу
+ дескрипторов, которая является таблицей, используемой
+ ядром для преобразования внешнего представления дескриптора в его
+ внутреннее представление. (Дескриптор является просто индексом в
+ этой таблице.) Таблица дескрипторов процесса наследуется от
+ родительского процесса, и вместе с ней наследуется и доступ к
+ объектам, на которые ссылаются дескрипторы. Основными способами,
+ при помощи которых процесс может получить дескриптор, является
+ открытие или создание объекта, а также наследование от родительского
+ процесса. Кроме того, межпроцессные коммуникации при помощи сокетов
+ позволяют передавать дескрипторы в сообщениях между несвязанными
+ процессами на одной и той же машине.
+
+ Любой рабочий дескриптор имеет связанное с ним смещение
+ в файле в байтах от начала объекта. Операции чтения и
+ записи начинаются от этого смещения, который обновляется после каждой
+ передачи данных. Для объектов, к которым разрешен произвольный
+ доступ, смещение в файле может быть установлено посредством
+ системного вызова lseek. Обычные файлы, а также
+ некоторые устройства, разрешают произвольный доступ к ним. Каналы и
+ сокеты этого делать не позволяют.
+
+ Когда процесс завершается, ядро освобождает все дескрипторы,
+ которые использовались этим процессом. Если процесс хранил последнюю
+ ссылку на объект, то менеджер объектов уведомляется для выполнения
+ всех необходимых действий, таких, как окончательное удаление файла
+ или уничтожение сокета.
+
+
+
+ Управление дескрипторами
+
+ Большинство процессов ожидают, что перед началом их работы уже
+ будут открыты три дескриптора. Это дескрипторы 0, 1 и 2, больше
+ известные как стандартный ввод,
+ стандартный вывод и стандартный поток
+ диагностических сообщений, соответственно. Как правило,
+ все они связываются с пользовательским терминалом по время входа в
+ систему (смотри Раздел 14.6) и наследуются через вызовы
+ fork и exec процессами,
+ запускаемыми пользователем. Таким образом, программа может считывать
+ то, что набирает пользователь, из стандартного ввода, и программа
+ может выдавать результат на экран пользователя, осуществляя запись в
+ стандартный вывод. Дескриптор потока диагностических сообщений
+ также открыт для записи и используется для вывода ошибок, когда как
+ стандартный вывод используется для обычного вывода.
+
+ Эти (и другие) дескрипторы могут отображаться на объекты,
+ отличающиеся от терминала; такое отображение называется
+ перенаправлением ввода/вывода, и все стандартные
+ командные процессоры позволяют пользователю это делать. Оболочка
+ может направить вывод программы в файл, закрывая дескриптор 1
+ (стандартный вывод) и открывая выбранный выходной файл для создания
+ нового дескриптора 1. Подобным же образом стандартный ввод может
+ браться из файла, при этом закрывается дескриптор 0 и открывается
+ файл.
+
+ Каналы позволяют выводу одной программы становиться вводом другой
+ программы без переписывания и даже перекомпоновки программ. Вместо
+ того, чтобы дескриптор 1 (стандартный вывод) исходной программы был
+ настроен на запись на терминал, он настраивается на входной
+ дескриптор канала. Аналогично дескриптор 0 (стандартный ввод)
+ принимающей программы настраивается на обращение к выводу канала,
+ а не к клавиатуре терминала. Результирующий набор двух процессов и
+ соединяющий канал называется конвейером.
+ Конвейеры могут быть весьма большими последовательностями процессов,
+ соединенных каналами.
+
+ Системные вызовы open,
+ pipe и socket порождают
+ новые дескрипторы с наименьшим неиспользуемым номером, подходящим для
+ дескриптора. Для того, чтобы конвейеры могли работать, должен
+ существовать механизм для отображения таких дескрипторов в 0 и 1.
+ Системный вызов dup создает копию дескриптора,
+ которая указывает на ту же самую запись в таблице файлов. Новый
+ дескриптор также является наименьшим неиспользуемым, но если нужный
+ дескриптор сначала закрыть, то dup можно
+ использовать для выполнения нужного отображения. Однако здесь
+ требуется некоторая осторожность: если нужен дескриптор 1, а
+ дескриптор 0 уже закрыт, то в результате получится дескриптор 0. Во
+ избежание этой проблемы в системе имеется системный вызов
+ dup2; он похож на dup, но
+ воспринимает дополнительный аргумент, указывающий номер нужного
+ дескриптора (если нужный дескриптор уже открыт, то
+ dup2 его закроет перед повторным
+ использованием).
+
+
+
+ Устройства
+
+ Аппаратные устройства имеют связанные с ними имена файлов, и к
+ ним может обращаться пользователь при помощи тех же самых системных
+ вызовов, что используются для обычных файлов. Ядро может
+ различать специальный файл устройства или просто
+ специальный файл, и может определять, к какому
+ устройству он относится, но большинство процессов не выполняют такого
+ распознавания. Терминалы, принтеры и стримеры все доступны как
+ последовательности байт, как дисковые файлы 4.4BSD. Таким образом,
+ особенности работы устройств максимально скрываются ядром, и даже в
+ ядре большинство из них отличаются в драйверах.
+
+ Аппаратные устройства могут быть разделены на
+ структурированные или
+ неструктурированные; они известны под названиями
+ блочные и посимвольные,
+ соответственно. Как правило, процессы обращаются к устройствам
+ посредством специальных файлов в файловой
+ системе. Операции ввода/вывода, выполняемые с такими файлами,
+ обрабатываются постоянно находящимися в ядре программными модулями,
+ называемыми драйверами устройств. Большинство
+ аппаратных устройств для сетевых коммуникаций доступны только при
+ помощи механизмов межпроцессного взаимодействия, и не имеют
+ специальных устройств в пространстве имен файловой системы, так как
+ интерфейс низкоуровневых сокетов дает более
+ естественный интерфейс, чем специальный файл.
+
+ Структурированные или блочные устройства разделяются на диски и
+ магнитные ленты и включают в себя большинство устройств с
+ произвольным доступом. Ядро поддерживает операции буферизации типа
+ чтение-изменение-запись с блочными структурированными устройствами
+ для того, чтобы разрешить последним осуществлять чтение и запись
+ полностью произвольным образом, как с обычными файлами. Файловые
+ системы создаются на блочных устройствах.
+
+ Неструктурированными устройствами являются те, что не
+ поддерживают блочную структуру. Типичными неструктурированными
+ устройствами являются линии связи, растровые графопостроители и
+ небуферизируемые магнитные ленты и диски. Неструктурированные
+ устройства, как правило, поддерживают перенос больших объемов
+ данных.
+
+ Неструктурированные файлы называют символьными
+ устройствами, потому что первые из них являлись драйверами
+ терминальных устройств. Интерфейс ядра к драйверу для этих устройств
+ доказал удобство его использования для других неструктурированных
+ устройств.
+
+ Специальные файлы устройств создаются системным вызовом
+ mknod. Имеется дополнительный системный вызов,
+ ioctl, для управления низкоуровневыми
+ параметрами специальных файлов. Выполняемые операции для каждого
+ устройства различны. Этот системный вызов позволяет осуществлять
+ доступ к специальным характеристикам устройств, не перегружая смысл
+ других системных вызовов. Например, для стримера существует
+ ioctl для записи метки конца ленты, но нет
+ особой или измененной версии функции
+ write.
+
+
+
+ Механизм межпроцессных коммуникаций посредством сокетов
+
+ В ядре 4.2BSD появился механизм межпроцессного взаимодействия,
+ более гибкий, чем каналы, основанный на сокетах.
+ Сокет является конечной точкой коммуникаций, доступный через
+ дескриптор, как файл или канал. Каждый из двух процессов может
+ создать сокет, а затем соединить эти конечные точки для получения
+ надежного канала передачи потока байт. После соединения процесс
+ может выполнять с дескрипторами операции чтения и записи, как это
+ делалось с каналами. Прозрачность сокетов позволяет ядру
+ перенаправить вывод одного процесса на вход другого, работающего на
+ другой машине. Большим различием между каналами и сокетами является
+ то, что каналы требуют наличия общего родительского процесса для
+ установки коммуникации. Соединение между сокетами может быть
+ установлено двумя несвязанными процессами, возможно, работающими на
+ разных машинах.
+
+ System V предоставляет механизм локального межпроцессного
+ взаимодействия через FIFO (также называемые именованными
+ каналами). FIFO отображаются как объекты файловой
+ системы, которые могут быть открыты несвязанными процессами, и в
+ которые можно открывать и посылать данные так же, как в случае
+ каналов. Таким образом, FIFO не требуют общего родительского
+ процесса для установки соединения; они могут быть соединены после
+ того, как будут запущены два процесса. В отличие от сокетов, FIFO
+ могут быть использованы только на локальной машине; они не могут быть
+ использованы для связи между процессами, работающими на разных
+ машинах. FIFO реализованы в 4.4BSD, потому что это требует стандарт
+ POSIX.1. Их функциональность является подмножеством функций
+ интерфейса сокетов.
+
+ Механизм сокетов требует расширения традиционных для UNIX
+ системных вызовов ввода/вывода для обеспечения соответствующих имен и
+ смыслов соединениям. Вместо того, чтобы перегружать существующий
+ интерфейс, разработчики использовали существующие интерфейсы,
+ расширив их так, что они продолжили работать без изменений, и
+ разработали новые интерфейсы для работы с новыми возможностями.
+ Системные вызовы read и
+ write использовались для соединений типа потока
+ байт, и было добавлено шесть новых системных вызовов, что позволило
+ посылать и принимать адресованные сообщения, такие, как сетевые
+ датаграммы. Системные вызовы для записи сообщений включают в себя
+ send, sendto и
+ sendmsg. Системные вызовы для чтения сообщений
+ включают recv, recvfrom и
+ recvmsg. В ретроспективе, первые два в каждом
+ классе являются особыми случаями других;
+ recvfrom и sendto,
+ наверное, должны были быть добавлены как библиотечные интерфейсы к
+ recvmsg и sendmsg,
+ соответственно.
+
+
+
+ Множественный ввод/вывод
+
+ Кроме традиционных системных вызовов read и
+ write, в 4.2BSD появилась возможность выполнять
+ множественный ввод/вывод. Множественный ввод использует системный
+ вызов readv для размещения результата
+ единственной операции чтения в нескольких различных буферах.
+ Обратно, системный вызов writev позволяет
+ осуществлять запись нескольких различных буферов за одну атомарную
+ операцию записи. Вместо передачи одного буфера и его длины в
+ качестве параметров, как это делается при использовании системных
+ вызовов read и write,
+ процесс передает указатель на массив буферов и их длин, а также
+ счетчик, определяющий размер массива.
+
+ Такой механизм позволяет буферам в различных областях адресного
+ пространства процесса записываться атомарно, без необходимости
+ копировать их в один буфер. Атомарные операции записи необходимы в
+ случае, когда низкоуровневые абстракции основаны на записях,
+ например, стримеры, которые выводят блок ленты при каждом запросе на
+ запись. Также полезна возможность помещать результат одного запроса
+ на чтение в нескольких различных буферах (например, заголовок записи
+ в одно место, а данные в другое). Хотя приложение может симулировать
+ возможность выполнять множественные операции посредством чтения
+ данных в большой буфер с последующим копированием их частей в
+ нужные области, и накладные расходы на копирование в памяти в таких
+ случаях часто увеличивает время выполнения приложения чуть ли не
+ вдвое.
+
+ Так же, как send и recv
+ могут быть реализованы в виде библиотечных интерфейсов к
+ sendto и recvfrom, возможно
+ симулирование read через
+ readv и write через
+ writev. Однако read и
+ write используются столь часто, что накладные
+ расходы на такую симуляцию не стоят того.
+
+
+
+ Поддержка нескольких файловых систем
+
+ Вместе с распространением сетевых вычислений возникла потребность
+ в поддержке как локальных, так и удаленных файловых систем. Для
+ облегчения поддержки нескольких файловых систем разработчики добавили
+ в ядро интерфейс виртуальных узлов файловой системы, или
+ интерфейс vnode. Набор операций, экспортируемых
+ через интерфейс vnode, похож на операции файловой системы, ранее
+ поддерживаемые локальной файловой системой. Однако они могут
+ поддерживаться широким спектром типов файловых систем:
+
+
+
+ Локальные файловые системы, использующие диск
+
+
+
+ Файлы, импортируемые при помощи разнообразных протоколов
+ удаленных файловых систем
+
+
+
+ Файловые системы CD-ROM, доступные только для чтения
+
+
+
+ Файловые системы, предоставляющие специализированные услуги
+ -- к примеру, файловая система /proc
+
+
+
+ Некоторые варианты 4.4BSD, такие, как FreeBSD, позволяют
+ выполнять динамическую загрузку файловых систем при первом обращении
+ к ним при помощи системного вызова mount.
+ Интерфейс vnode описан в Разделе 6.5; вдобавок он поддерживает
+ функции, описанные в Разделе 6.6; некоторые из файловых систем
+ специального назначения описаны в Разделе 6.7.
+
+
+
+
+ Файловые системы
+
+ Обычный файл представляет собой массив байтов, и может читаться и
+ записываться, начиная с произвольного байта файла. Ядро не различает
+ в обычных файлах границ записей, хотя многие программы воспринимают
+ символы перевода строки в качестве признаков конца строк, но другие
+ программы могут предполагать наличие других структур. В самом файле
+ не хранится никакой системной информации о файле, но в файловой системе
+ размещается некоторая информация о владельце, правах доступа и об
+ использовании каждого файла.
+
+ Компонент под названием имя файла является
+ строкой длиной до 255 символов. Эти имена хранятся в файле особого
+ типа, который называется каталогом. Информация о
+ файле в каталоге называется записью каталога и
+ включает, кроме имени файла, указатель на сам файл. Записи каталога
+ могут ссылаться как на другие каталоги, так и на обычные файлы. Таким
+ образом формируется иерархия каталогов и файлов, которая и называется
+ файловой системой filesystem;
+
+
+ Небольшая файловая система
+
+
+
+
+
+
+
+ +-------+
+ | |
+ +-------+
+ / \
+ usr / \ vmunix
+ |/ \|
+ +-------+ +-------+
+ | | | |
+ +-------+ +-------+
+ / | \
+ staff / | \ bin
+ |/ | tmp \|
+ +-------+ V +-------+
+ | | +-------+ | |
+ +-------+ | | +-------+
+ / | \ +-------+ / | \
+ mckusick / | \| |/ | \ ls
+ |/ | karels | vi \|
++-------+ V V +-------+
+| | +-------+ +-------+ | |
++-------+ | | | | +-------+
+ +-------+ +-------+
+
+
+
+
+ Дерево небольшой файловой системы
+
+
+
+
+ Одна небольшая файловая система показана на . Каталоги могут содержать подкаталоги, и нет
+ ограничений вложенности одного каталога в другой по глубине. Для
+ соблюдения целостности файловой системы, ядро не позволяет процессу
+ производить запись непосредственно в каталоги. Файловая система может
+ хранить не только обычные файлы и каталоги, но также ссылки на другие
+ объекты, такие, как устройства и сокеты.
+
+ Файловая система образует дерево, начало которого находится в
+ корневом каталоге, иногда называемому по имени
+ слэш, которое соответствует символу одинарной
+ наклонной черты (/). Корневой каталог содержит файлы; в нашем примере
+ на Рисунке 2.2, он содержит vmunix, копию
+ выполнимого объектного файла ядра. В нем также расположены каталоги;
+ в этом примере он содержит каталог usr. Внутри
+ каталога usr располагается каталог
+ bin, который в основном содержит выполнимый
+ объектный код программ, таких, как
+
+ ls и vi.
+
+ Процесс обращается к файлу, указывая путь до
+ него, который является строкой, состоящей из нескольких или ни одного
+ имен файлов, разделенных символами слэша (/). С каждым процессом ядро
+ связывает два каталога, при помощи которых можно интерпретировать
+ маршруты до файлов. Корневой каталог процесса
+ является самой верхней точкой файловой системы, которую может достичь
+ процесс; обычно он соответствует корневому каталогу всей файловой
+ системы. Маршрут, начинающийся с символа слэша, называется
+ абсолютным маршрутом, и интерпретируется ядром,
+ начиная с корневого каталога процесса.
+
+ Имя пути, которое не начинается со слэша, называется
+ относительным маршрутом, и интерпретируется
+ относительно текущего рабочего каталога процесса.
+ (Этот каталог кратко также называют текущим
+ каталогом или рабочим каталогом.)
+ Текущий каталог сам по себе можно обозначить непосредственно по имени
+ dot, что соответствует одной точке
+ (.). Имя файла dot-dot
+ (..) обозначает родительский каталог текущего
+ каталога. Корневой каталог является предком самому себе.
+
+ Процесс может задать собственный корневой каталог при помощи
+ системного вызова chroot, и установить текущий
+ каталог системным вызовом chdir. Каждый процесс
+ может в любой момент выполнить вызов chdir, но
+ chroot позволено выполнять только процессу с
+ административными привилегиями. Chroot обычно
+ используется для ограничения доступа к системе.
+
+ Взяв файловую систему, изображенную на Рисунке 2.2, и полагая, что
+ процесс имеет в качестве корневого каталога корневой каталог файловой
+ системы, и в качестве текущего каталога /usr,
+ он может обратиться к файлу vi либо от корня по
+ абсолютному имени /usr/bin/vi, либо из текущего
+ каталога с относительным именем bin/vi.
+
+ Системные утилиты и базы данных располагаются в нескольких всем
+ известных каталогах. Частью предопределенной иерархии является
+ каталог, содержащий домашний каталог для каждого
+ пользователя -- например, /usr/staff/mckusick и
+ /usr/staff/karels на Рисунке 2.2. Когда
+ пользователи регистрируются в системе, то рабочий каталог их командного
+ процессора устанавливается в домашний каталог. В своих домашних
+ каталогах пользователи могут создавать каталоги так же легко, как и
+ обычные файлы. Таким образом, пользователь может строить иерархии
+ каталогов произвольной сложности.
+
+ Пользователь обычно знает только об одной файловой системе, но
+ система может знать, что одна виртуальная файловая система на самом
+ деле состоит из нескольких физических файловых систем, каждая из
+ которых расположена на отдельном устройстве. Физическая файловая
+ система не может располагаться на нескольких физических устройствах.
+ Так как большинство физических дисковых устройств разбиваются на
+ несколько логических устройств, то на одном физическом устройстве может
+ располагаться более одной файловой системы, но не более одной для
+ каждого логического устройства. Одна из файловых систем -- та, с
+ которой начинаются все абсолютные имена -- называется
+ корневой файловой системой, и она всегда доступна.
+ Другие файловые системы могут монтироваться; это значит, что они могут
+ интегрироваться в иерархию каталогов корневой файловой системы. Ссылки
+ на каталог, в котором находится смонтированная в него файловая системе,
+ прозрачно преобразуются ядром в ссылки на корневой каталог
+ смонтированной файловой системы.
+
+ Системный вызов link в качестве параметров
+ принимает имя существующего файла и новое имя, которое будет присвоено
+ файлу. После успешного выполнения вызова link,
+ файл может быть доступен по любому из имен. Имя файла может быть
+ удалено при помощи системного вызова unlink.
+ Когда удаляется последнее имя для файла (и последний процесс, который
+ держал файл открытым, закрыл его), удаляется и сам файл.
+
+ Файлы организованы иерархически в каталоги.
+ Каталог является типом файла, но, в отличие от обычных файлов, каталог
+ имеет структуру, определяемую системой. Процесс может читать каталог,
+ как будто это обычный файл, но только ядру разрешено изменять каталог.
+ Каталоги создаются системным вызовом mkdir и
+ удаляются системным вызовом rmdir. До 4.2BSD
+ системные вызовы mkdir и
+ rmdir были реализованы как последовательность
+ системных вызовов link и
+ unlink. Имелось три причины для добавления
+ системных вызовов специально для создания и удаления каталогов:
+
+
+
+ Операция может быть сделана атомарной. Если система завершила
+ работу аварийно, то каталог не может оставаться в промежуточном
+ состоянии, что может случиться при последовательном вызове серии
+ операций.
+
+
+
+ При работе сетевой файловой системы создание и удаление файлов
+ и каталогов должны выполняться атомарно, чтобы могли выполняться
+ последовательно.
+
+
+
+ При реализации поддержки не-UNIX файловых систем, таких, как
+ файловая система MS-DOS, на другом разделе диска, может оказаться,
+ что эта файловая система не поддерживает ссылочных операций. Хотя
+ другие файловые системы могут поддерживать концепцию каталогов,
+ скорее всего, они не будут создавать и удалять каталоги со
+ ссылками, как это делается в файловой системе UNIX. Соответственно
+ они могут создавать и и удалять каталоги только при наличии явных
+ запросов на удаление или создание каталогов.
+
+
+
+ Системный вызов chown устанавливает владельца
+ и группу файла, а chmod изменяет атрибуты защиты.
+ Вызов stat, примененный к имени файла, может
+ использоваться для чтения этих свойств файла. Системные вызовы
+ fchown, fchmod и
+ fstat применяются с дескрипторами, а не с именами
+ файлов, для выполнения того же самого набора операций. Системный вызов
+ rename может использоваться для присвоения файлу
+ нового имени в файловой системе с заменой старого имени файла. Как и
+ операции по созданию и удалению каталогов, системный вызов
+ rename был добавлен в 4.2BSD для придания
+ атомарности изменению имен в локальной файловой системе. Позже он
+ оправдал свою исключительную полезность для экспортирования операций по
+ переименованию в сторонних файловых системах и по сети.
+
+ Системный вызов truncate был добавлен в 4.2BSD
+ для того, чтобы файлы могли обрезаться по указанному смещению. Вызов
+ был добавлен первоначально для поддержки библиотеки времени выполнения
+ языка Fortran, в котором применялось понятие конца файла с произвольным
+ доступом, который мог устанавливаться в любую позицию, в которой был
+ последний раз доступ к файлу. Без системного вызова
+ truncate единственным способом обрезать файл было
+ копирование нужной части в новый файл, удаление старого и
+ переименование копии в первоначальное имя. Библиотека могла
+ теоретически отказываться работать на заполненной файловой системе, к
+ тому же такой алгоритм оказывался медленным.
+
+ После того, как файловая система получила возможность обрезать
+ файлы, ядро применяло эту возможность для уменьшения больших пустых
+ каталогов. Преимущество в уменьшении пустых каталогов заключается в
+ сокращении времени ядра на поиск в них при создании или удалении
+ имен.
+
+ Вновь создаваемым файлам присваивается идентификатор пользователя
+ процесса, который их создал, и идентификатор группы каталога, в котором
+ они были созданы. Для защиты файлов применяется трехуровневый механизм
+ управления доступом. Эти три уровня определяют доступность файла
+ для
+
+
+
+ Пользователя, который является владельцем файла
+
+
+
+ Группы, которая приписана файлу
+
+
+
+ Всех остальных
+
+
+
+ Каждый уровень доступа имеет отдельные индикаторы прав для чтения,
+ записи и выполнения.
+
+ Файлы создаются с нулевым размером, который может увеличиться при
+ выполнении операций записи. Пока файл открыт, система отслеживает
+ указатель на файл, соответствующий текущему положению в файле,
+ связанном с дескриптором. Этот указатель может перемешаться по файлу в
+ произвольном порядке. Процессы, использующие один и тот же дескриптор
+ файла посредством системных вызовов fork или
+ dup, используют одновременно один и тот же
+ указатель текущей позиции. Дескрипторы, созданные различными
+ системными вызовами open, имеют различные
+ указатели текущей позиции. В файлах могут присутствовать
+ дыры. Дыры представляют собой пустые пространства
+ в теле файла, в которые никаких данных не записывалось. Процесс может
+ создать такие дыры, перемещая указатель за текущий конец файла и
+ производя запись. При чтении дыры интерпретируются системой как
+ заполненные нулевыми байтами.
+
+ Ранние версии UNIX имели ограничение в 14 символов на имя файла.
+ Это ограничение зачастую вызывало проблемы. Например, кроме
+ естественного желания пользователей давать файлам длинные описательные
+ имена, распространенным способом формировать имена файлов является
+ использование формата
+ basename.extension,
+ где расширение (указывающее на тип файла, скажем, .c
+ для исходного года на языке C или .o для
+ промежуточного двоичного объекта) имеет длину от одного до трех
+ символов, оставляя от 10 до 12 символов на имя файла. Системы
+ управления исходным кодом и редакторы обычно используют дополнительно
+ два символа для своих целей, для префикса или суффикса имени файла,
+ при этом остается от восьми до 10 символов. В качестве имени файла
+ легко использовать от 10 до 12 символов одного английского слова
+ (например, ``multiplexer'').
+
+ Можно смириться с этими ограничениями, но это непоследовательно и
+ даже опасно, потому что другие системы UNIX могут работать со строками,
+ превышающими этот лимит, при создании файлов, но затем имя будет
+ обрезано. Исходный файл с именем
+ multiplexer.c, содержащий исходный код на языке C,
+ (уже 13 символов) может иметь соответствующий файл из системы
+ управления исходным кодом с префиксом s., при этом
+ получается имя файла s.multiplexer, которое не
+ не будет отличаться от файла системы управления исходным кодом для
+ файла multiplexer.ms, содержащего исходный код
+
+ troff для документации программы на языке C.
+ Содержимое двух оригинальных файлов может оказаться перепутанным без
+ каких-либо предупреждений от системы управления исходным кодом.
+ При тщательном кодировании эту проблему можно обнаружить, но поддержка
+ длинных имен файлов, впервые появившаяся в 4.2BSD, практически
+ полностью ликвидировала эту проблему.
+
+
+
+ Размещение файлов
+
+ Операции, определенные для локальных файловых систем, делятся на
+ две категории. Общими для всех локальных систем являются иерархический
+ принцип именования, блокировка, квоты, управление атрибутами и защита.
+ Эти механизмы не зависят от того, как хранятся данные. В 4.4BSD
+ имеется единая реализация для предоставления этих сервисов.
+
+ Другой частью локальной файловой системы является организация и
+ управление данными на носителях информации. Размещение содержимого
+ файлов на носителях является вопросом хранилища файлов. В 4.4BSD
+ поддерживает три различных типа хранилищ файлов:
+
+
+
+ Традиционная файловая система Berkeley Fast Filesystem
+
+
+
+ Журналируемая файловая система, основанная на архитектуре
+ операционной системы Sprite
+
+
+
+ Файловая система в памяти
+
+
+
+ Хотя организация этих хранилищ совершенно различна, эти различия
+ скрыты от процессов, использующих файловые системы.
+
+ В файловой системе Fast Filesystem организует данные в группы
+ дорожек. Файлы, к которым, скорее всего, будет осуществляться доступ
+ одновременно (на основе их расположения в иерархии файловой системы),
+ хранятся на одной и той же группе дорожек. Файлы, к которым не
+ предполагается одновременный доступ, перемещаются на разные группы
+ дорожек. Таким образом, файлы, записываемые в одно и то же время, могут
+ располагаться в абсолютно разных областях диска.
+
+ Файловая система с журнальной организацией организует данные в виде
+ журнала. Все данные, записываемые в некоторый момент времени, собираются
+ вместе и записываются в одно и то же место диска. Данные никогда не
+ перезаписываются; вместо этого записывается новая копия файла, которая
+ заменяет старую. Старые файлы уничтожаются процессом-сборщиком мусора,
+ который запускается, когда файловая система переполняется и появляется
+ необходимость в свободном пространстве.
+
+ Файловая система в памяти предназначена для хранения данных в
+ виртуальной памяти. Она используется для файловых систем, в которых
+ должны храниться временные данные с обеспечением быстрого доступа к ним,
+ к примеру, /tmp. При организации файловой системы в
+ памяти преследуется цель организовать максимально компактное хранение
+ данных для минимизации использования ресурсов виртуальной памяти.
+
+
+
+ Сетевая файловая система
+
+ Изначально сетевые возможности использовались для передачи
+ данных от одной машины к другой. Позже это получило свое развитие в
+ обеспечении подключения пользователей удаленно к другим машинам.
+ Следующим логическим шагом было предоставление данных пользователю,
+ а не приближение пользователя к данным -- так родились сетевые файловые
+ системы. Пользователи, работающие локально, не ощущают сетевых
+ задержек при каждом нажатии клавиши, так что они получают более удобное
+ рабочее окружение.
+
+ Подключение файловой системы к локальной машине было одним из
+ первых основных клиент-серверных приложений.
+ Сервер является удаленной машиной, которая
+ экспортирует одну или более своих файловых систем.
+ Клиентом является локальная машина, которая
+ импортирует эти файловые системы. С точки зрения локального клиента,
+ смонтированные удаленные файловые системы появляются в пространстве
+ имен дерева файлов, как любая другая локально смонтированная файловая
+ система. Локальные клиенты могут перемещаться в каталоги на удаленной
+ файловой системе, и могут осуществлять чтение, запись и выполнение
+ двоичных файлов на удаленной файловой системе точно так же, как они
+ выполняют эти операции на локальной файловой системе.
+
+ Когда локальный клиент выполняет операцию на удаленной файловой
+ системе, оформляется и посылается запрос к серверу. Сервер выполняет
+ запрошенную операцию и возвращает либо запрошенную информацию, либо
+ ошибку, почему запрос был отклонен. Для получения удовлетворительной
+ производительности, клиент должен кэшировать данные, к которым доступ
+ осуществляется часто. Сложность удаленных файловых систем отражается
+ на поддержке соответствия между сервером и множеством его
+ клиентов.
+
+ Хотя за эти годы было разработано множество протоколов работы с
+ удаленными файловыми системами, самой распространенной на системах UNIX
+ является сетевая файловая система Network Filesystem (NFS), которая
+ была спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD
+ поддерживает протокол NFS, хотя его реализация была выполнена
+ независимо от спецификаций протокола .
+ Протокол NFS описан в Главе 9.
+
+
+
+ Терминалы
+
+ Терминалы поддерживают стандартные системные операции ввода/вывода,
+ а также набор операций, специфичных для терминалов, для управления
+ редактированием входных символов и задержек вывода. На самом нижнем
+ уровне находятся драйверы терминальных устройств, которые управляют
+ портами аппаратных терминалов. Терминальный ввод обрабатывается
+ согласно низлежащим характеристикам связи, таким, как скорость
+ передачи, и согласно набору программно контролируемых параметров, таких,
+ как контроль четности.
+
+ Выше уровня драйверов терминальных устройств находятся режимы
+ каналов, которые обеспечивают различные уровни обработки символов.
+ По умолчанию режим работы канала выбирается, когда порт используется
+ для интерактивного входа в систему. Режим работы канала
+ устанавливается в канонический; входной поток
+ обрабатывается так, что обеспечиваются стандартные функции,
+ ориентированные на редактирование строк, и он представляется процессу
+ в виде целых строк.
+
+ Экранные редакторы и программы, которые взаимодействуют с другими
+ машинами, обычно работают в неканоническом режиме
+ (часто называемом raw-режимом или
+ посимвольным режимом). В этом режиме входной
+ поток передается в читающий процесс сразу же и без всякой обработки.
+ Выключается вся обработка специальных символов, не выполняется
+ удаление символов и другое редактирование строк, все символы передаются
+ программе, которая выполняет чтение с терминала.
+
+ Терминал может быть настроен тысячами различных способов,
+ промежуточных между этими двумя. Например, экранный редактор, которому
+ необходимо получать прерывания от пользователя асинхронно, может
+ разрешить использование специальных символов, которые генерируют
+ сигналы и разрешить управление выходным потоком, в противном случае
+ работать в неканоническом режиме; все остальные символы будут
+ передаваться в процесс необработанными.
+
+ Что касается выходного потока, то терминальный обработчик
+ предоставляет простые службы по его форматированию, включая
+
+
+
+ Преобразование символа перевода строки на двухсимвольную
+ последовательность из символов возврата каретки и перевода
+ строки
+
+
+
+ Выдерживание пауз после некоторых стандартных управляющих
+ символов
+
+
+
+ Замещение символов табуляции
+
+
+
+ Вывод неграфических символов ASCII в виде двухсимвольных
+ последовательностей вида ``^C'' (другими словами, вывод знака
+ вставки, за которым следует символ, который находится по смещению
+ от символа ``@'', соответствующему значению этого символа).
+
+
+
+ Каждый из этих сервисов преобразования может быть независимо
+ выключен процессом при помощи управляющих запросов.
+
+
+
+ Коммуникации между процессами
+
+ Межпроцессные коммуникации в 4.4BSD организованы в
+ коммуникационные домены. К поддерживаемым на
+ данный момент доменам относятся локальный домен
+ для взаимодействия между процессами, выполняющимися на одной и той же
+ машине; межсетевой домен для связи между
+ процессами посредством набора протоколов TCP/IP (возможно, в сети
+ Интернет); семейство протоколов ISO/OSI для взаимодействия между
+ сайтами, которым нужна именно такая связь, и домен
+ XNS для коммуникаций между процессами при помощи протоколов
+ XEROX Network Systems (XNS).
+
+ В пределах домена соединения имеют место между конечными точками
+ связи, также называемыми сокетами. Как отмечено в
+ Разделе 2.6, системный вызов socket создает сокет
+ и возвращает дескриптор; другие системные вызовы IPC описаны в Главе
+ 11. Каждый сокет имеет тип, определяющий его коммуникационные
+ свойства; к ним относятся такие характеристики, как надежность,
+ сохранение последовательности передаваемой информации и предупреждение
+ дублирования сообщений.
+
+ с каждым сокетом связан некоторый коммуникационный
+ протокол. Этот протокол обеспечивает выполнение операций,
+ требуемых сокету, согласно его типу. Приложения могут задавать
+ нужный протокол при создании сокета или могут разрешить системе выбрать
+ протокол, который соответствует типу создаваемого сокета.
+
+ Сокеты могут иметь адреса, связанные с ними. Формат и смысл
+ адресов сокетов зависят от коммуникационного домена, в котором был
+ создан сокет. Привязка имени к сокету в локальном домене приводит к
+ созданию файла в файловой системе.
+
+ Обычные данные, передаваемые и получаемые при помощи сокетов, не
+ имеют типа. Вопросы представления данных зависят от библиотек, которые
+ находятся на верху коммуникационных сервисов. Вдобавок к передаче
+ обычных данных, коммуникационные домены могут поддерживать передачу и
+ прием специальных типов данных, которые называются правами
+ доступа. Например, локальный домен использует эту
+ возможность для передачи дескрипторов между процессами.
+
+ До 4.2BSD сетевые реализации в UNIX обычно работали через
+ интерфейсы символьных устройств. Одной из целей создания интерфейса
+ сокетов было обеспечение работы простеньким программам без изменения
+ на потоковых соединениях. Такие программы могут работать, если только
+ не меняются системные вызовы read и
+ write. Соответственно, оригинальные интерфейсы
+ не трогались, но были исправлены для работы с потоковыми сокетами.
+ Для более сложных сокетов, таких, как те, что используются для посылки
+ датаграмм и в которых при каждом вызове send должен
+ указываться адрес назначения, был добавлен новый интерфейс.
+
+ Другим достоинством является то, что новый интерфейс легко
+ переносим. Вскоре после тестового релиза, полученного из Беркли,
+ интерфейс сокетов был перенесен в System III поставщиком UNIX (хотя
+ AT&T не поддерживала интерфейс сокетов до выхода System V Release
+ 4, решив использовать вместо него механизм потоков из Eighth Edition).
+ Интерфейс сокетов был также перенесен для работы на многих
+ адаптерах Ethernet поставщиками, такими, как Excelan и Interlan, который
+ продавался на рынке PC, где компьютеры были слишком слабыми, чтобы
+ обрабатывать сетевой код на основном процессоре. Сравнительно недавно
+ интерфейс сокетов был использован в качестве основы для сетевого
+ интерфейса Winsock от Microsoft для Windows.
+
+
+
+ Сетевые коммуникации
+
+ Некоторые из коммуникационных доменов, поддерживаемых
+ IPC-механизмом сокетов дают доступ к сетевым
+ протоколам. Эти протоколы реализованы как отдельный программный слой,
+ логически находящийся ниже программного обеспечения сокетов в ядре.
+ Ядро предоставляет много вспомогательных сервисов, таких, как
+ управление буферами, маршрутизация сообщений, стандартные интерфейсы к
+ протоколам и интерфейсы к драйверам сетевых интерфейсов для
+ использования в различных сетевых протоколах.
+
+ В те времена, когда разрабатывалась 4.2BSD, использовалось или
+ разрабатывалось много сетевых протоколов, каждый со своими сильными и
+ слабыми сторонами. Не существует единственного подходящего на все
+ случаи жизни протокола или набора протоколов. Поддерживая много
+ протоколов, 4.2BSD может обеспечить взаимодействие и обмен ресурсами
+ между различными машинами, которые были доступны в Беркли. Поддержка
+ многих протоколов необходим также для изменений в будущем. Современные
+ протоколы, разработанные для Ethernet со скоростями работы 10 и 100
+ Mbit в секунду, вряд ли будут соответствовать для завтрашних оптических
+ сетей пропускной способностью 1 и 10 Gbit в секунду. Поэтому уровень
+ сетевых коммуникаций разработан с учетом поддержки многих протоколов.
+ Новые протоколы добавляются к ядру, не затрагивая поддержку старых
+ протоколов. Старые приложения могут продолжать работать с
+ использованием старых протоколов в той же самой физической сети, что
+ использовалась для новых приложений, работающих с новым сетевым
+ протоколом.
+
+
+
+ Сетевая реализация
+
+ Первым набором протоколов, реализованным в 4.2BSD, был
+ Transmission Control Protocol/Internet Protocol (TCP/IP) от DARPA.
+ CSRG выбрала TCP/IP в качестве первого для включения в набор протоколов
+ IPC, потому что реализация на основе 4.1 была всем доступна из проекта,
+ спонсируемого DARPA, в Bolt, Beranek и Newman (BBN). Это был выбор,
+ повлиявший на многое: Реализация в 4.2BSD стала основной причиной
+ очень широкой распространенности и использования этого набора
+ протоколов. Более поздние усовершенствования производительности и
+ возможностей TCP/IP были также широко приняты. Реализация TCP/IP
+ подробно описана в Главе 13.
+
+ В релизе 4.3BSD появился набор протоколов Xerox Network Systems
+ (XNS), частично основанный на работе, выполненной в Университете
+ Мэрилэнда и Университете Корнелла. Этот набор был нужен для
+ объединения отдельных машин, которые не могли работать с протоколом
+ TCP/IP.
+
+ В релиз 4.4BSD был добавлен набор протоколов ISO из-за его все
+ большей распространенности как внутри, так и во вне США. По причине
+ использования в протоколах ISO несколько другого подхода к сети, в
+ интерфейсе сокетов потребовалось сделать некоторые небольшие изменения
+ для реализации этого подхода. Изменения были сделаны так, что они
+ были незаметны для клиентов других существующих протоколов. Протоколы
+ ISO требуют также большой работы с двухуровневыми таблицами
+ маршрутизации, имеющимися в 4.3BSD. К значительно расширенным
+ возможностям по маршрутизации в 4.4BSD относятся раздельные уровни
+ маршрутизации с адресами переменной длины и сетевыми масками.
+
+
+
+ Работа системы
+
+ Механизмы начальной загрузки используются для запуска системы.
+ Сначала ядро 4.4BSD должно быть загружено в основную память процессора.
+ После загрузки оно должно пройти через фазу инициализации для установки
+ аппаратуры в известное состояние. Затем ядро должно выполнить
+ автоконфигурацию, в процессе которой распознаются и настраиваются
+ периферийные устройства, подключенные к процессору. Система начинает
+ работу в однопользовательском режиме, пока начальный скрипт выполняет
+ проверку дисков и включает подсчет статистики и использования квот.
+ Наконец, начальный скрипт запускает общесистемные службы и переводит
+ систему в полностью многопользовательский режим.
+
+ При работе в многопользовательском режиме процессы ждут запросов на
+ вход в систему с терминальных линий и сетевых портов, которые были
+ настроены на вход пользователей. После обнаружения запроса на вход,
+ вызывается процесс входа в систему и выполняется аутентификация
+ пользователя. Если она прошла успешно, запускается начальная
+ оболочка, из которой пользователь может запускать дополнительные
+ процессы.
+
+
+
+ Ссылки
+
+
+ Accetta et al, 1986
+
+
+ Mach: A New Kernel Foundation for UNIX Development"
+
+
+
+ M.
+ Accetta
+
+
+
+ R.
+ Baron
+
+
+
+ W.
+ Bolosky
+
+
+
+ D.
+ Golub
+
+
+
+ R.
+ Rashid
+
+
+
+ A.
+ Tevanian
+
+
+
+ M.
+ Young
+
+
+
+ 93-113
+
+
+
+ USENIX Association Conference Proceedings
+ USENIX Association
+ June 1986
+
+
+
+
+ Cheriton, 1988
+
+
+ The V Distributed System
+
+
+ D. R.
+ Cheriton
+
+
+ 314-333
+
+
+
+ Comm ACM, 31, 3
+
+ March 1988
+
+
+
+
+ Ewens et al, 1985
+
+
+ Tunis: A Distributed Multiprocessor Operating System
+
+
+
+ P.
+ Ewens
+
+
+
+ D. R.
+ Blythe
+
+
+
+ M.
+ Funkenhauser
+
+
+
+ R. C.
+ Holt
+
+
+
+ 247-254
+
+
+
+ USENIX Assocation Conference Proceedings
+ USENIX Association
+ June 1985
+
+
+
+
+ Gingell et al, 1987
+
+
+ Virtual Memory Architecture in SunOS
+
+
+
+ R.
+ Gingell
+
+
+
+ J.
+ Moran
+
+
+
+ W.
+ Shannon
+
+
+
+ 81-94
+
+
+
+ USENIX Association Conference Proceedings
+ USENIX Association
+ June 1987
+
+
+
+
+ Kernighan & Pike, 1984
+
+ The UNIX Programming Environment
+
+
+
+ B. W.
+ Kernighan
+
+
+
+ R.
+ Pike
+
+
+
+
+ Prentice-Hall
+
+ Englewood Cliffs
+ NJ
+
+
+
+ 1984
+
+
+
+ Macklem, 1994
+
+
+ The 4.4BSD NFS Implementation
+
+
+ R.
+ Macklem
+
+
+ 6:1-14
+
+
+
+ 4.4BSD System Manager's Manual
+
+
+ O'Reilly & Associates, Inc.
+
+ Sebastopol
+ CA
+
+
+
+ 1994
+
+
+
+
+ McKusick & Karels, 1988
+
+
+ Design of a General Purpose Memory Allocator for the 4.3BSD
+ UNIX Kernel
+
+
+
+ M. K.
+ McKusick
+
+
+
+ M. J.
+ Karels
+
+
+
+ 295-304
+
+
+
+ USENIX Assocation Conference Proceedings
+ USENIX Assocation
+ June 1998
+
+
+
+
+ McKusick et al, 1994
+
+
+ Berkeley Software Architecture Manual, 4.4BSD Edition
+
+
+
+ M. K.
+ McKusick
+
+
+
+ M. J.
+ Karels
+
+
+
+ S. J.
+ Leffler
+
+
+
+ W. N.
+ Joy
+
+
+
+ R. S.
+ Faber
+
+
+
+ 5:1-42
+
+
+
+ 4.4BSD Programmer's Supplementary Documents
+
+
+ O'Reilly & Associates, Inc.
+
+ Sebastopol
+ CA
+
+
+
+ 1994
+
+
+
+
+ Ritchie, 1988
+
+ Early Kernel Design
+ private communication
+
+
+ D. M.
+ Ritchie
+
+
+ March 1988
+
+
+
+ Rosenblum & Ousterhout, 1992
+
+
+ The Design and Implementation of a Log-Structured File
+ System
+
+
+
+ M.
+ Rosenblum
+
+
+
+ K.
+ Ousterhout
+
+
+
+ 26-52
+
+
+
+ ACM Transactions on Computer Systems, 10, 1
+
+ Association for Computing Machinery
+ February 1992
+
+
+
+
+ Rozier et al, 1988
+
+
+ Chorus Distributed Operating Systems
+
+
+
+ M.
+ Rozier
+
+
+
+ V.
+ Abrossimov
+
+
+
+ F.
+ Armand
+
+
+
+ I.
+ Boule
+
+
+
+ M.
+ Gien
+
+
+
+ M.
+ Guillemont
+
+
+
+ F.
+ Herrmann
+
+
+
+ C.
+ Kaiser
+
+
+
+ S.
+ Langlois
+
+
+
+ P.
+ Leonard
+
+
+
+ W.
+ Neuhauser
+
+
+
+ 305-370
+
+
+
+ USENIX Computing Systems, 1, 4
+ Fall 1988
+
+
+
+
+ Tevanian, 1987
+
+ Architecture-Independent Virtual Memory Management for Parallel
+ and Distributed Environments: The Mach Approach
+ Technical Report CMU-CS-88-106,
+
+
+ A.
+ Tevanian
+
+
+
+ Department of Computer Science, Carnegie-Mellon
+ University
+
+
+ Pittsburgh
+ PA
+
+
+
+ December 1987
+
+
+
+
diff --git a/ru_RU.KOI8-R/books/design-44bsd/fig1.eps b/ru_RU.KOI8-R/books/design-44bsd/fig1.eps
new file mode 100644
index 0000000000..d1b1976b14
--- /dev/null
+++ b/ru_RU.KOI8-R/books/design-44bsd/fig1.eps
@@ -0,0 +1,340 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Title: fig1.ps
+%%Creator: groff version 1.15
+%%CreationDate: Fri Jun 30 09:50:25 2000
+%%For:sheldonh sheldonh
+%%Pages: 1
+%%DocumentFonts:
+%%BoundingBox: 71 687 446 781
+%%BeginPreview: 376 93 1 93
+% 0000000000003fffffe00000000000000000000000000000000000000000000000000000001ffffff8000000000000
+% 000000000007c000001f000000000000000000000000040000000000000000000000000003e0000007c00000000000
+% 00000000007800000000f0000000000000000000000000000000000000000000000000001c00000000380000000000
+% 000000000380000000000e00000000000000000000000180000000000000000000000000e000000000070000000000
+% 000000000c00000000000180000000000000000006496dc0000000000000000000000003000000000000e000000000
+% 000000003000000000000060000000000000000002ca6d0000000000000000000000000c0000000000001800000000
+% 0000000040000000002000100000000000000000035469000000000000000000000000300000000008000400000000
+% 00000001800080100860000c00000000000000000374c9000000000000000000000000400040040218000200000000
+% 000000020000f395ef600002000000000000000002674b000000000000000000000000800079c57bd8000100000000
+% 0000000400009893e9200001000000000000000000000000000000000000000000000100004c44fa48000080000000
+% 0000000800008a9309200001800000000000000000000000000000000000000000000200004544c248000040000000
+% 00000f0800008e932920000080000000000000000000000000000000000000000003c200004744ca480000400003c0
+% 00000fe80000f3d9c930000080000000000000000000000000000000000000000003fc000079e6724c0000200003fc
+% fffffff80000800000000000be7c78f9f1e3e7c78f9f1e3e7c78f9f1e3c7cf8f1f3ffc00004000000000003ffffffc
+% 00000c0800008000000000008000000000000000000000000000000000000000000384000040000000000020000380
+% 00000008000590000000000080000000000000000000000000000000000000000000020001c4000000000040000000
+% 00000008000795a79fef000080000000000000000000000000000000000000000000020001e569ef7f800040000000
+% 000000040004d2183f8c00010000000000000000000000000000000000000000000001000134861f66000080000000
+% 000000020004521830e70002000000000000000000000000000000000000000000000080011486183b800080000000
+% 000000010004533cb32900040000000000000000000000000000000000000000000000c00114cf394c800300000000
+% 00000000c00799e71def001800000000000000000000000000000000000000000000002001e679ce7f800400000000
+% 0000000030040000000000600000000000000000000000000000000000000000000000180100000000001800000000
+% 000000000c040000000001800000000000000000000000000000000000000000000000060100000000006000000000
+% 00000000030c000000000e00000000000000000000000000000000000000000000000001c300000000038000000000
+% 0000000000f000000000700000000000000000000000000000000000000000000000000038000000001c0000000000
+% 00000000000f00000007800000000000000000000000000000000000000000000000000007c0000003e00000000000
+% 000000000000ff800ff80000000000000000000000000000000000000000000000000000003fe007fc000000000000
+% 000000000000007ff000000000000000000000000000000000000000000000000000000000001ff800000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
+% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
+% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
+% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
+% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008006000000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000000800e002000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008008002000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008008007000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000000803def7800000000000000000000000000000000000000000000000000000008000000000000000
+% 00000000000000080122c4000000000000000000000000000000000000000000000000000000008000000000000000
+% 00000000000000080146c6000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000000801448f000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008037889800000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008020000000000000000000000000000000000000000000000000000000000008000000000000000
+% 00000000000000080a0000000000000000000000000000000000000000000000000000000000008000000000000000
+% 00000000000000080c0000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000
+% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
+% 000000000000007fe000000000000000000000000000007fe0000000000000000000000000001ff800000000000000
+% 000000000000ff801ff0000000000000000000000000ff801ff000000000000080000000003fe007fc000000000000
+% 00000000000f0000000f80000000000000000000000f0000000f8000000000000000000007c0000003e00000000000
+% 0000000000f000000000700000000000000000000070000000007000000000003000000038000000001c0000000000
+% 000000000300000000000e000003bc73e47000000380000000000e000000073db8000001c000000000038000000000
+% 000000000c00008240800180000598b424b000000c0000824080018000000b19a00000060000002080006000000000
+% 000000003000008040800060000f19e839e00000300000804080006000001e19200000180000002000001800000000
+% 00000000c0000080408000180008190839000000c00000804080001800001019200000200000002000000400000000
+% 0000000100001ef647800004000f49ef11e0000100001ef64780000400001e49600000c0039a5fbd8f000300000000
+% 00000002000020924880000200000000000000020000209248800002000000000000008000a148a69f000080000000
+% 000000040000209248800001000000000000000400002092488000010000000000000100012148a298000080000000
+% 00000008000032924c8000008000000000000f88000032924c800000800000000003c200023348a699000040000000
+% 0000000800001c9267c000008000000000000ff800001c9267c00000800000000003fe0003deeebc8e000040000000
+% 000000080000000000000000bffffffffffffff80000000000000000be7cf1e7cf9ffc000000000000000020000000
+% 0000000800000000000000008000000000000e08000000000000000080000000000384000000000000000020000000
+% 0000000800041000000000008000000000000008000410000000000080000000000004000104000000000020000000
+% 00000008000795a79fef00008000000000000008000795a79fef0000800000000000020001e569ef7f800040000000
+% 000000080004d2183f8c000180000000000000080004d2183f8c000180000000000002000134861f66000040000000
+% 000000040004521830e7000100000000000000040004521830e700010000000000000100011486183b800080000000
+% 000000020004533cb329000200000000000000020004533cb329000200000000000000800114cf394c800100000000
+% 00000001000799e71def000c0000000000000001800799e71def000c000000000000004001e679ce7f800200000000
+% 00000000c0040000000000100000000000000000400400000000001000000000000000200100000000000400000000
+% 00000000300400000000006000000000000000003004000000000060000000000000001c0100000000001800000000
+% 000000000c0c00000000018000000000000000000c0c0000000001800000000000000003030000000000e000000000
+% 000000000380000000000e0000000000000000000380000000000e000000000000000000e000000000070000000000
+% 00000000007800000000f0000000000000000000007800000000f00000000000000000001c00000000380000000000
+% 0000000000078000001f0000000000000000000000078000001f0000000000000000000003e0000007c00000000000
+% 0000000000007ffdffe00000000000000000000000007ffdffe000000000000000000000001ffffff8000000000000
+% 0000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000
+%%EndImage
+%%EndPreview
+save
+countdictstack
+mark
+newpath
+/showpage {} def
+%%EndProlog
+%%Page 1 1
+%%+ font Times-Roman
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Times-Roman@0 ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic RE
+BP
+/F0 12/Times-Italic@0 SF(fork)141.534 58.984 Q 68.832 27.216 134.424
+90.408 DE .4 LW ST/F1 12/Times-Roman@0 SF(process)116.43 97.432 Q(child)
+121.632 89.368 Q 301.968 88.824 298.368 88.824 DL 308.808 88.824 305.208
+88.824 DL 315.576 88.824 311.976 88.824 DL 322.416 88.824 318.816 88.824
+DL 329.184 88.824 325.584 88.824 DL 336.024 88.824 332.424 88.824 DL
+342.792 88.824 339.192 88.824 DL 349.632 88.824 346.032 88.824 DL
+349.632 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL BL 349.632 88.824 MT -7.2 1.8
+RL 0 -3.6 RL CL ST 68.832 27.216 262.44 90.408 DE ST(process)244.374
+97.432 Q(child)249.576 89.368 Q(process)365.982 97.432 Q(zombie)364.728
+89.368 Q 383.976 72.408 383.976 76.008 DL 383.976 65.928 383.976 69.528
+DL 383.976 59.448 383.976 63.048 DL 383.976 52.968 383.976 56.568 DL
+383.976 46.488 383.976 50.088 DL 383.976 40.008 383.976 43.608 DL
+383.976 40.008 MT 1.8 7.2 RL -3.6 0 RL CL BL 383.976 40.008 MT 1.8 7.2
+RL -3.6 0 RL CL ST 68.832 27.216 384.048 90.408 DE ST 72 24.816 99.216
+24.816 DL 99.216 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 99.216 24.816 MT
+-7.2 1.8 RL 0 -3.6 RL CL ST 445.608 24.816 418.392 24.816 DL 445.608
+24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 445.608 24.816 MT -7.2 1.8 RL 0
+-3.6 RL CL ST 228.024 88.824 170.424 88.824 DL 228.024 88.824 MT -7.2
+1.8 RL 0 -3.6 RL CL BL 228.024 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL ST F0
+-.24(ex)180.12 84.616 S(ecve).24 E 174.024 24.816 170.424 24.816 DL
+181.296 24.816 177.696 24.816 DL 188.64 24.816 185.04 24.816 DL 195.984
+24.816 192.384 24.816 DL 203.256 24.816 199.656 24.816 DL 210.6 24.816
+207 24.816 DL 217.872 24.816 214.272 24.816 DL 225.216 24.816 221.616
+24.816 DL 232.56 24.816 228.96 24.816 DL 239.832 24.816 236.232 24.816
+DL 247.176 24.816 243.576 24.816 DL 254.448 24.816 250.848 24.816 DL
+261.792 24.816 258.192 24.816 DL 269.136 24.816 265.536 24.816 DL
+276.408 24.816 272.808 24.816 DL 283.752 24.816 280.152 24.816 DL
+291.096 24.816 287.496 24.816 DL 298.368 24.816 294.768 24.816 DL
+305.712 24.816 302.112 24.816 DL 312.984 24.816 309.384 24.816 DL
+320.328 24.816 316.728 24.816 DL 327.672 24.816 324.072 24.816 DL
+334.944 24.816 331.344 24.816 DL 342.288 24.816 338.688 24.816 DL
+349.632 24.816 346.032 24.816 DL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL
+CL BL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL ST(wait)236.838 20.608
+Q -.24(ex)315.456 84.616 S(it).24 E 131.976 76.008 131.976 40.008 DL
+131.976 76.008 MT -1.8 -7.2 RL 3.6 0 RL CL BL 131.976 76.008 MT -1.8
+-7.2 RL 3.6 0 RL CL ST 68.832 27.216 134.424 25.608 DE ST F1(process)
+116.43 32.632 Q(parent)118.638 24.568 Q 68.832 27.216 384.048 25.608 DE
+ST(process)365.982 32.632 Q(parent)368.19 24.568 Q EP
+end
+%%Trailer
+cleartomark
+countdictstack exch sub { end } repeat
+restore
+%%EOF
diff --git a/ru_RU.KOI8-R/books/design-44bsd/fig2.eps b/ru_RU.KOI8-R/books/design-44bsd/fig2.eps
new file mode 100644
index 0000000000..84581020db
--- /dev/null
+++ b/ru_RU.KOI8-R/books/design-44bsd/fig2.eps
@@ -0,0 +1,1476 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Title: /b/archive/c02/fig2.test.ps
+%%Creator: XV Version 3.10a Rev: 12/29/94 (jp-extension 5.3.3 + PNG patch 1.2d) - by John Bradley
+%%CreationDate: Nov 2 22:04
+%%For:sheldonh sheldonh
+%%Pages: 1
+%%DocumentFonts:
+%%BoundingBox: 187 308 426 484
+%%BeginPreview: 239 176 1 176
+% 000000000000000000000000000000000000000000aa8000000000000000
+% 000000000000000000000000000000000000000004001000000000000000
+% 000000000000000000000000000000000000000008000800000000000000
+% 000000000000000000000000000000000000000020000200000000000000
+% 000000000000000000000000000000000000000080000080000000000000
+% 000000000000000000000000000000000000000080000080000000000000
+% 000000000000000000000000000000000000000200000000000000000000
+% 000000000000000000000000000000000000000200000000000000000000
+% 000000000000000000000000000000000000000200000020000000000000
+% 000000000000000000000000000000000000000400000010000000000000
+% 000000000000000000000000000000000000000800000000000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000008000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000008000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000008000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000008000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000008000000000000
+% 000000000000000000000000000000000000000000000000000000000000
+% 000000000000000000000000000000000000000800000000000000000000
+% 000000000000000000000000000000000000000400000010000000000000
+% 000000000000000000000000000000000000000200000020000000000000
+% 000000000000000000000000000000000000000000000000000000006000
+% 000000000000000000000000000000000000000200000000000000002000
+% 00000000000000000000000000000000076c7804000000001d75ddf4fd00
+% 00000000000000000000000000000000037a68088000008008be8dbe6800
+% 00000000000000000000000000000000037c6010000000100d36cdb66600
+% 00000000000000000000000000000000036e6020280008080636cdb66600
+% 0000000000000000000000000000000003726040040010040636cdb66700
+% 0000000000000000000000000000000003fae08002aa8002023eefbeeb80
+% 000000000000000000000000000000000000010000000001000000000000
+% 000000000000000000000000000000000000020000000000800000000000
+% 000000000000000000000000000000000000040000000000400000000000
+% 000000000000000000000000000000000000080000000000080000000000
+% 000000000000000000000000000000000000100000000000080000000000
+% 000000000000000000000000000000000000200000000000020000000000
+% 000000000000000000000000000000000000400000000000010000000000
+% 00000000000000000000000000000000000080000000000000a000aa8000
+% 00000000000000000000000000000000000000000000000000700c00c000
+% 000000000000000000000000000000000002000000000000007820002800
+% 000000000000000000000000000000000040000000000000007c40000400
+% 0000000000000000000000000000000000b8000000000000003e80000200
+% 000000000000000000000000000001d500f0000000000000000700000100
+% 00000000000000000000000000000a00a0e0000000000000000200000080
+% 0000000000000000000000000000100011c0000000000000000400000000
+% 000000000000000000000000000020000b80000000000000000800000000
+% 000000000000000000000000000080000200000000000000000800000000
+% 000000000000000000000000000000000000000000000000000800000020
+% 000000000000000000000000000000000000000000000000001000000000
+% 000000000000000000000000000200000080000000000000000000000000
+% 000000000000000000000000000400000040000000000000001000000010
+% 000000000000000000000000000800000020000000000000002000000000
+% 000000000000000000000000000000000000000000000000000000000010
+% 000000000000000000000000000800000000000000000000002000000000
+% 000000000000000000000000001000000010000000000000000000000010
+% 000000000000000000000000000000000000000000000000002000000000
+% 000000000000000000000000001000000010000000000000000000000010
+% 000000000000000000000000002000000008000000000000000000000000
+% 000000000000000000000000000000000000000000000000001000000010
+% 000000000000000000000000002000000008000000000000000000000020
+% 000000000000000000000000000000000010000000000000000000000000
+% 000000000000000000000000000000000000000000000000000800000000
+% 000000000000000000000000001000000010000000000000000400000040
+% 000000000000000000000000000000000000000000000000000200000080
+% 000000000000000000000000000000000000000000000000000200000100
+% 000000000000000000000000000800000020000000000000000080000200
+% 000000000000000000000000000000000020000000000000000080000400
+% 00000000000000000000000000020000000800e180000000000020000800
+% 00000000000000000000001dc00400000000006100000000000010001000
+% 00000000000000000000201ba00a00000082006bba00000000000a808000
+% 00000000000000000007f73fc00100000101006d9b0000000000005c0000
+% 0000000000000000000c6c99802080000200806d9b000000000000000000
+% 0000000000000000000e6599800040000400406d9b000000000000000000
+% 0000000000000000000b6b9980800800280020699b000000000000000000
+% 000000000000000000016d9980000501c00010799b000000000000000000
+% 0000000000000000000e2ebb880000aa0000080000000000000000000000
+% 000000000000000000000000000000100000040000000000000000000000
+% 000000000000000000000000200000000000020000000000000000000000
+% 000000000000000000000000000000100000010000000000000000000000
+% 000000000000000000000000800000008000008000000000000000000000
+% 000000000000000000000001000000118000000000000000000000000000
+% 00000000000000000000000200000003baee800800000000000000000000
+% 000000000000000000000004000000119b66c00800000000000000000000
+% 000000000000000000000008000000019b66c00200000000000000000000
+% 000000000000000000000010000000119b66c00000000000000000000000
+% 00000000000000000aa00020000000019b668000a00aa800000000000000
+% 0000000000000000401801c0000000119b778000e0100400000000000000
+% 0000000000000002000203800000002800060000e0a00080000000000000
+% 0000000000000004000007c0000000380006000071000040000000000000
+% 000000000000000800008f8000000038000e00003a000008000000000000
+% 000000000000001000000c0000000038000000000c000008000000000000
+% 000000000000002000000800000000380000000008000000000000000000
+% 000000000000004000000000000000100000000010000000000000000000
+% 000000000000008000000800000000100000000020000002000000000000
+% 0000000000000000000004000000015d0000000000000001000000000000
+% 00000000000000000000020000000a00a000000000000000800000000000
+% 000000000000010000000000000020001000000040000000000000000000
+% 000000000000000000000200000080000800000080000000800000000000
+% 000000000000000000000100000100000400000080000000000000000000
+% 000000000000020000000000000200000200000080000000800000000000
+% 000000000000000000000100000400000100000000000000400000000000
+% 000000000000020000000000000800000080000080000000000000000000
+% 000000000000000000000100000800000000000080000000400000000000
+% 000000000000020000000000000800000000000080000000000000000000
+% 000000000000000000000100001000000000000000000000000000000000
+% 000000000000020000000000000000000020000080000000800000000000
+% 000000000000010000000000000000000000000000000000800000000000
+% 000000000000000000000200002000000020000000000000800000000000
+% 000000000000010000000000000000000000000040000000000000000000
+% 0000c0003030008000000000002000000000000020000000000000000000
+% 0000c0003030000000000400000000000010000000000000000000000000
+% fa38ebee32b2008000000800002000000000000020000002003800000000
+% db64d36c35b4000000001400002000000010000050000004001800000000
+% db28e36e3cb8022000002000002000000020000088000008801b80000000
+% db60f3673c3c041000004000000000000000000004000010001e00000000
+% db22fb6b3e3e080a00008000002000000020000002000020201e00000000
+% dbbcdbe73736100100010040001000000000000400400040001b80000000
+% 0000000000002000a0080028000800000000000800280a80081880000000
+% 00000000000040001d40000000080000004000000005d800001f80000000
+% 000000000000800000000000000800000080000000000000020000000000
+% 000000000001000001000002000400000000004000004000000000000000
+% 000000000002000000000000800200000200008000000000008000000000
+% 000000000004000001000000000100000000010000004000000000000000
+% 0000000000080000003800003000800008000000000c0000002000000000
+% 0000000000100000011800003000400010000000000c4000001000000000
+% 0000000000200000001abba2ba002800a000080003ac0000000800000000
+% 0000000001400000011859e5bc00050100001000030c4000000500000000
+% 00000020038000000018898fbe0000aa00002000030c0000000380020000
+% 0000071403c00000011e598c3700000000000000018c40000007c0556000
+% 0000280283800000001ad98eb980000000008000008c0000000382800800
+% 0000c00047000000011bd9873f40000000000000011c40000001c4000100
+% 000280000e00000000000000002000000000000000000000000028000080
+% 000200000c00000001000000000000000000000000004000000030000040
+% 00080000000000000380000000000000000000000001e000000020000020
+% 00080000000000000780000000000000000000000001c000000000000010
+% 00080000000000000380000000000000000000000000c000000080000008
+% 00100000000000000300000000000000000000000000c000000100000000
+% 002000000080000003000000000000000000000000008000000000000008
+% 00000000000000000300000000000000000000000000c000000000000004
+% 00200000000000000aa000000000000000000000000aa000000200000002
+% 004000000040000010040000000000000000000000401400000000000000
+% 000000000000000080008000000000000000000000800280000000000002
+% 004000000000000100004000000000000000000004000080000400000000
+% 008000000020000200002000000000000000000008000020000000000002
+% 000000000000000800001000000000000000000010000010000400000000
+% 008000000020000800000800000000000000000020000008000000000002
+% 004000000000001000000400000000000000000040000000000400000000
+% 000000000000002000000200000000000000000080000000000200000002
+% 004000000040004000000000000000000000000000000004000000000000
+% 000000000000008000000000000000000000000080000002000200000000
+% 000000000000000000000100000000000000000100000000000000000004
+% 002000000080008000000080000000000000000000000002000200000008
+% 001000000000000000000000000000000000000100000001000100000000
+% 000800000000008000000080000000000000000200000000000080000008
+% 000800000000010000000080000000000000000100000001000000000010
+% 000800000200008000000080000000000000000200000000000020000020
+% 000400000400010000000000000000000000000000000001000020000040
+% 000080000800008000000080000000000000000200000000000008000080
+% 000080000000000000000000000000000000000000000001000004000100
+% 000020008000008000000080000000000000000200000000000002800a00
+% 000004040000000000000000000000000000000100000001000000407000
+% 000000a800000080000000800000000000000000800000020000000a8000
+% 000000000000000000000100000000000000000000000000000000000000
+% 000000000000000000000200000000000000000080000002000000000000
+% 000000000000000000000200000000000000000040000004000000000000
+% 000000000000002000000200000000000000000000000008000000000000
+% 000000000000001000000400000000000000000000000008000000000000
+% 000000000000000800000800000000000000000020000020000000000000
+% 000000000000000400001000000000000000000008000040000000000000
+% 00000000000000020000200000000000000000000a000080000000000000
+% 000000000000000180018000000000000000000001000100000000000000
+% 0000000000000000200a0000000000000000000000a00a00000000000000
+% 000000000000000005500000000000000000000000174000000000000000
+%%EndImage
+%%EndPreview
+save
+countdictstack
+mark
+newpath
+/showpage {} def
+/setpagedevice {pop} def
+%%EndProlog
+%%Page 1 1
+%%DocumentFonts:
+
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define string to hold a scanline's worth of data
+/pix 240 string def
+
+% define space for color conversions
+/grays 240 string def % space for gray scale line
+/npixls 0 def
+/rgbindx 0 def
+
+% lower left corner
+186 308 translate
+
+% size of image (on paper, in 1/72inch coords)
+239.97600 176.97600 scale
+
+240 177 8 % dimensions of data
+[240 0 0 -177 0 177] % mapping matrix
+{currentfile pix readhexstring pop}
+image
+
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffdd8866777799bb9977777788dd
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffbb6688ddffffffffffffffffffdd88
+66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffee7788ffffffffffffffffffffffffffff
+ee7777eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffff
+ffffdd66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffff
+ffffffee66ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffff
+ffffffffff66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffff
+ffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff
+ffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff88bbffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff
+ffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff1122ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff7b50ffffffffffffffffffffffffffffffffffffff
+ffffffffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff4477ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff660000660000cc222288
+ff6600007711eeffffffffffffff6699aa88ffffffffffffffffffffffffffffffffffff
+ffffffffff77ccffffffffffffffffff550011cc22556600007711bb770088ff66000066
+0000660000770099ff550000550011991166ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff00002200ffbb
+ffff00007700ccffffffffffff77bbffff9988ffffffffffffffffffffffffffffffffff
+ffffffff779966ccffffffffffffffffee1144ff99ddff0011dd0011cc0011ffff0000ff
+0000ff0011ee0011ffff0000dd1133ee77ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000110055ee
+ffff0000ffffffffffffffff77ccffffffffaa77eeffffffffffffffffffffffffffffff
+ffffee55ccffee77aaffffffffffffffff6600dd88ffff0000ff0000ff0000ffff0000ff
+0000ff0000ff0000ffff0000ff880033eeffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000cc440033
+ffff0000ffffffffffffee44ccffffffffffffcc66aaffffffffffffffffffffffffffff
+ff9966eeffffffff8888ffffffffffffffdd0044bbffff0000ff0000ff0000ffff0000ff
+0000ff0000ff0000ffff0000ffff2200ccffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff000077ddcc00
+ffff0000ffffffffffee66ddffffffffffffffffff9966aaffffffffffffffffffffee99
+55bbffffffffffffffaa77eeffffffffffff4422ffffff0000ff0000ff0000ffff0000ff
+0000ff0000ff0000ffff0000ffaaaa1133ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff550044002233111166
+ffbb0000ddffffffdd66eeffffffffffffffffffffffffaa777777aabbbbbbaa777777cc
+ffffffffffffffffffffcc66eeffffffffffaa99ffffaa0000cc0000dd000055ff550044
+0022710000cc0000ccaa0000aa44ee440077ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffcc44eeffffffffffffffffffffffffffffffffeebbbbaabbbbffffffff
+ffffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff9966ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff9999ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffee77aaffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff8888ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffaa77eebfbfffffffffffffffffffffcc
+776677666677776699eeffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66
+ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc60161ceeffffffffffffee777799
+eeffffffffffffffcc7777bbffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55cc
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffee27000028ffffffffff7777ddffff
+ffffffffffffffffffffff9966ccffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bee66eeff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffdd300b00006dffffee66ccffffffff
+ffffffffffffffffffffffffee7799ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd180929eeffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffaf300708bfcc55eeffffffffff
+ffffffffffffffffffffffffffff9977ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffee997777776677777799eeffffffffffffff3000000dcfffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffaf2d0569ffffffffffffff
+ffffffffffffffffffffffffffffffcc77ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffff996677ccffffffffffffffcc776699ffffffff6d00002058ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffee46afffffffffffffff
+ffffffffffffffffffffffffffffffff9999ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffbb55bbffffffffffffffffffffffffffbb55bbffdd0f0858eeffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffffff
+ffffffffffffffffffffffffffffffffff77bbffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff7788ffffffffffffffffffffffffffffffffff8877191dddffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff66ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffee55ccffffffffffffffffffffffffffffffffffffffcc32eeffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff55ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff99aaffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffee66eeffffffffffffffffffffffffffffffffffffffffffee55ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff66ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffff77ccffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff88ddffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffdd88ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffbbaaffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffaabbffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
+bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99bbffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff66ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
+bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffcc99ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
+bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77eeffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
+aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ccffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff77ccffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffee77ffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffff
+ffffffffffffffffffffffffffffffffff66ddffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffff
+ffffffffffffffffffffffffffffffff77ccffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffff
+ffffffffffffffffffffffffffffff9999ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffbb30ddffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55ccffffffffff
+ffffffffffffffffffffffffffff7799ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffee33aaffffffffffffffffffffffffffffffffffffffffffffffffffff66ee55ccffff
+ffffffffffffffffffbb0000ffffffff1122ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7788ffffffff
+ffffffffffffffffffffffffdd66ccffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff77ffffffffffffffff7700118877001188ffffffffffffffff
+ff776699ffffffffffffffffffffffffffffffffffffffffffffffffff99aaffff77bbff
+ffffffffffffffffffff0000ffffffff4477ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb6699ffff
+ffffffffffffffffffffdd7777eeffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff6600ffffffffffffffff0000889900008899ffffffffffffffff
+77bbff77ccffffffffffffffffffffffffffffffffffffffffffffffbb77ffffffff7799
+ffffffffffffffffffff00004422cc550000ff660000770099ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb7777
+aaeeffffffffffcc886688eeffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffcc22228877000044ee550022aaff4400007744000077ffffffffffffffff77
+ccffffff66ccffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff99
+88ffffffffffffffffff0000dd0055ff0000ffff0011ee0011ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+bb77777777777799ddffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff2200ffbbff0000ff8822ff8811ffff0000ffff0000ffffffffffffffee55cc
+ffffffffff7799ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffff
+9977ffffffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff110055eeff0000ffcc77ff8800ffff0000ffff0000ffffffffffffee66ddff
+ffffffffffff9977eeffffffffffffffffffffffffffffffee7799ffffffffffffffffff
+ffcc77eeffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffcc440033ff0000ffee66aa0000ffff0000ffff0000ffffffffffee66eeffff
+ffffffffffffffdd7788ffffffffffffffffffffffffff7777ddffffffffffffffffffff
+ffffcc55eeffffffffff0000ee0044ff0000ffff0000ff0000ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff77ddcc00ff0000dd3300ff0000ffff0000ffff0000ffffffffcc55eeffffff
+ffffffffffffffffffbb777799eeffffffffffee997777ccffffffffffffffffffffffff
+ffffffee66ddffffffff44220022ccaa0000ffbb0000cc0000ccffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff55111166ff330099440044660099bb000077bb000077ffffcc77eeffffffff
+ffffffffffffffffffffffffcc77776638667777ccffffffffffffffffffffffffffffff
+ffffffffee55ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffffffffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff9977ffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff9988ffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff9988ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffff77ffffffffffffffffffffffffffff
+ffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff6600ffffffffffffffffffffffffffff
+ffffffffffffffffffffcc77eeffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffff770000446600007711bb770088ff660000
+4422ccffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff0000ffff0011dd0011cc0011ffff0022
+ee0055ffffffffffffffffffee66ddffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffee55ccffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000
+ff0000ffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000
+ff0000ffffffffffffffffffffffff77bbffddffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee99777766
+667777aaeeffffffffffffffffffffff9fffee66eeffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff0000ddff0000ff0000ff0000ffff0000
+ee0033ffffffffffffffffffffffffff77730abfffffffffffffffffffdd997777777777
+77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee887777bbffffff
+ffffeeaa777799ffffffffffffffffaf083a55eeffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffff330099aa0000cc0000dd000055ff0000
+3311ccffffffffffffffffffffffffffbf0f0022ffffffffffffee886688ccffffffffff
+eeaa7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffff
+ffffffffffffbb66bbffffffffffee2200005affffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffaf582a58ddffffffffffffffffffffffffffffff0000
+ffffffffffffffffffffffffffffffff3700000058ffffffee7777ddffffffffffffffff
+ffffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffdd66bbffffffffffffffff
+ffffffffffffffff9966eeffffff5000001050ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffaf00000accffffffffffffffffffffffffffffff0000
+ffffffffffffffffffffffffffffffffff85290008b3ffcc66ddffffffffffffffffffff
+ffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffffff
+ffffffffffffffffffdd66ccffaf060530ddffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff180028ffffffffffffffffffffffffffffff550000
+ffffffffffffffffffffffffffffffffffffff641a0b8f77ffffffffffffffffffffffff
+ffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffbb66ffffffffffffffffffffff
+ffffffffffffffffffffee77bf0b1aafffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff380040ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffee3242ffffffffffffffffffffffffff
+ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffff
+ffffffffffffffffffffffee5366ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff500064ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffff
+ffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffff
+ffffffffffffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffaf00ccffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff
+ffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffff
+ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff04ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff
+ffffffffffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffdd887777777741667777aaeeffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff996688ddffffffffffffffffaa7777ddffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffbb55bbffffffffffffffffffffffffffee7777eeffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff
+ffffffffff7788ffffffffffffffffffffffffffffffffffdd55ccffffffffffffffffff
+ffffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff
+ffffffee66ccffffffffffffffffffffffffffffffffffffffff77aaffffffffffffffff
+ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffff66ccffffffffffffffffffffffffffffffffffffffffffff66ccffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffff77ccffffffffffffffffffffffffffffffffffffffffffffffff66ddffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffbb88ffffffffffffffffffffffffffffffffffffffffffffffffffee55ffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ff55ffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffdd
+88ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
+ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff88
+ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
+ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaabbffffff
+ffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbaaffffff
+ffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffbb0000ffffffffffffffffffffffffffffffff11
+22ffffffffffbb0000ffffffffffffffffffffffdd77ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffaa99ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff44
+77ffffffffffff0000ffffffffffffffffffffffff77eeffffffffffffffffffffffffff
+ffffffffffffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+6600007711bb770088ffff77112299ffff0000dd8899600000660000ffcc222288ff5500
+00ff77112299ff0000dd8899eeffffffffffffff999477ffffffffffffffffffffffffff
+ffffffffffffffffffffffffee29bbffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
+ffffffffffffffffffffffffffffffffffffee5850ffffffffffffffffffffffffffffff
+ffffffffffffffffffffee5566eeffffffffffffffffffbb0000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ff0011dd0011cc0011ff7700bb7711ffff0000ee77eeff0000ff0000ff2200ffbbffff00
+007700bb7711ff0000ee77eeffffffffffffff9999ffbb77ffffffffffffffffffffffff
+ffffffffffffffffffffffff77cc8877eeffffffffffffffffffffffffffffffffffff66
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffff
+ffffffffffffffffffffffffffffffffffbb66dd9999ffffffffffffffffffffffffffff
+ffffffffffffffffffff55eeee66eeffffffffffffffffff0000ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ff0000ff0000ff0000ff2200ffeeaaffff000077eeffff0000ff0000ff110055eeffff00
+002200ffeeaaff000077eeffffffffffffff9977ffffff8899ffffffffffffffffffffff
+ffffffffffffffffffffff77aaffffddbbffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffffff
+ffffffffffffffffffffffffffffffffff99ffffff77ccffffffffffffffffffffffffff
+ffffffffffffffffff77ccffffee44eeffffffffffffffff0000cc222288ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ff0000ff0000ff0000ff0000eeffffffff00001144ffff0000ff0000ffcc440033ffff00
+000000eeffffff00001144ffffffffffffcc66ffffffffff8877ffffffffffffffffffff
+ffffffffffffffffffff77aaffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ddffffff
+ffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffffffff
+ffffffffffffffee55ccffffffffcc66ffffffffffffffff00002200ffbbffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ff0000ff0000ff0000ff440066ffeeeeff0000880077ff0000ff0000ff77ddcc00ffff00
+00440066ffeeee0000880077ffffffffcc77ffffffffffffffbb77eeffffffffffffffff
+ffffffffffffffffdd55ccffffffffffffffffffffffffffffffffffffffffffffffffaa
+aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff9977eeffffffffffffffffffff
+ffffffffffffcc66eeffffffffffffcc77ffffffffffffff0000110055eeffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+aa0000cc0000dd000055ee55001177ffbb0011aa0000bb55004400229955111166ffaa00
+00ee55001177bb0011aa0000bbffffcc77ffffffffffffffffffdd7777eeffffffffffff
+ffffffffffffee7777eeffffffffffffffff66bbffffffffffffffffffffffffffffffee
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffff
+ffffffffffffffffffffffffffff99aaffffffffffffffffcc6699ffffffffffffffffff
+ffffffffdd7777ffffffffffffffffffcc77ffffffffffff0000cc440033ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffcc7777aaffffffff
+ffffffeeaa7777ddffffffffffffffffffffff8877eeffffffffffffffffffffffffffff
+77eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffff
+ffffffffffffffffffffffffff9999ffffffffffffffffffffffbb7777ccffffffffffff
+ffee997777eeffffffffffffffffffffffcc77ffffffffff000077ddcc00ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffaa77777777
+30777777bbffffffffffffffffffffffffffffffddbbffffffffffffffffffffffffffff
+dd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffffff
+ffffffffffffffffffffffffffaaffffffffffffffffffffffffffffee99667777663077
+6677ccffffffffffffffffffffffffffffffcc66ffffffaa000055111166ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffee44eeffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff
+ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffff
+ffee55ffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffffff
+ffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffffffffff77ff
+ffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff
+ffffcc77ffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffff
+ffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffffffffff77ff
+ffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffeebbffffffffffffffffffff
+ffffffaa66ffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffff
+ffffffffffffffffaaffffffffffffffffffffffffffffffffffffffffffffffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffbb0000ffffffffffffffffffffffffffffffffffffffffbb0000ffffffffffffff
+ffffffffcc66eeffffffffffffffffffffffffffffffffffffaa77eeffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1122ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffff44ccffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff0000ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff
+ffffffffffdd55bbffffffffffffffffffffffffffffffee7788ffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4477ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffff66aaffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff0000dd8899df550022aaff6600007711eeff770044eeff0000bf222288ffffff
+ffffffffffffff9966bbffffffffffffffffffffffee7777ddffffffffffffffffffffff
+ffffffff99aaffffffffffffffffffffffffffffffff550011cc2255550000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff7bee77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff0000ee77ee8822ff8811ffff00007700cc9900ee7755ff00000e00ffbbffffff
+ffffffffffffffffff997777aabbffffffddbb886677ddffffffffffffffffffffffffff
+ffffff9999ffffffffffffffffffffffffffffffffffee1144ff99ddff0000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff77cc88bfffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffddbbddffffffffffffffff
+ffffffbf100da4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff000077eeffcc77ff8800ffff0000ffffff6600000000ff0000100055eeffffff
+ffffffffffffffffffffffffbbaa77777777bbddffffffffffffffffffffffffffffffff
+ffffffaaffffffffffffffffffffffffffffffffffffff6600dd88ffff0000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff3a0930ffffffffffff
+ffffffffffffbbbbeeffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffee9977667777bb8877777788ddffffff
+ffffff3000000eddffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff00001144ffee66aa0000ffff0000ffffff4400ffffffff0000cc440033ffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffdd0044bbffff0000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffff880a000085ffffffffff
+ffcc7777777799aa77777766aaffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffdd7777ccffffffffffffffffffcc8866ddff
+ffff9400001058ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffff00008800773300ff0000ffff0000ffffff880099ffccff000077ddcc0066eeff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
+77aaffffffffffffffffffffffffffffffffffffffffffff4422ffffff0000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffdd280c0016eeffffff99
+6699eeffffffffffffffffffaa7777eeffffffffffffffff
+ffffffffffffffffffffffffffffffffee7777eeffffffffffffffffffffffffffee7777
+eeff150030ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffbb0011aa0000320044660099bb0000ddffffee66001199aa000055111166ee66ee
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb66
+ddffffffffffffffffffffffffffffffffffffffffffffffaa99ffffaa0000ffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff941a004bffcc66bb
+ffffffffffffffffffffffffffffcc66aaffffffffffffff
+ffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffffee
+552b0994ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeebb
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee4b037577ffff
+ffffffffffffffffffffffffffffffff9977ffffffffffff
+ffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffffff
+ff2b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccbb
+58ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbb58cc
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5448ffffff
+ffffffffffffffffffffffffffffffffffcc55eeffffffff
+ffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffffffffffffffff
+ffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2200
+0030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1100003e
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88aaffffffff
+ffffffffffffffffffffffffffffffffffffdd66ffffffff
+ffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffff
+ffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4800
+0050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff38000094
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff
+ffffffffffffffffffffffffffffffffffffffcc77ffffff
+ffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffff
+ffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8500
+00afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500008ee
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66ffffffffffff
+ffffffffffffffffffffffffffffffffffffffff88bbffff
+ffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd0a
+0cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf0017ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff66ffff
+ffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28
+1bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1822ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffbb99ff
+ffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff40
+2affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2046ff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff66ff
+ffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffcc7746
+3c77777788ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb77777777335288
+ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff77dd
+ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffbb777799ddff
+ffffffffcc887777ddffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffbb777799ddffffffffffcc
+886677ddffffffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffcc99
+ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff77ffffffffffffffffffffffffffffffffffffffffffdd5599ffffffffff
+ffffffffffffffee7777eeffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffcc6699ffffffffffffffffffff
+ffffee7777eeffffffffffffffffffffffffffffffffffffffff88ccffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffaabbffffffffffffffffffffffffffffffffffffff7777eeffffffffffff
+ffffffffffffffffffdd66bbffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff7777eeffffffffffffffffffffff
+ffffffffdd66ccffffffffffffffffffffffffffffffffffffff77ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffbbbbffffffffffffffffffffffffffffffffffee77bbffffffffffffffff
+ffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffff
+ffffffffffff7799ffffffffffffffffffffffffffffffffffff77ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffbbaaffffffffffffffffffffffffffffffffff55ccffffffffffffffffff
+ffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff
+ffffffffffffff9988ffffffffffffffffffffffffffffffffff77ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffbbbbffffffffffffffffffffffffffffffff77ccffffffffffffffffffff
+ffffffffffffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffff
+ffffffffffffffff88aaffffffffffffffffffffffffffffffff66ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffaabbffffffffffffffffffffffffffffff88aaffffffffffffffffffffff
+ffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffffffffffffff
+ffffffffffffffffff77ccffffffffffffffffffffffffffffff77ffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff77eeffffffffffffffffffffffffffffee77ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffee66ffffffffffffffffffffffffffffff77ddffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77
+ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff77ffffffffffffffffffffffffffffff77ddffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff99bbffffffffffffffffffffffffffffcc99ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffdd88
+ffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffff66ffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff88dd
+ffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffaaaaffffffffffffffffffffffffffff88ddffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff88ddffffffffffffffffffffffffffff77ffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff66ff
+ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffdd88ffffffffffffffffffffffffffffbb88ffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc77ff
+ffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffbb99ffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffff66eeffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff66ffff
+ffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffffffffff
+ffffffff55ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffdd77ffffffffffff
+ffffffffffffffffffffffffffffffffffffffffbb99ffff
+ffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffff
+ffffff77ccffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff88aaffffffffff
+ffffffffffffffffffffffffffffffffffffffdd66ffffff
+ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff
+ffff88aaffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff77ccffffffff
+ffffffffffffffffffffffffffffffffffffee66eeffffff
+ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff
+ff9999ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff55ccffffff
+ffffffffffffffffffffffffffffffffffee55ddffffffff
+ffffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffff
+7799ffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff7799ffff
+ffffffffffffffffffffffffffffffffcc55eeffffffffff
+ffffffffffffffffffffffffffffffffdd6699ffffffffffffffffffffffffffffffbb66
+ccffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff9977dd
+ffffffffffffffffffffffffffffee7777ffffffffffffff
+ffffffffffffffffffffffffffffffffffffbb66aaffffffffffffffffffffffaa6699ff
+ffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffee77
+77ccffffffffffffffffffffdd8866ddffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffaa777777bbbbccbbbb887777aaffffff
+ffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffff
+dd99777799bbbbccbbaa776688ccffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffddbbbb77bbbbddffffffffffff
+ffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffbbbb9988bbbbeeffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffff
+ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffff
+ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffff
+ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffffffff
+ffffffffffffffffff88aaffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff
+ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffff
+ffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffee55eeffffffffffffffffff
+ffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff
+ffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffff
+ffffffffffffffffffffffbb77eeffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffff
+ffffffffffffaa77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffff
+ffffffffffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffffffffffffff
+ffffffffff8888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffff
+ffffffffffffffffaa66bbffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffffffffffff
+ffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee777788ddffff
+ffffffffffcc7766aaffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffee777799ddffffffffffffff
+cc7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd887777
+667777777799eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc8866776677777777
+99eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffff
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
+cleartomark
+countdictstack exch sub { end } repeat
+restore
+%%EOF
diff --git a/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl b/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl
new file mode 100644
index 0000000000..ceaf3eb1bf
--- /dev/null
+++ b/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl
@@ -0,0 +1,26 @@
+
+
+
+]>
+
+
+
+
+
+ ;; Keep the legalnotice together with the rest of the text
+ (define %generate-legalnotice-link%
+ #f)
+
+
+
+
+