!!!!''Кем или для кого он создан?''
<table>
<tr>
<th class="SpecHead">к20</th>
<th class="SpecHead1">Создатель или предполагаемый владелец</th>
<th class="SpecHead">к20</th>
<th class="SpecHead1">Создатель или предполагаемый владелец</th>
</tr>
<tr>
<th>1</th>
<td>Аберрация. Предмет был создан аберрациями в древние времена, возможно, для использования избранными гуманоидными рабами. Если смотреть на предмет боковым зрением, кажется, что он шевелится.</td>
<th>10</th>
<td>Нежить. На этом предмете находятся образы смерти, такие как кости и черепа, он может быть сделан из частей трупов. На ощупь кажется холодным.</td>
</tr>
<tr>
<th>2</th>
<td>Великан. Этот предмет больше среднего размера и был сделан великанами для их меньших союзников.</td>
<th>11</th>
<td>Фея. Предмет искусно сделан из превосходнейших материалов и даёт бледное излучение в лунном свете, проливая тусклый свет в радиусе 5 футов. Вместо железа и стали используется серебро или мифрил.</td>
</tr>
<tr>
<th>3</th>
<td>Гном. Этот предмет может смотреться поношенным. Кроме того, в нем есть шестерёнки и механические части, даже если они необязательны для функционирования предмета.</td>
<th>12–14</th>
<td>Человек. Предмет был создан во времена расцвета ныне павшего королевства, или он связан с легендарной личностью. На нём могут быть письмена на забытом языке или символы, чьё значение затерялось в веках.</td>
</tr>
<tr>
<th>4-5</th>
<td>Дварф. Этот предмет прочен, в его конструкции заложены руны Дварфского языка. Он может принадлежать какому-либо клану, который ждёт возвращение предмета.</td>
<th>15</th>
<td>Водяной элементаль. Блестящая рыбья чешуя вместо кожи и ткани; вместо металла используются морские раковины и кораллы, столь же твёрдые и прочные, как сама сталь.</td>
</tr>
<tr>
<th>6</th>
<td>Дракон. Этот предмет сделан из чешуи и когтей дракона. Возможно, с вкраплениями драгоценных металлов и камней из драконьих запасов. Он немного теплеет на расстоянии 120 футов от дракона.</td>
<th>16</th>
<td>Воздушный элементаль. Предмет весит половину стандартного веса и кажется полым. Если он сделан из ткани, то прозрачен.</td>
</tr>
<tr>
<th>7</th>
<td>Дроу. Предмет весит половину стандартного веса. Он чёрный, украшен пауками и паутиной в честь Лолс. После нахождения на солнечном свете минуту или более, предмет может начать работать неправильно или даже разложиться.</td>
<th>17</th>
<td>Земляной элементаль. Предмет может быть сделан из камня. Любые тканевые или кожаные элементы усыпаны хорошо отполированными камнями.</td>
</tr>
<tr>
<th>8</th>
<td>Исчадие. Предмет выполнен из чёрной стали или рога, с начертанными на нём рунами. Ткань или кожа заменены шкурой исчадия. Он тёплый на ощупь, а на его поверхности выгравированы рунические символы. Небожители считают его отталкивающим.</td>
<th>18</th>
<td>Огненный элементаль. Этот предмет тёплый на ощупь и некоторые из его частей сделаны из чёрной стали. На его поверхности изображены языки пламени. В оформлении использованы оттенки красного и оранжевого.</td>
</tr>
<tr>
<th>9</th>
<td>Небожитель. Оружие весит половину стандартного веса, украшено пернатыми крыльями, солнцем и другими символами добра. Исчадия считают его отталкивающим.</td>
<th>19–20</th>
<td>Эльф. Предмет весит половину стандартного веса и украшен символами природы: листьями, лозами, звёздами и т. п.</td>
</tr>
</table>
!!!!''Детали его истории?''
<table>
<tr>
<th class="SpecHead">к8 </th>
<th class="SpecHead1">История</th>
<th class="SpecHead">к8</th>
<th class="SpecHead1">История</th>
</tr>
<tr>
<th>1</th>
<td>Магия. Этот предмет был создан древним орденом заклинателей и содержит его символ.</td>
<th rowspan="2">6</th>
<td rowspan="2">Религия. Этот предмет использовался в религиозных обрядах, посвящённых какому-либо богу. На нём изображены священные символы. Последователи бога могут попытаться склонить его владельца отдать предмет храму, украсть его для себя или поощрять его использование паладином или жрецом того же бога.</td>
</tr>
<tr>
<th>2</th>
<td>Погибель. Это предмет был создан врагами какой-либо культуры или вида существ. Если культура или существа находятся рядом, они могут опознать предмет и опознать его владельца как врага.</td>
</tr>
<tr>
<th>3</th>
<td>Героизм. Великий герой когда-то владел этим предметом. Все, кому знакома история предмета, будут ожидать от его владельца великих деяний.</td>
<th rowspan="2">7</th>
<td rowspan="2">Мистика. Этот предмет связан с очень зловещими деяниями, будь то резня или убийство. На нём может быть имя или что-то напоминающее о злодее, который использовал его раньше. Те, кто знакомы с историей этого предмета, скорее всего, будут относиться к нему и его новому владельцу с подозрением.</td>
</tr>
<tr>
<th>4</th>
<td>Орнамент. Этот предмет был создан для какого-то специального события. Он инкрустирован драгоценными камнями, вставками из золота или платины и золотыми или серебряными узорами на поверхности.</td>
</tr>
<tr>
<th>5</th>
<td>Пророчество. Предмет фигурирует в пророчестве: его владельцу суждено сыграть ключевую роль в будущих событиях. Кто-то ещё, кто хочет сыграть эту роль, может попробовать украсть его или же тот, кто хочет предотвратить исполнение пророчества, может попытаться убить его владельца.</td>
<th>8</th>
<td>Символ власти. Этот предмет когда-то был частью королевских регалий или знаком высокого поста. Его бывший владелец или его потомки могут хотеть его вернуть или кто-нибудь по ошибке решит, что новый обладатель предмета является его законным наследником.</td>
</tr>
</table>
<table class="SpecTable">
<tr>
<th class="SpecHead">к20</th>
<th class="SpecHead1">Малые свойства</th>
<th class="SpecHead">к20</th>
<th class="SpecHead1">Малые свойства</th>
</tr>
<tr>
<th>1</th>
<td>''Маяк.'' Владелец может бонусным действием заставить предмет источать яркий свет в радиусе 10 футов и тусклый в пределах ещё 10 футов или погасить его.</td>
<th>12</th>
<td>''Песнь создания.'' Каждый раз, когда предмет ударяется или используется для удара по врагу, его владелец слышит фрагменты древней песни.</td>
</tr>
<tr>
<th>2</th>
<td>''Компас.'' Владелец может действием определить, в каком направлении находится север.</td>
<th>13</th>
<td>''Странный материал.'' Предмет был сделан из материала, который является весьма необычным, учитывая его предназначение. На прочности предмета это никак не отражается.</td>
</tr>
<tr>
<th>3</th>
<td>''Добросовестный.'' Когда владелец замышляет или предпринимает какое-либо злобное деяние, то предмет усиливает его угрызения совести.</td>
<th>14</th>
<td>''Умеренный.'' Владелец этого предмета не страдает ни от низких, ни от высоких температур в диапазоне от −20 до +120 °F (от −28 до 48 °С)</td>
</tr>
<tr>
<th>4</th>
<td>''Подземный житель.'' Находясь под землёй, владелец всегда знает расстояние до поверхности земли и направление до ближайшей лестницы, подъёма, или любого другого пути, ведущего наверх.</td>
<th>15</th>
<td>''Неразрушаемый.'' Предмет не может быть сломан. Для того чтобы его разрушить, должны быть использованы специальные средства.</td>
</tr>
<tr>
<th>5</th>
<td>''Сверкающий.'' Этот предмет никогда не покрывается грязью.</td>
<th>16</th>
<td>''Полководец.'' Владелец может действием заставить свой голос быть ясно слышимым на расстоянии до 300 футов. Эффект длится до конца следующего хода владельца.</td>
</tr>
<tr>
<th>6</th>
<td>''Страж.'' Предмет шепчет предупреждения об опасностях, грозящих своему владельцу, предоставляя ему, бонус +2 к инициативе, при условии, что тот дееспособен.</td>
<th>17</th>
<td>''Рождённый пучиной.'' Этот предмет не тонет в воде и любых других жидкостях. Его владелец совершает с преимуществом проверки Силы (Атлетика), когда он пытается плыть.</td>
</tr>
<tr>
<th>7</th>
<td>''Гармоничный.'' Для настройки на этот предмет понадобится всего одна минута.</td>
<th>18</th>
<td>''Злой.'' Когда владельцу предмета предоставляется возможность совершить какой-либо эгоистичный поступок или пойти по тёмному пути, предмет будет усиливать его желание сделать это.</td>
</tr>
<tr>
<th>8</th>
<td>''Скрытое сообщение.'' Где-то на поверхности предмета скрыто сообщение, которое можно увидеть только в определённое время года или при определённой фазе Луны, или же только в определённом месте.</td>
<th rowspan="3">19</th>
<td rowspan="3">''Иллюзия.'' Предмет наполнен магией иллюзии, позволяющей владельцу изменять вид предмета в небольших деталях. Такие изменения не влияют на то, как предмет надевается, носится или держится в руках, и не оказывает эффект на другие его магические свойства. Например, владелец может сделать так, чтобы красная мантия казалась синей или заставить кольцо из золота выглядеть изготовленным из если его никто не несёт и не носит.</td>
</tr>
<tr>
<th>9</th>
<td>''Ключ.'' Этот предмет используется для того, чтобы отпереть камеру, склеп, контейнер или какое-либо помещение.</td>
</tr>
<tr>
<th>10</th>
<td>''Язык.'' Пока предмет находится у владельца, тот может понимать и разговаривать на одном дополнительном языке (по выбору Мастера).</td>
</tr>
<tr>
<th>11</th>
<td>''Часовой.'' Выберите какой-либо вид существ — они были врагами создателя предмета. Предмет начинает слабо светиться, когда такие существа находятся в пределах 120 футов от него.</td>
<th>20</th>
<td>Совершите два броска, перебрасывая последующие результаты «20».</td>
</tr>
</table>
!!!!''Какими еще причудливыми особенностями обладает предмет?''
<table class="SpecTable">
<tr>
<th class="SpecHead">к12</th>
<th class="SpecHead1">Причудливая особенность</th>
<th class="SpecHead">к12</th>
<th class="SpecHead1">Причудливая особенность</th>
</tr>
<tr>
<th>1</th>
<td>Исполненный благости. Пока у владельца находится этот предмет, он чувствует себя счастливым и в будущее своё смотрит с оптимизмом. Бабочки и другие милые, безобидные создания порхают и резвятся в присутствии этого предмета.</td>
<th>7</th>
<td>Метаморфозы. Периодически предмет случайным образом несколько изменяет свой внешний вид. На возможности владельца использовать этот предмет подобные метаморфозы никак не влияют.</td>
</tr>
<tr>
<th>2</th>
<td>Самоуверенный. Этот предмет даёт владельцу чувство уверенности.</td>
<th>8</th>
<td>Ворчливый. Предмет еле слышно бормочет что-то и ворчит. Существо, которое прислушается к этому брюзжанию, может узнать что-нибудь полезное.</td>
</tr>
<tr>
<th>3</th>
<td>Скупой. Владелец становится одержим жаждой материального богатства.</td>
<th>9</th>
<td>Болезненный. При использовании владелец этого предмета чувствует не очень приятные, но, однако же, безобидные вспышки боли.</td>
</tr>
<tr>
<th>4</th>
<td>Хрупкий. Этот предмет скрипит, трещит и крошится, когда вы его используете, носите на себе или активируете. Это никоим образом не сказывается на его свойствах, но, если предметом пользовались продолжительное время, то вид у него потрёпанный.</td>
<th>10</th>
<td>Собственник. Предмет требует настройки при первом использовании или надевании, и не позволяет владельцу настраиваться на другие предметы (те предметы, на которые владелец был настроен, сохраняют свою связь с ним, пока она не закончится каким-либо образом).</td>
</tr>
<tr>
<th>5</th>
<td>Голодный. Магические свойства этого предмета работают только в том случае, если в последние 24 часа он имел контакт с кровью гуманоида. Совсем немного, капли достаточно.</td>
<th>11</th>
<td>Отталкивающий. Владелец испытывает отвращение когда прикасается к предмету и продолжает испытывать дискомфорт, когда носит его.</td>
</tr>
<tr>
<th>6</th>
<td>Шумный. При использовании предмет производит всякого рода громкие звуки: лязг, крик, звуки удара по гонгу.</td>
<th>12</th>
<td>Ленивый. Владелец этого предмета чувствует себя вялым и апатичным. Пока он настроен на предмет, ему требуется 10 часов для завершения длительного отдыха.</td>
</tr>
</table>
<ul class="">
<$list filter="[tag[1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[1lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[2lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[3lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[4lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[5lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[6lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[7lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[8lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[9lvl]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
!!!!''Астральные цветные вихри''
<table>
<tr>
<th>к20</th>
<th>План</th>
<th>Цвет вихря</th>
</tr>
<tr>
<td>1</td>
<td>Асгард</td>
<td>Индиго</td>
</tr>
<tr>
<td>2</td>
<td>Лимбо</td>
<td>Угольно-чёрный</td>
</tr>
<tr>
<td>3</td>
<td>Пандемониум</td>
<td>Пурпурный</td>
</tr>
<tr>
<td>4</td>
<td>Бездна</td>
<td>Аметистовый</td>
</tr>
<tr>
<td>5</td>
<td>Карцери</td>
<td>Оливковый</td>
</tr>
<tr>
<td>6</td>
<td>Гадес</td>
<td>Рыжий</td>
</tr>
<tr>
<td>7</td>
<td>Геенна</td>
<td>Красно-коричневый</td>
</tr>
<tr>
<td>8</td>
<td>Девять Преисподних</td>
<td>Рубиновый</td>
</tr>
<tr>
<td>9</td>
<td>Ахерон</td>
<td>Огненно-красный</td>
</tr>
<tr>
<td>10</td>
<td>Механус</td>
<td>Светло-синий</td>
</tr>
<tr>
<td>11</td>
<td>Аркадия</td>
<td>Тёмно-оранжевый</td>
</tr>
<tr>
<td>12</td>
<td>Гора Целестия</td>
<td>Золотой</td>
</tr>
<tr>
<td>13</td>
<td>Битопия</td>
<td>Янтарный</td>
</tr>
<tr>
<td>14</td>
<td>Элизиум</td>
<td>Оранжевый</td>
</tr>
<tr>
<td>15</td>
<td>Звериные Земли</td>
<td>Изумрудно-зелёный</td>
</tr>
<tr>
<td>16</td>
<td>Арборея</td>
<td>Сапфирово-синий</td>
</tr>
<tr>
<td>17</td>
<td>Внешние Земли</td>
<td>Коричневый</td>
</tr>
<tr>
<td>18</td>
<td>Эфирный План</td>
<td>Бурлящий белый</td>
</tr>
<tr>
<td>19—20</td>
<td>Материальный План</td>
<td>Серебряный</td>
</tr>
</table>
!!!!''Божества Предвечных Войн''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемыедомены</th>
<th>Символ</th>
</tr>
<tr>
<td>Авандра, богиня случая и удачи</td>
<td>ХД</td>
<td>Обман</td>
<td>Три сложенные волнистые линии</td>
</tr>
<tr>
<td>Асмодей, бог тирании</td>
<td>ЗЗ</td>
<td>Обман</td>
<td>Три плотно расположенных треугольника</td>
</tr>
<tr>
<td>Багамут, бог справедливости и благородства</td>
<td>ЗД</td>
<td>Война, Жизнь</td>
<td>Голова дракона в профиль, повёрнута влево</td>
</tr>
<tr>
<td>Бэйн, бог войны и завоеваний</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Кисть с тремя когтями, направленными вниз</td>
</tr>
<tr>
<td>Векна, бог злых тайн</td>
<td>НЗ</td>
<td>Знание, Смерть</td>
<td>Частично разрушенный одноглазый череп</td>
</tr>
<tr>
<td>Груумш, бог разрушений</td>
<td>ХЗ</td>
<td>Буря, Война</td>
<td>Треугольные глаза с костяными выступами</td>
</tr>
<tr>
<td>Зехир, бог тьмы и ядов</td>
<td>ХЗ</td>
<td>Обман, Смерть</td>
<td>Змея в форме кинжала</td>
</tr>
<tr>
<td>Йоун, богиня знаний</td>
<td>Н</td>
<td>Знание</td>
<td>Посох с навершием в виде глаза</td>
</tr>
<tr>
<td>Корд, бог силы и штормов</td>
<td>ХН</td>
<td>Буря</td>
<td>Меч с молнией на месте гарды</td>
</tr>
<tr>
<td>Кореллон, бог магии и искусств</td>
<td>ХД</td>
<td>Свет</td>
<td>Восьмиконечная звезда</td>
</tr>
<tr>
<td>Королева Воронов, богиня смерти</td>
<td>ЗН</td>
<td>Жизнь, Смерть</td>
<td>Голова ворона в профиль, повёрнута влево</td>
</tr>
<tr>
<td>Лолс, богиня пауков и лжи</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Восьмиконечная звезда из паутины</td>
</tr>
<tr>
<td>Мелора, богиня дикой природы и морей</td>
<td>Н</td>
<td>Буря, Природа</td>
<td>Волнообразный вихрь</td>
</tr>
<tr>
<td>Морадин, бог создания</td>
<td>ЗД</td>
<td>Война, Знание</td>
<td>Пылающая наковальня</td>
</tr>
<tr>
<td>Пелор, бог солнца и сельского хозяйства</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Круг с шестью светящимися точками</td>
</tr>
<tr>
<td>Сеанин, богиня луны</td>
<td>ХД</td>
<td>Обман</td>
<td>Полумесяц</td>
</tr>
<tr>
<td>Тариздун, бог безумия</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Закрученная против часовой стрелки спираль</td>
</tr>
<tr>
<td>Тиамат, богиня богатства, жадности и мести</td>
<td>ЗЗ</td>
<td>Война, Обман</td>
<td>Пятиконечная звезда с изогнутыми концами</td>
</tr>
<tr>
<td>Торог, бог Подземья</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Буква «Т», привязанная к круглым кандалам</td>
</tr>
<tr>
<td>Эратис, богиня цивилизации и изобретений</td>
<td>ЗН</td>
<td>Знание</td>
<td>Верхняя часть часового механизма</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Злодеи приключения</th>
<th>к20</th>
<th>Покровители приключения</th>
</tr>
<tr>
<td>1</td>
<td>Зверь или монстр без особых целей или планов</td>
<td>1</td>
<td rowspan="2">Ушедший в отставку искатель приключений</td>
</tr>
<tr>
<td>2</td>
<td>Аберрация, желающая разврата или господства</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Исчадие, желающее разврата или уничтожения</td>
<td>3</td>
<td rowspan="2">Местный правитель</td>
</tr>
<tr>
<td>4</td>
<td>Дракон, желающий господства и грабежа</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>Великан, желающий грабежа</td>
<td>5</td>
<td rowspan="2">Военный офицер</td>
</tr>
<tr>
<td>6</td>
<td rowspan="2">Нежить с любыми целями</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
<td rowspan="2">Храмовник</td>
</tr>
<tr>
<td>8</td>
<td>Фея с загадочной целью</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td rowspan="2">Гуманоид культист</td>
<td>9</td>
<td rowspan="2">Мудрец</td>
</tr>
<tr>
<td>10</td>
<td>10</td>
</tr>
<tr>
<td>11</td>
<td rowspan="2">Гуманоид завоеватель</td>
<td>11</td>
<td rowspan="2">Уважаемый старец</td>
</tr>
<tr>
<td>12</td>
<td>12</td>
</tr>
<tr>
<td>13</td>
<td>Гуманоид мститель</td>
<td>13</td>
<td>Божество или небожитель</td>
</tr>
<tr>
<td>14</td>
<td rowspan="2">Гуманоид заговорщик, жаждущий власти</td>
<td>14</td>
<td>Таинственная фея</td>
</tr>
<tr>
<td>15</td>
<td>15</td>
<td>Старый</td>
</tr>
<tr>
<td>16</td>
<td>Гуманоид криминальный авторитет</td>
<td>16</td>
<td>Бывший</td>
</tr>
<tr>
<td>17</td>
<td rowspan="2">Гуманоид налётчик или разрушитель</td>
<td>17</td>
<td>Родственник</td>
</tr>
<tr>
<td>18</td>
<td>18</td>
<td>Отчаянный</td>
</tr>
<tr>
<td>19</td>
<td>Гуманоид под проклятьем</td>
<td>19</td>
<td>Купец</td>
</tr>
<tr>
<td>20</td>
<td>Дезинформированный гуманоид фанатик</td>
<td>20</td>
<td>Злодей, выдающий себя за покровителя</td>
</tr>
</table>
<table>
<tr>
<th>к12 </th>
<th>Союзники приключения</th>
</tr>
<tr>
<td>1</td>
<td>Опытный искатель приключений</td>
</tr>
<tr>
<td>2</td>
<td>Неопытный искатель приключений</td>
</tr>
<tr>
<td>3</td>
<td>Восторженный простолюдин</td>
</tr>
<tr>
<td>4</td>
<td>Солдат</td>
</tr>
<tr>
<td>5</td>
<td>Священник</td>
</tr>
<tr>
<td>6</td>
<td>Мудрец</td>
</tr>
<tr>
<td>7</td>
<td>Мститель</td>
</tr>
<tr>
<td>8</td>
<td>Буйный сумасшедший</td>
</tr>
<tr>
<td>9</td>
<td>Небожитель-союзник</td>
</tr>
<tr>
<td>10</td>
<td>Фея-союзник</td>
</tr>
<tr>
<td>11</td>
<td>Маскирующееся чудовище</td>
</tr>
<tr>
<td>12</td>
<td>Злодей, выдающий себя за союзника</td>
</tr>
</table>
<table>
<tr>
<th>к12</th>
<th>Введение</th>
</tr>
<tr>
<td>1</td>
<td>Во время путешествия по дикой местности герои проваливаются под землю, оказываясь в месте приключения.</td>
</tr>
<tr>
<td>2</td>
<td>Во время путешествия по дикой местности герои замечают вход в место приключения.</td>
</tr>
<tr>
<td>3</td>
<td>Во время путешествия по дороге на героев нападают чудовища, которые позже отступают в место приключения.</td>
</tr>
<tr>
<td>4</td>
<td>Искатели приключений находят карту на мёртвом теле. В этой карте содержатся важные сведения, и злодей желает заполучить её.</td>
</tr>
<tr>
<td>5</td>
<td>Таинственный волшебный предмет или злодей телепортирует персонажей в место приключения.</td>
</tr>
<tr>
<td>6</td>
<td>Незнакомец встречает персонажей в таверне, и настоятельно призывает их отправиться в место приключения.</td>
</tr>
<tr>
<td>7</td>
<td>В городе или деревне необходимы добровольцы, чтобы пойти в место приключения.</td>
</tr>
<tr>
<td>8</td>
<td>Важный для персонажей ПМ просит их пойти в место приключения.</td>
</tr>
<tr>
<td>9</td>
<td>ПМ, которому персонажи должны подчиняться, приказывает им идти к месту приключения.</td>
</tr>
<tr>
<td>10</td>
<td>ПМ, которого персонажи уважают, просит их сходить на место приключения.</td>
</tr>
<tr>
<td>11</td>
<td>Однажды ночью все персонажи видят сон, в котором они входят в место приключения.</td>
</tr>
<tr>
<td>12</td>
<td>Деревню терроризирует призрак. Исследования</td>
</tr>
</table>
[img height=750px [http://www.tawmis.com/downloads/DnD/roper.jpg]]
[img height=250px [http://www.tawmis.com/downloads/DnD/roper.jpg]]
<table class="SB">
<tr>
<th colspan="7">Верёвочник</th>
</tr>
<tr>
<th colspan="7">//Большой монстр, нейтрально-злой//</th>
</tr>
<tr>
<th>Класс Доспеха </th>
<td colspan="6">20 (природный доспех)</td>
</tr>
<tr>
<th>Хиты </th>
<td colspan="6">93 (11к10 + 33)</td>
</tr>
<tr>
<th>Скорость </th>
<td colspan="6">10 фт., лазая 10 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>18 (+4)</td>
<td>8 (–1)</td>
<td>17 (+3)</td>
<td>7 (–2)</td>
<td>16 (+3)</td>
<td>6 (–2)</td>
</tr>
<tr>
<th>Навыки </th>
<td colspan="6">Внимательность +6, Скрытность +5</td>
</tr>
<tr>
<th>Чувства </th>
<td colspan="6">тёмное зрение 60 фт., пассивная Внимательность 16</td>
</tr>
<tr>
<th>Языки </th>
<td colspan="6">—</td>
</tr>
<tr>
<th>Опасность </th>
<td colspan="6">5 (1800 опыта)</td>
</tr>
</table>
!!!!__''Особенности''__
;
://''Обманчивая внешность.''// Пока верёвочник остаётся без движения, он неотличим от обычного пещерного образования, такого как сталагмит.
://''Хваткие усики.''// У верёвочника может быть до шести усиков одновременно. Каждый усик можно атаковать (КД 20; 10 хитов; иммунитет к урону психической энергией и ядом). Уничтожение усика не причиняет урон верёвочнику, который может в своём следующем ходу создать усик на замену уничтоженному. Усик также можно сломать, если существо действием совершит проверку Силы со Сл 15 и преуспеет.
://''Паучье лазание.''// Верёвочник может лазать по сложным поверхностям, включая потолки, без совершения проверок характеристик.
!!!!__''Действия''__
;
://''Мультиатака.''// Верёвочник совершает четыре атаки усиками, использует Подтаскивание и совершает одну атаку укусом.
://''Укус.''// Рукопашная атака оружием: +7 к попаданию, досягаемость 5 фт., одна цель. Попадание: Колющий урон 22 (4к8+4).
://''Усик.''// Рукопашная атака оружием: +7 к попаданию, досягаемость 50 фт., одно существо. Попадание: Цель становится схваченной (Сл высвобождения равна 15). Пока цель схвачена, она также опутана и совершает с помехой проверки Силы и спасброски Силы, а верёвочник не может использовать этот усик против другой цели.
://''Подтаскивание.''// Верёвочник подтаскивает всех схваченных существ на расстояние до 25 футов к себе.
<table>
<tr>
<th>к12</th>
<th>Особенность</th>
<th>к12</th>
<th>Особенность</th>
</tr>
<tr>
<td>1</td>
<td>Спорит</td>
<td>7</td>
<td>Честен</td>
</tr>
<tr>
<td>2</td>
<td>Высокомерен</td>
<td>8</td>
<td>Вспыльчив</td>
</tr>
<tr>
<td>3</td>
<td>Хвастается</td>
<td>9</td>
<td>Раздражителен</td>
</tr>
<tr>
<td>4</td>
<td>Груб</td>
<td>10</td>
<td>Нудный</td>
</tr>
<tr>
<td>5</td>
<td>Любознателен</td>
<td>11</td>
<td>Тихий</td>
</tr>
<tr>
<td>6 </td>
<td>Дружелюбен</td>
<td>12</td>
<td>Подозрителен</td>
</tr>
</table>
!!!!''Внешние планы''
<table>
<tr>
<th>Внешний план</th>
<th>Мировоззрение</th>
</tr>
<tr>
<td>Гора Целестия, Семь Небес</td>
<td>ЗД</td>
</tr>
<tr>
<td>Битопия, Двойной рай</td>
<td>НД, ЗД</td>
</tr>
<tr>
<td>Элизиум, Благословенные Поля</td>
<td>НД</td>
</tr>
<tr>
<td>Звериные Земли, Дебри</td>
<td>НД, ХД</td>
</tr>
<tr>
<td>Арборея, Олимпийские просторы</td>
<td>ХД</td>
</tr>
<tr>
<td>Асгард, Героические владения</td>
<td>ХН, ХД</td>
</tr>
<tr>
<td>Лимбо, Вечно бурлящий хаос</td>
<td>ХН</td>
</tr>
<tr>
<td>Пандемониум, Завывающие Глубины</td>
<td>ХН, ХЗ</td>
</tr>
<tr>
<td>Бездны, Бесконечные слои</td>
<td>ХЗ</td>
</tr>
<tr>
<td>Карцери, Забытые Преисподние</td>
<td>НЗ, ХЗ</td>
</tr>
<tr>
<td>Гадес, Серые Пустоши</td>
<td>НЗ</td>
</tr>
<tr>
<td>Геенна, Мрачная вечность</td>
<td>НЗ, ЗЗ</td>
</tr>
<tr>
<td>Девять Преисподних (Баатора)</td>
<td>ЗЗ</td>
</tr>
<tr>
<td>Ахерон, Бесконечные поля битв</td>
<td>ЗН, ЗЗ</td>
</tr>
<tr>
<td>Механус, Механическая нирвана</td>
<td>ЗН</td>
</tr>
<tr>
<td>Аркадия, Мирные Королевства</td>
<td>ЗН, ЗД</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Особенность</th>
</tr>
<tr>
<td>1</td>
<td>Приметные украшения: серьги, ожерелье, диадема, браслеты</td>
</tr>
<tr>
<td>2</td>
<td>Пирсинг</td>
</tr>
<tr>
<td>3</td>
<td>Пышная или чужеземная одежда</td>
</tr>
<tr>
<td>4</td>
<td>Официальная, чистая одежда</td>
</tr>
<tr>
<td>5</td>
<td>Грязная и драная одежда</td>
</tr>
<tr>
<td>6</td>
<td>Заметный шрам</td>
</tr>
<tr>
<td>7</td>
<td>Отсутствующий зуб</td>
</tr>
<tr>
<td>8</td>
<td>Отсутствующий палец</td>
</tr>
<tr>
<td>9</td>
<td>Необычный цвет глаз (или глаза разного цвета)</td>
</tr>
<tr>
<td>10</td>
<td>Татуировки</td>
</tr>
<tr>
<td>11</td>
<td>Родинка</td>
</tr>
<tr>
<td>12</td>
<td>Необычный цвет кожи</td>
</tr>
<tr>
<td>13</td>
<td>Лысина</td>
</tr>
<tr>
<td>14</td>
<td>Борода или волосы, заплетённые в косы</td>
</tr>
<tr>
<td>15</td>
<td>Необычный цвет волос</td>
</tr>
<tr>
<td>16</td>
<td>Нервный тик</td>
</tr>
<tr>
<td>17</td>
<td>Приметный нос</td>
</tr>
<tr>
<td>18</td>
<td>Приметная осанка (прямая или скрюченная)</td>
</tr>
<tr>
<td>19</td>
<td>Невероятная красота</td>
</tr>
<tr>
<td>20</td>
<td>Невероятное уродство</td>
</tr>
</table>
[img height=750px [https://www.aidedd.org/dnd/images/waterWeird.jpg]]
[img height=250px [https://www.aidedd.org/dnd/images/waterWeird.jpg]]
<table class="SB">
<tr>
<th colspan="7">Водная аномалия</th>
</tr>
<tr>
<th colspan="7">//Большой элементаль, нейтральный//</th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">13</td>
</tr>
<tr>
<th>Хиты</th>
<td colspan="6">58 (9к10 + 9)</td>
</tr>
<tr>
<th>Скорость</th>
<td colspan="6">0 фт., плавая 60 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>17 (+3)</td>
<td>16 (+3)</td>
<td>13 (+1)</td>
<td>11 (+0)</td>
<td>10 (+0)</td>
<td>10 (+0)</td>
</tr>
<tr>
<th>Сопротивление к урону</th>
<td colspan="6">огонь; дробящий, колющий и рубящий урон от немагических атак</td>
</tr>
<tr>
<th>Иммунитет к урону</th>
<td colspan="6">яд</td>
</tr>
<tr>
<th>Иммунитет к состоянию</th>
<td colspan="6">бессознательность, захват, истощение, опутанность, отравление, паралич, сбивание с ног</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">слепое зрение 30 фт., пассивная Внимательность 10</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">понимает Акван, но не говорит</td>
</tr>
<tr>
<th>Опасность</th>
<td colspan="6">3 (700 опыта)</td>
</tr>
</table>
!!!!__''Особенности''__
;
://''Невидимость в воде.''// Водная аномалия невидима, если полностью погружена в воду.
://''Привязка к воде.''// Водная аномалия умирает, если покидает воду, к которой привязана, или если эта вода уничтожается.
__''Действия''__
;
://''Сжимание.''// Рукопашная атака оружием: +5 к попаданию, досягаемость 10 фт., одно существо. Попадание: Дробящий урон 13 (3к6+3). Если размер цели не больше Среднего, она становится схваченной (Сл высвобождения 13) и подтягивается на 5 футов к водной аномалии. Пока цель схвачена, она опутана, водная аномалия пытается её утопить, и аномалия не может сжимать другую цель.
!!!!''Воздушные и водные суда''
<table>
<tr>
<th>Судно</th>
<th>Стоимость</th>
<th>Скорость</th>
<th>Экипаж</th>
<th>Пассажиры</th>
<th>Груз (тонн)</th>
<th>КД</th>
<th>Хиты</th>
<th>Порог урона</th>
</tr>
<tr>
<th>Военный корабль</th>
<td>25 000 зм</td>
<td>2,5 мили/ч</td>
<td>60</td>
<td>60</td>
<td>200</td>
<td>15</td>
<td>500</td>
<td>20</td>
</tr>
<tr>
<th>Воздушный корабль</th>
<td>20 000 зм</td>
<td>8 миль/ч</td>
<td>10</td>
<td>20</td>
<td>1</td>
<td>13</td>
<td>300</td>
<td>—</td>
</tr>
<tr>
<th>Галера</th>
<td>30 000 зм</td>
<td>4 мили/ч</td>
<td>80</td>
<td>—</td>
<td>150</td>
<td>15</td>
<td>500</td>
<td>20</td>
</tr>
<tr>
<th>Драккар</th>
<td>10 000 зм</td>
<td>3 мили/ч</td>
<td>40</td>
<td></td>
<td>10</td>
<td>15</td>
<td>300</td>
<td>15</td>
</tr>
<tr>
<th>Лодка</th>
<td>50 зм</td>
<td>1,5 мили/ч</td>
<td>1</td>
<td>3</td>
<td>—</td>
<td>11</td>
<td>50</td>
<td>—</td>
</tr>
<tr>
<th>Парусник</th>
<td>10 000 зм</td>
<td>2 мили/ч</td>
<td>20</td>
<td>20</td>
<td>100</td>
<td>15</td>
<td>300</td>
<td>15</td>
</tr>
<tr>
<th>Шлюпка</th>
<td>3 000 зм</td>
<td>1 миля/ч</td>
<td>1</td>
<td>6</td>
<td>1/2</td>
<td>15</td>
<td>100</td>
<td>10</td>
</tr>
</table>
!!!!''Встречи в эльфийском лесу''
<table>
<tr>
<th>к12 + к8</th>
<th>Встреча</th>
</tr>
<tr>
<td>2</td>
<td>1 ускользающий зверь</td>
</tr>
<tr>
<td>3 </td>
<td>1 вожак стаи гноллов и 2к4 гнолла</td>
</tr>
<tr>
<td>4</td>
<td>1к4 гнолла и 2к4 гиены</td>
</tr>
<tr>
<td>5</td>
<td>Роща сожжённых деревьев.Персонажи, исследующие область и преуспевшие в проверке Мудрости (Выживание) со Сл 10, находят следы гнол-лов. Следование по следам в течение 1к4 часов приведёт к сцене с гноллами или нахождению мёртвых гноллов с эльфийскими стрелами, торчащими из их кишащих блохами трупов.</td>
</tr>
<tr>
<td>6</td>
<td>1 гигантская сова</td>
</tr>
<tr>
<td>7</td>
<td>Покрытая плющом статуя эльфийского божества или героя</td>
</tr>
<tr>
<td>8</td>
<td>1 дриада (50%) или 1к4 сатира (50%)</td>
</tr>
<tr>
<td>9</td>
<td>1к4 кентавра</td>
</tr>
<tr>
<td>10</td>
<td>2к4 разведчиков (эльфы). Один разведчик несёт рог и может им воспользоваться. Если в лесу раздаётся звук рога, то совершите бросок кости ещё раз. Если выпала встреча с чудовищами, то указанные чудовища прибудут через 1 к4 минуты. Все кроме гноллов, гиен, совомедов и смещающихся зверей будут дружелюбно настроены по отношению к разведчикам.</td>
</tr>
<tr>
<td>11</td>
<td>2к4 пикси (50%) или 2к4 спрайта (50%)</td>
</tr>
<tr>
<td>12</td>
<td>1 совомед</td>
</tr>
<tr>
<td>13</td>
<td>1к4 лосей (75%) или 1 гигантский лось (25%)</td>
</tr>
<tr>
<td>14</td>
<td>1к4 мерцающих псов</td>
</tr>
<tr>
<td>15</td>
<td>Магический куст с 2к4 светящимися ягодами. Существо, съедающее ягоду, становится невидимым на 1 час, или пока не атакует или не использует заклинание. Если сорвать ягоду, то она потеряет свои магические свойства через 12 часов. Ягоды вырастают в полночь, но если собрать все ягоды с куста, то он перестанет быть волшебным, и на нём больше не будут расти ягоды.</td>
</tr>
<tr>
<td>16</td>
<td>Эльфийская мелодия, принесённая лёгким ветерком</td>
</tr>
<tr>
<td>17</td>
<td>1к4 оранжевых (75%) или синих (25%) волшебных дракончиков</td>
</tr>
<tr>
<td>18</td>
<td>1 друид (эльф). Друид изначально безразличен к отряду, но станет дружелюбным, если персонажи согласятся избавить лес от гноллов.</td>
</tr>
<tr>
<td>19</td>
<td>1 трент. Трент будет дружелюбным, если в группе есть хотя бы один эльф, или если группа сопровождается существом фейского происхождения. Трент будет враждебным, если персонажи несут открытый огонь. В других случаях трент будет безразличным, и не раскроет своё присутствие, когда персонажи будут проходить мимо.</td>
</tr>
<tr>
<td>20</td>
<td>1 единорог</td>
</tr>
</table>
!!!!''Вторгающиеся силы''
<table>
<tr>
<th>к8</th>
<th>Вторгающиеся силы</th>
</tr>
<tr>
<td>1</td>
<td>Криминальная группировка</td>
</tr>
<tr>
<td>2</td>
<td>Чудовища или уникальное чудовище</td>
</tr>
<tr>
<td>3</td>
<td>Планарная угроза</td>
</tr>
<tr>
<td>4</td>
<td>Прошлый враг поднялся из мёртвых, переродился или ожил</td>
</tr>
<tr>
<td>5</td>
<td>Фракция раскольников</td>
</tr>
<tr>
<td>6</td>
<td>Дикое племя</td>
</tr>
<tr>
<td>7</td>
<td>Тайное общество</td>
</tr>
<tr>
<td>8</td>
<td>Союзник-предатель</td>
</tr>
</table>
!!!!''Вымирание или истощение''
<table>
<tr>
<th>к8 </th>
<th>Потерянный ресурс</th>
</tr>
<tr>
<td>1</td>
<td>Вид животного (насекомое, птица, рыба, домашнее животное)</td>
</tr>
<tr>
<td>2</td>
<td>Пригодная для жизни земля</td>
</tr>
<tr>
<td>3</td>
<td>Магия или те, кто ей пользуются (вся магия, конкретные виды или школы магии)</td>
</tr>
<tr>
<td>4</td>
<td>Минеральные ресурсы (драгоценные камни металлы, руды)</td>
</tr>
<tr>
<td>5</td>
<td>Вид чудовища (единорог, мантикора, дракон)</td>
</tr>
<tr>
<td>6</td>
<td>Народ (династия, клан, культура, раса)</td>
</tr>
<tr>
<td>7</td>
<td>Вид растения (культура, дерево, трава, лес)</td>
</tr>
<tr>
<td>8</td>
<td>Водный путь (река, озеро, океан)</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Дарование</th>
</tr>
<tr>
<td>1</td>
<td>Играет на музыкальном инструменте</td>
</tr>
<tr>
<td>2</td>
<td>Свободно говорит на нескольких языках</td>
</tr>
<tr>
<td>3</td>
<td>Невероятно удачлив</td>
</tr>
<tr>
<td>4</td>
<td>Прекрасная память</td>
</tr>
<tr>
<td>5</td>
<td>Хорошо ладит с животными</td>
</tr>
<tr>
<td>6</td>
<td>Хорошо ладит с детьми</td>
</tr>
<tr>
<td>7</td>
<td>Прекрасно разгадывает загадки и головоломки</td>
</tr>
<tr>
<td>8</td>
<td>Прекрасно играет в одну игру</td>
</tr>
<tr>
<td>9</td>
<td>Может перевоплощаться в других</td>
</tr>
<tr>
<td>10</td>
<td>Красиво пишет</td>
</tr>
<tr>
<td>11</td>
<td>Красиво рисует</td>
</tr>
<tr>
<td>12</td>
<td>Красиво поёт</td>
</tr>
<tr>
<td>13</td>
<td>Может перепить любого</td>
</tr>
<tr>
<td>14</td>
<td>Прекрасный плотник</td>
</tr>
<tr>
<td>15</td>
<td>Отлично готовит</td>
</tr>
<tr>
<td>16</td>
<td>Отлично метает дротики и пускает блинчики по воде</td>
</tr>
<tr>
<td>17</td>
<td>Отлично жонглирует</td>
</tr>
<tr>
<td>18</td>
<td>Прекрасный актёр и знает, как использовать грим</td>
</tr>
<tr>
<td>19</td>
<td>Умелый танцор</td>
</tr>
<tr>
<td>20</td>
<td>Знает воровской жаргон</td>
</tr>
</table>
!!__''Детектив''__
Детектив — это вид приключения, основанного на событиях, которое, как правило, сосредоточено на усилиях искателей приключений по раскрытию преступления, обычно ограбления или убийства. В отличие от писателя детективных романов, Мастер не всегда может предсказать, что герои будут делать в таком приключении.
Злодей, чья стратегия «череда преступлений», «последнее дело» или «серийные преступления», может вдохновить вас на создание детектива. Если цели искателей приключений включают в себя определение личности злодея, то такое приключение тоже может нести детективный подтекст.
Чтобы создать детектив, возьмите за основу приключение, основанное на событиях, и добавьте три дополнительных элемента: жертву, подозреваемых и улики.
!!!''Жертва''
Подумайте, как жертва связана со злодеем. Вы можете создать сильный сценарий и без таких отношений, но именно раскрытие хитросплетений в отношениях между персонажами Мастера и выяснение мотива убийства делает детектив захватывающим. Случайное убийство тоже может быть таинственным, но ему не хватает эмоциональной составляющей.
Также подумайте о связи между жертвой и кем-то из искателей приключений. Верный способ вовлечь их в расследование — в том числе сделав их подозреваемыми — это сделать жертвой кого-то, с кем персонажи знакомы.
!!!''Подозреваемые''
Ваш список персонажей должен включать в себя других персонажей, которые не совершали преступление, но имели мотивы, средства, или возможности сделать это. Подозреваемые могут быть на виду или могут появиться в ходе расследования. Один из методов, часто используемый в детективах — это создать круг подозреваемых — ограниченное число лиц, чьё положение делает их единственными возможными подозреваемыми.
Хороший способ заставить игроков гадать, кто злодей, это сделать так, чтобы тайны были более чем у одного подозреваемого. Отвечая на вопросы искателей приключений, подозреваемый может проявить нервозность или попытаться лгать, несмотря на то, что он невиновен в преступлении. Тайные сделки, незаконные делишки, тёмное прошлое, или неконтролируемые пороки — недостатки, которые делают подозреваемых более интересными, чем персонажи, которым нечего скрывать.
!!!''Улики''
Улики указывают на личность злодея. Бывают словесные улики, такие как заявления подозреваемых и свидетелей, которые помогают искателям приключений построить картину того, что произошло. Другие улики физические, такие как незаконченное сообщения, написанное кровью пострадавшего, безделушка, оставленная злодеем, или оружие, найденное в комнате подозреваемого.
Улики должны как-то связывать подозреваемого и преступление; как правило, они проливают свет на мотивацию подозреваемого, на его средства или возможности. Некоторые улики вовлекают невиновного подозреваемого, уводя искателей приключений в неправильном направлении. В конечном итоге они должны найти улики, ведущие в противоположном направлении, или найти доказательства невиновности подозреваемого.
Избыток улик в приключении лучше, чем их недостаток. Если искатели приключений разгадают тайну слишком быстро, вы можете почувствовать некоторое разочарование, но игроки испытают чувство удовлетворения от выполнения задания. Если же задание слишком трудное, игроки могут разочароваться. Искатели приключений могут пропустить некоторые улики, поэтому создайте улик с избытком, чтобы быть уверенным, что у игроков хватит информации для поимки злодея.
!!__''Интрига''__
Интрига — это приключение, основанное на событиях, которое закручено вокруг борьбы за власть. Интриги в большей степени распространены среди королевской знати, но борьба за власть может с лёгкостью разыграться и в торговых гильдиях, и в преступных синдикатах, и среди храмовников.
Вместо тёмных событий и злодейских заговоров, приключение в жанре интриги, как правило, вращается вокруг обмена услугами, восхождения и падения людей во власти и влиянии, и сладких речей дипломатии. Попытки принца унаследовать престол, стремление придворного стать правой рукой королевы и желание купца открыть торговый маршрут через вражеские земли — всё это сюжеты интриги.
Как и другие приключения, интрига работает только если игроки и их персонажи лично заинтересованы в каком-либо исходе. Если никому нет дела до того, кем является королевский камергер, или у кого есть право на вырубку в эльфийских лесах, то приключения, ставящие центром внимания такие темы, обречены на провал. Однако если знакомство с королевским камергером сулит персонажам возможность использовать королевских солдат для защиты своей крепости на границе, то заинтересованность игроков повысится.
Обычно искатели приключений оказываются втянутыми в интригу, когда они им нужно покровительство мощного существа, и они готовы оказать услугу в обмен, или когда заговоры властных ПМ встают на пути персонажей, добивающихся своих целей. Некоторые из целей для приключений на основе событий из этого раздела хорошо подходят для интриг. Если в вашем приключении герои должны раскрыть заговор, обсудить мирный договор или добиться помощи от правителя или совета, то вы играете в интригу.
Процесс создания интриги аналогичен созданию любого другого приключения на основе событий, с двумя основными различиями: как трактуются злодеи, и как персонажи могут получить влияние.
!!!''Злодеи''
Некоторые интриги основываются на действиях всего одного злодея, например, дворянина, готовящего покушение на монарха. Тем не менее, интрига может иметь в себе несколько злодеев или вообще их не иметь.
;
://''Нет злодея.''// Некоторые интриги вращаются вокруг обмена услугами в отсутствие злодея. Для таких приключений пропустите шаги 1 и 2 процесса создания приключения на основе событий (злодей и действия злодея) и переходите прямо к целям искателей приключений в шаге 3. Выясните, почему искатели приключений участвуют в интригах, затем потратьте время на создание ПМ, с которыми им предстоит взаимодействовать.
://''Много злодеев.''// Некоторые интриги, напротив, предоставляют целых набор злодеев, каждый со своими целями, мотивами и методами. Искатели приключений могут быть вовлечены в дворцовые интриги, где дворяне борются за трон в результате внезапной смерти короля, или могут оказаться втянутыми в переговоры о перемирии в смертельной борьбе за сферы влияния среди гильдий воров. В таких случаях вам придётся потратить много времени на шаги 1 и 2, продумывая каждого из основных ПМ в качестве отдельного злодея со своими планами.
В шаге 5 вам будет нужно придумать реакции каждого злодея на потенциальные неудачи, с которыми они столкнуться во время приключения.
Вам не потребуется тратить одинаковое время на детализацию реакций каждого злодея, так как многие из них, скорее всего, будут компенсировать или влиять друг на друга. Всякий раз, когда искатели приключений срывают планы одного злодея, они своими действиями могут помочь другому, продвигая сюжет вперёд независимо от того, как отреагирует первый злодей.
!!!''Очки влияния''
В зависимости от сценария, вы, возможно, захотите отслеживать очки влияния отряда на разных ПМ или фракции, или даже отслеживать их отдельно для каждого персонажа.
Один из способов отслеживания очков влияния — это относиться к ним как к очкам вдохновения. Персонаж получает очки влияния в определённых ситуациях только по вашему желанию, а ввод таких очков в игру требует их траты. Персонаж может получить очки влияния по вашему усмотрению, например, помогая ПМ, продвигая дела организации, или демонстрируя свою силу и героизм. Как и с очками вдохновения, персонаж может потратить очки влияния, чтобы совершить с преимуществом бросок кости, связанной с этим влиянием.
Другой способ отслеживать очки влияния — это относиться к ним как к очкам славы (см. главу 1), позволяя персонажам получать славу при дворе и внутри различных ключевых фракций.
!!!!''Дистанция подводных сцен''
<table>
<tr>
<th>Условия</th>
<th>Дистанция сцен</th>
</tr>
<tr>
<td>Прозрачная вода, яркий свет</td>
<td>60 фт.</td>
</tr>
<tr>
<td>Прозрачная вода, тусклый свет</td>
<td>30 фт.</td>
</tr>
<tr>
<td>Мутная вода или свет отсутствует</td>
<td>10 фт.</td>
</tr>
</table>
<table>
<tr>
<th>к20 </th>
<th>Достопримечательность</th>
</tr>
<tr>
<td>1</td>
<td>Каналы вместо улиц</td>
</tr>
<tr>
<td>2</td>
<td>Массивная статуя или монумент</td>
</tr>
<tr>
<td>3</td>
<td>Верховный храм</td>
</tr>
<tr>
<td>4</td>
<td>Большая крепость</td>
</tr>
<tr>
<td>5</td>
<td>Цветущие парки и сады</td>
</tr>
<tr>
<td>6</td>
<td>Город разделён рекой</td>
</tr>
<tr>
<td>7</td>
<td>Главный торговый центр</td>
</tr>
<tr>
<td>8</td>
<td>Штаб-квартира влиятельной семьи или гильдии</td>
</tr>
<tr>
<td>9</td>
<td>Много богатых</td>
</tr>
<tr>
<td>10</td>
<td>Много бедняков</td>
</tr>
<tr>
<td>11</td>
<td>Дурной запах (кожевенный завод, открытая канализация)</td>
</tr>
<tr>
<td>12</td>
<td>Центр торговли специфичным товаром</td>
</tr>
<tr>
<td>13</td>
<td>Место многочисленных сражений</td>
</tr>
<tr>
<td>14</td>
<td>Место мистического или магического события</td>
</tr>
<tr>
<td>15</td>
<td>Важная библиотека или архив</td>
</tr>
<tr>
<td>16</td>
<td>Запрещено поклоняться всем богам</td>
</tr>
<tr>
<td>17</td>
<td>Зловещая репутация</td>
</tr>
<tr>
<td>18</td>
<td>Значительная библиотека или академия</td>
</tr>
<tr>
<td>19</td>
<td>Важный склеп или кладбище</td>
</tr>
<tr>
<td>20</td>
<td>Поселение построено на древних руинах</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 10 зм''
<table>
<tr>
<th>к12</th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Азурит (непрозрачный, пёстрый тёмно-синий)</td>
</tr>
<tr>
<td>2</td>
<td>Бирюза (непрозрачная, зелёно-голубая)</td>
</tr>
<tr>
<td>3</td>
<td>Гематит (непрозрачный, серо-чёрный)</td>
</tr>
<tr>
<td>4</td>
<td>Глазчатый агат (полупрозрачный, чередующиеся круги серого, белого, коричневого, голубого или зелёного цвета)</td>
</tr>
<tr>
<td>5</td>
<td>Голубой кварц (прозрачный, голубой)</td>
</tr>
<tr>
<td>6</td>
<td>Лазурит (непрозрачный, голубой и синий с жёлтыми вкраплениями)</td>
</tr>
<tr>
<td>7</td>
<td>Малахит (непрозрачный, с чередующимися светло- и тёмно-зелёными полосами)</td>
</tr>
<tr>
<td>8</td>
<td>Моховой агат (полупрозрачный, розовый или беложёлтый с мшистыми серыми или зелёными пятнами)</td>
</tr>
<tr>
<td>9</td>
<td>Обсидиан (непрозрачный, чёрный)</td>
</tr>
<tr>
<td>10</td>
<td>Полосчатый агат (полупрозрачный, с чередующимися коричневыми, голубыми, белыми или красными полосами)</td>
</tr>
<tr>
<td>11</td>
<td>Родохрозит (непрозрачный, светло-розовый)</td>
</tr>
<tr>
<td>12</td>
<td>Тигровый глаз (полупрозрачный, коричневый с золотой серединкой)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 100 зм''
<table>
<tr>
<th>к10</th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Аметист (прозрачный, тёмно-фиолетовый)</td>
</tr>
<tr>
<td>2</td>
<td>Гагат (непрозрачный, чёрный)</td>
</tr>
<tr>
<td>3</td>
<td>Гранат (прозрачный, красный, зелёно-коричневый или фиолетовый)</td>
</tr>
<tr>
<td>4</td>
<td>Жемчуг (непрозрачный, переливчатый белый, жёлтый или розовый)</td>
</tr>
<tr>
<td>5</td>
<td>Коралл (непрозрачный, тёмно-красный)</td>
</tr>
<tr>
<td>6</td>
<td>Нефрит (полупрозрачный, светло- или тёмно-зелёный, белый)</td>
</tr>
<tr>
<td>7</td>
<td>Турмалин (прозрачный, бледно-зелёный, синий, коричневый или красный)</td>
</tr>
<tr>
<td>8</td>
<td>Хризоберилл (прозрачный, жёлто-зелёный или светло-зелёный)</td>
</tr>
<tr>
<td>9</td>
<td>Шпинель (прозрачная, красная, красно-коричневая или тёмно-зелёная)</td>
</tr>
<tr>
<td>10</td>
<td>Янтарь (прозрачный, жёлто-золотой)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 100 зм''
<table>
<tr>
<th>к10</th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Аметист (прозрачный, тёмно-фиолетовый)</td>
</tr>
<tr>
<td>2</td>
<td>Гагат (непрозрачный, чёрный)</td>
</tr>
<tr>
<td>3</td>
<td>Гранат (прозрачный, красный, зелёно-коричневый или фиолетовый)</td>
</tr>
<tr>
<td>4</td>
<td>Жемчуг (непрозрачный, переливчатый белый, жёлтый или розовый)</td>
</tr>
<tr>
<td>5</td>
<td>Коралл (непрозрачный, тёмно-красный)</td>
</tr>
<tr>
<td>6</td>
<td>Нефрит (полупрозрачный, светло- или тёмно-зелёный, белый)</td>
</tr>
<tr>
<td>7</td>
<td>Турмалин (прозрачный, бледно-зелёный, синий, коричневый или красный)</td>
</tr>
<tr>
<td>8</td>
<td>Хризоберилл (прозрачный, жёлто-зелёный или светло-зелёный)</td>
</tr>
<tr>
<td>9</td>
<td>Шпинель (прозрачная, красная, красно-коричневая или тёмно-зелёная)</td>
</tr>
<tr>
<td>10</td>
<td>Янтарь (прозрачный, жёлто-золотой)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 1000 зм''
<table>
<tr>
<th>к8</th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Голубой сапфир (прозрачный, от бело-голубого до умеренно синего)</td>
</tr>
<tr>
<td>2</td>
<td>Жёлтый сапфир (прозрачный, огненно-жёлтый или жёлто-зелёный)</td>
</tr>
<tr>
<td>3</td>
<td>Звёздчатый рубин (полупрозрачный, рубин с белёсой звездой в центре)</td>
</tr>
<tr>
<td>4</td>
<td>Звёздчатый сапфир (полупрозрачный, синий сапфир с белёсой звездой в центре)</td>
</tr>
<tr>
<td>5</td>
<td>Изумруд (прозрачный, насыщенный ярко-зелёный)</td>
</tr>
<tr>
<td>6</td>
<td>Огненный опал (полупрозрачный, огненно-красный)</td>
</tr>
<tr>
<td>7</td>
<td>Опал (полупрозрачный, голубой с зелёными и золотыми вкраплениями)</td>
</tr>
<tr>
<td>8</td>
<td>Чёрный опал (полупрозрачный, тёмно-зелёный с чёрными пятнышками и золотыми вкраплениями)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 50 зм''
<table>
<tr>
<th>к12 </th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Гелиотроп (непрозрачный, тёмно-серый с красными вкраплениями)</td>
</tr>
<tr>
<td>2</td>
<td>Звёздчатый розовый кварц (полупрозрачный, розовый камень с белой звездой по центру)</td>
</tr>
<tr>
<td>3</td>
<td>Кварц (прозрачный, белый, дымчатый или жёлтый)</td>
</tr>
<tr>
<td>4</td>
<td>Лунный камень (полупрозрачный, белый с бледноголубым отливом)</td>
</tr>
<tr>
<td>5</td>
<td>Оникс (непрозрачный, чёрно-белые полосы или чисто чёрный или белый)</td>
</tr>
<tr>
<td>6</td>
<td>Сардоникс (непрозрачный, бело-красные полосы)</td>
</tr>
<tr>
<td>7</td>
<td>Сердолик (непрозрачный, оранжевый с переходом в красно-коричневый)</td>
</tr>
<tr>
<td>8</td>
<td>Халцедон (непрозрачный, белый)</td>
</tr>
<tr>
<td>9</td>
<td>Хризопраз (полупрозрачный, зелёный)</td>
</tr>
<tr>
<td>10</td>
<td>Циркон (прозрачный, бледный зелёно-голубой)</td>
</tr>
<tr>
<td>11</td>
<td>Цитрин (прозрачный, жёлто-коричневый)</td>
</tr>
<tr>
<td>12</td>
<td>Яшма (непрозрачная, синяя, чёрная или коричневая)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 50 зм''
<table>
<tr>
<th>к12 </th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Гелиотроп (непрозрачный, тёмно-серый с красными вкраплениями)</td>
</tr>
<tr>
<td>2</td>
<td>Звёздчатый розовый кварц (полупрозрачный, розовый камень с белой звездой по центру)</td>
</tr>
<tr>
<td>3</td>
<td>Кварц (прозрачный, белый, дымчатый или жёлтый)</td>
</tr>
<tr>
<td>4</td>
<td>Лунный камень (полупрозрачный, белый с бледноголубым отливом)</td>
</tr>
<tr>
<td>5</td>
<td>Оникс (непрозрачный, чёрно-белые полосы или чисто чёрный или белый)</td>
</tr>
<tr>
<td>6</td>
<td>Сардоникс (непрозрачный, бело-красные полосы)</td>
</tr>
<tr>
<td>7</td>
<td>Сердолик (непрозрачный, оранжевый с переходом в красно-коричневый)</td>
</tr>
<tr>
<td>8</td>
<td>Халцедон (непрозрачный, белый)</td>
</tr>
<tr>
<td>9</td>
<td>Хризопраз (полупрозрачный, зелёный)</td>
</tr>
<tr>
<td>10</td>
<td>Циркон (прозрачный, бледный зелёно-голубой)</td>
</tr>
<tr>
<td>11</td>
<td>Цитрин (прозрачный, жёлто-коричневый)</td>
</tr>
<tr>
<td>12</td>
<td>Яшма (непрозрачная, синяя, чёрная или коричневая)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 500 зм''
<table>
<tr>
<th>к6</th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Аквамарин (прозрачный, зелёно-голубой)</td>
</tr>
<tr>
<td>2</td>
<td>Александрит (прозрачный, тёмно-зелёный)</td>
</tr>
<tr>
<td>3</td>
<td>Синяя шпинель (прозрачная, синяя)</td>
</tr>
<tr>
<td>4</td>
<td>Топаз (прозрачный, золотисто-жёлтый)</td>
</tr>
<tr>
<td>5</td>
<td>Хризолит (прозрачный, сочный оливково-зелёный)</td>
</tr>
<tr>
<td>6</td>
<td>Чёрный жемчуг (непрозрачный, чисто чёрный)</td>
</tr>
</table>
!!!!''Драгоценные камни стоимостью 5000 зм''
<table>
<tr>
<th>к4 <br></th>
<th>Описание камня</th>
</tr>
<tr>
<td>1</td>
<td>Алмаз (прозрачный, сине-белый, ярко-жёлтый, розовый, коричневый или синий)</td>
</tr>
<tr>
<td>2</td>
<td>Гиацинт (прозрачный, огненно-оранжевый)</td>
</tr>
<tr>
<td>3</td>
<td>Рубин (прозрачный, чисто красный с переходом в тёмно-алый)</td>
</tr>
<tr>
<td>4</td>
<td>Чёрный сапфир (полупрозрачный, блестящий чёрный с яркими вкраплениями)</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1-2</td>
<td>Заброшенный дом</td>
</tr>
<tr>
<td>3-8</td>
<td>Дом среднего класса</td>
</tr>
<tr>
<td>9-10</td>
<td>Дом богачей</td>
</tr>
<tr>
<td>11-15</td>
<td>Переполненный многоквартирный дом</td>
</tr>
<tr>
<td>16-17</td>
<td>Детский приют</td>
</tr>
<tr>
<td>18</td>
<td>Тайное логово работорговцев</td>
</tr>
<tr>
<td>19</td>
<td>Прикрытие тайного культа</td>
</tr>
<tr>
<td>20</td>
<td>Роскошный, охраняемый особняк</td>
</tr>
</table>
<table>
<tr>
<th>Уровень жреца</th>
<th>Заклинания</th>
</tr>
<tr>
<td>1</td>
<td>луч болезни, псевдожизнь</td>
</tr>
<tr>
<td>3</td>
<td>глухота/слепота, луч слабости</td>
</tr>
<tr>
<td>5</td>
<td>восставший труп, прикосновение вампира</td>
</tr>
<tr>
<td>7</td>
<td>защита от смерти, усыхание</td>
</tr>
<tr>
<td>9</td>
<td>облако смерти, преграда жизни</td>
</tr>
</table>
[img height="750px"[https://forum.becomealivinggod.com/uploads/db2684/optimized/3X/b/7/b7bd5da5eb2594c7433b37d6ee59804a9009d11d_1_422x500.png]]
[img height="250px"[https://forum.becomealivinggod.com/uploads/db2684/optimized/3X/b/7/b7bd5da5eb2594c7433b37d6ee59804a9009d11d_1_422x500.png]]
<table class="SB">
<tr>
<th colspan="7">Злобоглаз зомби (Бехолдер-зомби)</th>
</tr>
<tr>
<th colspan="7">Большая нежить, нейтрально-злая</th>
</tr>
<tr>
<th>Класс Доспеха </th>
<td colspan="6">15 (природный доспех)</td>
</tr>
<tr>
<th>Хиты</th>
<td colspan="6">93 (11к10 + 33)</td>
</tr>
<tr>
<th>Скорость </th>
<td colspan="6">0 фт., летая 20 фт. (парит)</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>10 (+0)</td>
<td>8 (–1)</td>
<td>16 (+3)</td>
<td>3 (–4)</td>
<td>8 (–1)</td>
<td>5 (–3)</td>
</tr>
<tr>
<th>Спасброски</th>
<td colspan="6">Мдр +2</td>
</tr>
<tr>
<th>Иммунитет к урону</th>
<td colspan="6">яд</td>
</tr>
<tr>
<th>Иммунитет к состоянию</th>
<td colspan="6">отравление, сбивание с ног</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">тёмное зрение 60 фт., пассивная Внимательность 9</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">понимает Глубинную Речь и Подземный, но не говорит</td>
</tr>
<tr>
<th>Опасность</th>
<td colspan="6">5 (1800 опыта)</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Злодей</th>
<th></th>
<th>к20</th>
<th>Покровитель</th>
</tr>
<tr>
<td>1</td>
<td>Зверь или монстр без особых целей или планов</td>
<th></th>
<td>1</td>
<td rowspan="2">Ушедший в отставку искатель приключений</td>
</tr>
<tr>
<td>2</td>
<td>Аберрация, желающая разврата или господства</td>
<th></th>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Исчадие, желающее разврата или уничтожения</td>
<th></th>
<td>3</td>
<td rowspan="2">Местный правитель</td>
</tr>
<tr>
<td>4</td>
<td>Дракон, желающий господства и грабежа</td>
<th></th>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>Великан, желающий грабежа</td>
<th></th>
<td>5</td>
<td rowspan="2">Военный офицер</td>
</tr>
<tr>
<td>6</td>
<td rowspan="2">Нежить с любыми целями</td>
<th></th>
<td>6</td>
</tr>
<tr>
<td>7</td>
<th></th>
<td>7</td>
<td rowspan="2">Храмовник</td>
</tr>
<tr>
<td>8</td>
<td>Фея с загадочной целью</td>
<th></th>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td rowspan="2">Гуманоид культист</td>
<th></th>
<td>9</td>
<td rowspan="2">Мудрец</td>
</tr>
<tr>
<td>10</td>
<th></th>
<td>10</td>
</tr>
<tr>
<td>11</td>
<td rowspan="2">Гуманоид завоеватель</td>
<th></th>
<td>11</td>
<td rowspan="2">Уважаемый старец</td>
</tr>
<tr>
<td>12</td>
<th></th>
<td>12</td>
</tr>
<tr>
<td>13</td>
<td>Гуманоид мститель</td>
<th></th>
<td>13</td>
<td>Божество или небожитель</td>
</tr>
<tr>
<td>14</td>
<td rowspan="2">Гуманоид заговорщик, жаждущий власти</td>
<th></th>
<td>14</td>
<td>Таинственная фея</td>
</tr>
<tr>
<td>15</td>
<th></th>
<td>15</td>
<td>Старый друг</td>
</tr>
<tr>
<td>16</td>
<td>Гуманоид криминальный авторитет</td>
<th></th>
<td>16</td>
<td>Бывший учитель</td>
</tr>
<tr>
<td>17</td>
<td rowspan="2">Гуманоид налётчик или разрушитель</td>
<th></th>
<td>17</td>
<td>Родственник или другой член семьи</td>
</tr>
<tr>
<td>18</td>
<th></th>
<td>18</td>
<td>Отчаянныйпростолюдин</td>
</tr>
<tr>
<td>19</td>
<td>Гуманоид под проклятьем</td>
<th></th>
<td>19</td>
<td>Купец во всеоружии</td>
</tr>
<tr>
<td>20</td>
<td>Дезинформированный гуманоид фанатик</td>
<th></th>
<td>20</td>
<td>Злодей, выдающий себя за покровителя</td>
</tr>
</table>
[img height="750px"[http://dungeon.su/gallery/bestiary/9_1516344595.jpg]]
[img height="250px"[http://dungeon.su/gallery/bestiary/9_1516344595.jpg]]
<table class="SB">
<tr>
<th colspan="7">Зомби</th>
</tr>
<tr>
<th colspan="7">Средняя нежить, нейтрально-злая</th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">8</td>
</tr>
<tr>
<th>Хиты </th>
<td colspan="6">22 (3к8 + 9)</td>
</tr>
<tr>
<th>Скорость </th>
<td colspan="6">20 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>13 (+1)</td>
<td>6 (–2)</td>
<td>16 (+3)</td>
<td>3 (–4)</td>
<td>6 (–2)</td>
<td>5 (–3)</td>
</tr>
<tr>
<th>Спасброски </th>
<td colspan="6">Мдр +0</td>
</tr>
<tr>
<th>Иммунитет к урону</th>
<td colspan="6">яд</td>
</tr>
<tr>
<th>Иммунитет к состоянию </th>
<td colspan="6">отравление</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">тёмное зрение 60 фт., пассивная Внимательность 8</td>
</tr>
<tr>
<th>Языки </th>
<td colspan="6">понимает все языки, известные при жизни, но не говорит</td>
</tr>
<tr>
<th>Опасность </th>
<td colspan="6">1/4 (50 опыта)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Добрый идеал</th>
<th rowspan="7"></th>
<th>к6</th>
<th>Злой идеал</th>
</tr>
<tr>
<td>1</td>
<td>Красота</td>
<td>1</td>
<td>Доминирование</td>
</tr>
<tr>
<td>2</td>
<td>Благотворительность</td>
<td>2</td>
<td>Жадность</td>
</tr>
<tr>
<td>3</td>
<td>Высшее благо</td>
<td>3</td>
<td>Мощь</td>
</tr>
<tr>
<td>4</td>
<td>Жизнь</td>
<td>4</td>
<td>Боль</td>
</tr>
<tr>
<td>5</td>
<td>Уважение</td>
<td>5</td>
<td>Кара</td>
</tr>
<tr>
<td>6</td>
<td>Самопожертвование</td>
<td>6</td>
<td>Резня</td>
</tr>
<tr>
<th>к6</th>
<th>Законный идеал</th>
<th rowspan="7"></th>
<th>к6</th>
<th>Хаотичный идеал</th>
</tr>
<tr>
<td>1</td>
<td>Общество</td>
<td>1</td>
<td>Перемены</td>
</tr>
<tr>
<td>2</td>
<td>Честность</td>
<td>2</td>
<td>Находчивость</td>
</tr>
<tr>
<td>3</td>
<td>Честь</td>
<td>3</td>
<td>Свобода</td>
</tr>
<tr>
<td>4</td>
<td>Логика</td>
<td>4</td>
<td>Независимость</td>
</tr>
<tr>
<td>5</td>
<td>Ответственность</td>
<td>5</td>
<td>Отсутствие ограничений</td>
</tr>
<tr>
<td>6</td>
<td>Традиции</td>
<td>6</td>
<td>Капризы</td>
</tr>
<tr>
<th>к6</th>
<th>Нейтральный идеал</th>
<th rowspan="7"></th>
<th>к6</th>
<th>Прочие идеалы</th>
</tr>
<tr>
<td>1</td>
<td>Равновесие</td>
<td>1</td>
<td>Стремление</td>
</tr>
<tr>
<td>2</td>
<td>Знание</td>
<td>2</td>
<td>Исследования</td>
</tr>
<tr>
<td>3</td>
<td>Сам живи и другим не мешай</td>
<td>3</td>
<td>Слава</td>
</tr>
<tr>
<td>4</td>
<td>Умеренность</td>
<td>4</td>
<td>Держава</td>
</tr>
<tr>
<td>5</td>
<td>Нейтральность</td>
<td>5</td>
<td>Искупление</td>
</tr>
<tr>
<td>6</td>
<td>Народ</td>
<td>6</td>
<td>Самопознание</td>
</tr>
</table>
<table>
<tr>
<th colspan="6">Индивидуальные сокровища: Показатель опасности 0-4</th>
</tr>
<tr>
<th>к100</th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>01-30</th>
<td>5к6 (17) </td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<th>31-60</th>
<td>—</td>
<td>4к6 (14)</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<th>61-70</th>
<td>—</td>
<td>—</td>
<td>3к6 (10)</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<th>71-95</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>(3к6) (10)</td>
<td>—</td>
</tr>
<tr>
<th>96-00</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>1 к6 (3)</td>
</tr>
<tr>
<th colspan="6">Индивидуальные сокровища: Показатель опасности 5-10</th>
</tr>
<tr>
<th>к100</th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>01-30</th>
<td>4к6 х 100 (1400) </td>
<td>—</td>
<td>1к6 х 10 (35)</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<th>31-60</th>
<td>—</td>
<td>6к6 х 10 (210)</td>
<td>—</td>
<td>6 х 10 (70)</td>
<td>—</td>
</tr>
<tr>
<th>61-70</th>
<td>—</td>
<td>—</td>
<td>3к6 х 10 (105)</td>
<td>2к6 х 10 (70)</td>
<td>—</td>
</tr>
<tr>
<th>71-95</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>4к6 х 10 (140)</td>
<td>—</td>
</tr>
<tr>
<th>96-00</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>2к6 х 10 (70)</td>
<td>3к6 (10)</td>
</tr>
<tr>
<th colspan="6">Индивидуальные сокровища: Показатель опасности 11-16</th>
</tr>
<tr>
<th>к100</th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>01-20</th>
<td>—</td>
<td>4к6 х 100 (1400)</td>
<td>—</td>
<td>1к6 х 100 (350)</td>
<td>—</td>
</tr>
<tr>
<th>21-35</th>
<td>—</td>
<td>—</td>
<td>1к6 х 100 (350)</td>
<td>1к6 х 100 (350)</td>
<td>—</td>
</tr>
<tr>
<th>36-75</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>2к6 х 100 (700)</td>
<td>1к6 х 10 (35)</td>
</tr>
<tr>
<th>76-00</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>2к6 х 100 (700)</td>
<td>2к6 х 10 (70)</td>
</tr>
<tr>
<th colspan="6">Индивидуальные сокровища: Показатель опасности 17+</th>
</tr>
<tr>
<th>к100</th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>01-15</th>
<td>—</td>
<td>—</td>
<td>2к6 х 1000 (7000)</td>
<td>8к6 х 100 (2800)</td>
<td>—</td>
</tr>
<tr>
<th>16-55</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>1к6 х 1000 (3500)</td>
<td>1к6 х 100 (350)</td>
</tr>
<tr>
<th>56-00</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>1к6 х 1000 (3500)</td>
<td>2к6 х 100 (700)</td>
</tr>
</table>
!!!!''История подземелья''
<table>
<tr>
<th>к20</th>
<th>Ключевое событие</th>
</tr>
<tr>
<td>1</td>
<td>Заброшено из-за заражения</td>
</tr>
<tr>
<td>2-5</td>
<td>Завоёвано налётчиками</td>
</tr>
<tr>
<td>6</td>
<td>Захвачено планарными существами</td>
</tr>
<tr>
<td>7-8</td>
<td>Исходный создатель всё ещё находится у власти</td>
</tr>
<tr>
<td>9</td>
<td>Проклято богами и заброшено</td>
</tr>
<tr>
<td>10</td>
<td>Произошло великое чудо</td>
</tr>
<tr>
<td>11-13</td>
<td>Покинуто создателями</td>
</tr>
<tr>
<td>14</td>
<td>Создатели уничтожены магической катастрофой</td>
</tr>
<tr>
<td>15</td>
<td>Создатели уничтожены междоусобным конфликтом</td>
</tr>
<tr>
<td>16-17</td>
<td>Создатели уничтожены природной катастрофой</td>
</tr>
<tr>
<td>18</td>
<td>Создатели уничтожены тем, что обнаружили здесь</td>
</tr>
<tr>
<td>19-20</td>
<td>Создатели уничтожены чужаками</td>
</tr>
</table>
<table>
<tr>
<th>Месяц</th>
<th>Название</th>
<th>Распространённое название</th>
</tr>
<tr>
<td rowspan="2">1</td>
<td>Хаммер</td>
<td>Разгар зимы</td>
</tr>
<tr>
<td colspan="2">Ежегодный праздник: Макушка зимы</td>
</tr>
<tr>
<td>2</td>
<td>Альтуриак</td>
<td>Коготь зимы</td>
</tr>
<tr>
<td>3</td>
<td>Чес</td>
<td>Месяц закатов</td>
</tr>
<tr>
<td rowspan="2">4</td>
<td>Тарсах</td>
<td>Месяц гроз</td>
</tr>
<tr>
<td colspan="2">Ежегодный праздник: день Зелёной травы</td>
</tr>
<tr>
<td>5</td>
<td>Миртул</td>
<td>Месяц таяния снегов</td>
</tr>
<tr>
<td>6</td>
<td>Киторн</td>
<td>Время цветов</td>
</tr>
<tr>
<td rowspan="3">7</td>
<td>Флеймрул</td>
<td>Разгар лета</td>
</tr>
<tr>
<td colspan="2">Ежегодный праздник Солнцеворот</td>
</tr>
<tr>
<td colspan="2">Праздник раз в четыре года: Щитовой Сход</td>
</tr>
<tr>
<td>8</td>
<td>Элесиас</td>
<td>Солнце в зените</td>
</tr>
<tr>
<td rowspan="2">9</td>
<td>Элейнт</td>
<td>Угасание</td>
</tr>
<tr>
<td colspan="2">Ежегодный праздник: Праздник урожая</td>
</tr>
<tr>
<td>10</td>
<td>Марпенот</td>
<td>Листопад</td>
</tr>
<tr>
<td rowspan="2">11</td>
<td>Уктар</td>
<td>Умирание</td>
</tr>
<tr>
<td colspan="2">Ежегодный праздник: Пир Луны</td>
</tr>
<tr>
<td>12</td>
<td>Найтол</td>
<td>Завершение года</td>
</tr>
</table>
!!!!''Катастрофы и бедствия''
<table>
<tr>
<th>к10</th>
<th>Катастрофы и бедствия</th>
</tr>
<tr>
<td>1</td>
<td>Землетрясение</td>
</tr>
<tr>
<td>2</td>
<td>Голод/засуха</td>
</tr>
<tr>
<td>3</td>
<td>Пожар</td>
</tr>
<tr>
<td>4</td>
<td>Наводнение</td>
</tr>
<tr>
<td>5</td>
<td>Чума/болезнь</td>
</tr>
<tr>
<td>6</td>
<td>Огненный дождь (падение метеорита)</td>
</tr>
<tr>
<td>7</td>
<td>Буря (ураган, торнадо, цунами)</td>
</tr>
<tr>
<td>8</td>
<td>Извержение вулкана</td>
</tr>
<tr>
<td>9</td>
<td>Вышедшая из-под контроля магия или планарные искривления</td>
</tr>
<tr>
<td>10</td>
<td>Божественный суд</td>
</tr>
</table>
<<Button "$:/Мировоззрение ПМ""Мировоззрение ПМ">>
<<Button "$:/Класс ПМ""Класс ПМ">>
<table>
<tr>
<th>к20</th>
<th>Класс</th>
<th rowspan="7"></th>
<th>к20</th>
<th>Класс</th>
</tr>
<tr>
<td>1</td>
<td>Бард</td>
<td>12</td>
<td>Колдун</td>
</tr>
<tr>
<td>2</td>
<td>Варвар</td>
<td>13</td>
<td>Монах</td>
</tr>
<tr>
<td>3-4</td>
<td>Воин</td>
<td>14</td>
<td>Паладин</td>
</tr>
<tr>
<td>5-8</td>
<td>Волшебник</td>
<td>15-18</td>
<td>Плут</td>
</tr>
<tr>
<td>9</td>
<td>Друид</td>
<td>19</td>
<td>Следопыт</td>
</tr>
<tr>
<td>10-11</td>
<td>Жрец</td>
<td>20</td>
<td>Чародей</td>
</tr>
</table>
!!!!''Коммерческая деятельность''
<table>
<tr>
<th>к100+ дни</th>
<th>Результат</th>
</tr>
<tr>
<td>01-20</td>
<td> Вы должны заплатить по полторы стоимости ведения бизнеса за каждый день.</td>
</tr>
<tr>
<td>21-30 </td>
<td>Вы должны заплатить полную стоимость ведения бизнеса за каждый день.</td>
</tr>
<tr>
<td>31-40</td>
<td>Вы должны заплатить половину стоимости ведения бизнеса за каждый день. Оставшуюся половину покрывает прибыль.</td>
</tr>
<tr>
<td>41-60 </td>
<td>Прибыль от деятельности покрывает стоимость ведения бизнеса за каждый день.</td>
</tr>
<tr>
<td>61-80 </td>
<td>Прибыль от деятельности покрывает стоимость ведения бизнеса за каждый день и приносит 1 к6 х 5</td>
</tr>
<tr>
<td>81-90 </td>
<td>Прибыль от деятельности покрывает стоимость ведения бизнеса за каждый день и приносит 2к8 х 5 зм.</td>
</tr>
<tr>
<td>91 и выше</td>
<td>Прибыль от деятельности покрывает стоимость веде-выше ния бизнеса за каждый день и приносит 3к10 х 5 зм.</td>
</tr>
</table>
<table>
<tr>
<th>к12</th>
<th>Кульминация</th>
</tr>
<tr>
<td>1</td>
<td>Искатели приключений сталкиваются с главным злодеем и его приспешниками в финальной кровавой битве.</td>
</tr>
<tr>
<td>2</td>
<td>Искатели приключений преследуют злодея, обходя все ловушки, которые он для них приготовил, и, в конце концов, сталкиваются с ним в финальной битве в его убежище или за его пределами.</td>
</tr>
<tr>
<td>3</td>
<td>Действия главных героев или злодея вызывают катастрофу, в которой искатели приключений должны выжить.</td>
</tr>
<tr>
<td>4</td>
<td>Искатели приключений мчатся к месту, где злодей приводит в исполнение свой главный план, и прибывают туда точно в последний момент.</td>
</tr>
<tr>
<td>5</td>
<td>Злодей и два или три помощника проводят отдельные обряды в большой комнате. Искатели приключений должны помешать им всем одновременно.</td>
</tr>
<tr>
<td>6</td>
<td>Союзник предаёт искателей приключений как раз тогда, когда они уже вот-вот достигнут своей цели (используйте этот вариант осторожно, и не злоупотребляйте им).</td>
</tr>
<tr>
<td>7</td>
<td>Портал, ведущий на другой план, начинает открываться. Из него выходят различные существа, вынуждая искателей приключений закрывать портал и разбираться со злодеем одновременно.</td>
</tr>
<tr>
<td>8</td>
<td>Ловушки, опасности и оживлённые предметы выматывают искателей приключений, и тут же нападает главный злодей.</td>
</tr>
<tr>
<td>9</td>
<td>Подземелье начинает разрушаться, а искатели приключений сталкиваются с главным злодеем, который пытается скрыться, воспользовавшись образованным хаосом.</td>
</tr>
<tr>
<td>10</td>
<td>Появляется угроза, которая гораздо сильнее искателей приключений, которая уничтожает главного злодея и переключает своё внимание на героев.</td>
</tr>
<tr>
<td>11</td>
<td>Искателям приключений нужно выбрать: погнаться за убегающим главным злодеем или спасать друга или группу невиновных.</td>
</tr>
<tr>
<td>12</td>
<td>Искателям приключений необходимо обнаружить секретную слабость главного злодея, иначе нет надежды на победу над ним.</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Культ или религиозная группа</th>
</tr>
<tr>
<td>1</td>
<td>Культ демонопоклонников</td>
</tr>
<tr>
<td>2</td>
<td>Культ дьяволопоклонников</td>
</tr>
<tr>
<td>3-4</td>
<td>Культ стихийной воды</td>
</tr>
<tr>
<td>5-6</td>
<td>Культ стихийного воздуха</td>
</tr>
<tr>
<td>7-8</td>
<td>Культ стихийной земли</td>
</tr>
<tr>
<td>9-10</td>
<td>Культ стихийного огня</td>
</tr>
<tr>
<td>11-15</td>
<td>Последователи доброго божества</td>
</tr>
<tr>
<td>16-17</td>
<td>Последователи злого божества</td>
</tr>
<tr>
<td>18-20</td>
<td>Последователи нейтрального божества</td>
</tr>
</table>
!!!!''Кутёж''
<table>
<tr>
<th>к100 + уровень</th>
<th>Результат</th>
</tr>
<tr>
<td>01-10 </td>
<td>Вы попали в тюрьму на 1 к4 дня в конце простоя по обвинению в неповиновении и нарушении спокойствия. Вы можете заплатить штраф 10 зм, чтобы избежать тюрьмы, или можете сопротивляться аресту.</td>
</tr>
<tr>
<td>11-20 </td>
<td>Вы приходите в сознание в странном месте, не помня, как там оказались, и вас грабят на 3к6 х 5 зм.</td>
</tr>
<tr>
<td>21-30 </td>
<td>Вы нажили врага. Теперь некая личность или организация враждебна к вам. Оскорблённую сторону определяет Мастер, а вы решаете, что это было за оскорбление.</td>
</tr>
<tr>
<td>31-40 </td>
<td>Вы закрутили любовную интрижку. Бросьте к20. Если выпадет «1-5», вы расстаётесь со скандалом. Если выпадет «6-10», вы расстаётесь полюбовно. Если выпадет «11-20», ваш роман продолжается. Вы сами определяете личность партнёра, но Мастер должен её одобрить. Если вы расстались со скандалом, вы можете получить новую слабость. Если вы расстались полюбовно или роман ещё продолжается, партнёр может стать новой привязанностью.</td>
</tr>
<tr>
<td>41-80 </td>
<td>Вы получили хороший выигрыш в азартной игре и компенсируете затраты на богатое проживание на время кутежа.</td>
</tr>
<tr>
<td>81-90 </td>
<td>Вы получили хороший выигрыш в азартной игре и компенсируете затраты на богатое проживание на время кутежа и получаете 1к20 х 4 зм.</td>
</tr>
<tr>
<td>91 и выше </td>
<td>Вы получили хороший выигрыш в азартной игре и выше компенсируете затраты на богатое проживание на время кутежа и получаете 4к6 х 10 зм. Ваш кутёж входит в местные легенды.</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
<th rowspan="11"></th>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1</td>
<td>Ломбард</td>
<td>11</td>
<td>Кузница</td>
</tr>
<tr>
<td>2</td>
<td>Травы /благовония</td>
<td>12</td>
<td>Столяр</td>
</tr>
<tr>
<td>3</td>
<td>Фрукты/овощи</td>
<td>13</td>
<td>Ткач</td>
</tr>
<tr>
<td>4</td>
<td>Сушёное мясо</td>
<td>14</td>
<td>Ювелир</td>
</tr>
<tr>
<td>5</td>
<td>Гончар</td>
<td>15</td>
<td>Пекарь</td>
</tr>
<tr>
<td>6</td>
<td>Гробовщик</td>
<td>16</td>
<td>Картограф</td>
</tr>
<tr>
<td>7</td>
<td>Книги</td>
<td>17</td>
<td>Портной</td>
</tr>
<tr>
<td>8</td>
<td>Ростовщик</td>
<td>18</td>
<td>Канатчик</td>
</tr>
<tr>
<td>9</td>
<td>Оружие/доспехи</td>
<td>19</td>
<td>Каменщик</td>
</tr>
<tr>
<td>10</td>
<td>Лавочник</td>
<td>20</td>
<td>Писец</td>
</tr>
</table>
!!!!''Малые отрицательные свойства''
<table>
<tr>
<th class="SpecHead2">к100</th>
<th>Свойство</th>
</tr>
<tr>
<td>01-05</td>
<td>Пока вы настроены на артефакт, вы совершаете с помехой спасброски от заклинаний.</td>
</tr>
<tr>
<td>06-10</td>
<td>Когда вы впервые касаетесь драгоценного камня или ювелирного изделия, будучи настроенным на этот артефакт, ценность этого камня или изделия уменьшается вдвое.</td>
</tr>
<tr>
<td>11-15</td>
<td>Пока вы настроены на артефакт, вы ослеплены, пока находитесь более чем в 10 футах от него.</td>
</tr>
<tr>
<td>16-20</td>
<td>Пока вы настроены на артефакт, вы совершаете с помехой спасброски от яда.</td>
</tr>
<tr>
<td>21-30</td>
<td>Пока вы настроены на артефакт, вы испускаете отвратительный запах, ощутимый с 10 футов.</td>
</tr>
<tr>
<td>31-35</td>
<td>Пока вы настроены на артефакт, вся святая вода в пределах 10 футов от вас уничтожается.</td>
</tr>
<tr>
<td>36-40</td>
<td>Пока вы настроены на артефакт, ваше тело болеет физически и вы совершаете с помехой проверки характеристик и спасброски, использующие Силу или Телосложение.</td>
</tr>
<tr>
<td>41-45</td>
<td>Пока вы настроены на артефакт, ваш вес увеличивается на 1к4 х 10 фунтов.</td>
</tr>
<tr>
<td>46-50</td>
<td>Пока вы настроены на артефакт, ваша внешность меняется так, как решит Мастер.</td>
</tr>
<tr>
<td>51-55</td>
<td>Пока вы настроены на артефакт, вы глухи, пока находитесь более чем в 10 футах от него.</td>
</tr>
<tr>
<td>56-60</td>
<td>Пока вы настроены на артефакт, ваш вес уменьшается на 1к4 х 5 фунтов.</td>
</tr>
<tr>
<td>61-65</td>
<td>Пока вы настроены на артефакт, вы теряете обоняние.</td>
</tr>
<tr>
<td>66-70</td>
<td>Пока вы настроены на артефакт, немагическое пламя тухнет в пределах 30 футов от вас.</td>
</tr>
<tr>
<td>71-80</td>
<td>Пока вы настроены на артефакт, другие существа не могут совершать короткий и продолжительный отдых, находясь в пределах 300 футов от вас.</td>
</tr>
<tr>
<td>81-85</td>
<td>Пока вы настроены на артефакт, вы причиняете урон некротической энергией 1к6 всем растениям, не являющимся существами, которых вы касаетесь.</td>
</tr>
<tr>
<td>86-90</td>
<td>Пока вы настроены на артефакт, животные в пределах 30 футов от вас враждебны по отношению к вам.</td>
</tr>
<tr>
<td>91-95</td>
<td>Пока вы настроены на артефакт, вы должны есть и пить в шесть раз больше, чем обычно.</td>
</tr>
<tr>
<td>96-00</td>
<td>Пока вы настроены на артефакт, ваша слабость усиливается так, как решит Мастер.</td>
</tr>
</table>
!!!!''Малые положительные свойства''
<table>
<tr>
<th class="SpecHead2">к100</th>
<th>Свойство</th>
</tr>
<tr>
<td>01–20</td>
<td>Пока вы настроены на артефакт, вы получаете владение одним навыком на выбор Мастера.</td>
</tr>
<tr>
<td>21–30</td>
<td>Пока вы настроены на артефакт, вы обладаете иммунитетом к болезням.</td>
</tr>
<tr>
<td>31–40</td>
<td>Пока вы настроены на артефакт, вы не можете быть очарованы и испуганы.</td>
</tr>
<tr>
<td>41–50</td>
<td>Пока вы настроены на артефакт, вы получаете сопротивление к одному виду урона на выбор Мастера.</td>
</tr>
<tr>
<td>51–60</td>
<td>Пока вы настроены на артефакт, вы можете действием накладывать им один заговор (выбранный Мастером).</td>
</tr>
<tr>
<td>61–70</td>
<td>Пока вы настроены на артефакт, вы можете действием наложить им одно заклинание 1 уровня (выбранное Мастером). Наложив заклинание, бросьте к6. При результате 1–5 вы не можете повторить это до следующего рассвета.</td>
</tr>
<tr>
<td>71–80</td>
<td>Как результат 61–70, но заклинание 2 уровня.</td>
</tr>
<tr>
<td>81–90</td>
<td>Как результат 61–70, но заклинание 3 уровня.</td>
</tr>
<tr>
<td>91–00</td>
<td>Пока вы настроены на артефакт, вы получаете бонус +l к Классу Доспеха.</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Манеры</th>
</tr>
<tr>
<td>1</td>
<td>Склонен тихо петь, насвистывать или что-то мычать</td>
</tr>
<tr>
<td>2</td>
<td>Говорит рифмами или как-то причудливо</td>
</tr>
<tr>
<td>3</td>
<td>Тихий или громкий голос</td>
</tr>
<tr>
<td>4</td>
<td>Проглатывает слова, шепелявит или заикается</td>
</tr>
<tr>
<td>5</td>
<td>Чрезвычайно чётко проговаривает слова</td>
</tr>
<tr>
<td>6</td>
<td>Говорит очень громко</td>
</tr>
<tr>
<td>7</td>
<td>Шепчет</td>
</tr>
<tr>
<td>8</td>
<td> Использует помпезную речь или длинные слова</td>
</tr>
<tr>
<td>9</td>
<td> Часто использует неправильные слова</td>
</tr>
<tr>
<td>10</td>
<td> Часто клянётся или произносит пафосные фразы</td>
</tr>
<tr>
<td>11</td>
<td>Постоянно шутит или каламбурит</td>
</tr>
<tr>
<td>12</td>
<td>Часто предрекает неудачи</td>
</tr>
<tr>
<td>13</td>
<td>Нервно дёргается</td>
</tr>
<tr>
<td>14</td>
<td> Косоглазие</td>
</tr>
<tr>
<td>15</td>
<td>Глядит вдаль</td>
</tr>
<tr>
<td>16</td>
<td>Что-то жуёт</td>
</tr>
<tr>
<td>17</td>
<td>Ходит из угла в угол</td>
</tr>
<tr>
<td>18</td>
<td>Барабанит пальцами</td>
</tr>
<tr>
<td>19</td>
<td>Кусает ногти</td>
</tr>
<tr>
<td>20</td>
<td>Накручивает на палец волосы или дёргает бороду</td>
</tr>
</table>
<table>
<tr>
<th>к100 </th>
<th>Расположение</th>
</tr>
<tr>
<td>01–04 </td>
<td>Здание в городе</td>
</tr>
<tr>
<td>05–08</td>
<td>Катакомбы или канализация под городом</td>
</tr>
<tr>
<td>09–12</td>
<td>Под сельским домом</td>
</tr>
<tr>
<td>13–16 </td>
<td>Под кладбищем</td>
</tr>
<tr>
<td>17–22 </td>
<td>Под разрушенным замком</td>
</tr>
<tr>
<td>23–26 </td>
<td>Под разрушенным городом</td>
</tr>
<tr>
<td>27–30</td>
<td>Под храмом</td>
</tr>
<tr>
<td>31–34</td>
<td>В разломе</td>
</tr>
<tr>
<td>35–38 </td>
<td>В скале</td>
</tr>
<tr>
<td>39–42</td>
<td>В пустыне</td>
</tr>
<tr>
<td>43–46</td>
<td>В лесу</td>
</tr>
<tr>
<td>47–50 </td>
<td>В леднике</td>
</tr>
<tr>
<td>51–54 </td>
<td>В овраге</td>
</tr>
<tr>
<td>55–58 </td>
<td>В джунглях</td>
</tr>
<tr>
<td>59–62 </td>
<td>В горном перевале</td>
</tr>
<tr>
<td>63–66 </td>
<td>В болоте</td>
</tr>
<tr>
<td>67–70 </td>
<td>Под столовой горой или на ней</td>
</tr>
<tr>
<td>71–74 </td>
<td>В морской пещере</td>
</tr>
<tr>
<td>75–78 </td>
<td>В нескольких соединённых столовых горах</td>
</tr>
<tr>
<td>79–82 </td>
<td>На горной вершине</td>
</tr>
<tr>
<td>83–86</td>
<td>На возвышенности</td>
</tr>
<tr>
<td>87–90 </td>
<td>На острове</td>
</tr>
<tr>
<td>91–95</td>
<td>Под водой</td>
</tr>
<tr>
<td>96–00</td>
<td>Совершите бросок по таблице «экзотические места»</td>
</tr>
</table>
<<Button "$:/Экзотические места""Экзотические места">>
<<Button "$:/Местонахождение подземелья""Местонахождение подземелья">>
<table>
<tr>
<th>к20</th>
<th colspan="2">Методы</th>
<th>к20</th>
<th colspan="2">Методы</th>
</tr>
<tr>
<th rowspan="7">1 </th>
<th colspan="2">Боевые действия (к6)</th>
<th rowspan="11">11</th>
<th colspan="2">Пленение или оказание давления (к10)</th>
</tr>
<tr>
<td>1</td>
<td>Вторжение</td>
<td>1</td>
<td>Взяточничество</td>
</tr>
<tr>
<td>2</td>
<td>Засада</td>
<td>2 </td>
<td>Заключение в тюрьме</td>
</tr>
<tr>
<td>3</td>
<td>Мятеж</td>
<td>3</td>
<td>Заковывание в кандалы</td>
</tr>
<tr>
<td>4</td>
<td>Наёмники</td>
<td>4</td>
<td>Запугивание в рамках закона</td>
</tr>
<tr>
<td>5</td>
<td>Резня</td>
<td>5</td>
<td>Насильственная вербовка</td>
</tr>
<tr>
<td>6</td>
<td>Терроризм</td>
<td>6</td>
<td>Обольщение</td>
</tr>
<tr>
<th rowspan="11">2</th>
<th colspan="2">Воровство или преступление против собственности (к10)</th>
<td>7</td>
<td>Похищения</td>
</tr>
<tr>
<td>1</td>
<td>Браконьерство</td>
<td>8</td>
<td>Рабство</td>
</tr>
<tr>
<td>2</td>
<td>Грабёж</td>
<td>9</td>
<td>Угрозы или притеснения</td>
</tr>
<tr>
<td>3 </td>
<td>Грабёж на улице</td>
<td>10</td>
<td>Экспроприация имущества</td>
</tr>
<tr>
<td>4</td>
<td>Контрабанда</td>
<th rowspan="7">12</th>
<th colspan="2">Политика (к6)</th>
</tr>
<tr>
<td>5 </td>
<td>Конфискация имущества</td>
<td>1</td>
<td>Геноцид</td>
</tr>
<tr>
<td>6 </td>
<td>Кража с взломом</td>
<td>2</td>
<td>Заговор</td>
</tr>
<tr>
<td>7</td>
<td>Мародёрство</td>
<td>3</td>
<td>Предательство или измена</td>
</tr>
<tr>
<td>8</td>
<td>Поджог</td>
<td>4</td>
<td>Увеличение налогов</td>
</tr>
<tr>
<td>9</td>
<td>Фальсификация</td>
<td>5</td>
<td>Угнетение</td>
</tr>
<tr>
<td>10</td>
<td>Шантаж или вымогательство</td>
<td>6</td>
<td>Шпионаж</td>
</tr>
<tr>
<th>3</th>
<th colspan="2">Дуэль</th>
<th rowspan="5">13</th>
<th colspan="2">Пороки (к4)</th>
</tr>
<tr>
<th rowspan="9">4</th>
<th colspan="2">Казнь (к8)</th>
<td>1</td>
<td>Азартные игры</td>
</tr>
<tr>
<td>1 </td>
<td>Жертвоприношение (живьём)</td>
<td>2</td>
<td>Наркотики или алкоголь</td>
</tr>
<tr>
<td>2</td>
<td>Закапывание живьём</td>
<td>3</td>
<td>Прелюбодеяние</td>
</tr>
<tr>
<td>3</td>
<td>Обезглавливание</td>
<td>4</td>
<td>Совращение</td>
</tr>
<tr>
<td>4</td>
<td>Повешение</td>
<th>14</th>
<th colspan="2">Пренебрежение</th>
</tr>
<tr>
<td>5</td>
<td>Распятие</td>
<th>15</th>
<th colspan="2">Преследование</th>
</tr>
<tr>
<td>6 </td>
<td>Сажание на кол</td>
<th rowspan="7">16</th>
<th colspan="2">Пытки (к6)</th>
</tr>
<tr>
<td>7</td>
<td>Сожжение у столба</td>
<td>1</td>
<td>Дыба</td>
</tr>
<tr>
<td>8</td>
<td>Четвертование</td>
<td>2</td>
<td>Кислота</td>
</tr>
<tr>
<th rowspan="6">5</th>
<th colspan="2">Клевета (к4)</th>
<td>3</td>
<td>Клеймение</td>
</tr>
<tr>
<td>1</td>
<td>Ложное обвинение</td>
<td>4</td>
<td>Ослепление</td>
</tr>
<tr>
<td>2</td>
<td>Оскорбление</td>
<td>5</td>
<td>Порка</td>
</tr>
<tr>
<td>3</td>
<td>Сплетни</td>
<td>6</td>
<td>Тиски для пальцев</td>
</tr>
<tr>
<td>4</td>
<td>Унижение</td>
<th rowspan="5">17</th>
<th colspan="2">Религия (к4)</th>
</tr>
<tr>
<td>6</td>
<td>Ложь или клятвопреступление</td>
<td>1</td>
<td>Ересь или культы</td>
</tr>
<tr>
<th rowspan="9">7</th>
<th colspan="2">Магические волнения (к8)</th>
<td>2</td>
<td>Ложные боги</td>
</tr>
<tr>
<td>1</td>
<td>Иллюзии</td>
<td>3</td>
<td>Осквернение</td>
</tr>
<tr>
<td>2</td>
<td>Контроль погоды</td>
<td>4</td>
<td>Проклятья</td>
</tr>
<tr>
<td>3</td>
<td>Контроль сознания</td>
<th>18</th>
<th colspan="2">Самозванство или маскировка</th>
</tr>
<tr>
<td>4</td>
<td>Нашествие привидений</td>
<th rowspan="5">19</th>
<th colspan="2">Сельскохозяйственная катастрофа (к4)</th>
</tr>
<tr>
<td>5 </td>
<td>Оживление нежити</td>
<td>1</td>
<td>Болезнь растений</td>
</tr>
<tr>
<td>6</td>
<td>Окаменение</td>
<td>2</td>
<td>Гибель урожая</td>
</tr>
<tr>
<td>7</td>
<td>Призыв</td>
<td>3</td>
<td>Голод</td>
</tr>
<tr>
<td>8 </td>
<td>Сделки с дьяволами</td>
<td>4</td>
<td>Засуха</td>
</tr>
<tr>
<th rowspan="7">8</th>
<th colspan="2">Мошенничество (к6)</th>
<th rowspan="11">20</th>
<th colspan="2">Убийство (к10)</th>
</tr>
<tr>
<td>1</td>
<td>Забалтывание</td>
<td>1</td>
<td>Наёмное убийство</td>
</tr>
<tr>
<td>2</td>
<td>Разрыв контракта</td>
<td>2</td>
<td>Каннибализм</td>
</tr>
<tr>
<td>3</td>
<td>Мелкий шрифт условий</td>
<td>3</td>
<td>Расчленение</td>
</tr>
<tr>
<td>4</td>
<td>Обман</td>
<td>4</td>
<td>Утопление</td>
</tr>
<tr>
<td>5</td>
<td>Самозванство или жульничество</td>
<td>5</td>
<td>Убийство электричеством</td>
</tr>
<tr>
<td>6</td>
<td>Шарлатанство или фокусы</td>
<td>6</td>
<td>Эвтаназия (насильственная)</td>
</tr>
<tr>
<th rowspan="2">9</th>
<th colspan="2" rowspan="2">Награды за голову или наёмные убийства</th>
<td>7</td>
<td>Болезнь</td>
</tr>
<tr>
<td>8</td>
<td>Отравление</td>
</tr>
<tr>
<th rowspan="2">10</th>
<th colspan="2" rowspan="2">Нападения или избиения</th>
<td>9</td>
<td>Удар кинжалом в спину</td>
</tr>
<tr>
<td>10</td>
<td>Удушение</td>
</tr>
</table>
<table>
<tr>
<th>к20 </th>
<th>Мировоззрение</th>
</tr>
<tr>
<td>1-2</td>
<td>Законно-доброе</td>
</tr>
<tr>
<td>3-4</td>
<td>Нейтрально-доброе</td>
</tr>
<tr>
<td>5-6</td>
<td>Хаотично-доброе</td>
</tr>
<tr>
<td>7-9</td>
<td>Законно-нейтральное</td>
</tr>
<tr>
<td>10-11</td>
<td>Нейтральное</td>
</tr>
<tr>
<td>12</td>
<td>Хаотично-нейтральное</td>
</tr>
<tr>
<td>13-15</td>
<td>Законно-злое</td>
</tr>
<tr>
<td>16–18</td>
<td>Нейтрально-злое</td>
</tr>
<tr>
<td>19-20</td>
<td>Хаотично-злое</td>
</tr>
</table>
!!!!''Множители''
<table>
<tr>
<th>Количество чудовищ</th>
<th>Множитель</th>
</tr>
<tr>
<td>1 </td>
<td>× 1</td>
</tr>
<tr>
<td>2 </td>
<td>× 1,5</td>
</tr>
<tr>
<td>3–6 </td>
<td>× 2</td>
</tr>
<tr>
<td>7–10</td>
<td>× 2,5<br></td>
</tr>
<tr>
<td>11–14</td>
<td>× 3<br></td>
</tr>
<tr>
<td>15 или больше</td>
<td>× 4</td>
</tr>
</table>
!!!!''Монументы''
<table>
<tr>
<th>к20</th>
<th>Монумент</th>
</tr>
<tr>
<td>1</td>
<td>Запечатанный погребальный курган или пирамида</td>
</tr>
<tr>
<td>2</td>
<td>Разграбленный погребальный курган или пирамида</td>
</tr>
<tr>
<td>3</td>
<td>Лица, вырезанные в скале</td>
</tr>
<tr>
<td>4</td>
<td>Огромные статуи, вырезанные в скале</td>
</tr>
<tr>
<td>5-6</td>
<td>Нетронутый обелиск, на котором вырезаны предупреждения, исторические знания, посвящение или религиозная иконография</td>
</tr>
<tr>
<td>7-8</td>
<td>Разрушенный или опрокинутый обелиск</td>
</tr>
<tr>
<td>9-10</td>
<td>Нетронутая статуя существа или божества</td>
</tr>
<tr>
<td>11-13</td>
<td>Разрушенная или опрокинутая статуя существа или божества</td>
</tr>
<tr>
<td>14</td>
<td>Огромная каменная стена, нетронутая, с башнями через каждую милю</td>
</tr>
<tr>
<td>15</td>
<td>Огромная разрушенная каменная стена</td>
</tr>
<tr>
<td>16</td>
<td>Огромная каменная арка</td>
</tr>
<tr>
<td>17</td>
<td>Фонтан</td>
</tr>
<tr>
<td>18</td>
<td>Нетронутый круг стоящих камней</td>
</tr>
<tr>
<td>19</td>
<td>Круг из разрушенных или опрокинутых камней</td>
</tr>
<tr>
<td>20</td>
<td>Тотемный столб</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Дилемма</th>
</tr>
<tr>
<td>1–3</td>
<td>Дилемма с другом</td>
</tr>
<tr>
<td>4–6</td>
<td>Дилемма с союзником</td>
</tr>
<tr>
<td>7–10</td>
<td>Дилемма с уважением</td>
</tr>
<tr>
<td>11–16</td>
<td>Дилемма с честью</td>
</tr>
<tr>
<td>17–20 </td>
<td>Дилемма со спасением</td>
</tr>
</table>
!!!!''Навигация в дикой местности''
<table>
<tr>
<th>Местность </th>
<th>Сл</th>
</tr>
<tr>
<td>Лес, джунгли, болото, горы или открытое море с пасмурным небом и без суши на горизонте</td>
<td>15</td>
</tr>
<tr>
<td>Арктика, пустыня, холмы или открытое море с чистым небом и без суши на горизонте</td>
<td>10</td>
</tr>
<tr>
<td>Пастбище, луг, сельхозугодья </td>
<td>5</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Первая часть</th>
<th rowspan="21"></th>
<th>к20</th>
<th>Вторая часть</th>
</tr>
<tr>
<td>1</td>
<td>Серебряный</td>
<td>1</td>
<td>Угорь</td>
</tr>
<tr>
<td>2</td>
<td>Золотой</td>
<td>2</td>
<td>Дельфин</td>
</tr>
<tr>
<td>3</td>
<td>Шатающийся</td>
<td>3</td>
<td>Дварф</td>
</tr>
<tr>
<td>4</td>
<td>Смеющийся</td>
<td>4</td>
<td>Пегас</td>
</tr>
<tr>
<td>5</td>
<td>Гарцующий</td>
<td>5</td>
<td>Пони</td>
</tr>
<tr>
<td>6</td>
<td>Позолоченный</td>
<td>6</td>
<td>Цветок</td>
</tr>
<tr>
<td>7</td>
<td>Бегущий</td>
<td>7</td>
<td>Жеребец</td>
</tr>
<tr>
<td>8</td>
<td>Воющий</td>
<td>8</td>
<td>Волк</td>
</tr>
<tr>
<td>9</td>
<td>Зарезанный</td>
<td>9</td>
<td>Ягнёнок</td>
</tr>
<tr>
<td>10</td>
<td>Хитрый</td>
<td>10</td>
<td>Демон</td>
</tr>
<tr>
<td>11</td>
<td>Пьяный</td>
<td>11</td>
<td>Козёл</td>
</tr>
<tr>
<td>12</td>
<td>Прыгающий</td>
<td>12</td>
<td>Дух</td>
</tr>
<tr>
<td>13</td>
<td>Ревущий</td>
<td>13</td>
<td>Рой</td>
</tr>
<tr>
<td>14</td>
<td>Хмурый</td>
<td>14</td>
<td>Шут</td>
</tr>
<tr>
<td>15</td>
<td>Одинокий</td>
<td>15</td>
<td>Холм</td>
</tr>
<tr>
<td>16</td>
<td>Странствующий</td>
<td>16</td>
<td>Орёл</td>
</tr>
<tr>
<td>17</td>
<td>Таинственный</td>
<td>17</td>
<td>Сатир</td>
</tr>
<tr>
<td>18</td>
<td>Лающий</td>
<td>18</td>
<td>Пёс</td>
</tr>
<tr>
<td>19</td>
<td>Чёрный</td>
<td>19</td>
<td>Паук</td>
</tr>
<tr>
<td>20</td>
<td>Сверкающий</td>
<td>20</td>
<td>Идол</td>
</tr>
</table>
!!!!''Названия оружия для уся''
<table>
<tr>
<th>Оружие</th>
<th>Другое название (культура)</th>
</tr>
<tr>
<td>Алебарда</td>
<td>дзи (Китай); камаяри (Япония)</td>
</tr>
<tr>
<td>Боевая кирка</td>
<td>фанг (Китай); кува (Япония)</td>
</tr>
<tr>
<td>Боевой посох</td>
<td>гун (Китай); бо (Япония)</td>
</tr>
<tr>
<td>Боевой топор</td>
<td>фу (Китай); масакари (Япония)</td>
</tr>
<tr>
<td>Булава</td>
<td>чуи (Китай); канабо (Япония)</td>
</tr>
<tr>
<td>Глефа</td>
<td>гуань дао (Китай); бисенто, нагината (Япония)</td>
</tr>
<tr>
<td>Двуручный меч</td>
<td>чанг дао (Китай); нодачи (Япония)</td>
</tr>
<tr>
<td>Длинное копьё</td>
<td>умаяри (Япония)</td>
</tr>
<tr>
<td>Длинный лук</td>
<td>дайкиу (Япония)</td>
</tr>
<tr>
<td>Длинный меч</td>
<td>цзянь (Китай); катана (Япония)</td>
</tr>
<tr>
<td>Дротик</td>
<td>сюрикен (Япония)</td>
</tr>
<tr>
<td>Дубинка</td>
<td>бянь (Китай); тонфа (Япония)</td>
</tr>
<tr>
<td>Кинжал</td>
<td>бишу, тамо (Китай); козука, танто (Япония)</td>
</tr>
<tr>
<td>Копьё</td>
<td>цян (Китай); яри (Япония)</td>
</tr>
<tr>
<td>Короткий лук</td>
<td>ханкю (Япония)</td>
</tr>
<tr>
<td>Короткий меч</td>
<td>шуангдао (Китай)</td>
</tr>
<tr>
<td>Метательное копьё</td>
<td>мау (Китай);учи-не (Япония)</td>
</tr>
<tr>
<td>Палица</td>
<td>тетсубо (Япония)</td>
</tr>
<tr>
<td>Пика</td>
<td>мао (Китай); нагаеяри (Япония)</td>
</tr>
<tr>
<td>Ручной топор</td>
<td>оно (Япония)</td>
</tr>
<tr>
<td>Серп</td>
<td>кама (Япония)</td>
</tr>
<tr>
<td>Скимитар</td>
<td>лиу дао (Китай); вакидзаси (Япония)</td>
</tr>
<tr>
<td>Трезубец</td>
<td>ча (Китай); магарияри (Япония)</td>
</tr>
<tr>
<td>Цеп</td>
<td>нунчаку (Япония)</td>
</tr>
</table>
!!!!''Начальное снаряжение''
<table>
<tr>
<th>Уровень<br>персонажа<br></th>
<th>Кампания, в которой мало магии</th>
<th>Стандартная кампания</th>
<th>Кампания, в которой много магии</th>
</tr>
<tr>
<td>1–4</td>
<td>Обычное стартовое снаряжение</td>
<td>Обычное стартовое снаряжение </td>
<td>Обычное стартовое снаряжение</td>
</tr>
<tr>
<td>5–10</td>
<td>500 зм плюс 1к10 × 25 зм, обычное стартовое снаряжение</td>
<td>500 зм плюс 1к10 × 25 зм, обычное стартовое снаряжение</td>
<td>500 зм плюс 1к10 × 25 зм, один необычный магический предмет, обычное стартовое снаряжение</td>
</tr>
<tr>
<td>11–16</td>
<td>5000 зм плюс 1к10 × 250 зм, один необычный магический предмет, обычное стартовое снаряжение</td>
<td>5000 зм плюс 1к10 × 250 зм, два необычных магических предмета, обычное стартовое снаряжение</td>
<td>5000 зм плюс 1к10 × 250 зм, три не обычных магических предмета, один редкий предмет, обычное стартовое снаряжение</td>
</tr>
<tr>
<td>17–20</td>
<td>20000 зм плюс 1к10 × 250 зм, два необычных магических предмета, обычное стартовое снаряжение</td>
<td>20000 зм плюс 1к10 × 250 зм, два необычных магических предмета, один редкий предмет, обычное стартовое снаряжение</td>
<td>20000 зм плюс 1к10 × 250 зм, три необычных магических предмета, два редких предмета, один очень редкий предмет, обычное стартовое снаряжение</td>
</tr>
</table>
!!!!''Неудача при прочтении свитков''
<table>
<tr>
<th>к6 </th>
<th>Результат</th>
</tr>
<tr>
<td>1</td>
<td>Волна магической энергии причиняет заклинателю урон силовым полем 1к6 за каждый уровень заклинания.</td>
</tr>
<tr>
<td>2</td>
<td>Вместо намеченной цели заклинание перенаправляется на заклинателя или на его союзника (определяется случайным образом). Если изначальной целью заклинания был сам заклинатель, то оно перенаправляется на случайное существо, находящееся поблизости.</td>
</tr>
<tr>
<td>3</td>
<td>Заклинание воздействует на случайную область в пределах действия заклинания.</td>
</tr>
<tr>
<td>4</td>
<td>Эффект заклинания оказывается прямо противоположен тому, каким он должен был быть. При этом заклинание не приносит ни вреда, ни пользы. Например, огненный шар оборачивается безобидной волной холода.</td>
</tr>
<tr>
<td>5</td>
<td>Заклинатель страдает от незначительного, но причудливого эффекта, связанного с природой заклинания. Продолжительность этого эффекта такая же, как и длительность неудавшегося заклинания или же 1к10 минут для заклинаний с длительностью «мгновенная». Например, огненный шар может обернуться тем, что из ушей заклинателя в течение 1к10 минут будет идти дым.</td>
</tr>
<tr>
<td>6</td>
<td>Заклинание активируется через 1к12 часов. Если целью заклинания был сам заклинатель, то оно срабатывает как обычно. Если целью было другое существо, которого уже нет рядом, то эффект от заклинания распространяется в направлении этого существа, на расстояние максимальной дистанции самого заклинания.</td>
</tr>
</table>
!!!!''Новые организации''
<table>
<tr>
<th>к10</th>
<th>Новая организация</th>
</tr>
<tr>
<td>1</td>
<td>Криминальный синдикат/бандитский союз</td>
</tr>
<tr>
<td>2</td>
<td>Гильдия (каменщики, аптекари, ювелиры)</td>
</tr>
<tr>
<td>3 </td>
<td>Общество магии</td>
</tr>
<tr>
<td>4 </td>
<td>Военный/рыцарский орден</td>
</tr>
<tr>
<td>5 </td>
<td>Новое семейство/династия/племя/клан</td>
</tr>
<tr>
<td>6 </td>
<td>Философия/дисциплина, посвящённая принципу или идеалу</td>
</tr>
<tr>
<td>7</td>
<td>Королевство (село, город, герцогство, царство)</td>
</tr>
<tr>
<td>8</td>
<td>Религия/секта/вероисповедание</td>
</tr>
<tr>
<td>9</td>
<td>Школа/университет</td>
</tr>
<tr>
<td>10</td>
<td>Тайное общество/культ/клика</td>
</tr>
</table>
<table class="SB">
<tr>
<th colspan="7">Образ смерти</th>
</tr>
<tr>
<th colspan="7"><span style="font-style:italic">Средняя нежить, нейтрально-злая</span></th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">20</td>
</tr>
<tr>
<th>Хиты</th>
<td colspan="6">половина от максимума хитов вызвавшего его персонажа</td>
</tr>
<tr>
<th>Скорость</th>
<td colspan="6">60 фт., летая 60 фт. (парение)</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>16 (+3)</td>
<td>16 (+3)</td>
<td>16 (+3)</td>
<td>16 (+3)</td>
<td>16 (+3)</td>
<td>16 (+3)</td>
</tr>
<tr>
<th>Иммунитет к урону</th>
<td colspan="6">некротическая энергия, яд</td>
</tr>
<tr>
<th>Иммунитет к состоянию</th>
<td colspan="6">бессознательность, испуган, окаменение, отравление, очарован, парализован</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">тёмное зрение 60 фт., истинное зрение 60 фт., пассивная Внимательность 13</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">все языки, известные вызвавшему его персонажу</td>
</tr>
<tr>
<th>Опасность</th>
<td colspan="6">— (0 опыта)</td>
</tr>
</table>
[img height="750px"[https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/287/1000/1000/636252770700032248.jpeg]]
[img height="250px"[https://media-waterdeep.cursecdn.com/avatars/thumbnails/0/287/1000/1000/636252770700032248.jpeg]]
<table class="SB">
<tr>
<th colspan="7">Огр зомби</th>
</tr>
<tr>
<th colspan="7">Большая нежить, нейтрально-злая</th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">8</td>
</tr>
<tr>
<th>Хиты </th>
<td colspan="6">85 (9к10 + 36)</td>
</tr>
<tr>
<th>Скорость </th>
<td colspan="6">30 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>19 (+4)</td>
<td>6 (–2) </td>
<td>18 (+4)</td>
<td>3 (–4)</td>
<td>6 (–2)</td>
<td>5 (–3)</td>
</tr>
<tr>
<th>Спасброски</th>
<td colspan="6">Мдр +0</td>
</tr>
<tr>
<th>Иммунитет к урону</th>
<td colspan="6">яд</td>
</tr>
<tr>
<th>Иммунитет к состоянию</th>
<td colspan="6">отравление</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">тёмное зрение 60 фт., пассивная Внимательность 8</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">понимает Великаний и Общий, но не говорит</td>
</tr>
<tr>
<th>Опасность</th>
<td colspan="6">2 (450 опыта)</td>
</tr>
</table>
!!!!''Опыт за день приключений''
<table>
<tr>
<th>Уровень</th>
<th>Модифицированный опыт на персонажа<br></th>
<th></th>
<th>Уровень</th>
<th>Модифицированный опыт на персонажа</th>
</tr>
<tr>
<td>1</td>
<td>300</td>
<th></th>
<td>11 </td>
<td>10 500</td>
</tr>
<tr>
<td>2</td>
<td>600</td>
<th></th>
<td>12 </td>
<td>11 500</td>
</tr>
<tr>
<td>3</td>
<td>1 200</td>
<th></th>
<td>13 </td>
<td>13 500</td>
</tr>
<tr>
<td>4</td>
<td>1 700</td>
<th></th>
<td>14</td>
<td>15 000</td>
</tr>
<tr>
<td>5</td>
<td>3 500 </td>
<th></th>
<td>15</td>
<td>18 000</td>
</tr>
<tr>
<td>6</td>
<td>4 000</td>
<th></th>
<td>16 </td>
<td>20 000</td>
</tr>
<tr>
<td>7</td>
<td>5 000</td>
<th></th>
<td>17</td>
<td>25 000</td>
</tr>
<tr>
<td>8</td>
<td>6 000</td>
<th></th>
<td>18 </td>
<td>27 000</td>
</tr>
<tr>
<td>9</td>
<td>7 500</td>
<th></th>
<td>19 </td>
<td>30 000</td>
</tr>
<tr>
<td>10</td>
<td>9 000</td>
<th></th>
<td>20 </td>
<td>40 000</td>
</tr>
</table>
!!!!''Основные отрицательные свойства''
<table>
<tr>
<th class="SpecHead2">к100</th>
<th>Свойство</th>
</tr>
<tr>
<td>01-05</td>
<td>Пока вы настроены на артефакт, вы совершаете с помехой спасброски от заклинаний.</td>
</tr>
<tr>
<td>06-10</td>
<td>Когда вы впервые касаетесь драгоценного камня или ювелирного изделия, будучи настроенным на этот артефакт, ценность этого камня или изделия уменьшается вдвое.</td>
</tr>
<tr>
<td>11-15</td>
<td>Пока вы настроены на артефакт, вы ослеплены, пока находитесь более чем в 10 футах от него.</td>
</tr>
<tr>
<td>16-20</td>
<td>Пока вы настроены на артефакт, вы совершаете с помехой спасброски от яда.</td>
</tr>
<tr>
<td>21-30</td>
<td>Пока вы настроены на артефакт, вы испускаете отвратительный запах, ощутимый с 10 футов.</td>
</tr>
<tr>
<td>31-35</td>
<td>Пока вы настроены на артефакт, вся святая вода в пределах 10 футов от вас уничтожается.</td>
</tr>
<tr>
<td>36-40</td>
<td>Пока вы настроены на артефакт, ваше тело болеет физически и вы совершаете с помехой проверки характеристик и спасброски, использующие Силу или Телосложение.</td>
</tr>
<tr>
<td>41-45</td>
<td>Пока вы настроены на артефакт, ваш вес увеличивается на 1к4 х 10 фунтов.</td>
</tr>
<tr>
<td>46-50</td>
<td>Пока вы настроены на артефакт, ваша внешность меняется так, как решит Мастер.</td>
</tr>
<tr>
<td>51-55</td>
<td>Пока вы настроены на артефакт, вы глухи, пока находитесь более чем в 10 футах от него.</td>
</tr>
<tr>
<td>56-60</td>
<td>Пока вы настроены на артефакт, ваш вес уменьшается на 1к4 х 5 фунтов.</td>
</tr>
<tr>
<td>61-65</td>
<td>Пока вы настроены на артефакт, вы теряете обоняние.</td>
</tr>
<tr>
<td>66-70</td>
<td>Пока вы настроены на артефакт, немагическое пламя тухнет в пределах 30 футов от вас.</td>
</tr>
<tr>
<td>71-80</td>
<td>Пока вы настроены на артефакт, другие существа не могут совершать короткий и продолжительный отдых, находясь в пределах 300 футов от вас.</td>
</tr>
<tr>
<td>81-85</td>
<td>Пока вы настроены на артефакт, вы причиняете урон некротической энергией 1к6 всем растениям, не являющимся существами, которых вы касаетесь.</td>
</tr>
<tr>
<td>86-90</td>
<td>Пока вы настроены на артефакт, животные в пределах 30 футов от вас враждебны по отношению к вам.</td>
</tr>
<tr>
<td>91-95</td>
<td>Пока вы настроены на артефакт, вы должны есть и пить в шесть раз больше, чем обычно.</td>
</tr>
<tr>
<td>96-00</td>
<td>Пока вы настроены на артефакт, ваша слабость усиливается так, как решит Мастер.</td>
</tr>
</table>
!!!!''Основные положительные свойства''
<table>
<tr>
<th class="SpecHead2">к100</th>
<th>Свойство</th>
</tr>
<tr>
<td>01-10</td>
<td>Пока вы настроены на артефакт, одна из ваших характеристик (на выбор Мастера) увеличивается на 2, с максимумом 24.</td>
</tr>
<tr>
<td>21-30</td>
<td>Пока вы настроены на артефакт, вы восстанавливаете 1к6 хитов в начале каждого своего хода, если у вас есть хотя бы 1 хит.</td>
</tr>
<tr>
<td>31-40</td>
<td>Если вы попадаете атакой оружием, будучи настроенным на этот артефакт, цель получает дополнительный урон 1к6, чей вид соответствует оружию.</td>
</tr>
<tr>
<td>41-50</td>
<td>Пока вы настроены на артефакт, ваша скорость ходьбы увеличивается на 10 футов.</td>
</tr>
<tr>
<td>51-60</td>
<td>Пока вы настроены на артефакт, вы можете действием наложить им одно заклинание 4 уровня (выбранное Мастером). Наложив заклинание, бросьте к6. При результате 1-5 вы не можете повторить это до следующего рассвета.</td>
</tr>
<tr>
<td>61-70</td>
<td>Как результат 51-60, но заклинание 5 уровня.</td>
</tr>
<tr>
<td>71-80</td>
<td>Как результат 51-60, но заклинание 6 уровня</td>
</tr>
<tr>
<td>81-90</td>
<td>Как результат 51-60, но заклинание 7 уровня</td>
</tr>
<tr>
<td>91–00</td>
<td>Пока вы настроены на артефакт, вы получаете бонус +l к Классу Доспеха.</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Событие</th>
</tr>
<tr>
<td>01–02 </td>
<td>Введение в должность рыцаря или другого дворянина</td>
</tr>
<tr>
<td>03–04</td>
<td>Введение в должность священника</td>
</tr>
<tr>
<td>05–06 </td>
<td>Выпуск курсантов или волшебников</td>
</tr>
<tr>
<td>07–08 </td>
<td>Выступление артистов</td>
</tr>
<tr>
<td>09–10</td>
<td>Годовщина важного события</td>
</tr>
<tr>
<td>11–12</td>
<td>Годовщина правления монарха</td>
</tr>
<tr>
<td>13–14 </td>
<td>Городской фестиваль</td>
</tr>
<tr>
<td>15–16</td>
<td>День аудиенции с королём</td>
</tr>
<tr>
<td>17–18 </td>
<td>День поминовения былой трагедии</td>
</tr>
<tr>
<td>19–20 </td>
<td>День рождения важного ПМ</td>
</tr>
<tr>
<td>21–22 </td>
<td>Жестокое восстание</td>
</tr>
<tr>
<td>23–24 </td>
<td>Заседание совета</td>
</tr>
<tr>
<td>25–26 </td>
<td>Казнь</td>
</tr>
<tr>
<td>27–28 </td>
<td>Королевский бал</td>
</tr>
<tr>
<td>29–30 </td>
<td>Королевское обращение или прокламация</td>
</tr>
<tr>
<td>31–32 </td>
<td>Коронация</td>
</tr>
<tr>
<td>33–34 </td>
<td>Лунное затмение</td>
</tr>
<tr>
<td>35–36 </td>
<td>Миграция чудовищ</td>
</tr>
<tr>
<td>37–38</td>
<td>Новолуние</td>
</tr>
<tr>
<td>39–40</td>
<td>Новый год</td>
</tr>
<tr>
<td>41–42</td>
<td>Освящение нового храма</td>
</tr>
<tr>
<td>43–44 </td>
<td>Память солдат, погибших на войне</td>
</tr>
<tr>
<td>45–46</td>
<td>Парад планет</td>
</tr>
<tr>
<td>47–48</td>
<td>Планарное слияние</td>
</tr>
<tr>
<td>49–50 </td>
<td>Подписание договора</td>
</tr>
<tr>
<td>51–52 </td>
<td>Полнолуние</td>
</tr>
<tr>
<td>53–54 </td>
<td>Помилование заключённого</td>
</tr>
<tr>
<td>55–56 </td>
<td>Похороны</td>
</tr>
<tr>
<td>57–58 </td>
<td>Появление кометы</td>
</tr>
<tr>
<td>59–60</td>
<td>Праздник урожая</td>
</tr>
<tr>
<td>61–62</td>
<td>Прибытие важного ПМ</td>
</tr>
<tr>
<td>63–64</td>
<td>Прибытие каравана или корабля</td>
</tr>
<tr>
<td>65–66</td>
<td>Прибытие марширующих модронов</td>
</tr>
<tr>
<td>67–68</td>
<td>Прибытие цирка</td>
</tr>
<tr>
<td>69–70</td>
<td>Равноденствие или солнцестояние</td>
</tr>
<tr>
<td>71–72 </td>
<td>Рождение ребёнка</td>
</tr>
<tr>
<td>73–74 </td>
<td>Свадьба или годовщина свадьбы</td>
</tr>
<tr>
<td>75–76 </td>
<td>Святой день</td>
</tr>
<tr>
<td>77–78 </td>
<td>Событие на арене</td>
</tr>
<tr>
<td>79–80</td>
<td>Солнечное затмение</td>
</tr>
<tr>
<td>81–82 </td>
<td>Спортивное событие</td>
</tr>
<tr>
<td>83–85 </td>
<td>Судебный процесс</td>
</tr>
<tr>
<td>86–88 </td>
<td>Турнир</td>
</tr>
<tr>
<td>89–90 </td>
<td>Фестиваль плодородия</td>
</tr>
<tr>
<td>91–92 </td>
<td>Фестиваль середины зимы</td>
</tr>
<tr>
<td>93–96</td>
<td>Фестиваль середины лета</td>
</tr>
<tr>
<td>97–98 </td>
<td>Шествие призраков</td>
</tr>
<tr>
<td>99–00</td>
<td>Совпадение двух событий (бросьте кость дважды, игнорируя выпадение «99» и «100»)</td>
</tr>
</table>
Вы можете базировать всё своё приключение на основных событиях или использовать их, чтобы заинтересовать игроков. В таблице представлены несколько идей, но вы всегда можете создать собственное событие, основываясь на предложенных.
{{$:/Основные События}}
!!!!''Открытия''
<table>
<tr>
<th>к10</th>
<th>Открытие</th>
</tr>
<tr>
<td>1</td>
<td>Древние руины/потерянный город легендарной расы</td>
</tr>
<tr>
<td>2</td>
<td>Животное/чудовище/магическая мутация</td>
</tr>
<tr>
<td>3</td>
<td>Изобретение/технология/магия (полезная, разрушительная)</td>
</tr>
<tr>
<td>4</td>
<td>Новый (или забытый) бог или планарная сущность</td>
</tr>
<tr>
<td>5</td>
<td>Новый (или найденный) артефакт или религиозная реликвия</td>
</tr>
<tr>
<td>6</td>
<td>Новый земли (остров, континент, затерянный мир, демиплан)</td>
</tr>
<tr>
<td>7</td>
<td>Потусторонний объект (планарный портал, инопланетный космический корабль)</td>
</tr>
<tr>
<td>8</td>
<td>Люди (род, племя, потерянная цивилизация, колония)</td>
</tr>
<tr>
<td>9</td>
<td>Растение (чудодейственная трава, грибковые паразиты, разумное растение)</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Результат</th>
</tr>
<tr>
<td>1-10</td>
<td>Гармония</td>
</tr>
<tr>
<td>11-14</td>
<td>Напряжение или вражда</td>
</tr>
<tr>
<td>15-16</td>
<td>Расовое большинство — завоеватели</td>
</tr>
<tr>
<td>17</td>
<td>Расовое меньшинство — правители</td>
</tr>
<tr>
<td>18</td>
<td>Расовое меньшинство — беженцы</td>
</tr>
<tr>
<td>19</td>
<td>Расовое большинство притесняет меньшинство</td>
</tr>
<tr>
<td>20</td>
<td>Расовое меньшинство притесняет большинство</td>
</tr>
</table>
!!!!''Отчаяние Царства Теней''
<table>
<tr>
<th>к6 <br></th>
<th>Эффект</th>
</tr>
<tr>
<td>1-3</td>
<td>Апатия. Персонаж совершает с помехой спасброски от смерти и проверки Ловкости для определения инициативы, а также получает следующую слабость: «Мне кажется, что всё бессмысленно».</td>
</tr>
<tr>
<td>4-5</td>
<td>Ужас. Персонаж совершает с помехой все спасброски и получает следующую слабость: «Я уверен, что это место убьёт меня».</td>
</tr>
<tr>
<td>6</td>
<td>Безумие. Персонаж совершает с помехой проверки характеристик и спасброски, использующие Интеллект, Мудрость или Харизму, и получает следующую слабость: «Теперь я не знаю, что реально, а что — нет».</td>
</tr>
</table>
<table>
<tr>
<th>
<$select field='class' multiple size='8'>
<option>Бард</option>
<option>Волшебник</option>
<option>Друид</option>
<option>Жрец</option>
<option>Колдун</option>
<option>Паладин</option>
<option>Следопыт</option>
<option>Чародей</option>
</$select>
</th>
<th>
<$select field='lvl' multiple size='10'>
<option>Заговор</option>
<option>1 Уровень</option>
<option>2 Уровень</option>
<option>3 Уровень</option>
<option>4 Уровень</option>
<option>5 Уровень</option>
<option>6 Уровень</option>
<option>7 Уровень</option>
<option>8 Уровень</option>
<option>9 Уровень</option>
</$select>
</th>
<th>
<$select field='School' multiple size='8'>
<option>Воплощение</option>
<option>Ограждение</option>
<option>Вызов</option>
<option>Некромантия</option>
<option>Иллюзия</option>
<option>Очарование</option>
<option>Прорицание</option>
<option>Преобразование</option>
</$select>
</th>
<th>
<$checkbox field="ritual" checked="+" unchecked="-" default="-"> Only ritual spells?
</$checkbox>
</th>
<th>
<$checkbox field="conc" checked="+" unchecked="-" default="-"> Only concentration spell?
</$checkbox>
</th>
</tr>
</table>
<$button>
<$action-setfield $field="sсhool" $value=""/>
<$action-setfield $field="lvl" $value=""/>
<$action-setfield $field="class" $value=""/>
<$action-setfield $field="ritual" $value=""/>
<$action-setfield $field="conc" $value=""/>
Reset Filter
</$button>
<$reveal type="match" state="!!class" text="Бард">
<<list-links filter:"[prefix[J]]">>
</$reveal>
<table>
<tr>
<th>к8</th>
<th colspan="2">Задача и план</th>
</tr>
<tr>
<th rowspan="5">1</th>
<th colspan="2">Бессмертие (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Заполучить легендарный предмет для продления жизни</td>
</tr>
<tr>
<td>2</td>
<td>Стать богом</td>
</tr>
<tr>
<td>3</td>
<td>Стать нежитью или получить молодое тело</td>
</tr>
<tr>
<td>4</td>
<td>Украсть сущность планарного существа</td>
</tr>
<tr>
<th rowspan="5">2</th>
<th colspan="2">Богатство (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Контролировать природные ресурсы или торговлю ими</td>
</tr>
<tr>
<td>2</td>
<td>Заключить брак по расчёту</td>
</tr>
<tr>
<td>3</td>
<td>Разграбить древние руины</td>
</tr>
<tr>
<td>4</td>
<td>Отбирать земли, товары или деньги</td>
</tr>
<tr>
<th rowspan="5">3</th>
<th colspan="2">Власть (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Завоевать регион или разжечь восстание</td>
</tr>
<tr>
<td>2</td>
<td>Захватить контроль над армией</td>
</tr>
<tr>
<td>3</td>
<td>Стать «серым кардиналом»</td>
</tr>
<tr>
<td>4</td>
<td>Заслужить расположение правителя</td>
</tr>
<tr>
<th rowspan="5">4</th>
<th colspan="2">Влияние (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Получить важную должность или титул</td>
</tr>
<tr>
<td>2</td>
<td>Победить в соревновании или турнире</td>
</tr>
<tr>
<td>3</td>
<td>Получить расположение влиятельной личности</td>
</tr>
<tr>
<td>4</td>
<td>Заполучить послушную марионетку во власти</td>
</tr>
<tr>
<th rowspan="7">5</th>
<th colspan="2">Волнения (к6)</th>
</tr>
<tr>
<td>1</td>
<td>Выполнить апокалиптичное пророчество</td>
</tr>
<tr>
<td>2</td>
<td>Воплотить мстительную волю божества или покровителя</td>
</tr>
<tr>
<td>3</td>
<td>Разнести заразную болезнь</td>
</tr>
<tr>
<td>4</td>
<td>Свергнуть правительство</td>
</tr>
<tr>
<td>5</td>
<td>Вызвать природную катастрофу</td>
</tr>
<tr>
<td>6</td>
<td>Полностью уничтожить родословную или клан</td>
</tr>
<tr>
<th rowspan="7">6</th>
<th colspan="2">Магия (к6)</th>
</tr>
<tr>
<td>1</td>
<td>Получить древний артефакт</td>
</tr>
<tr>
<td>2</td>
<td>Создать конструкт или магическое устройство</td>
</tr>
<tr>
<td>3</td>
<td>Воплотить желания божества</td>
</tr>
<tr>
<td>4</td>
<td>Предложить жертву божеству</td>
</tr>
<tr>
<td>5</td>
<td>Контакт с утерянным божеством или силой</td>
</tr>
<tr>
<td>6</td>
<td>Открыть врата в иной мир</td>
</tr>
<tr>
<th rowspan="5">7</th>
<th colspan="2">Месть (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Отомстить за унижение или оскорбление</td>
</tr>
<tr>
<td>2</td>
<td>Отомстить за тюремное заточение или травму</td>
</tr>
<tr>
<td>3</td>
<td>Отомстить за смерть любимой (-ого)</td>
</tr>
<tr>
<td>4</td>
<td>Вернуть украденную вещь и наказать вора</td>
</tr>
<tr>
<th rowspan="5">8</th>
<th colspan="2">Страсть (к4)</th>
</tr>
<tr>
<td>1</td>
<td>Продлить жизнь возлюбленной (-ого)</td>
</tr>
<tr>
<td>2</td>
<td>Доказать свою любовь</td>
</tr>
<tr>
<td>3</td>
<td>Воскресить или воссоздать любимую (-ого)</td>
</tr>
<tr>
<td>4</td>
<td>Уничтожить соперников</td>
</tr>
</table>
<table>
<tr>
<th>к8</th>
<th>Побочное задание</th>
</tr>
<tr>
<td>1</td>
<td>Найти особый предмет, который, по слухам, находится в этом районе.</td>
</tr>
<tr>
<td>2</td>
<td>Вернуть украденный предмет, который сейчас находится в распоряжении злодея.</td>
</tr>
<tr>
<td>3</td>
<td>Получить информацию от ПМ, находящегося в этой области.</td>
</tr>
<tr>
<td>4</td>
<td>Спасти пленника.</td>
</tr>
<tr>
<td>5</td>
<td>Выяснить, что случилось с пропавшим ПМ.</td>
</tr>
<tr>
<td>6</td>
<td>Убить особое чудовище.</td>
</tr>
<tr>
<td>7</td>
<td>Выяснить природу и происхождение странного явления в этой области.</td>
</tr>
<tr>
<td>8</td>
<td>Обеспечить помощь персонажу или существу в этом районе.</td>
</tr>
</table>
!!!!''Погода''
<table>
<tr>
<th>к20</th>
<th>Температура</th>
</tr>
<tr>
<td>1-14</td>
<td>Обычная для времени года</td>
</tr>
<tr>
<td>15-17</td>
<td>На 1 к4 х 5 градусов холоднее, чем обычно</td>
</tr>
<tr>
<td>18-20</td>
<td>На 1 к4 х 5 градусов жарче, чем обычно</td>
</tr>
<tr>
<th>к20</th>
<th>Ветер</th>
</tr>
<tr>
<td>1-12</td>
<td>Отсутствует</td>
</tr>
<tr>
<td>13-17</td>
<td>Лёгкий</td>
</tr>
<tr>
<td>18-20</td>
<td>Сильный</td>
</tr>
<tr>
<th>к20</th>
<th>Осадки</th>
</tr>
<tr>
<td>1-12</td>
<td>Отсутствуют</td>
</tr>
<tr>
<td>13-17</td>
<td>Лёгкий дождь или снегопад</td>
</tr>
<tr>
<td>18-20</td>
<td>Сильный дождь или снегопад</td>
</tr>
</table>
!!!!''Пороговые значения опыта для определения уровня сложности''
<table>
<tr>
<th rowspan="2">Уровень персонажа</th>
<th colspan="4">Сложность сцены</th>
</tr>
<tr>
<th>Легко</th>
<th>Средне</th>
<th>Сложно</th>
<th>Смертельно</th>
</tr>
<tr>
<td>1</td>
<td>25</td>
<td>50</td>
<td>75</td>
<td>100</td>
</tr>
<tr>
<td>2</td>
<td>50</td>
<td>100</td>
<td>150</td>
<td>200</td>
</tr>
<tr>
<td>3</td>
<td>75</td>
<td>150</td>
<td>225</td>
<td>400</td>
</tr>
<tr>
<td>4</td>
<td>125</td>
<td>250</td>
<td>375</td>
<td>500</td>
</tr>
<tr>
<td>5</td>
<td>250</td>
<td>500</td>
<td>750</td>
<td>1 100</td>
</tr>
<tr>
<td>6</td>
<td>300</td>
<td>600</td>
<td>900</td>
<td>1 400</td>
</tr>
<tr>
<td>7</td>
<td>350</td>
<td>750</td>
<td>1 100</td>
<td>1 700</td>
</tr>
<tr>
<td>8</td>
<td>450</td>
<td>900</td>
<td>1400</td>
<td>2 100</td>
</tr>
<tr>
<td>9</td>
<td>550</td>
<td>1 100</td>
<td>1 600</td>
<td>2 400</td>
</tr>
<tr>
<td>10</td>
<td>600</td>
<td>1 200</td>
<td>1 900</td>
<td>2 800</td>
</tr>
<tr>
<td>11</td>
<td>800</td>
<td>1 600</td>
<td>2 400</td>
<td>3 600</td>
</tr>
<tr>
<td>12</td>
<td>1 000</td>
<td>2 000</td>
<td>3 000</td>
<td>4 500</td>
</tr>
<tr>
<td>13</td>
<td>1 100</td>
<td>2 200</td>
<td>3 400</td>
<td>5 100</td>
</tr>
<tr>
<td>14</td>
<td>1 250</td>
<td>2 500</td>
<td>3 800</td>
<td>5 700</td>
</tr>
<tr>
<td>15</td>
<td>1 400</td>
<td>2 800</td>
<td>4 300</td>
<td>6 400</td>
</tr>
<tr>
<td>16</td>
<td>1 600</td>
<td>3 200</td>
<td>4 800</td>
<td>7 200</td>
</tr>
<tr>
<td>17</td>
<td>2 000</td>
<td>3 900</td>
<td>5 900</td>
<td>8 800</td>
</tr>
<tr>
<td>18</td>
<td>2 100</td>
<td>4 200</td>
<td>6 300</td>
<td>9 500</td>
</tr>
<tr>
<td>19</td>
<td>2 400</td>
<td>4 900</td>
<td>7 300</td>
<td>10 900</td>
</tr>
<tr>
<td>20</td>
<td>2 800</td>
<td>5 700</td>
<td>8 500</td>
<td>12 700</td>
</tr>
</table>
!!!!''Портальные города Внешних Земель''
<table>
<tr>
<th>Город</th>
<th>Место назначения портала</th>
</tr>
<tr>
<td>Превосходный</td>
<td>Семь Небес Горы Целестия</td>
</tr>
<tr>
<td>Торговые врата</td>
<td>Двойной рай Битопии</td>
</tr>
<tr>
<td>Экстазия</td>
<td>Благословенные Поля Элизиума</td>
</tr>
<tr>
<td>Фаунель</td>
<td>Дебри Звериных Земель</td>
</tr>
<tr>
<td>Сильвания</td>
<td>Олимпийские просторы Арбореи</td>
</tr>
<tr>
<td>Глориум</td>
<td>Героические владения Асгарда</td>
</tr>
<tr>
<td>Каос</td>
<td>Вечно бурлящий хаос Лимбо</td>
</tr>
<tr>
<td>Бедлам</td>
<td>Завывающие Глубины Пандемониума</td>
</tr>
<tr>
<td>Зачумлённый</td>
<td>Бесконечные слои Бездны</td>
</tr>
<tr>
<td>Клятый</td>
<td>Забытые Преисподние Карцери</td>
</tr>
<tr>
<td>Безнадёжность</td>
<td>Серые Пустоши Гадеса</td>
</tr>
<tr>
<td>Факел</td>
<td>Мрачная вечность Геенны</td>
</tr>
<tr>
<td>Костяк</td>
<td>Девять Преисподних Баатора</td>
</tr>
<tr>
<td>Ригус</td>
<td>Бесконечные поля битв Ахерона</td>
</tr>
<tr>
<td>Автомата</td>
<td>Механическая нирвана Механуса</td>
</tr>
<tr>
<td>Стойкость</td>
<td>Мирные Королевства Аркадии</td>
</tr>
</table>
!!!!''Постройка крепости''
<table>
<tr>
<th>Крепость</th>
<th>Стоимость постройки</th>
<th>Время строительства</th>
</tr>
<tr>
<td>Аббатство</td>
<td>50000 зм</td>
<td>400 дней</td>
</tr>
<tr>
<td>Застава или форт</td>
<td>15000зм</td>
<td>100 дней</td>
</tr>
<tr>
<td>Укреплённая башня</td>
<td>15000 зм</td>
<td>100 дней</td>
</tr>
<tr>
<td>Дворец или большой замок</td>
<td>500000 зм</td>
<td>1200 дней</td>
</tr>
<tr>
<td>Дворянский особняк</td>
<td>25000 зм</td>
<td>150 дней</td>
</tr>
<tr>
<td>Ратуша посёлка или города</td>
<td>5000 зм</td>
<td>60 дней</td>
</tr>
<tr>
<td>Фактория</td>
<td>5000 зм</td>
<td>60 дней</td>
</tr>
<tr>
<td>Храм</td>
<td>50000зм</td>
<td>400 дней</td>
</tr>
<tr>
<td>Цитадель или небольшой замок</td>
<td>50000 зм</td>
<td>400 дней</td>
</tr>
</table>
!!!!''Потрясающие весь мир события''
<table>
<tr>
<th>к10</th>
<th>Событие</th>
</tr>
<tr>
<td>1</td>
<td>Восхождение лидера или начало эпохи</td>
</tr>
<tr>
<td>2</td>
<td>Падение лидера или конец эпохи</td>
</tr>
<tr>
<td>3</td>
<td>Катастрофа</td>
</tr>
<tr>
<td>4</td>
<td>Нападение или вторжение</td>
</tr>
<tr>
<td>5</td>
<td>Восстание, революция, свержение</td>
</tr>
<tr>
<td>6</td>
<td>Вымирание или истощение</td>
</tr>
<tr>
<td>7</td>
<td>Новая организация</td>
</tr>
<tr>
<td>8</td>
<td>Открытие, экспансия, изобретение</td>
</tr>
<tr>
<td>9</td>
<td>Предсказание, предзнаменование, пророчество</td>
</tr>
<tr>
<td>10</td>
<td>Мифы и легенды</td>
</tr>
</table>
!!!!''Предназначение подземелья''
<table>
<tr>
<th>к20</th>
<th>Предназначение</th>
<th>к20</th>
<th>Предназначение</th>
</tr>
<tr>
<td>1–4</td>
<td>Крепость</td>
<td>13</td>
<td>Смертельная ловушка</td>
</tr>
<tr>
<td>5</td>
<td>Лабиринт</td>
<td>14–16</td>
<td>Храм или святыня</td>
</tr>
<tr>
<td>6–9</td>
<td>Логовосокровищ</td>
<td>17</td>
<td>Хранилище</td>
</tr>
<tr>
<td>10</td>
<td>Планарные врата</td>
<td rowspan="2">18–20</td>
<td rowspan="2">Шахта</td>
</tr>
<tr>
<td>11–12</td>
<td>Склеп</td>
</tr>
</table>
<table>
<tr>
<th>к10</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Преданность выполнению личной цели</td>
</tr>
<tr>
<td>2</td>
<td>Защита близких членов семьи</td>
</tr>
<tr>
<td>3</td>
<td>Защита коллег или сограждан</td>
</tr>
<tr>
<td>4</td>
<td>Верность благодетелю, покровителю или работодателю</td>
</tr>
<tr>
<td>5</td>
<td>Одержимость романтическими чувствами</td>
</tr>
<tr>
<td>6</td>
<td>Желание попасть в особое место</td>
</tr>
<tr>
<td>7</td>
<td>Защита сентиментального сувенира</td>
</tr>
<tr>
<td>8</td>
<td>Защита ценного имущества</td>
</tr>
<tr>
<td>9</td>
<td>Желание отомстить</td>
</tr>
<tr>
<td>10</td>
<td>Совершите два броска, игнорируя результат «10»</td>
</tr>
</table>
!!__''Приключения, основанные на локациях''__
Приключения, разворачивающиеся в подземельях и в дикой местности, являются краеугольным камнем множества кампаний. Многие из величайших приключений D&D всех времён — это приключения, основанные на локациях.
Создание подобного приключения можно разбить на несколько этапов. Для каждого этапа существуют таблицы, из которых вы можете выбрать базовые элементы приключения. Вы также можете бросить кости и получить случайный результат. Порядок этапов можно менять.
!!!''1. Определите цели группы''
Таблица «цели подземелья» предлагает общие цели, которые приведут искателей приключений в подземелье или заманят их туда. В таблице «цели дикой местности» предоставлены аналогичные цели, но ориентированные уже на открытую местность. В таблице «другие цели» описаны приключения, основанные на локациях, которые не вписываются в первые две категории.
{{$:/Цели группы}}
!!!''2. Определите важных ПМ''
Чтобы создать важных ПМ, используйте приведённые таблицы генерации злодеев, союзников и покровителей. Глава 4 поможет вам вдохнуть в них жизнь.
{{$:/Злодеи и Покровители приключения}}
{{$:/Союзники приключения}}
!!!''3. Создайте детали локаций''
Глава 5 предлагает материалы для создания локаций, в том числе таблицы, которые помогут вам сгенерировать важные элементы для подземелий, дикой местности или поселения.
!!!''4. Придумайте идеальное введение''
Приключение может начаться со сцены встречи с кем-то, в которой искатели приключений выяснят, что они должны делать, и почему. Оно может начаться с внезапного нападения, или с того, что искатели приключений случайно натолкнутся на важную информацию. Будет лучше, если введение напрямую связано с целями приключения. Взгляните, возможно, вас вдохновят варианты из следующей таблицы:
{{$:/Введение приключений}}
!!!''5. Придумайте идеальное завершение''
Кульминационная развязка приключения подводит итог всей игры. Несмотря на то, что обычно кульминация базируется на успехах и неудачах персонажей, вы всё-таки можете воспользоваться приведённой таблицей, чтобы вдохновиться идеями, которые помогут вам придумать концовку.
{{$:/Кульминация приключения}}
!!__''Приключения, основанные на событиях''__
В приключениях, основанных на событиях, акцент делается на то, что персонажи и злодеи делают, и что происходит в результате. Вопрос о том, в каких местах всё это происходит, имеет второстепенное значение.
Создание такого приключения более трудоёмко, чем создание приключения, основанного на локациях, но этот процесс можно упростить, выполнив ряд несложных шагов. Для некоторых шагов приведены таблицы, из которых можно выбрать готовые элементы, а можно бросить кости для получения случайного результата. Как и в случае с приключениями, основанными на локациях, вам не нужно обязательно соблюдать очерёдность шагов.
!!!''1. Начните со злодея''
Трата времени на создание злодея обязательно окупится, ведь злодеи играют ключевую роль в развитии истории. Чтобы начать, воспользуйтесь таблицей «злодеи приключения» из предыдущего раздела, а затем используйте информацию из главы 4, чтобы конкретизировать злодея.
Например, ваш злодей может быть нежитью, жаждущей мести за прошлое заключение или увечье. Интересность такого злодея в том, что его изувечили, возможно, много веков назад, но он до сих мстит потомкам тех, кто это сделал. Допустим, это вампир, пленённый членами религиозного ордена рыцарей, желающий отомстить нынешним членам этого ордена.
!!!''2. Определите действия злодея''
Теперь, когда у вас есть злодей, пришло время решить, какие шаги он предпримет для того, чтобы достичь своих целей. Создайте график, показывающий, что злодей будет делать, и в какое время, не учитывая при этом возможные помехи от искателей приключения.
Основываясь на предыдущем примере, вы можете решить, что ваш злодей-вампир убивает нескольких рыцарей. Пройдя сквозь закрытые двери в газообразной форме, вампир может создать впечатление, что рыцари умерли естественной смертью, или что это несчастный случай, но всё это только на первый взгляд, ведь вскоре всё равно станет ясно, что это было убийство.
Если вам нужно дополнительное вдохновение, взгляните на варианты того, как действия злодея могут разворачиваться в течение приключения:
{{$:/Стратегия действий злодея в приключениях, основанных на событиях}}
;
://''Большое событие.''// Планам злодея суждено сбыться во время фестиваля, астрологического события, святого (или порочного) обряда, королевской свадьбы, рождения ребёнка, или во время чего-то другого подобного. Деятельность злодея до этого момента сконцентрирована на подготовке к этому мероприятию.
://''Последнее дело.''// Злодей совершает одно преступление, а затем пытается избежать последствий. Вместо того чтобы придерживаться плана и совершать больше преступлений, злодей пытается залечь на дно и не высовываться.
://''Растущая коррупция.''// Со временем влияние и власть злодея растут, как и число потерпевших от них. Влияние и власть могут принимать форму армии, захватывающей новые территории, злого культа, вербующего новых членов, или выражаться в виде распространения чумы. Планируя в ближайшем времени дворцовый переворот, претендент на престол может заручиться поддержкой дворянства, или лидер гильдии может подкупить членов городского совета и дать взятку сотрудникам охраны.
://''Серийные преступления.''// Злодей совершает преступления одно за другим, но эти преступления одинаковы по характеру, и не становятся более ужасными. Чтобы поймать такого злодея, необходимо понять принцип, лежащий в основе преступлений. И хотя серийные убийцы — это обычный пример такого типа злодеев, ваш злодей может быть серийным пироманьяком, поджигающим здания только определённого типа; он может насылать волшебную болезнь, которая затрагивает только заклинателей, использующих конкретные заклинания; он может быть вором, который грабит только определённых купцов, или доппельгангером, который похищает дворян и выдаёт себя за них.
://''Череда преступлений.''// Злодей совершает преступления, которые с каждым разом становятся всё более дерзкими и гнусными. Убийца может начать с убийства бедняков в городских трущобах, а дальше перейти к резне на рынке, нагнетая ужас и увеличивая количество жертв.
://''Шаг за шагом.''// В погоне за своей целью злодей совершает действия в определённой последовательности. Волшебник может украсть предметы, необходимые для создания филактерия, и стать личем, или культист может похитить священников семи добрых богов ради жертвоприношения. Или же злодей может идти по следу объекта своей мести, убивая людей одного за другим, пока не доберётся до главной цели.
!!!''3. Определите цели отряда''
Чтобы придумать цель для отряда, вы можете использовать приведённую таблицу. Цель может также подразумевать варианты, как искатели приключений могут оказаться втянутыми в планы злодея, а также то, что именно герои должны сделать, чтобы сорвать эти планы.
{{$:/Цели, основанные на событиях}}
Например, если у вас выпало «10», цель отряда — добиться помощи от правителя или совета. Вы решаете привязать это к руководству ордена, на который точит зуб ваш вампир-злодей. Возможно, у руководителей ордена есть сундук с драгоценностями, украденный у вампира несколько веков назад, и персонажи могут использовать его как наживку, чтобы заманить злодея в ловушку.
!!!''4. Придумайте важных ПМ''
Приключения, основанные на событиях, требуют хорошо проработанных персонажей Мастера. Некоторые из этих ПМ подпадают под категорию союзников или покровителей, но подавляющее большинство из них — это персонажи или существа, чьё отношение к героям остаётся неясным до тех пор, пока искатели приключений не вступят во взаимодействие с ними (для получения дополнительной информации по созданию ПМ смотрите главу 4).
Элементы приключения, которые вы уже определили к этому моменту, должны обеспечить чёткое представление о том, каких вспомогательных персонажей вам нужно создать, а также насколько подробно вы должны детализировать каждого из них. Персонаж Мастера, который вряд ли станет участвовать в бою, не нуждается в полной боевой статистике, а персонажи, которые активно участвуют в переговорах, могут иметь идеалы, привязанности и слабости. Если вам нужна помощь, воспользуйтесь таблицами «союзники приключения» или «покровители приключения» (в разделе «приключения, основанные на локациях», ранее в этой главе).
!!!''5. Определите реакции злодея''
Как отреагирует злодей, когда искатели приключений достигнут своих целей и разрушат его планы? Набросится на них в ярости или отправит угрожающее предупреждение? Ищет ли он простые решения проблем или создаёт сложные планы, стараясь учесть все возможные помехи?
Посмотрите на действия злодея, которые вы определили в пункте 2. Подумайте, как отреагируют искатели приключений на каждое возможное действие злодея. Если они смогут предотвратить или затруднить выполнение каких-то действий, какой эффект это возымеет на общий план злодея? Сможет ли он что-то сделать, чтобы компенсировать потери?
Один из способов отслеживания реакции злодея — это использование блок-схемы. Она может быть связана с временной шкалой, описывающей планы злодея, и показывать, как злодей возвращается назад после того как искатели приключений срывают его планы. Или же блок-схема может идти отдельно от временной шкалы и показывать, какие действия искатели приключений могут предпринять, и что злодей может им противопоставить.
!!!''6. Заполните ключевые локации''
Так как локации не играют большой роли в таком типе приключения, они могут быть проще и меньше, чем продуманное подземелье или огромная дикая местность. Это могут быть конкретные места в городе, или даже отдельные комнаты в тех местах, где, скорее всего, произойдёт схватка, или в которых потребуется тщательное исследование, такие как тронный зал, штаб-квартира гильдии, ветхая усадьба вампира, или дом одного из рыцарей. 3 рыцарь, который считает, что вампир пытается убить его, или же это родственник рыцаря, надеющийся найти убийцу. Он заставляет героев обратить внимание на преступления вампира.
Просмотрев таблицу вариантов кульминаций, вы можете решить, что искатели приключений должны приманить вампира сундуком с драгоценностями, украденным из его логова. В качестве дополнительного сюжетного поворота, вы решаете, что истинной целью вампира среди драгоценных камней является ожерелье. Это ожерелье украшено девятью драгоценными камнями, и с его помощью вампир может открыть врата в Девять Преисподних. Если у вампира это получится, у искателей приключений появится гораздо более серьёзная проблема в виде мощного дьявола, который чтит древний договор, заключённый с вампиром.
!!!''8. Спланируйте сцены''
После того как вы придумали общую историю приключений, наступает пора спланировать сцены, к которым будут привязаны события. В приключении, основанном на событиях, сцены происходят, когда планы злодея и героев пересекаются. Вы не всегда сможете предугадать, когда и где это произойдёт, но вы можете создать список возможных сцен, в которые искатели приключений могут попасть. Список может принимать форму описания войск злодея, его помощников и подручных, а также сцен, привязанных к ключевым локациям приключения.
Для получения информации по разработке индивидуальных сцен смотрите раздел «создание сцен».
!!!!''Пример иерархии дворянских титулов''
<table>
<tr>
<th>Ранг</th>
<th>Титул</th>
</tr>
<tr>
<td>1</td>
<td>Император/Императрица</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>Король/Королева</td>
</tr>
<tr>
<td>3</td>
<td>Герцог/Герцогиня</td>
</tr>
<tr>
<td>4</td>
<td>Князь/Княгиня</td>
</tr>
<tr>
<td>5</td>
<td>Маркиз/Маркиза</td>
</tr>
<tr>
<td>6</td>
<td>Граф/Графиня</td>
</tr>
<tr>
<td>7</td>
<td>Виконт/Виконтесса</td>
</tr>
<tr>
<td>8</td>
<td>Барон/Баронесса</td>
</tr>
<tr>
<td>9</td>
<td>Баронет</td>
</tr>
<tr>
<td>10</td>
<td>Рыцарь</td>
</tr>
</table>
<table>
<tr>
<th>Слава</th>
<th>Арфисты</th>
<th>Орден Перчатки</th>
<th>Изумрудный Анклав</th>
<th>Альянс Лордов</th>
<th>Жентарим</th>
</tr>
<tr>
<td>1</td>
<td>Наблюдатель</td>
<td>Кавалер</td>
<td>Хранитель весны</td>
<td>Мантия</td>
<td>Клык</td>
</tr>
<tr>
<td>3</td>
<td>Тень арфы</td>
<td>Маршеон</td>
<td>Летний странник</td>
<td>Багряный нож</td>
<td>Волк</td>
</tr>
<tr>
<td>10</td>
<td>Яркая свеча</td>
<td>Белый ястреб</td>
<td>Осенний разбойник</td>
<td>Острый клинок</td>
<td>Змей</td>
</tr>
<tr>
<td>25</td>
<td>Мудрая сова</td>
<td>Поборник</td>
<td>Зимний ловчий</td>
<td>Военный герцог</td>
<td>Ардракон</td>
</tr>
<tr>
<td>50</td>
<td>Высший Арфист</td>
<td>Праведная рука</td>
<td>Хозяин дикой природы</td>
<td>Королевский лев</td>
<td>Лорд страха</td>
</tr>
</table>
!!!!''Продажа магических предметов''
<table>
<tr>
<th>к100 + мод.</th>
<th>Вы находите...</th>
</tr>
<tr>
<td>20 или меньше</td>
<td>Покупателя, предлагающего десятую часть базовой цены</td>
</tr>
<tr>
<td>21-40</td>
<td>Покупателя, предлагающего четверть базовой цены, но анонимный покупатель предлагает половину базовой цены</td>
</tr>
<tr>
<td>41-80</td>
<td>Покупателя, предлагающего половину базовой цены, но анонимный покупатель предлагает базовую цену</td>
</tr>
<tr>
<td>81-90</td>
<td>Покупателя, предлагающего базовую цену</td>
</tr>
<tr>
<td>91 и больше</td>
<td>Анонимного покупателя, предлагающего полторы базовых цены, не задавая вопросов</td>
</tr>
</table>
!!!!''Произведения искусства стоимостью 25 зм''
<table>
<tr>
<th>к10</th>
<th>Предмет</th>
</tr>
<tr>
<td>1</td>
<td>Серебряный кувшин</td>
</tr>
<tr>
<td>2</td>
<td>Резная статуэтка из кости</td>
</tr>
<tr>
<td>3</td>
<td>Маленький золотой браслет</td>
</tr>
<tr>
<td>4</td>
<td>Одеяние из золотой парчи</td>
</tr>
<tr>
<td>5</td>
<td>Чёрная бархатная маска, вышитая серебряной нитью</td>
</tr>
<tr>
<td>6</td>
<td>Медная чаша с серебряной филигранью</td>
</tr>
<tr>
<td>7</td>
<td>Пара гравированных игральных костей</td>
</tr>
<tr>
<td>8</td>
<td>Небольшое зеркальце в расписной деревянной раме</td>
</tr>
<tr>
<td>9</td>
<td>Вышитый шёлковый носовой платок</td>
</tr>
<tr>
<td>10</td>
<td>Золотой медальон с портретом возлюбленной внутри</td>
</tr>
</table>
!!!!''Произведения искусства стоимостью 250 зм''
<table>
<tr>
<th>к10 </th>
<th>Предмет</th>
</tr>
<tr>
<td>1</td>
<td>Золотое кольцо с гелиотропами</td>
</tr>
<tr>
<td>2</td>
<td>Резная статуэтка слоновой кости</td>
</tr>
<tr>
<td>3</td>
<td>Большой золотой браслет</td>
</tr>
<tr>
<td>4</td>
<td>Серебряной ожерелье с кулоном из поделочного камня</td>
</tr>
<tr>
<td>5</td>
<td>Бронзовая корона</td>
</tr>
<tr>
<td>6</td>
<td>Шёлковая мантия с золотой вышивкой</td>
</tr>
<tr>
<td>7</td>
<td>Большой мастерски вытканный гобелен</td>
</tr>
<tr>
<td>8</td>
<td>Латунная кружка, инкрустированная нефритом</td>
</tr>
<tr>
<td>9</td>
<td>Коробочка с бирюзовыми фигурками животных</td>
</tr>
<tr>
<td>10</td>
<td>Золотая клетка для птиц, инкрустированная электрумом.</td>
</tr>
</table>
!!!!''Произведения искусства стоимостью 2500 зм''
<table>
<tr>
<th>к10</th>
<th>Предмет</th>
</tr>
<tr>
<td>1</td>
<td>Прекрасная золотая цепь с огненным опалом</td>
</tr>
<tr>
<td>2</td>
<td>Старинный шедевр живописи</td>
</tr>
<tr>
<td>3</td>
<td>Расшитая шёлком и бархатом мантия, украшенная лунными камнями</td>
</tr>
<tr>
<td>4</td>
<td>Платиновый браслет с сапфиром</td>
</tr>
<tr>
<td>5</td>
<td>Вышитые перчатки, усыпанные драгоценными камнями</td>
</tr>
<tr>
<td>6</td>
<td>Украшенный драгоценными камнями ножной браслет</td>
</tr>
<tr>
<td>7</td>
<td>Золотая музыкальная шкатулка</td>
</tr>
<tr>
<td>8</td>
<td>Золотой браслет, украшенный аквамаринами</td>
</tr>
<tr>
<td>9</td>
<td>Глазная повязка с ложным глазом из голубого сапфира и лунного камня</td>
</tr>
<tr>
<td>10</td>
<td>Ожерелье из маленьких розовых жемчужин</td>
</tr>
</table>
!!!!''Произведения искусства стоимостью 750 зм''
<table>
<tr>
<th>к10</th>
<th>Предмет</th>
</tr>
<tr>
<td>1</td>
<td>Серебряная чаша, декорированная лунным камнем</td>
</tr>
<tr>
<td>2</td>
<td>Длинный меч из посеребрённой стали</td>
</tr>
<tr>
<td>3</td>
<td>Резная арфа из экзотической древесины, с инкрустацией из слоновой кости и драгоценными цирконами</td>
</tr>
<tr>
<td>4</td>
<td>Небольшой золотой идол</td>
</tr>
<tr>
<td>5</td>
<td>Гребень в виде золотого дракона со вставленными в глаза гранатами</td>
</tr>
<tr>
<td>6</td>
<td>Бутыль, запечатанная пробкой с тиснением по золотой фольге и украшенная аметистами</td>
</tr>
<tr>
<td>7</td>
<td>Церемониальный кинжал из электрума с чёрной жемчужиной в навершии</td>
</tr>
<tr>
<td>8</td>
<td>Серебряно-золотая брошь</td>
</tr>
<tr>
<td>9</td>
<td>Обсидиановая статуэтка с золотой инкрустацией</td>
</tr>
<tr>
<td>10</td>
<td>Расписная боевая маска из золота</td>
</tr>
</table>
!!!!''Произведения искусства стоимостью 7500 зм''
<table>
<tr>
<th>к8</th>
<th>Предмет</th>
</tr>
<tr>
<td>1</td>
<td>Украшенная драгоценностями золотая корона</td>
</tr>
<tr>
<td>2</td>
<td>Украшенное драгоценностями платиновое кольцо</td>
</tr>
<tr>
<td>3</td>
<td>Небольшая золотая статуэтка с рубинами</td>
</tr>
<tr>
<td>4</td>
<td>Золотой кубок с изумрудами</td>
</tr>
<tr>
<td>5</td>
<td>Золотая шкатулка для драгоценностей с платиновой филигранью</td>
</tr>
<tr>
<td>6</td>
<td>Расписанный золотом детский саркофаг</td>
</tr>
<tr>
<td>7</td>
<td>Нефритовая игральная доска с золотыми фигурками</td>
</tr>
<tr>
<td>8</td>
<td>Украшенный драгоценными камнями рог для напитков слоновой кости, инкрустированный золотой филигранью</td>
</tr>
</table>
!!!!''Развращение Бездной''
<table>
<tr>
<th>к10<br></th>
<th>Результат</th>
</tr>
<tr>
<td>1-4 </td>
<td>Предательство. Персонаж получает следующую слабость: «Я достигну своей цели только после того как удостоверюсь, что мои спутники не достигнут своего желаемого результата».</td>
</tr>
<tr>
<td>5-7 </td>
<td>Кровожадность. Персонаж получает следующую слабость: «Мне нравится убивать ради забавы, и если я начну, уже не могу остановиться».</td>
</tr>
<tr>
<td>8-9 </td>
<td>Безумные амбиции. Персонаж получает следующую слабость: «Мне суждено править Бездной, и мои спутники — лишь инструменты в достижении этой цели».</td>
</tr>
<tr>
<td>10 </td>
<td>Одержимость демоном. Персонаж одержим демонической сущностью, пока не будет освобождён заклинанием <span style="font-style:italic">рассеивание добра и зла </span>или аналогичной магией. Каждый раз, когда одержимый персонаж выбрасывает «1» при броске атаки, проверке характеристики или спасброске, демон захватывает над ним контроль и определяет его поведение. В конце каждого своего хода одержимое существо может совершать спасбросок Харизмы со Сл 15. При успехе персонаж восстанавливает над собой контроль, пока вновь не выбросит «1».</td>
</tr>
</table>
!!!!''Распространение слухов''
<table>
<tr>
<th>Размер поселения</th>
<th>Требуемое время</th>
</tr>
<tr>
<td>Деревня</td>
<td>2кб дней</td>
</tr>
<tr>
<td>Посёлок</td>
<td>4кб дней</td>
</tr>
<tr>
<td>Большой город</td>
<td>6к6 дней</td>
</tr>
</table>
!!!!''Редкость магических предметов''
<table>
<tr>
<th>Редкость</th>
<th>Уровень персонажа</th>
<th>Стоимость</th>
</tr>
<tr>
<td>Обычная</td>
<td>1 и выше</td>
<td>50-100 зм</td>
</tr>
<tr>
<td>Необычная</td>
<td>1 и выше</td>
<td>Д101-500 зм</td>
</tr>
<tr>
<td>Редкая</td>
<td>5 и выше</td>
<td>501-5000 зм</td>
</tr>
<tr>
<td>Очень редкая</td>
<td>11 и выше</td>
<td>5001-50000 зм</td>
</tr>
<tr>
<td>Легендарная</td>
<td>17 и выше</td>
<td>50001+ зм</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1-10</td>
<td>Храм доброго или нейтрального божества</td>
</tr>
<tr>
<td>11-12</td>
<td>Храм ложного божества (возглавляется шарлатаном)</td>
</tr>
<tr>
<td>13</td>
<td>Дом аскетов</td>
</tr>
<tr>
<td>14-15</td>
<td>Заброшенное святилище</td>
</tr>
<tr>
<td>16-17</td>
<td>Библиотека религиозного учения</td>
</tr>
<tr>
<td>18-20</td>
<td>Скрытое святилище исчадья или злого божества</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1-4</td>
<td>Пустой или заброшенный</td>
</tr>
<tr>
<td>5-6</td>
<td>Хорошо охраняющийся, дорогие товары</td>
</tr>
<tr>
<td>7-10</td>
<td>Дешёвые товары</td>
</tr>
<tr>
<td>11-14</td>
<td>Громоздкие товары</td>
</tr>
<tr>
<td>15</td>
<td>Животные</td>
</tr>
<tr>
<td>16-17</td>
<td>Оружие/доспехи</td>
</tr>
<tr>
<td>18-19</td>
<td>Товары с далёких земель</td>
</tr>
<tr>
<td>20</td>
<td>Тайное логово контрабандистов</td>
</tr>
</table>
!!!!''Сл сбора еды''
<table>
<tr>
<th>Наличие еды и воды</th>
<th>Сл</th>
</tr>
<tr>
<td>Много источников еды и воды</td>
<td>10</td>
</tr>
<tr>
<td>Ограниченные источники еды и воды</td>
<td>15</td>
</tr>
<tr>
<td>Очень мало источников еды и воды</td>
<td>20</td>
</tr>
</table>
!!!!''Сл спасения и бонусы атаки ловушек''
<table>
<tr>
<th>Угроза от ловушки</th>
<th>Сл спасения</th>
<th>Бонус атаки</th>
</tr>
<tr>
<td>Неудобство</td>
<td>10-11</td>
<td>От +3 до +5</td>
</tr>
<tr>
<td>Опасная</td>
<td>12-15</td>
<td>От +6 до +8</td>
</tr>
<tr>
<td>Смертельная</td>
<td>16-20</td>
<td>От +9 до +12</td>
</tr>
</table>
<table>
<tr>
<th>к12</th>
<th>Слабость или тайна</th>
</tr>
<tr>
<td>1</td>
<td>Запретная любовь или влюбчивость</td>
</tr>
<tr>
<td>2</td>
<td>Обожает декадентские удовольствия</td>
</tr>
<tr>
<td>3</td>
<td>Высокомерен</td>
</tr>
<tr>
<td>4</td>
<td>Завидует чужому положению или имуществу</td>
</tr>
<tr>
<td>5</td>
<td>Чрезмерно жаден</td>
</tr>
<tr>
<td>6</td>
<td>Впадает в ярость</td>
</tr>
<tr>
<td>7</td>
<td>Имеет сильного врага</td>
</tr>
<tr>
<td>8</td>
<td>Особая фобия</td>
</tr>
<tr>
<td>9</td>
<td>Постыдная или скандальная история</td>
</tr>
<tr>
<td>10</td>
<td>Скрывает преступление или проступок</td>
</tr>
<tr>
<td>11</td>
<td>Обладает запретным знанием</td>
</tr>
<tr>
<td>12</td>
<td>Самоуверен</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Особенность</th>
<th rowspan="11"></th>
<th>к20</th>
<th>Особенность</th>
</tr>
<tr>
<td>1</td>
<td>Изысканной кухней</td>
<td>11</td>
<td>Набожностью</td>
</tr>
<tr>
<td>2</td>
<td>Грубыми жителями</td>
<td>12</td>
<td>Азартными играми</td>
</tr>
<tr>
<td>3</td>
<td>Жадными торговцами</td>
<td>13</td>
<td>Безбожием</td>
</tr>
<tr>
<td>4</td>
<td>Художниками иписателями</td>
<td>14</td>
<td>Образованием</td>
</tr>
<tr>
<td>5</td>
<td>Великим героем/спасителем</td>
<td>15</td>
<td>Винами</td>
</tr>
<tr>
<td>6</td>
<td>Цветами</td>
<td>16</td>
<td>Высокой модой</td>
</tr>
<tr>
<td>7</td>
<td>Толпами нищих</td>
<td>17</td>
<td>Политическими интригами</td>
</tr>
<tr>
<td>8</td>
<td>Стойкими воителями</td>
<td>18</td>
<td>Влиятельными гильдиями</td>
</tr>
<tr>
<td>9</td>
<td>Тёмной магией</td>
<td>19</td>
<td>Крепкими напитками</td>
</tr>
<tr>
<td>10</td>
<td>Декадентством</td>
<td>20</td>
<td>Патриотизмом</td>
</tr>
</table>
!!!!''Случайные встречи в море''
<table>
<tr>
<th>к12 + к8 Встреча</th>
<th>Дистанция сцен</th>
</tr>
<tr>
<td>2</td>
<td>Корабль-призрак</td>
</tr>
<tr>
<td>3</td>
<td>Дружелюбный и любопытный бронзовый дракон</td>
</tr>
<tr>
<td>4</td>
<td>Водоворот (25% шанс, что это портал на Стихийный План Воды)</td>
</tr>
<tr>
<td>5</td>
<td>Мерфолки торговцы</td>
</tr>
<tr>
<td>6</td>
<td>Проходящий мимо боевой корабль (дружественный или враждебный)</td>
</tr>
<tr>
<td>7-8</td>
<td>Пиратский корабль (враждебный)</td>
</tr>
<tr>
<td>9-10</td>
<td>Проходящий мимо торговый корабль (галера или парусник)</td>
</tr>
<tr>
<td>11-12</td>
<td>Кит-убийца</td>
</tr>
<tr>
<td>13-14</td>
<td>Плавающие обломки</td>
</tr>
<tr>
<td>15</td>
<td>Драккар с экипажем из враждебных берсерков</td>
</tr>
<tr>
<td>16</td>
<td>Враждебные грифоны или гарпии</td>
</tr>
<tr>
<td>17</td>
<td>Айсберг (легко избежать, если увиден издалека)</td>
</tr>
<tr>
<td>18</td>
<td>Отряд сахуагинов, досматривающий все корабли</td>
</tr>
<tr>
<td>19</td>
<td>ПМ в воде (держится за обломки)</td>
</tr>
<tr>
<td>20</td>
<td>Морское чудовище (такое как дракочерепаха или кракен)</td>
</tr>
</table>
!!!!''Случайные встречи в поселениях''
<table>
<tr>
<th>к12 + к8 </th>
<th>Встреча</th>
</tr>
<tr>
<td>2</td>
<td>Животное на свободе</td>
</tr>
<tr>
<td>3</td>
<td>Глашатай</td>
</tr>
<tr>
<td>4</td>
<td>Уличная драка</td>
</tr>
<tr>
<td>5</td>
<td>Задиры</td>
</tr>
<tr>
<td>6</td>
<td>Спутник</td>
</tr>
<tr>
<td>7</td>
<td>Соревнование</td>
</tr>
<tr>
<td>8</td>
<td>Труп</td>
</tr>
<tr>
<td>9</td>
<td>Набор призывников</td>
</tr>
<tr>
<td>10</td>
<td>Пьяница</td>
</tr>
<tr>
<td>11</td>
<td>Пожар</td>
</tr>
<tr>
<td>12</td>
<td>Безделушка</td>
</tr>
<tr>
<td>13</td>
<td>Притесняющий страж</td>
</tr>
<tr>
<td>14</td>
<td>Карманная кража</td>
</tr>
<tr>
<td>15</td>
<td>Процессия</td>
</tr>
<tr>
<td>16</td>
<td>Протест</td>
</tr>
<tr>
<td>17</td>
<td>Катящаяся карета</td>
</tr>
<tr>
<td>18</td>
<td>Незаконная сделка</td>
</tr>
<tr>
<td>19</td>
<td>Представление</td>
</tr>
<tr>
<td>20</td>
<td>Бродяжка</td>
</tr>
</table>
!!!!''Случайные встречи под водой''
<table>
<tr>
<th>к12 + к8 </th>
<th>Встреча</th>
</tr>
<tr>
<td>2</td>
<td>Затонувший корабль, обросший ракушками (25% шанс, что в корабле есть сокровище; совершите бросок по таблицам сокровищ из главы 7)</td>
</tr>
<tr>
<td>3</td>
<td>Затонувший корабль с кружащими вокруг него рифовыми акулами (мелководье) или охотничьими акулами (глубоководье) (50% шанс, что в корабле есть сокровище; совершите бросок по таблицам сокровищ из главы 7)</td>
</tr>
<tr>
<td>4</td>
<td>Множество гигантских устриц (у каждой устрицы есть шанс 1%, что в ней находится огромная жемчужина, стоящая 5000 зм)</td>
</tr>
<tr>
<td>5</td>
<td>Подводная струя пара (25% шанс, что устье является порталом на Стихийный План Огня)</td>
</tr>
<tr>
<td>6</td>
<td>Затонувшие руины (необитаемые)</td>
</tr>
<tr>
<td>7</td>
<td>Затонувшие руины (обитаемые живыми существами или привидениями)</td>
</tr>
<tr>
<td>8</td>
<td>Затонувшая статуя или монолит</td>
</tr>
<tr>
<td>9</td>
<td>Дружелюбный и любопытный гигантский морской конёк</td>
</tr>
<tr>
<td>10</td>
<td>Патруль дружелюбных мерфолков</td>
</tr>
<tr>
<td>11</td>
<td>Патруль враждебных водянников (прибрежные воды) или сахуагинов (глубоководье)</td>
</tr>
<tr>
<td>12</td>
<td>Огромные заросли водорослей (совершите ещё один бросок по таблице, чтобы определить, что скрыто в них)</td>
</tr>
<tr>
<td>13</td>
<td>Подводная пещера (пустая)</td>
</tr>
<tr>
<td>14</td>
<td>Подводная пещера (логово морской карги)</td>
</tr>
<tr>
<td>15</td>
<td>Подводная пещера (логово мерфолка)</td>
</tr>
<tr>
<td>16</td>
<td>Подводная пещера (логово гигантского осьминога)</td>
</tr>
<tr>
<td>17</td>
<td>Подводная пещера (логово дракочерепахи)</td>
</tr>
<tr>
<td>18</td>
<td>Бронзовый дракон, ищущий сокровища</td>
</tr>
<tr>
<td>19</td>
<td>Штормовой великан, идущий по дну океана</td>
</tr>
<tr>
<td>20</td>
<td>Затонувший сундук с сокровищами (25% шанс, что найдётся что-то ценное; совершите бросок по таблицам сокровищ из главы 7)</td>
</tr>
</table>
!!!!''Смешивание зелий''
<table>
<tr>
<th class="SpecHead">к100 </th>
<th>Результат</th>
</tr>
<tr>
<td>01</td>
<td>Смесь взрывается, причиняя экспериментатору урон силовым полем 6к10, а также урон силовым полем 1к10 всем существам в пределах 5 футов от него.</td>
</tr>
<tr>
<td>02-08</td>
<td>Смесь становится пищевым ядом по выбору Мастера.</td>
</tr>
<tr>
<td>09-15</td>
<td>Оба зелья теряют свои свойства.</td>
</tr>
<tr>
<td>16-25</td>
<td>Одно из зелий теряет свои свойства.</td>
</tr>
<tr>
<td>26-35</td>
<td>Оба зелья продолжают работать, но их численные эффекты снижаются наполовину. Если в силу особенностей</td>
</tr>
<tr>
<td>36-90</td>
<td>Оба зелья работают нормально.</td>
</tr>
<tr>
<td>91-99</td>
<td>Численные эффекты и длительность действия одного из зелий удваиваются. Если ни одно зелье не может быть модифицировано таким образом, то в этом случае они работают как обычно.</td>
</tr>
<tr>
<td>00</td>
<td>Только одно зелье продолжает работать, но его эффект становится постоянным. Выберите наиболее простой эффект для того, чтобы сделать его постоянным, или же тот, который кажется вам наиболее забавным. Например, зелье лечения может увеличить максимум хитов на 4, а масло эфирности может навсегда заточить персонажа на Эфирном Плане. На ваше усмотрение, назначьте заклинание, такое как рассеивание магии или снятие проклятья, которое может рассеять этот длительный эффект.</td>
</tr>
</table>
!!!!''Создание магических предметов''
<table>
<tr>
<th>Редкость предмета</th>
<th>Стоимость создания</th>
<th>Минимальный уровень</th>
</tr>
<tr>
<td>Обычная</td>
<td>100 зм</td>
<td>3</td>
</tr>
<tr>
<td>Необычная</td>
<td>500 зм</td>
<td>3</td>
</tr>
<tr>
<td>Редкая</td>
<td>5000 зм</td>
<td>6</td>
</tr>
<tr>
<td>Очень редкая</td>
<td>50000 зм</td>
<td>11</td>
</tr>
<tr>
<td>Легендарная</td>
<td>500000 зм</td>
<td>17</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Создатель</th>
</tr>
<tr>
<td>1</td>
<td>Великаны</td>
</tr>
<tr>
<td>2-5</td>
<td>Дварфы</td>
</tr>
<tr>
<td>6</td>
<td>Злобоглаз</td>
</tr>
<tr>
<td>7-9</td>
<td>Культ или религиозная группа (совершите бросок по соответствующей таблице)</td>
</tr>
<tr>
<td>10</td>
<td>Куо-тоа</td>
</tr>
<tr>
<td>11</td>
<td>Лич</td>
</tr>
<tr>
<td>12-15</td>
<td>Люди (совершите броски по таблицам мировоззрения и класса)</td>
</tr>
<tr>
<td>16</td>
<td>Свежеватели разума</td>
</tr>
<tr>
<td>17</td>
<td>Хобгоблины</td>
</tr>
<tr>
<td>18</td>
<td>Эльфы (включая дроу)</td>
</tr>
<tr>
<td>19</td>
<td>Юань-ти</td>
</tr>
<tr>
<td>20</td>
<td>Без создателя (естественная пещера)</td>
</tr>
</table>
<<Button "$:/Культы и религиозные группы""Культы и религиозные группы">>
!!!!''Сокровищница: Показатель опасности 0-4''
<table>
<tr>
<th></th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>Монеты</th>
<td>6к6 х 100 (2100)</td>
<td>3к6 х 100 (1050)</td>
<td>—</td>
<td>2к6 х 10 (70)</td>
<td>—</td>
</tr>
<tr>
<th>к100</th>
<th colspan="2">Драгоценные камни или произведения искусства</th>
<th colspan="3">Магические предметы</th>
</tr>
<tr>
<th>01-06</th>
<td colspan="2">—</td>
<td colspan="3">—</td>
</tr>
<tr>
<th>07-16</th>
<td colspan="2">2к6 (7) камней, стоящих 10 зм</td>
<td colspan="3">—</td>
</tr>
<tr>
<th>17-26</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">—</td>
</tr>
<tr>
<th>27-36</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">—</td>
</tr>
<tr>
<th>37-44</th>
<td colspan="2">2к6 (7) камней, стоящих 10 зм</td>
<td colspan="3">1к6 предметов из Таблицы А</td>
</tr>
<tr>
<th>45-52</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к6 предметов из Таблицы А</td>
</tr>
<tr>
<th>53-60</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">1к6 предметов из Таблицы А</td>
</tr>
<tr>
<th>61-65</th>
<td colspan="2">2к6 (7) камней, стоящих 10 зм</td>
<td colspan="3">1к4 предметов из Таблицы Б</td>
</tr>
<tr>
<th>66-70</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из Таблицы Б</td>
</tr>
<tr>
<th>71-75</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из Таблицы Б</td>
</tr>
<tr>
<th>76-78</th>
<td colspan="2">2к6 (7) камней, стоящих 10 зм</td>
<td colspan="3">1к4 предметов из Таблицы В</td>
</tr>
<tr>
<th>79-80</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из Таблицы В</td>
</tr>
<tr>
<th>81-85</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из Таблицы В</td>
</tr>
<tr>
<th>86-92</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из Таблицы Е</td>
</tr>
<tr>
<th>93-97</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из Таблицы Е</td>
</tr>
<tr>
<th>98-99</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1 предмет из Таблицы Ё</td>
</tr>
<tr>
<th>00</th>
<td colspan="2">2к6 (7) камней, стоящих 50 зм</td>
<td colspan="3">1 предмет из Таблицы Ё</td>
</tr>
</table>
<table>
<tr>
<th></th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>Монеты</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>4к6 × 1000 (14000)</td>
<td>5к6 × 100 (1750)</td>
</tr>
<tr>
<th>к100</th>
<th colspan="2">Драгоценные камни или произведения искусства</th>
<th colspan="3">Магические предметы</th>
</tr>
<tr>
<th>01–03</th>
<td colspan="2">— </td>
<td colspan="3">— </td>
</tr>
<tr>
<th>04–06</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>07–09</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>10–12</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>13–15</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>16–19</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предмета из таблицы А и 1к6 предметов из таблицы Б</td>
</tr>
<tr>
<th>20–23</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1к4 предмета из таблицы А и 1к6 предметов из таблицы Б</td>
</tr>
<tr>
<th>24–26</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1к4 предмета из таблицы А и 1к6 предметов из таблицы Б</td>
</tr>
<tr>
<th>27–29</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы А и 1к6 предметов из таблицы Б</td>
</tr>
<tr>
<th>30–35</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к6 предметов из таблицы В </td>
</tr>
<tr>
<th>36–40</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1к6 предметов из таблицы В </td>
</tr>
<tr>
<th>41–45</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1к6 предметов из таблицы В </td>
</tr>
<tr>
<th>46–50</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к6 предметов из таблицы В </td>
</tr>
<tr>
<th>51–54</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предмета из таблицы Г </td>
</tr>
<tr>
<th>55–58</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1к4 предмета из таблицы Г </td>
</tr>
<tr>
<th>59–62</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1к4 предмета из таблицы Г </td>
</tr>
<tr>
<th>63–66</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы Г </td>
</tr>
<tr>
<th>67–68</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1 предмет из таблицы Д </td>
</tr>
<tr>
<th>69–70</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1 предмет из таблицы Д </td>
</tr>
<tr>
<th>71–72</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1 предмет из таблицы Д </td>
</tr>
<tr>
<th>73–74</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1 предмет из таблицы Д </td>
</tr>
<tr>
<th>75–76</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1 предмет из таблицы Е и 1к4 предмета из таблицы Ё</td>
</tr>
<tr>
<th>77–78</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1 предмет из таблицы Е и 1к4 предмета из таблицы Ё</td>
</tr>
<tr>
<th>79–80</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1 предмет из таблицы Е и 1к4 предмета из таблицы Ё</td>
</tr>
<tr>
<th>81–82</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1 предмет из таблицы Е и 1к4 предмета из таблицы Ё</td>
</tr>
<tr>
<th>83–85</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>86–88</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>89–90</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>91–92</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>93–94</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1 предмет из таблицы З </td>
</tr>
<tr>
<th>95–96</th>
<td colspan="2">2к4 (5) произведений, стоящих 750 зм</td>
<td colspan="3">1 предмет из таблицы З </td>
</tr>
<tr>
<th>97–98</th>
<td colspan="2">3к6 (10) камней, стоящих 500 зм</td>
<td colspan="3">1 предмет из таблицы З </td>
</tr>
<tr>
<th>99–00</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1 предмет из таблицы З </td>
</tr>
</table>
<table>
<tr>
<th></th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>Монеты</th>
<td>—</td>
<td>—</td>
<td>—</td>
<td>12к6 × 1000 (42000)</td>
<td>8к6 × 1000 (28000)</td>
</tr>
<tr>
<th>к100</th>
<th colspan="2">Драгоценные камни или произведения искусства</th>
<th colspan="3">Магические предметы</th>
</tr>
<tr>
<th>01–02</th>
<td colspan="2">— </td>
<td colspan="3">— </td>
</tr>
<tr>
<th>03–05</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к8 предметов из таблицы В </td>
</tr>
<tr>
<th>06–08</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к8 предметов из таблицы В </td>
</tr>
<tr>
<th>09–11</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к8 предметов из таблицы В </td>
</tr>
<tr>
<th>12–14</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к8 предметов из таблицы В </td>
</tr>
<tr>
<th>15–22</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к6 предметов из таблицы Г </td>
</tr>
<tr>
<th>23–30</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к6 предметов из таблицы Г </td>
</tr>
<tr>
<th>31–38</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к6 предметов из таблицы Г </td>
</tr>
<tr>
<th>39–46</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к6 предметов из таблицы Г </td>
</tr>
<tr>
<th>47–52</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к6 предметов из таблицы Д </td>
</tr>
<tr>
<th>53–58</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к6 предметов из таблицы Д </td>
</tr>
<tr>
<th>59–63</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к6 предметов из таблицы Д </td>
</tr>
<tr>
<th>64–68</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к6 предметов из таблицы Д </td>
</tr>
<tr>
<th>69</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы Ё </td>
</tr>
<tr>
<th>70</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к4 предмета из таблицы Ё </td>
</tr>
<tr>
<th>71</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к4 предмета из таблицы Ё </td>
</tr>
<tr>
<th>72</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к4 предмета из таблицы Ё </td>
</tr>
<tr>
<th>73–74</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>75–76</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>77–78</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>79–80</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к4 предмета из таблицы Ж </td>
</tr>
<tr>
<th>81–85</th>
<td colspan="2">3к6 (10) камней, стоящих 1000 зм</td>
<td colspan="3">1к4 предмета из таблицы З </td>
</tr>
<tr>
<th>86–90</th>
<td colspan="2">1к10 (5) предметов, стоящих 2500 зм</td>
<td colspan="3">1к4 предмета из таблицы З </td>
</tr>
<tr>
<th>91–95</th>
<td colspan="2">1к4 (2) предметов, стоящих 7500 зм</td>
<td colspan="3">1к4 предмета из таблицы З </td>
</tr>
<tr>
<th>96–00</th>
<td colspan="2">1к8 (4) камней, стоящих 5000 зм</td>
<td colspan="3">1к4 предмета из таблицы З </td>
</tr>
</table>
!!!!''Сокровищница: Показатель опасности 5-10 (Таблица)''
<table>
<tr>
<th></th>
<th>ММ</th>
<th>СМ</th>
<th>ЭМ</th>
<th>ЗМ</th>
<th>ПМ</th>
</tr>
<tr>
<th>Монеты</th>
<td>2к6 х 100 (700)</td>
<td>2к6 х 1000 (7000)</td>
<td> — </td>
<td>6к6 х 100 (2100)</td>
<td>—</td>
</tr>
<tr>
<th>к100</th>
<th colspan="2">Драгоценные камни или произведения искусства</th>
<th colspan="3">Магические предметы</th>
</tr>
<tr>
<th>01–04</th>
<td colspan="2">— — </td>
<td colspan="3">—</td>
</tr>
<tr>
<th>05–10</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">—</td>
</tr>
<tr>
<th>11–16</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>17–22</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>23–28</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">— </td>
</tr>
<tr>
<th>29–32</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к6 предметов из таблицы A</td>
</tr>
<tr>
<th>33–36</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">1к6 предметов из таблицы A</td>
</tr>
<tr>
<th>37–40</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1к6 предметов из таблицы A</td>
</tr>
<tr>
<th>41–44</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к6 предметов из таблицы A</td>
</tr>
<tr>
<th>45–49</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из таблицы Б</td>
</tr>
<tr>
<th>50–54</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из таблицы Б</td>
</tr>
<tr>
<th>55–59</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1к4 предметов из таблицы Б</td>
</tr>
<tr>
<th>60–63</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предметов из таблицы Б</td>
</tr>
<tr>
<th>64–66</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из таблицы В</td>
</tr>
<tr>
<th>67–69</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из таблицы В</td>
</tr>
<tr>
<th>70–72</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1к4 предметов из таблицы В</td>
</tr>
<tr>
<th>73–74</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предметов из таблицы В</td>
</tr>
<tr>
<th>75–76</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1 предмет из таблицы Г</td>
</tr>
<tr>
<th>77–78</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">1 предмет из таблицы Г</td>
</tr>
<tr>
<th>79</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1 предмет из таблицы Г</td>
</tr>
<tr>
<th>80</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1 предмет из таблицы Г</td>
</tr>
<tr>
<th>81–84</th>
<td colspan="2">2к4 (5) произведений, стоящих 25 зм</td>
<td colspan="3">1к4 предметов из таблицы Е</td>
</tr>
<tr>
<th>85–88</th>
<td colspan="2">3к6 (10) камней, стоящих 50 зм</td>
<td colspan="3">1к4 предметов из таблицы Е</td>
</tr>
<tr>
<th>89–91</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1к4 предметов из таблицы Е</td>
</tr>
<tr>
<th>92–94</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предметов из таблицы Е</td>
</tr>
<tr>
<th>95–96</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1к4 предметов из таблицы Ё</td>
</tr>
<tr>
<th>97–98</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1к4 предметов из таблицы Ё</td>
</tr>
<tr>
<th>99</th>
<td colspan="2">3к6 (10) камней, стоящих 100 зм</td>
<td colspan="3">1 предмет из таблицы Ж</td>
</tr>
<tr>
<th>0</th>
<td colspan="2">2к4 (5) произведений, стоящих 250 зм</td>
<td colspan="3">1 предмет из таблицы Ж</td>
</tr>
</table>
<table>
<tr>
<th>к12</th>
<th>Союзник</th>
</tr>
<tr>
<td>1</td>
<td>Опытный искатель приключений</td>
</tr>
<tr>
<td>2</td>
<td>Неопытный искатель приключений</td>
</tr>
<tr>
<td>3</td>
<td>Восторженный простолюдин</td>
</tr>
<tr>
<td>4</td>
<td>Солдат</td>
</tr>
<tr>
<td>5</td>
<td>Священник</td>
</tr>
<tr>
<td>6</td>
<td>Мудрец</td>
</tr>
<tr>
<td>7</td>
<td>Мститель</td>
</tr>
<tr>
<td>8</td>
<td>Буйный сумасшедший</td>
</tr>
<tr>
<td>9</td>
<td>Небожитель-союзник</td>
</tr>
<tr>
<td>10</td>
<td>Фея-союзник</td>
</tr>
<tr>
<td>11</td>
<td>Маскирующееся чудовище</td>
</tr>
<tr>
<td>12</td>
<td>Злодей, выдающий себя за союзника</td>
</tr>
</table>
!!!!''Спрос на магические предметы''
<table>
<tr>
<th>Редкость</th>
<th>Базовая цена</th>
<th>Дни на поиск покупателя</th>
<th>Модификатор броска к100*</th>
</tr>
<tr>
<td>Обычный</td>
<td>100 зм</td>
<td>1к4</td>
<td>+10</td>
</tr>
<tr>
<td>Необычный</td>
<td>500 зм</td>
<td>1к6</td>
<td>+0</td>
</tr>
<tr>
<td>Редкий</td>
<td>5000 зм</td>
<td>1к8</td>
<td>-10</td>
</tr>
<tr>
<td>Очень редкий</td>
<td>50000 зм</td>
<td>1к10</td>
<td>-20</td>
</tr>
<tr>
<td colspan="4">* Добавьте этот модификатор к результату броска по таблице «продажа магических предметов».</td>
</tr>
</table>
<table>
<tr>
<th>к20 </th>
<th>Правитель</th>
</tr>
<tr>
<td>1–5</td>
<td>Уважаемый, честный и справедливый</td>
</tr>
<tr>
<td>6–8</td>
<td>Пугающий тиран</td>
</tr>
<tr>
<td>9</td>
<td>Слабак, марионетка в чьих-то руках</td>
</tr>
<tr>
<td>10</td>
<td>Незаконный правитель, назревает гражданская война</td>
</tr>
<tr>
<td>11</td>
<td>Поселение управляется или контролируется мощным чудовищем</td>
</tr>
<tr>
<td>12</td>
<td>Таинственная анонимная кабала</td>
</tr>
<tr>
<td>13</td>
<td>Идёт открытая борьба за власть</td>
</tr>
<tr>
<td>14</td>
<td>Кабала открыто захватила власть</td>
</tr>
<tr>
<td>15</td>
<td>Придурковатый недотёпа</td>
</tr>
<tr>
<td>16</td>
<td>Умирающий, претенденты соревнуются за власть</td>
</tr>
<tr>
<td>17–18</td>
<td>Волевой, но всеми уважаемый</td>
</tr>
<tr>
<td>19–20</td>
<td>Религиозный лидер</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
!!!!''Странные места''
<table>
<tr>
<th>к20</th>
<th>Монумент</th>
</tr>
<tr>
<td>1-2</td>
<td>Зона мёртвой магии (подобно преграде магии)</td>
</tr>
<tr>
<td>3 </td>
<td>Зона дикой магии (каждый раз, когда в зоне накладывается заклинание, совершайте бросок по таблице «волна дикой магии» из Книги игрока)</td>
</tr>
<tr>
<td>4</td>
<td>Валун, на котором вырезаны говорящие лица</td>
</tr>
<tr>
<td>5</td>
<td>Кристаллическая пещера, отвечающая на вопросы</td>
</tr>
<tr>
<td>6</td>
<td>Древнее дерево, содержащее внутри запертого духа</td>
</tr>
<tr>
<td>7-8</td>
<td>Поле биты, на котором постоянный туман периодически принимает облик гуманоидов</td>
</tr>
<tr>
<td>9-10</td>
<td>Постоянный портал на другой план существования</td>
</tr>
<tr>
<td>11</td>
<td>Колодец, исполняющий желания</td>
</tr>
<tr>
<td>12</td>
<td>Огромный кристалл, торчащий из земли</td>
</tr>
<tr>
<td>13</td>
<td>Разбитый корабль, очень далеко от воды</td>
</tr>
<tr>
<td>14-15</td>
<td>Холм или курган с привидениями</td>
</tr>
<tr>
<td>16</td>
<td>Речной паром, которым правит скелет</td>
</tr>
<tr>
<td>17</td>
<td>Поле окаменевших солдат или других существ</td>
</tr>
<tr>
<td>18</td>
<td>Лес с окаменевшими или ожившими деревьями</td>
</tr>
<tr>
<td>19</td>
<td>Каньон с кладбищем дракона</td>
</tr>
<tr>
<td>20</td>
<td>Парящая в воздухе глыба земли с башней на ней</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Тип действий</th>
<th>к6</th>
<th>Тип действий</th>
</tr>
<tr>
<td>1</td>
<td>Большое событие</td>
<td>4</td>
<td>Серийные преступления</td>
</tr>
<tr>
<td>2</td>
<td>Последнее дело</td>
<td>5</td>
<td>Череда преступлений</td>
</tr>
<tr>
<td>3</td>
<td>Растущая коррупция</td>
<td>6</td>
<td>Шаг за шагом</td>
</tr>
</table>
<table>
<tr>
<th>к10</th>
<th>Сюжетный поворот</th>
</tr>
<tr>
<td>1</td>
<td>Искатели приключений соревнуются с другими существами, у которых те же или противоположные цели.</td>
</tr>
<tr>
<td>2</td>
<td>Искатели приключений берут на себя ответственность за безопасность небоевого ПМ.</td>
</tr>
<tr>
<td>3</td>
<td>Искателям приключений запрещено убивать злодея, а злодей готов убить их без угрызений совести.</td>
</tr>
<tr>
<td>4</td>
<td>У искателей приключений есть лимит времени.</td>
</tr>
<tr>
<td>5</td>
<td>Искатели приключений получили ложную информацию.</td>
</tr>
<tr>
<td>6</td>
<td>Конечная цель приключения выполняет пророчество или предотвращает выполнение пророчества.</td>
</tr>
<tr>
<td>7</td>
<td>У искателей приключений есть две различные цели, но они могут выполнить только одну.</td>
</tr>
<tr>
<td>8</td>
<td>Достижение цели на руку злодею, но искатели приключений об этом не знают</td>
</tr>
<tr>
<td>9</td>
<td>Для достижения цели искатели приключений должны сотрудничать с известным врагом.</td>
</tr>
<tr>
<td>10</td>
<td>Искатели приключений выполняют своё задание, находясь под магическим помешательством (например, заклинанием обет).</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-50</th>
<td>Зелье лечения</td>
</tr>
<tr>
<th>51-60</th>
<td>Свиток заклинания (заговор)</td>
</tr>
<tr>
<th>61-70</th>
<td>Зелье лазания</td>
</tr>
<tr>
<th>71-90</th>
<td>Свиток заклинания (1 уровень)</td>
</tr>
<tr>
<th>91-94</th>
<td>Свиток заклинания (2 уровень)</td>
</tr>
<tr>
<th>95-98</th>
<td>Зелье большого лечения</td>
</tr>
<tr>
<th>99</th>
<td>Сумка хранения</td>
</tr>
<tr>
<th>00</th>
<td>Парящая сфера</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-15</th>
<td>Зелье большого лечения</td>
</tr>
<tr>
<th>16-22</th>
<td>Зелье огненного дыхания</td>
</tr>
<tr>
<th>23-29</th>
<td>Зелье сопротивления</td>
</tr>
<tr>
<th>30-34</th>
<td>Боеприпас, +1</td>
</tr>
<tr>
<th>35-39</th>
<td>Зелье дружбы с животными</td>
</tr>
<tr>
<th>40-44</th>
<td>Зелье подводного дыхания</td>
</tr>
<tr>
<th>45-49</th>
<td>Зелье увеличения</td>
</tr>
<tr>
<th>50-54</th>
<td>Зелье силы холмового великана</td>
</tr>
<tr>
<th>55-59</th>
<td>Свиток заклинания (2 уровень)</td>
</tr>
<tr>
<th>60-64</th>
<td>Свиток заклинания (3 уровень)</td>
</tr>
<tr>
<th>65-67</th>
<td>Сумка хранения</td>
</tr>
<tr>
<th>68-70</th>
<td>Мазь Кеогтома</td>
</tr>
<tr>
<th>71-73</th>
<td>Масло скольжения</td>
</tr>
<tr>
<th>74-75</th>
<td>Порошок исчезновения</td>
</tr>
<tr>
<th>76-77</th>
<td>Порошок сухости</td>
</tr>
<tr>
<th>78-79</th>
<td>Порошок чихания и удушья</td>
</tr>
<tr>
<th>80-81</th>
<td>Камень элементаля</td>
</tr>
<tr>
<th>82-83</th>
<td>Любовное зелье</td>
</tr>
<tr>
<th>84</th>
<td>Алхимический сосуд</td>
</tr>
<tr>
<th>85</th>
<td>Верёвка лазания</td>
</tr>
<tr>
<th>86</th>
<td>Волшебная палочка обнаружения магии</td>
</tr>
<tr>
<th>87</th>
<td>Волшебная палочка секретов</td>
</tr>
<tr>
<th>88</th>
<td>Доспех моряка</td>
</tr>
<tr>
<th>89</th>
<td>Зелье яда</td>
</tr>
<tr>
<th>90</th>
<td>Кольцо плавания</td>
</tr>
<tr>
<th>91</th>
<td>Мантия полезных предметов</td>
</tr>
<tr>
<th>92</th>
<td>Мифрильный доспех</td>
</tr>
<tr>
<th>93</th>
<td>Неподвижный жезл</td>
</tr>
<tr>
<th>94</th>
<td>Ночные очки</td>
</tr>
<tr>
<th>95</th>
<td>Парящая сфера</td>
</tr>
<tr>
<th>96</th>
<td>Плащ ската</td>
</tr>
<tr>
<th>97</th>
<td>Седло кавалериста</td>
</tr>
<tr>
<th>98</th>
<td>Фонарь обнаружения</td>
</tr>
<tr>
<th>99</th>
<td>Шапка подводного дыхания</td>
</tr>
<tr>
<th>00</th>
<td>Шлем понимания языков</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01–15</th>
<td>Зелье отличного лечения</td>
</tr>
<tr>
<th>16–22</th>
<td>Свиток заклинания (4 уровень)</td>
</tr>
<tr>
<th>23–27</th>
<td>Боеприпас, +2</td>
</tr>
<tr>
<th>28–32</th>
<td>Зелье газообразной формы</td>
</tr>
<tr>
<th>33–37</th>
<td>Зелье героизма</td>
</tr>
<tr>
<th>38–42</th>
<td>Зелье неуязвимости</td>
</tr>
<tr>
<th>43–47</th>
<td>Зелье силы каменного великана</td>
</tr>
<tr>
<th>48–52</th>
<td>Зелье силы ледяного великана</td>
</tr>
<tr>
<th>53–57</th>
<td>Зелье уменьшения</td>
</tr>
<tr>
<th>58–62</th>
<td>Зелье чтения мыслей</td>
</tr>
<tr>
<th>63–67</th>
<td>Зелье ясновидения</td>
</tr>
<tr>
<th>68–72</th>
<td>Свиток заклинания (5 уровень)</td>
</tr>
<tr>
<th>73–75</th>
<td>Эликсир здоровья</td>
</tr>
<tr>
<th>76–78</th>
<td>Масло эфирности</td>
</tr>
<tr>
<th>79–81</th>
<td>Зелье силы огненного великана</td>
</tr>
<tr>
<th>82–84</th>
<td>Перо Кваля</td>
</tr>
<tr>
<th>85–87</th>
<td>Свиток защиты</td>
</tr>
<tr>
<th>88–89</th>
<td>Сумка с бобами</td>
</tr>
<tr>
<th>90–91</th>
<td>Бусина силы</td>
</tr>
<tr>
<th>92</th>
<td>Графин бесконечной воды</td>
</tr>
<tr>
<th>93</th>
<td>Камни послания</td>
</tr>
<tr>
<th>94</th>
<td>Колокольчик открывания</td>
</tr>
<tr>
<th>95</th>
<td>Медальон здоровья</td>
</tr>
<tr>
<th>96</th>
<td>Ожерелье огненных шаров</td>
</tr>
<tr>
<th>97</th>
<td>Очки детального зрения</td>
</tr>
<tr>
<th>98</th>
<td>Подковы скорости</td>
</tr>
<tr>
<th>99</th>
<td>Складная лодка</td>
</tr>
<tr>
<th>00</th>
<td>Удобный рюкзак Хеварда</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01–10</th>
<td>Зелье невидимости</td>
</tr>
<tr>
<th>11–30</th>
<td>Зелье превосходного лечения</td>
</tr>
<tr>
<th>31–40</th>
<td>Зелье скорости</td>
</tr>
<tr>
<th>41–50</th>
<td>Свиток заклинания (6 уровень)</td>
</tr>
<tr>
<th>51–57</th>
<td>Свиток заклинания (7 уровень)</td>
</tr>
<tr>
<th>58–62</th>
<td>Боеприпас, +3</td>
</tr>
<tr>
<th>63–67</th>
<td>Масло остроты</td>
</tr>
<tr>
<th>68–72</th>
<td>Зелье долголетия</td>
</tr>
<tr>
<th>73–77</th>
<td>Зелье живучести</td>
</tr>
<tr>
<th>78–82</th>
<td>Зелье полёта</td>
</tr>
<tr>
<th>83–87</th>
<td>Зелье силы облачного великана</td>
</tr>
<tr>
<th>88–92</th>
<td>Свиток заклинания (8 уровень)</td>
</tr>
<tr>
<th>93–95</th>
<td>Подковы ветра</td>
</tr>
<tr>
<th>96–98</th>
<td>Чудесные краски Нолзура</td>
</tr>
<tr>
<th>99</th>
<td>Переносная дыра</td>
</tr>
<tr>
<th>00</th>
<td>Сумка пожирания</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01–30</th>
<td>Свиток заклинания (8 уровень)</td>
</tr>
<tr>
<th>31–45</th>
<td>Зелье превосходного лечения</td>
</tr>
<tr>
<th>46–70</th>
<td>Зелье силы штормового великана</td>
</tr>
<tr>
<th>71–85</th>
<td>Свиток заклинания (9 уровень)</td>
</tr>
<tr>
<th>86–93</th>
<td>Универсальный растворитель</td>
</tr>
<tr>
<th>94–98</th>
<td>Стрела убийства</td>
</tr>
<tr>
<th>99–00</th>
<td>Превосходный клей</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-15</th>
<td>Оружие, +1</td>
<th>71</th>
<td>Заполярные сапоги</td>
</tr>
<tr>
<th>16-18</th>
<td>Щит, +1</td>
<th>72</th>
<td>Инструмент бардов (бандура Фоклучан)</td>
</tr>
<tr>
<th>19-21</th>
<td>Щит часового</td>
<th>73</th>
<td>Инструмент бардов (лютня Досс)</td>
</tr>
<tr>
<th>22-23</th>
<td>Амулет защиты от обнаружения и поиска</td>
<th>74</th>
<td>Инструмент бардов (цитра Мак-Фуирмид)</td>
</tr>
<tr>
<th>24-25</th>
<td>Брошь защиты</td>
<th>75</th>
<td>Камень сияния</td>
</tr>
<tr>
<th>26-27</th>
<td>Волшебная палочка боевого мага, +1</td>
<th>76</th>
<td>Камень удачи</td>
</tr>
<tr>
<th>28-29</th>
<td>Волшебная палочка паутины</td>
<th>77</th>
<td>Колода иллюзий</td>
</tr>
<tr>
<th>30-31</th>
<td>Волшебная палочка снарядов</td>
<th>78</th>
<td>Колчан Элонны</td>
</tr>
<tr>
<th>32-33</th>
<td>Жезл хранителя договора, +1</td>
<th>79</th>
<td>Кольцо защиты разума</td>
</tr>
<tr>
<th>34-35</th>
<td>Жемчужина силы</td>
<th>80</th>
<td>Кольцо тепла</td>
</tr>
<tr>
<th>36-37</th>
<td>Метательное копьё молнии</td>
<th>81</th>
<td>Кольцо прыжков</td>
</tr>
<tr>
<th>38-39</th>
<td>Меч мести</td>
<th>82</th>
<td>Кольцо хождения по воде</td>
</tr>
<tr>
<th>40-41</th>
<td>Наручи стрельбы из лука</td>
<th>83</th>
<td>Крылатые сапоги</td>
</tr>
<tr>
<th>42-43</th>
<td>Оружие предупреждения</td>
<th>84</th>
<td>Медальон затягивающихся ран</td>
</tr>
<tr>
<th>44-45</th>
<td>Плащ защиты</td>
<th>85</th>
<td>Медальон мыслей</td>
</tr>
<tr>
<th>46-47</th>
<td>Помело полёта</td>
<th>86</th>
<td>Обруч сжигания</td>
</tr>
<tr>
<th>48-49</th>
<td>Посох гадюки</td>
<th>87</th>
<td>Ожерелье адаптации</td>
</tr>
<tr>
<th>50-51</th>
<td>Посох питона</td>
<th>88</th>
<td>Очки орлиного зрения</td>
</tr>
<tr>
<th>52-53</th>
<td>Рукавицы силы огра</td>
<th>89</th>
<td>Очки очарования</td>
</tr>
<tr>
<th>54-55</th>
<td>Сапоги ходьбы и прыжков</td>
<th>90</th>
<td>Перчатки воровства</td>
</tr>
<tr>
<th>56-57</th>
<td>Трезубец командования рыбами</td>
<th>91</th>
<td>Перчатки ловли снарядов</td>
</tr>
<tr>
<th>58-59</th>
<td>Туфли паука</td>
<th>92</th>
<td>Перчатки плавания и лазания</td>
</tr>
<tr>
<th>60-61</th>
<td>Шапка маскировки</td>
<th>93</th>
<td>Повязка интеллекта</td>
</tr>
<tr>
<th>62-63</th>
<td>Эльфийские сапоги</td>
<th>94</th>
<td>Свирель канализации</td>
</tr>
<tr>
<th>64-65</th>
<td>Эльфийский плащ</td>
<th>95</th>
<td>Свирель ужаса</td>
</tr>
<tr>
<th>66</th>
<td>Адамантиновый доспех (кольчуга)</td>
<th>96</th>
<td>Статуэтка чудесной силы (серебряный ворон)</td>
</tr>
<tr>
<th>67</th>
<td>Адамантиновый доспех (кольчужная рубаха)</td>
<th>97</th>
<td>Сумка фокусов (коричневая)</td>
</tr>
<tr>
<th>68</th>
<td>Адамантиновый доспех (чешуйчатый доспех)</td>
<th>98</th>
<td>Сумка фокусов (рыжая)</td>
</tr>
<tr>
<th>69</th>
<td>Веер ветра</td>
<th>99</th>
<td>Сумка фокусов (серая)</td>
</tr>
<tr>
<th>70</th>
<td>Вечнодымящаяся бутылка</td>
<th>00</th>
<td>Шлем телепатии</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-11</th>
<td>Оружие, +2</td>
<th>54</th>
<td>Кинжал яда</td>
</tr>
<tr>
<th rowspan="8">12-14</th>
<td>''Статуэтка чудесной силы (бросьте к8)''</td>
<th>55</th>
<td>Кольцо влияния на животных</td>
</tr>
<tr>
<td>//''1'' Бронзовый грифон//</td>
<th>56</th>
<td>Кольцо защиты</td>
</tr>
<tr>
<td>//''2'' Эбеновая муха//</td>
<th>57</th>
<td>Кольцо падения пёрышком</td>
</tr>
<tr>
<td>//''3'' Золотые львы//</td>
<th>58</th>
<td>Кольцо проникающего зрения</td>
</tr>
<tr>
<td>//''4'' Костяные козлы//</td>
<th>59</th>
<td>Кольцо свободных действий</td>
</tr>
<tr>
<td>//''5'' Мраморный слон//</td>
<th>60</th>
<td>Кольцо сопротивления</td>
</tr>
<tr>
<td>//''6-7'' Ониксовая собака//</td>
<th>61</th>
<td>Кольцо тарана</td>
</tr>
<tr>
<td>//''8'' Серпентиновая сова//</td>
<th>62</th>
<td>Кольцо уклонения</td>
</tr>
<tr>
<th>15</th>
<td>Адамантиновый доспех (кираса)</td>
<th>63</th>
<td>Кольцо хранения заклинаний</td>
</tr>
<tr>
<th>16</th>
<td>Адамантиновый доспех (наборный доспех)</td>
<th>64</th>
<td>Красивый проклёпанный доспех</td>
</tr>
<tr>
<th>17</th>
<td>Амулет здоровья</td>
<th>65</th>
<td>Крылья полёта</td>
</tr>
<tr>
<th>18</th>
<td>Булава кары</td>
<th>66</th>
<td>Куб силового поля</td>
</tr>
<tr>
<th>19</th>
<td>Булава распада</td>
<th>67</th>
<td>Ловящий стрелы щит</td>
</tr>
<tr>
<th>20</th>
<td>Булава ужаса</td>
<th>68</th>
<td>Мантия глаз</td>
</tr>
<tr>
<th>21</th>
<td>Верёвка опутывания</td>
<th>69</th>
<td>Мантия сопротивления заклинаниям</td>
</tr>
<tr>
<th>22</th>
<td>Волшебная палочка боевого мага, +2</td>
<th>70</th>
<td>Мгновенная крепость Даэрна</td>
</tr>
<tr>
<th>23</th>
<td>Волшебная палочка молний</td>
<th>71</th>
<td>Медальон защиты от яда</td>
</tr>
<tr>
<th>24</th>
<td>Волшебная палочка обнаружения врагов</td>
<th>72</th>
<td>Меч кражи жизни</td>
</tr>
<tr>
<th>25</th>
<td>Волшебная палочка огненных шаров</td>
<th>73</th>
<td>Меч ранения</td>
</tr>
<tr>
<th>26</th>
<td>Волшебная палочка паралича</td>
<th>74</th>
<td>Наручи защиты</td>
</tr>
<tr>
<th>27</th>
<td>Волшебная палочка сковывания</td>
<th>75</th>
<td>Ожерелье молитвенных чёток</td>
</tr>
<tr>
<th>28</th>
<td>Волшебная палочка страха</td>
<th>76</th>
<td>Оковы измерений</td>
</tr>
<tr>
<th>29</th>
<td>Волшебная палочка чудес</td>
<th>77</th>
<td>Плащ летучей мыши</td>
</tr>
<tr>
<th>30</th>
<td>Доспех сопротивления (кожаный)</td>
<th>78</th>
<td>Плащ ускользания</td>
</tr>
<tr>
<th>31</th>
<td>Доспех сопротивления (кольчуга)</td>
<th>79</th>
<td>Плащ шарлатана</td>
</tr>
<tr>
<th>32</th>
<td>Доспех сопротивления (кольчужная рубаха)</td>
<th>80</th>
<td>Посох иссушения</td>
</tr>
<tr>
<th>33</th>
<td>Доспех сопротивления (чешуйчатый)</td>
<th>81</th>
<td>Посох леса</td>
</tr>
<tr>
<th>34</th>
<td>Доспех уязвимости</td>
<th>82</th>
<td>Посох лечения</td>
</tr>
<tr>
<th>35</th>
<td>Доспех, +1 кожаный</td>
<th>83</th>
<td>Посох очарования</td>
</tr>
<tr>
<th>36</th>
<td>Доспех, +1 кольчуга</td>
<th>84</th>
<td>Посох роя насекомых</td>
</tr>
<tr>
<th>37</th>
<td>Доспех, +1 кольчужная рубаха</td>
<th>85</th>
<td>Пояс дварфов</td>
</tr>
<tr>
<th>38</th>
<td>Доспех, +1 чешуйчатый</td>
<th>86</th>
<td>Пояс силы холмового великана</td>
</tr>
<tr>
<th>39</th>
<td>Жаровня командования огненными элементалями</td>
<th>87</th>
<td>Рог Валгаллы (серебряный или латунный)</td>
</tr>
<tr>
<th>40</th>
<td>Жезл правления</td>
<th>88</th>
<td>Рог взрыва</td>
</tr>
<tr>
<th>41</th>
<td>Жезл хранителя договора, +2</td>
<th>89</th>
<td>Сапоги левитации</td>
</tr>
<tr>
<th>42</th>
<td>Жезл щупалец</td>
<th>90</th>
<td>Сапоги скорости</td>
</tr>
<tr>
<th>43</th>
<td>Железные ленты Биларро</td>
<th>91</th>
<td>Солнечный клинок</td>
</tr>
<tr>
<th>44</th>
<td>Жестокое оружие</td>
<th>92</th>
<td>Топор берсерка</td>
</tr>
<tr>
<th>45</th>
<td>Инструмент бардов (лира Кли)</td>
<th>93</th>
<td>Убийца великанов</td>
</tr>
<tr>
<th>46</th>
<td>Инструмент бардов (мандолина Канаит)</td>
<th>94</th>
<td>Убийца драконов</td>
</tr>
<tr>
<th>47</th>
<td>Кадило контролирования воздушных элементалей</td>
<th>95</th>
<td>Чаша командования водяными элементалями</td>
</tr>
<tr>
<th>48</th>
<td>Камень зрения</td>
<th>96</th>
<td>Шлем телепортации</td>
</tr>
<tr>
<th>49</th>
<td>Камень Йоун (запас)</td>
<th>97</th>
<td>Щит притягивания снарядов</td>
</tr>
<tr>
<th>50</th>
<td>Камень Йоун (защита)</td>
<th>98</th>
<td>Щит, +2</td>
</tr>
<tr>
<th>51</th>
<td>Камень Йоун (осведомлённость)</td>
<th>99</th>
<td>Эльфийская кольчуга</td>
</tr>
<tr>
<th>52</th>
<td>Камень Йоун (пропитание)</td>
<th>00</th>
<td>Язык пламени</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-10</th>
<td>Оружие, +3</td>
<th>66</th>
<td>Доспех, +1 наборный</td>
</tr>
<tr>
<th>11-12</th>
<td>Амулет планов</td>
<th>67</th>
<td>Доспех, +1 проклёпанная кожа</td>
</tr>
<tr>
<th>13-14</th>
<td>Волшебная палочка боевого мага, +3</td>
<th>68</th>
<td>Доспех, +2 кожаный</td>
</tr>
<tr>
<th>15-16</th>
<td>Волшебная палочка превращения</td>
<th>69</th>
<td>Доспех, +2 кольчуга</td>
</tr>
<tr>
<th>17-18</th>
<td>Жезл бдительности</td>
<th>70</th>
<td>Доспех, +2 кольчужная рубаха</td>
</tr>
<tr>
<th>19-20</th>
<td>Жезл безопасности</td>
<th>71</th>
<td>Доспех, +2 чешуйчатый</td>
</tr>
<tr>
<th>21-22</th>
<td>Жезл поглощения</td>
<th>72</th>
<td>Живой щит</td>
</tr>
<tr>
<th>23-24</th>
<td>Жезл хранителя договора, +3</td>
<th>73</th>
<td>Зеркало похищения жизни</td>
</tr>
<tr>
<th>25-26</th>
<td>Ковёр-самолёт</td>
<th>74</th>
<td>Инструмент бардов (арфа Анструт)</td>
</tr>
<tr>
<th>27-28</th>
<td>Кольцо падающих звёзд</td>
<th>75</th>
<td>Камень Йоун (интеллект)</td>
</tr>
<tr>
<th>29-30</th>
<td>Кольцо регенерации</td>
<th>76</th>
<td>Камень Йоун (лидерство)</td>
</tr>
<tr>
<th>31-32</th>
<td>Кольцо телекинеза</td>
<th>77</th>
<td>Камень Йоун (ловкость)</td>
</tr>
<tr>
<th>33-34</th>
<td>Мантия звёзд</td>
<th>78</th>
<td>Камень Йоун (поглощение)</td>
</tr>
<tr>
<th>35-36</th>
<td>Мантия сияющих цветов</td>
<th>79</th>
<td>Камень Йоун (проницательность)</td>
</tr>
<tr>
<th>37-38</th>
<td>Меч остроты</td>
<th>80</th>
<td>Камень Йоун (сила)</td>
</tr>
<tr>
<th>39-40</th>
<td>Посох грома и молнии</td>
<th>81</th>
<td>Камень Йоун (стойкость)</td>
</tr>
<tr>
<th>41-42</th>
<td>Посох мороза</td>
<th>82</th>
<td>Латы дварфов</td>
</tr>
<tr>
<th>43-44</th>
<td>Посох огня</td>
<th>83</th>
<td>Лук клятвы</td>
</tr>
<tr>
<th>45-46</th>
<td>Посох силы</td>
<th>84</th>
<td>Морозный клинок</td>
</tr>
<tr>
<th>47-48</th>
<td>Посох ударов</td>
<th>85</th>
<td>Плащ паука</td>
</tr>
<tr>
<th>49-50</th>
<td>Скимитар скорости</td>
<th>86</th>
<td>Пояс силы ледяного (или каменного) великана</td>
</tr>
<tr>
<th>51-52</th>
<td>Хрустальный шар (очень редкая версия)</td>
<th>87</th>
<td>Пояс силы огненного великана</td>
</tr>
<tr>
<th>53-54</th>
<td>Щит, +3</td>
<th>88</th>
<td>Рог Валгаллы (бронзовый)</td>
</tr>
<tr>
<th>55</th>
<td>Адамантиновый доспех (латы)</td>
<th>89</th>
<td>Свеча мольбы</td>
</tr>
<tr>
<th>56</th>
<td>Адамантиновый доспех (полулаты)</td>
<th>90</th>
<td>Справочник быстроты действий</td>
</tr>
<tr>
<th>57</th>
<td>Бутылка с ифритом</td>
<th>91</th>
<td>Справочник по големам</td>
</tr>
<tr>
<th>58</th>
<td>Вор девяти жизней</td>
<th>92</th>
<td>Справочник полезных упражнений</td>
</tr>
<tr>
<th>59</th>
<td>Дварфский метатель</td>
<th>93</th>
<td>Справочник телесного здоровья</td>
</tr>
<tr>
<th>60</th>
<td>Демонический доспех</td>
<th>94</th>
<td>Статуэтка чудесной силы (обсидиановый скакун)</td>
</tr>
<tr>
<th>61</th>
<td>Доспех из драконьей чешуи</td>
<th>95</th>
<td>Танцующий меч</td>
</tr>
<tr>
<th>62</th>
<td>Доспех сопротивления (кираса)</td>
<th>96</th>
<td>Том лидерства и влияния</td>
</tr>
<tr>
<th>63</th>
<td>Доспех сопротивления (наборный)</td>
<th>97</th>
<td>Том понимания</td>
</tr>
<tr>
<th>64</th>
<td>Доспех сопротивления (проклёпанная кожа)</td>
<th>98</th>
<td>Том чистых мыслей</td>
</tr>
<tr>
<th rowspan="2">65</th>
<td rowspan="2">Доспех, +1 кираса</td>
<th>99</th>
<td>Шлем блеска</td>
</tr>
<tr>
<th>00</th>
<td>Щит от заклинаний</td>
</tr>
</table>
<table>
<tr>
<th>к100</th>
<th>Магический предмет</th>
<th>к100</th>
<th>Магический предмет</th>
</tr>
<tr>
<th>01-05</th>
<td>Защитник</td>
<th>77</th>
<td>Аппарат Квалиша</td>
</tr>
<tr>
<th>06-10</th>
<td>Клинок удачи</td>
<th>78</th>
<td>Доспех неуязвимости</td>
</tr>
<tr>
<th>11-15</th>
<td>Меч ответа</td>
<th>79</th>
<td>Доспех сопротивления (полулаты)</td>
</tr>
<tr>
<th>16-20</th>
<td>Молот грома</td>
<th>80</th>
<td>Инструмент бардов (арфа Оллава)</td>
</tr>
<tr>
<th>21-23</th>
<td>Святой мститель</td>
<th>81</th>
<td>Камень Йоун (большое поглощение)</td>
</tr>
<tr>
<th>24-26</th>
<td>Жезл величественной мощи</td>
<th>82</th>
<td>Камень Йоун (мастерство)</td>
</tr>
<tr>
<th>27-29</th>
<td>Кольцо невидимости</td>
<th>83</th>
<td>Камень Йоун (регенерация)</td>
</tr>
<tr>
<th>30-32</th>
<td>Кольцо отражения заклинаний</td>
<th>84</th>
<td>Колода многих вещей</td>
</tr>
<tr>
<th>33-35</th>
<td>Кольцо призыва джинна</td>
<th>85</th>
<td>Кольцо командования водяными элементалями</td>
</tr>
<tr>
<th>36-38</th>
<td>Меч головоруб</td>
<th>86</th>
<td>Кольцо командования воздушными элементалями</td>
</tr>
<tr>
<th>39-41</th>
<td>Посох магов</td>
<th>87</th>
<td>Кольцо командования земляными элементалями</td>
</tr>
<tr>
<th>42-43</th>
<td>Доспех, +1 латы</td>
<th>88</th>
<td>Кольцо командования огненными элементалями</td>
</tr>
<tr>
<th>44-45</th>
<td>Доспех, +1 полулаты</td>
<th>89</th>
<td>Кольцо трёх желаний</td>
</tr>
<tr>
<th>46-47</th>
<td>Доспех, +1 чешуйчатый</td>
<th>90</th>
<td>Кольчуга ифритов</td>
</tr>
<tr>
<th>48-49</th>
<td>Доспех, +2 кираса</td>
<th>91</th>
<td>Куб врат</td>
</tr>
<tr>
<th>50-51</th>
<td>Доспех, +2 наборный</td>
<th>92</th>
<td>Латный доспех сопротивления</td>
</tr>
<tr>
<th>52-53</th>
<td>Доспех, +2 проклёпанная кожа</td>
<th>93</th>
<td>Латный доспех эфирности</td>
</tr>
<tr>
<th>54-55</th>
<td>Доспех, +3 кожаный</td>
<th>94</th>
<td>Пояс силы штормового великана</td>
</tr>
<tr>
<th>56-57</th>
<td>Доспех, +3 кольчуга</td>
<th>95</th>
<td>Рог Валгаллы (железный)</td>
</tr>
<tr>
<th>58-59</th>
<td>Доспех, +3 кольчужная рубаха</td>
<th>96</th>
<td>Сфера аннигиляции</td>
</tr>
<tr>
<th>60-61</th>
<td>Жезл воскрешения</td>
<th>97</th>
<td>Талисман абсолютного зла</td>
</tr>
<tr>
<th>62-63</th>
<td>Железная фляга</td>
<th>98</th>
<td>Талисман сферы</td>
</tr>
<tr>
<th>64-65</th>
<td>Колодец многих миров</td>
<th>99</th>
<td>Талисман чистого добра</td>
</tr>
<tr>
<th>66-67</th>
<td>Мантия архимага</td>
<th>00</th>
<td>Том молчаливого языка</td>
</tr>
<tr>
<th>68-69 <br></th>
<td colspan="3">Плащ невидимости</td>
</tr>
<tr>
<th>70-71</th>
<td colspan="3">Пояс силы облачного великана</td>
</tr>
<tr>
<th>72-73 </th>
<td colspan="3">Скарабей защиты</td>
</tr>
<tr>
<th>74-75 </th>
<td colspan="3">Хрустальный шар (легендарная версия)</td>
</tr>
<tr>
<th rowspan="8">76 <br></th>
<td colspan="3">''Магический доспех (бросьте к12)''</td>
</tr>
<tr>
<td colspan="3">//''1–2'' Доспех, +2 полулаты//</td>
</tr>
<tr>
<td colspan="3">//''3–4'' Доспех, +2 латы//</td>
</tr>
<tr>
<td colspan="3">//''5–6'' Доспех, +3 проклёпанная кожа//</td>
</tr>
<tr>
<td colspan="3">//''7–8'' Доспех, +3 кираса//</td>
</tr>
<tr>
<td colspan="3">//''9–10'' Доспех, +3 наборный//</td>
</tr>
<tr>
<td colspan="3">//''11'' Доспех, +3 полулаты//</td>
</tr>
<tr>
<td colspan="3">//''12'' Доспех, +3 латы//</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1-5</td>
<td>Тихий, неброский бар</td>
</tr>
<tr>
<td>6-9</td>
<td>Шумный притон</td>
</tr>
<tr>
<td>10</td>
<td>Пристанище гильдии воров</td>
</tr>
<tr>
<td>11</td>
<td>Место сбора тайного общества</td>
</tr>
<tr>
<td>12-13</td>
<td>Трапезная высшего общества</td>
</tr>
<tr>
<td>14-15</td>
<td>Игровой салон</td>
</tr>
<tr>
<td>16-17</td>
<td>Заведение определённой расы или гильдии</td>
</tr>
<tr>
<td>18</td>
<td>Клуб, доступный только для членов</td>
</tr>
<tr>
<td>19-20</td>
<td>Бордель</td>
</tr>
</table>
<table>
<tr>
<th>к8 </th>
<th>Уязвимость</th>
</tr>
<tr>
<td>1</td>
<td>В спрятанном предмете хранится душа злодея.</td>
</tr>
<tr>
<td>2</td>
<td>Сила злодея исчезнет, если смерть его возлюбленной</td>
</tr>
<tr>
<td>3</td>
<td>Злодей слабеет в присутствии некоего артефакта.</td>
</tr>
<tr>
<td>4</td>
<td>Особое оружие причиняет злодею дополнительный урон.</td>
</tr>
<tr>
<td>5</td>
<td>Злодей будет уничтожен, если произнесут его настоящее имя.</td>
</tr>
<tr>
<td>6</td>
<td>Древнее пророчество или загадка раскрывают, как можно поразить злодея.</td>
</tr>
<tr>
<td>7</td>
<td>Злодей будет повержен, если его старый враг простит его злодеяния.</td>
</tr>
<tr>
<td>8</td>
<td>Злодей потеряет силу, если загадочная сделка, заключённая очень давно, будет выполнена.</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Несчастье</th>
</tr>
<tr>
<td>1</td>
<td>Подозревается нашествие вампиров</td>
</tr>
<tr>
<td>2</td>
<td>Новый культ ищет последователей</td>
</tr>
<tr>
<td>3</td>
<td>Умерла важная персона (подозревается убийство)</td>
</tr>
<tr>
<td>4</td>
<td>Война между враждующими гильдиями воров</td>
</tr>
<tr>
<td>5-6</td>
<td>Чума или голод (назревают бунты)</td>
</tr>
<tr>
<td>7</td>
<td>Продажные власти</td>
</tr>
<tr>
<td>8-9</td>
<td>Нападения чудовищ</td>
</tr>
<tr>
<td>10</td>
<td>В городе появился мощный волшебник</td>
</tr>
<tr>
<td>11</td>
<td>Экономика в депрессии (торговля подорвана)</td>
</tr>
<tr>
<td>12</td>
<td>Наводнение</td>
</tr>
<tr>
<td>13</td>
<td>На кладбище оживает нежить</td>
</tr>
<tr>
<td>14</td>
<td>Роковое пророчество</td>
</tr>
<tr>
<td>15</td>
<td>Назревает война</td>
</tr>
<tr>
<td>16</td>
<td>Внутренняя вражда (ведёт к анархии)</td>
</tr>
<tr>
<td>17</td>
<td>Осаждён врагами</td>
</tr>
<tr>
<td>18</td>
<td>Влиятельным семьям угрожает скандал</td>
</tr>
<tr>
<td>19</td>
<td>Обнаружено подземелье (в город стекаются искатели приключений)</td>
</tr>
<tr>
<td>20</td>
<td>Религиозные секты борются за власть</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Тип</th>
</tr>
<tr>
<td>1-10</td>
<td>Жилое (совершите бросок по таблице «жилище»)</td>
</tr>
<tr>
<td>11-12</td>
<td>Религиозное (совершите бросок по таблице «религиозное здание»)</td>
</tr>
<tr>
<td>13-15</td>
<td>Таверна (совершите бросок по таблице «таверна» и два броска по таблице «название таверны»)</td>
</tr>
<tr>
<td>16-17</td>
<td>Склад (совершите бросок по таблице «склад»)</td>
</tr>
<tr>
<td>18-20</td>
<td>Магазин (совершите бросок по таблице «магазин»)</td>
</tr>
</table>
!!!!''Типы лидеров''
<table>
<tr>
<th>к6</th>
<th>Тип лидера</th>
</tr>
<tr>
<td>1</td>
<td>Политический</td>
</tr>
<tr>
<td>2</td>
<td>Религиозный</td>
</tr>
<tr>
<td>3</td>
<td>Военный</td>
</tr>
<tr>
<td>4</td>
<td>Криминальный/подпольный</td>
</tr>
<tr>
<td>5</td>
<td>В области культуры/искусства</td>
</tr>
<tr>
<td>6</td>
<td>В области философии/эрудиции/магии</td>
</tr>
</table>
!!!!''Требования к еде и воде''
<table>
<tr>
<th>Размер существа</th>
<th>Еды в день</th>
<th>Воды в день</th>
</tr>
<tr>
<td>Крохотное</td>
<td>1/4 фунта</td>
<td>1/4 галлона</td>
</tr>
<tr>
<td>Маленькое</td>
<td>1 фунт</td>
<td>1 галлон</td>
</tr>
<tr>
<td>Среднее</td>
<td>1 фунт</td>
<td>1 галлон</td>
</tr>
<tr>
<td>Большое</td>
<td>4 фунта</td>
<td>4 галлона</td>
</tr>
<tr>
<td>Огромное</td>
<td>16 фунтов</td>
<td>16 галлонов</td>
</tr>
<tr>
<td>Громадное</td>
<td>64 фунта</td>
<td>64 галлона</td>
</tr>
</table>
!!!!''Тренировки для получения уровней''
<table>
<tr>
<th>Получаемый уровень</th>
<th>Время тренировки</th>
<th>Стоимость тренировки</th>
</tr>
<tr>
<td>2-4</td>
<td>10 дней</td>
<td>20 зм</td>
</tr>
<tr>
<td>5-10</td>
<td>20 дней</td>
<td>40 зм</td>
</tr>
<tr>
<td>11-16</td>
<td>30 дней</td>
<td>60 зм</td>
</tr>
<tr>
<td>17-20</td>
<td>40 дней</td>
<td>80 зм</td>
</tr>
</table>
<table>
<tr>
<th>Раса<br></th>
<th>Модификаторы характеристик</th>
<th>Умения</th>
</tr>
<tr>
<td>Ааракокра</td>
<td>+2 Лов, +2 Мдр</td>
<td>Пикирующая атака; атака когтём; скорость 20 фт., летая 50 фт., говорит на Ауране</td>
</tr>
<tr>
<td>Гнолл</td>
<td>+2 Сил, -2 Инт</td>
<td>Буйство; тёмное зрение 60 фт.</td>
</tr>
<tr>
<td>Гном*</td>
<td>-2 Инт, +2 Лов или Тел</td>
<td>Гномья хитрость; Маленький размер; скорость 25 фт.; тёмное зрение 60 фт.; говорит на Гномьем и Общем</td>
</tr>
<tr>
<td>Гном, глубинный</td>
<td>+1 Сил, +2 Лов</td>
<td>Гномья хитрость, Врождённое колдовство, Каменный камуфляж; Маленький размер; скорость 20 фт.; тёмное зрение 120 фт.; говорит на Г номьем, Подземном и Терране</td>
</tr>
<tr>
<td>Гоблин</td>
<td>-2 Сил, +2 Лов</td>
<td>Ловкий побег; Маленький размер; тёмное зрение 60 фт.; говорит на Гоблинском и Общем</td>
</tr>
<tr>
<td>Гримлок</td>
<td>+2 Сил, -2 Хар</td>
<td>Компенсация слепоты, Острый слух и тонкий нюх, Каменный камуфляж; не может быть ослеплён; слепое зрение 30 фт., или 10 фт. если глух (слеп за пределами этого радиуса); говорит на Подземном</td>
</tr>
<tr>
<td>Дварф*</td>
<td>-2 Сил или Мдр, +2 Тел</td>
<td>Дварфская устойчивость, Знание камня; скорость 25 фт.; тёмное зрение 60 фт.; говорит на Дварфском и Общем</td>
</tr>
<tr>
<td>Драконорождённый*</td>
<td>+2 Сил, +1 Хар</td>
<td>Оружие дыхания (при определении урона вместо уровня используйте показатель опасности), Сопротивление урону, Наследие драконов; говорит на Драконьем и Общем</td>
</tr>
<tr>
<td>Дроу*</td>
<td>-2 Лов, +1 Хар</td>
<td>Наследие фей, умение дроу Врождённое колдовство, Чувствительность к солнечному свету; тёмное зрение 120 фт.; говорит на Эльфийском и Подземном</td>
</tr>
<tr>
<td>Жаболюд</td>
<td>-2 Инт, -2 Хар</td>
<td>Амфибия, Общение с лягушками и жабами, Болотный камуфляж, Прыжок с места; скорость 20 фт., плавая 40 фт.; говорит на Жаболюдском</td>
</tr>
<tr>
<td>Зомби</td>
<td>-1 Сил, +2 Тел, -6 Инт, -4 Мдр, -4 Хар</td>
<td>Стойкость нежити; иммунитет к урону ядом; не может быть отравлен; тёмное зрение 60 фт.; не может говорить, но понимает языки, известные при жизни</td>
</tr>
<tr>
<td>Кенку</td>
<td>+2 Лов</td>
<td>Мастер устраивать засады, Подражание; понимает Ауран и Общий, но говорит только с помощью особенности Подражание</td>
</tr>
<tr>
<td>Кобольд</td>
<td>-4 Сил, +2 Лов</td>
<td>Тактика стаи, Чувствительность к солнечному свету; Маленький размер; тёмное зрение 60 фт.; говорит на Драконьем и Общем</td>
</tr>
<tr>
<td>Куо-тоа</td>
<td>Нет</td>
<td>Амфибия, Сверхъестественное восприятие, Скользкий, Чувствительность к солнечному свету; скорость 30 фт., плавая 30 фт.; тёмное зрение 120 фт.; говорит на Подземном</td>
</tr>
<tr>
<td>Людоящер</td>
<td>-2 Сил, -2 Инт</td>
<td>Задержка дыхания (15 мин.); бонус природного доспеха +3 к КД; скорость 30 фт., плавая 30 фт.; говорит на Драконьем</td>
</tr>
<tr>
<td>Мерфолк</td>
<td>Нет</td>
<td>Амфибия; скорость 10 фт., плавая 40 фт.; говорит на Акване и Общем</td>
</tr>
<tr>
<td>Орк</td>
<td>+2 Сил, -2 Инт</td>
<td>Агрессивный; тёмное зрение 60 фт.; говорит на Общем и Орочьем</td>
</tr>
<tr>
<td>Полуорк*</td>
<td>+2 Сил, + 1 Тел</td>
<td>Непоколебимая стойкость; тёмное зрение 60 фт.; владение навыком Запугивание; говорит на Общем и Орочьем</td>
</tr>
<tr>
<td>Полурослик*</td>
<td>-2 Лов, +1 Тел или Хар</td>
<td>Храбрый, Проворство полуросликов, Везучий; Маленький размер; скорость 25 фт.; говорит на Общем и языке Полуросликов</td>
</tr>
<tr>
<td>Полуэльф*</td>
<td>+1 Лов, +1 Инт, +2 Хар</td>
<td>Наследие фей; тёмное зрение 60 фт.; владение двумя навыками; говорит на Общем и Эльфийском</td>
</tr>
<tr>
<td>Скелет</td>
<td>-2 Лов, -4 Инт, -4 Хар</td>
<td>Уязвимость к дробящему урону; иммунитет к урону ядом и истощению; не может быть отрав-лен; тёмное зрение 60 фт.; не может говорить, но понимает языки, известные при жизни</td>
</tr>
<tr>
<td>Тифлинг*</td>
<td>+1 Инт, +2 Хар</td>
<td>Дьявольское наследие (вместо уровня используйте показатель опасности), сопротивление к урону огнём; тёмное зрение 60 фт.; говорит на Инфернальном и Общем</td>
</tr>
<tr>
<td>Троглодит</td>
<td>-2 Сил, +2 Тел, -4 Инт, -4 Хар</td>
<td>Кожа хамелеона, Вонь, Чувствительность к солнечному свету; бонус природного доспеха +1 к КД; тёмное зрение 60 фт.; говорит на Троглодитском</td>
</tr>
<tr>
<td>Хобгоблин</td>
<td>Нет</td>
<td>Воинское превосходство; тёмное зрение 60 фт.; говорит на Гоблинском и Общем</td>
</tr>
<tr>
<td>Эльф*</td>
<td>-2 Лов, +1 Инт или Мдр</td>
<td>Наследие фей, Транс; тёмное зрение 60 фт.; владение навыком Внимательность; говорит на Общем и Эльфийском</td>
</tr>
<tr>
<td colspan="3">''*'' //Смотрите в Книге игрока описание расовых особенностей, ни одна из которых не влияет на показатель опасности ПМ.//</td>
</tr>
</table>
<table>
<tr>
<th>Название</th>
<th>Пример</th>
<th>Влияние на показатель опасности</th>
</tr>
<tr>
<td>Агрессивный</td>
<td>Орк</td>
<td>Увеличьте эффективный урон в раунд на 2.</td>
</tr>
<tr>
<td>Аморфный</td>
<td>Чёрная слизь</td>
<td>—</td>
</tr>
<tr>
<td>Амфибия</td>
<td>Куо-тоа</td>
<td>—</td>
</tr>
<tr>
<td>Атака в броске</td>
<td>Кентавр</td>
<td>Увеличьте урон одной атаки на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Безрассудство</td>
<td>Минотавр</td>
<td>—</td>
</tr>
<tr>
<td>Бестелесное перемещение</td>
<td>Привидение</td>
<td>—</td>
</tr>
<tr>
<td>Благословение исчадия </td>
<td>Камбион</td>
<td>Добавьте модификатор Харизмы к настоящему КД.</td>
</tr>
<tr>
<td>Борец</td>
<td>Мимик</td>
<td>—</td>
</tr>
<tr>
<td>Буйство</td>
<td>Гнолл</td>
<td>Увеличьте эффективный урон в раунд на 2.</td>
</tr>
<tr>
<td>Быстрая реакция</td>
<td>Марилит</td>
<td>—</td>
</tr>
<tr>
<td>Внезапная атака</td>
<td>Медвежатник</td>
<td>Увеличьте эффективный урон на 1 раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Воинское превосходство</td>
<td>Хобгоблин</td>
<td>Увеличьте эффективный урон одной атаки в раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Вонь</td>
<td>Троглодит</td>
<td>Увеличьте эффективный КД на 1.</td>
</tr>
<tr>
<td>Восприимчивость к антимагии</td>
<td>Летающий меч</td>
<td>—</td>
</tr>
<tr>
<td>Восстановление</td>
<td>Лич</td>
<td>—</td>
</tr>
<tr>
<td>Врождённое колдовство </td>
<td>Джинн</td>
<td>Смотрите шаг 13 в разделе «создание блока статистики чудовища».</td>
</tr>
<tr>
<td>Вытягивание жизни</td>
<td>Умертвие</td>
<td>—</td>
</tr>
<tr>
<td>Две головы</td>
<td>Эттин</td>
<td>—</td>
</tr>
<tr>
<td>Дьявольское зрение</td>
<td>Шипастый дьявол</td>
<td>—</td>
</tr>
<tr>
<td>Жестокость</td>
<td>Медвежатник</td>
<td>Увеличьте эффективный урон в раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Задержка дыхания</td>
<td>Людоящер</td>
<td>—</td>
</tr>
<tr>
<td>Запоминание пути</td>
<td>Минотавр</td>
<td>—</td>
</tr>
<tr>
<td>Избегание</td>
<td>Демилич</td>
<td>Увеличьте эффективный КД на 1.</td>
</tr>
<tr>
<td>Иллюзорная внешность</td>
<td>Зелёная карга</td>
<td>—</td>
</tr>
<tr>
<td>Иммунитет к изгнанию Ревенант</td>
<td>—</td>
<td></td>
</tr>
<tr>
<td>Использование заклинаний</td>
<td>Лич</td>
<td>Смотрите шаг 13 в разделе «создание блока статистики чудовища».</td>
</tr>
<tr>
<td>Камуфляж на местности</td>
<td>Жаболюд</td>
<td>—</td>
</tr>
<tr>
<td>Кожа хамелеона</td>
<td>Троглодит</td>
<td>—</td>
</tr>
<tr>
<td>Компенсация слепоты</td>
<td>Гримлок</td>
<td>—</td>
</tr>
<tr>
<td>Кровавое бешенство</td>
<td>Сахуагин</td>
<td>Увеличьте эффективный бонус атаки на 4.</td>
</tr>
<tr>
<td>Легендарное сопротивление</td>
<td>Древний чёрный дракон</td>
<td>Каждое ежедневное использование этой особенности увеличивает эффективные хиты чудовища в зависимости от его ожидаемого показателя опасности: 1-4, 10 хитов; 5-10, 20 хитов; 11 или выше, 30 хитов.</td>
</tr>
<tr>
<td>Лидерство</td>
<td>Капитан хобгоблинов</td>
<td>—</td>
</tr>
<tr>
<td>Ловкий побег</td>
<td>Гоблин</td>
<td>Увеличьте эффективный КД и эффективный бонус атаки на 4 (при условии, что чудовище в каждом раунде прячется).</td>
</tr>
<tr>
<td>Магическое оружие</td>
<td>Балор</td>
<td>—</td>
</tr>
<tr>
<td>Мастер устраивать засады</td>
<td>Доппельгангер</td>
<td>Увеличьте эффективный бонус атаки на 1.</td>
</tr>
<tr>
<td>Наскок</td>
<td>Тигр</td>
<td>Увеличьте эффективный урон на 1 раунд на количество, причиняемое бонусным действием этой особенности.</td>
</tr>
<tr>
<td>Наследие фей</td>
<td>Дроу</td>
<td>—</td>
</tr>
<tr>
<td>Невидимость</td>
<td>Бес</td>
<td>—</td>
</tr>
<tr>
<td>Неизменяемая форма </td>
<td>Железный голем</td>
<td>—</td>
</tr>
<tr>
<td>Непостижимый</td>
<td>Андросфинкс</td>
<td>—</td>
</tr>
<tr>
<td>Неумолимый</td>
<td>Вервепрь</td>
<td>Увеличьте эффективные хиты чудовища в зависимости от его ожидаемого показателя опасности: 1-4, 7 хитов; 5-10, 14 хитов; 11-16, 21 хит; 17 или выше, 28 хитов.</td>
</tr>
<tr>
<td>Облёт</td>
<td>Перитон</td>
<td>—</td>
</tr>
<tr>
<td>Обманчивая внешность</td>
<td>Горгулья</td>
<td>—</td>
</tr>
<tr>
<td>Одержимость</td>
<td>Привидение</td>
<td>Удвойте эффективные хиты.</td>
</tr>
<tr>
<td>Оружие ангела</td>
<td>Дэв</td>
<td>Увеличьте эффективный урон в раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Оружие дыхания</td>
<td>Древний чёрный дракон</td>
<td>При определении эффективного урона считайте, что оружие дыхания попадает по двум целям, и что все цели провалили спасброски.</td>
</tr>
<tr>
<td>Осадное чудовище</td>
<td>Земляной элементаль</td>
<td>—</td>
</tr>
<tr>
<td>Острые чувства</td>
<td>Адская гончая</td>
<td>—</td>
</tr>
<tr>
<td>Очарование</td>
<td>Вампир</td>
<td>—</td>
</tr>
<tr>
<td>Парирование</td>
<td>Хобгоблин военачальник</td>
<td>Увеличьте эффективный КД на 1.</td>
</tr>
<tr>
<td>Паутина</td>
<td>Гигантский паук</td>
<td>Увеличьте эффективный КД на 1.</td>
</tr>
<tr>
<td>Паучье лазание</td>
<td>Эттеркап</td>
<td>—</td>
</tr>
<tr>
<td>Перевёртыш</td>
<td>Веркрыса</td>
<td>—</td>
</tr>
<tr>
<td>Передача урона</td>
<td>Плащевик</td>
<td>Удвойте эффективные хиты. Добавьте одну третью хитов чудовища к урону в раунд.</td>
</tr>
<tr>
<td>Перенаправление атаки</td>
<td>Босс гоблинов</td>
<td>—</td>
</tr>
<tr>
<td>Пикирующая атака</td>
<td>Ааракокра</td>
<td>Увеличьте урон одной атаки на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Поглощение урона</td>
<td>Мясной голем</td>
<td>—</td>
</tr>
<tr>
<td>Подражание</td>
<td>Кенку</td>
<td>—</td>
</tr>
<tr>
<td>Подтаскивание</td>
<td>Верёвочник</td>
<td>—</td>
</tr>
<tr>
<td>Превосходная невидимость</td>
<td>Волшебный дракончик</td>
<td>Увеличьте эффективный КД на 2.</td>
</tr>
<tr>
<td>Предсмертная вспышка</td>
<td>Магмин</td>
<td>Увеличьте эффективный урон на 1 раунд на количество, указанное в описании особенности, считая, что она будет действовать на два существа.</td>
</tr>
<tr>
<td>Проглатывание</td>
<td>Бехир</td>
<td>Предположите, что чудовище проглотило одно существо и в течение 2 раундов причиняет ему урон кислотой.</td>
</tr>
<tr>
<td>Прокладывание туннеля</td>
<td>Бурый увалень</td>
<td>—</td>
</tr>
<tr>
<td>Прыжок с места</td>
<td>Жаболюд</td>
<td>—</td>
</tr>
<tr>
<td>Психическая защита</td>
<td>Гитцерай монах</td>
<td>Добавьте модификатор Мудрости к настоящему КД, если чудовище не носит доспех и не использует щит.</td>
</tr>
<tr>
<td>Регенерация</td>
<td>Тролль</td>
<td>Увеличьте эффективные хиты на 3 х число хитов, регенерируемых каждый раунд.</td>
</tr>
<tr>
<td>Сверхъестественное восприятие</td>
<td>Куо-тоа</td>
<td>—</td>
</tr>
<tr>
<td>Свечение</td>
<td>Пылающий череп</td>
<td>—</td>
</tr>
<tr>
<td>Сжимание</td>
<td>Удав</td>
<td>Увеличьте эффективный КД на 1.</td>
</tr>
<tr>
<td>Скользкий</td>
<td>Куо-тоа</td>
<td>—</td>
</tr>
<tr>
<td>Скрытность в тени</td>
<td>Теневой демон</td>
<td>Увеличьте эффективный КД на 4.</td>
</tr>
<tr>
<td>Смена облика</td>
<td>Древний латунный дракон</td>
<td>—</td>
</tr>
<tr>
<td>Сопротивление изгнанию</td>
<td>Лич</td>
<td>—</td>
</tr>
<tr>
<td>Сопротивление магии</td>
<td>Балор</td>
<td>Увеличьте эффективный КД на 2.</td>
</tr>
<tr>
<td>Стихийное тело</td>
<td>Эйзер</td>
<td>Увеличьте эффективный урон в раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Стойкость нежити</td>
<td>Зомби</td>
<td>Увеличьте эффективные хиты чудовища в зависимости от его ожидаемого показателя опасности: 1-4, 7 хитов; 5-10, 14 хитов; 11-16, 21 хит; 17 или выше, 28 хитов.</td>
</tr>
<tr>
<td>Тактика стаи</td>
<td>Кобольд</td>
<td>Увеличьте эффективный бонус атаки на 1.</td>
</tr>
<tr>
<td>Телепортация</td>
<td>Балор</td>
<td>—</td>
</tr>
<tr>
<td>Увеличение</td>
<td>Дуэргар</td>
<td>Увеличьте эффективный урон в раунд на количество, указанное в описании особенности.</td>
</tr>
<tr>
<td>Уверенный</td>
<td>Бородатый дьявол</td>
<td>—</td>
</tr>
<tr>
<td>Ужасающая внешность</td>
<td>Древний чёрный дракон</td>
<td>Увеличьте эффективные хиты на 25%, если чудовище предназначено для персонажей не больше 10 уровня.</td>
</tr>
<tr>
<td>Ужасающий облик</td>
<td>Баньши</td>
<td>Смотрите «ужасающая внешность».</td>
</tr>
<tr>
<td>Устойчивый</td>
<td>Дао</td>
<td>—</td>
</tr>
<tr>
<td>Хождение по паутине</td>
<td>Гигантский паук</td>
<td>—</td>
</tr>
<tr>
<td>Чтение мыслей</td>
<td>Доппельгангер</td>
<td>—</td>
</tr>
<tr>
<td>Чувствительность к свету </td>
<td>Теневой демон</td>
<td>—</td>
</tr>
<tr>
<td>Чувствительность к солнечному свету</td>
<td>Кобольд</td>
<td>—</td>
</tr>
<tr>
<td>Чувство паутины</td>
<td>Гигантский паук</td>
<td>—</td>
</tr>
<tr>
<td>Эфирность</td>
<td>Ночная карга</td>
<td>—</td>
</tr>
<tr>
<td>Эхолокация</td>
<td>Крюкастый ужас</td>
<td>—</td>
</tr>
<tr>
<td>Ярость от ранения</td>
<td>Кваггот</td>
<td>Увеличьте эффективный урон на 1 раунд на количество, указанное в описании особенности.</td>
</tr>
</table>
!!!!''Урон в зависимости от уровня''
<table>
<tr>
<th>Уровень персонажа</th>
<th>Неудобство</th>
<th>Опасная</th>
<th>Смертельная</th>
</tr>
<tr>
<td>1-4</td>
<td>1к10</td>
<td>2к10</td>
<td>4к10</td>
</tr>
<tr>
<td>5-10</td>
<td>2к10</td>
<td>4к10</td>
<td>10к10</td>
</tr>
<tr>
<td>11-16</td>
<td>4к10</td>
<td>10к10</td>
<td>18к10</td>
</tr>
<tr>
<td>17-20</td>
<td>10к10</td>
<td>18к10</td>
<td>24к10</td>
</tr>
</table>
!!!!''Формы правления''
<table>
<tr>
<th>к100</th>
<th>Правительство</th>
<th>к100</th>
<th>Правительство</th>
</tr>
<tr>
<td>01-08</td>
<td>Самодержавие</td>
<td>59-64</td>
<td>Милитократия</td>
</tr>
<tr>
<td>09-13</td>
<td>Бюрократия</td>
<td>65-74</td>
<td>Монархия</td>
</tr>
<tr>
<td>14-19</td>
<td>Конфедерация</td>
<td>75-78</td>
<td>Олигархия</td>
</tr>
<tr>
<td>20-22</td>
<td>Демократия</td>
<td>79-80</td>
<td>Патриархия</td>
</tr>
<tr>
<td>23-27</td>
<td>Диктатура</td>
<td>81-83</td>
<td>Меритократия</td>
</tr>
<tr>
<td>28-42</td>
<td>Феодализм</td>
<td>84-85</td>
<td>Плутократия</td>
</tr>
<tr>
<td>43-44</td>
<td>Геронтократия</td>
<td>86-92</td>
<td>Республика</td>
</tr>
<tr>
<td>45-53</td>
<td>Иерархия</td>
<td>93-94</td>
<td>Сатрапия</td>
</tr>
<tr>
<td>54-56</td>
<td>Магократия</td>
<td>95</td>
<td>Клептократия</td>
</tr>
<tr>
<td>57-58</td>
<td>Матриархат</td>
<td>96-00</td>
<td>Теократия</td>
</tr>
</table>
<table>
<tr>
<th colspan="2">Общие</th>
<th colspan="2">Защитные</th>
<th colspan="3">Атакующие</th>
</tr>
<tr>
<th>ПО</th>
<th>Бонус маст.</th>
<th>Класс Доспеха</th>
<th>Хиты</th>
<th>Бонус атаки</th>
<th>Урон/раунд</th>
<th>Сл спасброска</th>
</tr>
<tr>
<td>0</td>
<td>+2</td>
<td>< 13</td>
<td>1-6</td>
<td>< +3</td>
<td>0-1</td>
<td>< 13</td>
</tr>
<tr>
<td>1/8</td>
<td>+2</td>
<td>13</td>
<td>7-35</td>
<td>+3</td>
<td>2-3</td>
<td>13</td>
</tr>
<tr>
<td>1/4</td>
<td>+2</td>
<td>13</td>
<td>36-49</td>
<td>+3</td>
<td>4-5</td>
<td>13</td>
</tr>
<tr>
<td>1/2</td>
<td>+2</td>
<td>13</td>
<td>50-70</td>
<td>+3</td>
<td>6-8</td>
<td>13</td>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>13</td>
<td>71-85</td>
<td>+3</td>
<td>9-14</td>
<td>13</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>13</td>
<td>86-100</td>
<td>+3</td>
<td>15-20</td>
<td>13</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>13</td>
<td>101-115</td>
<td>+4</td>
<td>21-26</td>
<td>13</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>14</td>
<td>116-130</td>
<td>+5</td>
<td>27-32</td>
<td>14</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>15</td>
<td>131-145</td>
<td>+6</td>
<td>33-38</td>
<td>15</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>15</td>
<td>146-160</td>
<td>4+6</td>
<td>39-44</td>
<td>15</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>15</td>
<td>161-175</td>
<td>+6</td>
<td>45-50</td>
<td>15</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>16</td>
<td>176-190</td>
<td>+7</td>
<td>51-56</td>
<td>16</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>16</td>
<td>191-205</td>
<td>+7</td>
<td>57-62</td>
<td>16</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>17</td>
<td>206-220</td>
<td>+7</td>
<td>63-68</td>
<td>16</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>17</td>
<td>221-235</td>
<td>+8</td>
<td>69-74</td>
<td>17</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>17</td>
<td>236-250</td>
<td>+8</td>
<td>75-80</td>
<td>17</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>18</td>
<td>251-265</td>
<td>+8</td>
<td>81-86</td>
<td>18</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>18</td>
<td>266-280</td>
<td>+8</td>
<td>87-92</td>
<td>18</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>18</td>
<td>281-295</td>
<td>+8</td>
<td>93-98</td>
<td>18</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>18</td>
<td>296-310</td>
<td>+9</td>
<td>99-104</td>
<td>18</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>19</td>
<td>311-325</td>
<td>+10</td>
<td>105-110</td>
<td>19</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>19</td>
<td>326-340</td>
<td>+10</td>
<td>111-116</td>
<td>19</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>19</td>
<td>341-355</td>
<td>+10</td>
<td>117-122</td>
<td>19</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>19</td>
<td>356-400</td>
<td>+10</td>
<td>123-140</td>
<td>19</td>
</tr>
<tr>
<td>21</td>
<td>+7</td>
<td>19</td>
<td>401-445</td>
<td>+11</td>
<td>141-158</td>
<td>20</td>
</tr>
<tr>
<td>22</td>
<td>+7</td>
<td>19</td>
<td>446-490</td>
<td>+11</td>
<td>159-176</td>
<td>20</td>
</tr>
<tr>
<td>23</td>
<td>+7</td>
<td>19</td>
<td>491-535</td>
<td>+11</td>
<td>177-194</td>
<td>20</td>
</tr>
<tr>
<td>24</td>
<td>+7</td>
<td>19</td>
<td>536-580</td>
<td>+12</td>
<td>195-212</td>
<td>21</td>
</tr>
<tr>
<td>25</td>
<td>+8</td>
<td>19</td>
<td>581-625</td>
<td>+12</td>
<td>213-230</td>
<td>21</td>
</tr>
<tr>
<td>26</td>
<td>+8</td>
<td>19</td>
<td>626-670</td>
<td>+12</td>
<td>231-248</td>
<td>21</td>
</tr>
<tr>
<td>27</td>
<td>+8</td>
<td>19</td>
<td>671-715</td>
<td>+13</td>
<td>249-266</td>
<td>22</td>
</tr>
<tr>
<td>28</td>
<td>+8</td>
<td>19</td>
<td>716-760</td>
<td>+13</td>
<td>267-284</td>
<td>22</td>
</tr>
<tr>
<td>29</td>
<td>+9</td>
<td>19</td>
<td>761-805</td>
<td>+13</td>
<td>285-302</td>
<td>22</td>
</tr>
<tr>
<td>30</td>
<td>+9</td>
<td>19</td>
<td>806-850</td>
<td>+14</td>
<td>303-320</td>
<td>23</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Высокая характеристика</th>
<th></th>
<th>к6</th>
<th>Низкая характеристика</th>
</tr>
<tr>
<td>1</td>
<td>Сила — сильный, мускулистый, крупный</td>
<th></th>
<td>1</td>
<td>Сила — слабый, щуплый</td>
</tr>
<tr>
<td>2</td>
<td>Ловкость — стройный, ловкий, грациозный</td>
<th></th>
<td>2</td>
<td>Ловкость — неуклюжий, угловатый</td>
</tr>
<tr>
<td>3</td>
<td>Телосложение — выносливый, крепкий, здоровый</td>
<th></th>
<td>3</td>
<td>Телосложение — болезненный, бледный</td>
</tr>
<tr>
<td>4</td>
<td>Интеллект — грамотный, образованный, любознательный</td>
<th></th>
<td>4</td>
<td>Интеллект — глупый, недалёкий</td>
</tr>
<tr>
<td>5</td>
<td>Мудрость — проницательный, набожный, внимательный</td>
<th></th>
<td>5</td>
<td>Мудрость — забывчивый, рассеянный</td>
</tr>
<tr>
<td>6</td>
<td>Харизма — убедительный, волевой, прирождённый лидер</td>
<th></th>
<td>6</td>
<td>Харизма — скучный, монотонный</td>
</tr>
</table>
<table>
<tr>
<th>к20 </th>
<th>Цели подземелий</th>
<th></th>
<th>к20</th>
<th>Цели дикой местности</th>
</tr>
<tr>
<td>1</td>
<td>Чудовищные обитатели подземелья терроризируют окрестности. Нужно остановить их!</td>
<th></th>
<td>1</td>
<td><br>Займитесь поиском подземелья или любого другого интересного места (бросьте кость по таблице «цели подземелий», чтобы выяснить, зачем).<br></td>
</tr>
<tr>
<td>2</td>
<td>Сорвать злодею все планы.</td>
<th></th>
<td>2</td>
<td>Оцените масштабы естественной или противоестественной катастрофы.</td>
</tr>
<tr>
<td>3</td>
<td>Уничтожить магическую угрозу внутри подземелья.</td>
<th></th>
<td>3</td>
<td>Сопроводите ПМ в пункт назначения.</td>
</tr>
<tr>
<td>4</td>
<td>Найти сокровище.</td>
<th></th>
<td>4</td>
<td>Доберитесь до пункта назначения, оставшись незамеченными для сил злодея.</td>
</tr>
<tr>
<td>5</td>
<td>Найти конкретный предмет, необходимый для определённой задачи.</td>
<th></th>
<td>5</td>
<td>Остановите набеги чудовищ на караваны и фермерские хозяйства.</td>
</tr>
<tr>
<td>6</td>
<td>Найти украденный предмет, спрятанный в подземелье</td>
<th></th>
<td>6</td>
<td>Установите торговые связи с далёким городом.</td>
</tr>
<tr>
<td>7</td>
<td>Найти информацию, необходимую для определённой задачи.</td>
<th></th>
<td>7</td>
<td>Защитите караван, идущий в далёкий город.</td>
</tr>
<tr>
<td>8</td>
<td>Спасти пленника.</td>
<th></th>
<td>8</td>
<td>Нанесите на карту новые земли.</td>
</tr>
<tr>
<td>9</td>
<td>Выяснить, что случилось с предыдущей группой искателей приключений.</td>
<th></th>
<td>9</td>
<td>Найдите место для создания колонии.</td>
</tr>
<tr>
<td>10</td>
<td>Найти исчезнувшего ПМ.</td>
<th></th>
<td>10</td>
<td>Найдите природный ресурс.</td>
</tr>
<tr>
<td>11</td>
<td>Убить дракона или другое опасное чудовище.</td>
<th></th>
<td>11</td>
<td>Начните охоту на конкретное чудовище.</td>
</tr>
<tr>
<td>12</td>
<td>Исследуйте природу и происхождение странного места или явления.</td>
<th></th>
<td>12</td>
<td>Вернитесь домой из далёкого места.</td>
</tr>
<tr>
<td>13</td>
<td>Прогнать врагов, устроивших убежище в подземелье.</td>
<th></th>
<td>13</td>
<td>Добудьте информацию у отшельника-затворника.</td>
</tr>
<tr>
<td>14</td>
<td>Сбегите из подземного плена.</td>
<th></th>
<td>14</td>
<td>Найдите предмет, который был потерян в диких местах.</td>
</tr>
<tr>
<td>15</td>
<td>Очистите руины от врагов, чтобы их можно было восстановить и вновь там обосноваться.</td>
<th></th>
<td>15</td>
<td>Узнайте, что случилось с пропавшей группой исследователей.</td>
</tr>
<tr>
<td>16</td>
<td>Узнайте, почему именно злодей так заинтересован в этом подземелье.</td>
<th></th>
<td>16</td>
<td>Догоните убегающих противников.</td>
</tr>
<tr>
<td>17</td>
<td>Выиграйте пари или завершите обряд посвящения, выживая в подземелье в течение определённого количества времени.</td>
<th></th>
<td>17</td>
<td>Оцените размер приближающейся армии.</td>
</tr>
<tr>
<td>18</td>
<td>Устройте переговоры со злодеем в подземелье.</td>
<th></th>
<td>18</td>
<td>Не дайте тирану взойти на трон.</td>
</tr>
<tr>
<td>19</td>
<td>Скрывайтесь от опасности, угрожающей вне подземелья.</td>
<th></th>
<td>19</td>
<td>Защитите дикое место от нападающих.</td>
</tr>
<tr>
<td>20</td>
<td>Бросьте кость дважды, игнорируя результат «20».</td>
<th></th>
<td>20</td>
<td>Бросьте кость дважды, игнорируя результат «20».</td>
</tr>
</table>
<table>
<tr>
<th>к12</th>
<th>Другие цели</th>
</tr>
<tr>
<td>1</td>
<td>Захватите контроль над укреплённым объектом, таким как крепость, город, или корабль.</td>
</tr>
<tr>
<td>2</td>
<td>Защитите место от нападающих.</td>
</tr>
<tr>
<td>3</td>
<td>Заполучите предмет из надёжного места в поселении.</td>
</tr>
<tr>
<td>4</td>
<td>Заполучите предмет из каравана.</td>
</tr>
<tr>
<td>5</td>
<td>Достаньте предмет или товар из затерянного судна или каравана.</td>
</tr>
<tr>
<td>6</td>
<td>Вытащите заключённого из тюрьмы или тюремного лагеря.</td>
</tr>
<tr>
<td>7</td>
<td>Сбегите из тюрьмы или тюремного лагеря.</td>
</tr>
<tr>
<td>8</td>
<td>Пройдите через полосу препятствий, чтобы получить признание или награду.</td>
</tr>
<tr>
<td>9</td>
<td>Проникните в укреплённое место.</td>
</tr>
<tr>
<td>10</td>
<td>Найдите причину странных происшествий в доме с привидениями или в другом месте.</td>
</tr>
<tr>
<td>11</td>
<td>Помешайте работе бизнеса или предприятия.</td>
</tr>
<tr>
<td>12</td>
<td>Спасите персонажа, чудовище, или предмет от естественной или неестественной катастрофы.</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Цель</th>
</tr>
<tr>
<td>1</td>
<td>Представить злодея перед правосудием.</td>
</tr>
<tr>
<td>2</td>
<td>Вернуть доброе имя оболганному ПМ.</td>
</tr>
<tr>
<td>3</td>
<td>Защитить или спрятать ПМ.</td>
</tr>
<tr>
<td>4</td>
<td>Защитить объект.</td>
</tr>
<tr>
<td>5</td>
<td>Открыть для себя природу и происхождение странного явления, которое может быть результатом дел злодея.</td>
</tr>
<tr>
<td>6</td>
<td>Найти беглеца в розыске.</td>
</tr>
<tr>
<td>7</td>
<td>Свергнуть тирана.</td>
</tr>
<tr>
<td>8</td>
<td>Раскрыть заговор с целью свержения правителя.</td>
</tr>
<tr>
<td>9</td>
<td>Договориться о мире между враждующими нациями или семьями.</td>
</tr>
<tr>
<td>10</td>
<td>Добиться помощи от правителя или совета.</td>
</tr>
<tr>
<td>11</td>
<td>Помочь злодею найти искупление.</td>
</tr>
<tr>
<td>12</td>
<td>Провести переговоры со злодеем.</td>
</tr>
<tr>
<td>13</td>
<td>Поставить контрабанду оружия повстанцам.</td>
</tr>
<tr>
<td>14</td>
<td>Остановить банду контрабандистов.</td>
</tr>
<tr>
<td>15</td>
<td>Собрать информацию о вражеских силах.</td>
</tr>
<tr>
<td>16</td>
<td>Выиграть турнир.</td>
</tr>
<tr>
<td>17</td>
<td>Определить личность злодея.</td>
</tr>
<tr>
<td>18</td>
<td>Найти украденный предмет.</td>
</tr>
<tr>
<td>19</td>
<td>Следить за тем, чтобы свадьба прошла без сучка без задоринки.</td>
</tr>
<tr>
<td>20</td>
<td>Бросьте кость дважды, игнорируя результат «20».</td>
</tr>
</table>
<table>
<tr>
<th>к20</th>
<th>Расположение</th>
</tr>
<tr>
<td>1</td>
<td>Среди ветвей дерева</td>
</tr>
<tr>
<td>2</td>
<td>Вокруг гейзера</td>
</tr>
<tr>
<td>3</td>
<td>За водопадом</td>
</tr>
<tr>
<td>4</td>
<td>Погребено камнепадом</td>
</tr>
<tr>
<td>5</td>
<td>Погребено песчаной бурей</td>
</tr>
<tr>
<td>6</td>
<td>Погребено вулканическим пеплом</td>
</tr>
<tr>
<td>7</td>
<td>Замок или здание, затонувшее в болоте</td>
</tr>
<tr>
<td>8</td>
<td>Замок или здание на дне карстовой воронки</td>
</tr>
<tr>
<td>9</td>
<td>Плавает в море</td>
</tr>
<tr>
<td>10</td>
<td>В метеорите</td>
</tr>
<tr>
<td>11</td>
<td>На демиплане или в карманном измерении</td>
</tr>
<tr>
<td>12</td>
<td>В области, разрушенной магической катастрофой</td>
</tr>
<tr>
<td>13</td>
<td>На облаке</td>
</tr>
<tr>
<td>14</td>
<td>В Стране Фей</td>
</tr>
<tr>
<td>15</td>
<td>В Царстве Теней</td>
</tr>
<tr>
<td>16</td>
<td>На острове в подземном море</td>
</tr>
<tr>
<td>17</td>
<td>В вулкане</td>
</tr>
<tr>
<td>18</td>
<td>На спине Громадного живого существа</td>
</tr>
<tr>
<td>19</td>
<td>Запечатано в магическом куполе из силового поля</td>
</tr>
<tr>
<td>20</td>
<td>Внутри великолепного особняка Морденкайнена</td>
</tr>
</table>
!!!!''Эфирные завесы''
<table>
<tr>
<th>к8</th>
<th>План</th>
<th>Цвет завесы</th>
</tr>
<tr>
<td>1</td>
<td>Материальный План</td>
<td>Ярко-бирюзовый</td>
</tr>
<tr>
<td>2</td>
<td>Царство Теней</td>
<td>Тускло-серы й</td>
</tr>
<tr>
<td>3</td>
<td>Страна Фей</td>
<td>Опалесцирующий белый</td>
</tr>
<tr>
<td>4</td>
<td>План Воздуха</td>
<td>Бледно-синий</td>
</tr>
<tr>
<td>5</td>
<td>План Земли</td>
<td>Красновато-коричневый</td>
</tr>
<tr>
<td>6</td>
<td>План Огня</td>
<td>Оранжевый</td>
</tr>
<tr>
<td>7</td>
<td>План Воды</td>
<td>Зелёный</td>
</tr>
<tr>
<td>8</td>
<td>Стихийный Хаос</td>
<td>Бурлящая смесь всех цветов</td>
</tr>
</table>
!!!!''Эфирный циклон''
<table>
<tr>
<th>к20</th>
<th>Эффект</th>
</tr>
<tr>
<td>1-12</td>
<td>Продление путешествия</td>
</tr>
<tr>
<td>13-19</td>
<td>Перенос в Пограничный Эфир, граничащий со случайным планом (совершите бросок по таблице «эфирные завесы»)</td>
</tr>
<tr>
<td>20</td>
<td>Перенос на Астральный План</td>
</tr>
</table>
!!!!''Эффекты психического ветра''
<table>
<tr>
<th>к20<br></th>
<th>Перемещающий эффект</th>
</tr>
<tr>
<td>1-8</td>
<td>Отклонение; добавьте 1к6 часов ко времени путешествия</td>
</tr>
<tr>
<td>9-12</td>
<td>Сбиты с пути; добавьте 3к10 часов ко времени путешествия</td>
</tr>
<tr>
<td>13-16</td>
<td>Блуждания; в конце путешествия персонажи прибывают не в то место, куда шли 17-20 Персонажи отправлены через цветной вихрь на случайным образом выбранный план (совершите бросок по таблице «астральные цветные вихри»)</td>
</tr>
<tr>
<td>17–20 </td>
<td>Персонажи отправлены через цветной вихрь на случайным образом выбранный план (совершить бросок по таблице «астральные цветные вихри»)</td>
</tr>
<tr>
<th>к20 </th>
<th>Ментальный эффект</th>
</tr>
<tr>
<td>1-8 </td>
<td>Ошеломлён на 1 минуту; вы можете повторять спасбросок в конце каждого своего хода, чтобы окончить действие этого эффекта на вас 9-10 Кратковременное безумие (смотрите в главе 8) 11-12 Урон психической энергией 11 (2к10)</td>
</tr>
<tr>
<td>9–10</td>
<td>Кратковременное безумие (смотрите в главе 8)</td>
</tr>
<tr>
<td>11–12 </td>
<td>Урон психической энергией 11 (2к10)</td>
</tr>
<tr>
<td>13-16 </td>
<td>Урон психической энергией 22 (4к10)</td>
</tr>
<tr>
<td>17-18 </td>
<td>Долговременное безумие (смотрите в главе 8) 19-20 Лишён сознания на 5 (1к10) минут; действие этого эффекта оканчивается на вас, если вы получаете урон или если другое существо действием приведёт вас в чувство</td>
</tr>
<tr>
<td>19–20</td>
<td>Лишён сознания на 5 (1к10) минут; действие этого эффекта оканчивается на вас, если вы получаете урон или если другое существо действием приведёт вас в чувство</td>
</tr>
</table>
<iframe src="https://money.yandex.ru/quickpay/shop-widget?writer=buyer&targets=&targets-hint=&default-sum=&button-text=12&comment=on&hint=&successURL=&quickpay=shop&account=410011418984842" height="294" frameborder="0" allowtransparency="true" scrolling="no"></iframe>
\define AlignRight(text:"TextHere")
<style>
.align_right{
text-align: right;
}
</style>
<div class="align_right"> $text$ </div>
\end
<<list-links filter:"[tag[brd]tag[1lvl]]">>
<<list-links filter:"[tag[brd]tag[2lvl]]">>
<<list-links filter:"[tag[brd]tag[3lvl]]">>
<<list-links filter:"[tag[brd]tag[4lvl]]">>
<<list-links filter:"[tag[brd]tag[5lvl]]">>
<<list-links filter:"[tag[brd]tag[6lvl]]">>
<<list-links filter:"[tag[brd]tag[7lvl]]">>
<<list-links filter:"[tag[brd]tag[8lvl]]">>
<<list-links filter:"[tag[brd]tag[9lvl]]">>
Built from branch 'tiddlywiki-com' at commit 7428f17551b97523aa93b956e3e508230332833d of https://github.com/Jermolene/TiddlyWiki5.git at 2019-09-20 15:21:21 UTC
\define Button(1:"1" 2:"2")
<$reveal type="nomatch" state="$:/state/$1$" text="show">
<$button set="$:/state/$1$" setTo="show">''$2$''</$button>
</$reveal>
<$reveal type="match" state="$:/state/$1$" text="show">
<$button set="$:/state/$1$" setTo="hide">$2$ (Скрыть)</$button>
{{$1$}}
</$reveal>
\end
<ul class="">
<$list filter="[tag[$:/Cantrip]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[abjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<<list-links filter:"[tag[$:/Cantrip Bard]]">>
<<list-links filter:"[tag[$:/Cantrip Cleric]]">>
<ul class="">
<$list filter="[tag[cantrip]tag[conjur]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[div]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Cantrip Druid]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[ench]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[evoc]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[illu]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[necro]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Cantrip Sorcerer]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[cantrip]tag[trans]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Cantrip Warlock]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<<list-links "[tag[$:/Cantrip Wizard]sort[title]]">>
<<list-links filter:"[tag[$:/Cleric 1lvl]]">>
<<list-links filter:"[tag[$:/Cleric 2lvl]]">>
<<list-links filter:"[tag[$:/Cleric 3lvl]]">>
<<list-links filter:"[tag[$:/Cleric 4lvl]]">>
<<list-links filter:"[tag[$:/Cleric 5lvl]]">>
<<list-links filter:"[tag[$:/Cleric 6lvl]]">>
<<list-links filter:"[tag[$:/Cleric 7lvl]]">>
<<list-links filter:"[tag[$:/Cleric 8lvl]]">>
<<list-links filter:"[tag[$:/Cleric 9lvl]]">>
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/add-comment": {
"title": "$:/core/images/add-comment",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
},
"$:/core/images/auto-height": {
"title": "$:/core/images/auto-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
},
"$:/core/images/bold": {
"title": "$:/core/images/bold",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
},
"$:/core/images/copy-clipboard": {
"title": "$:/core/images/copy-clipboard",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
},
"$:/core/images/erase": {
"title": "$:/core/images/erase",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
},
"$:/core/images/excise": {
"title": "$:/core/images/excise",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
},
"$:/core/images/file": {
"title": "$:/core/images/file",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
},
"$:/core/images/fixed-height": {
"title": "$:/core/images/fixed-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/fold-all-button": {
"title": "$:/core/images/fold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
},
"$:/core/images/fold-button": {
"title": "$:/core/images/fold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
},
"$:/core/images/fold-others-button": {
"title": "$:/core/images/fold-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/folder": {
"title": "$:/core/images/folder",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
},
"$:/core/images/github": {
"title": "$:/core/images/github",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
},
"$:/core/images/gitter": {
"title": "$:/core/images/gitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
},
"$:/core/images/heading-1": {
"title": "$:/core/images/heading-1",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
},
"$:/core/images/heading-2": {
"title": "$:/core/images/heading-2",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
},
"$:/core/images/heading-3": {
"title": "$:/core/images/heading-3",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
},
"$:/core/images/heading-4": {
"title": "$:/core/images/heading-4",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
},
"$:/core/images/heading-5": {
"title": "$:/core/images/heading-5",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
},
"$:/core/images/heading-6": {
"title": "$:/core/images/heading-6",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
},
"$:/core/images/italic": {
"title": "$:/core/images/italic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
},
"$:/core/images/left-arrow": {
"title": "$:/core/images/left-arrow",
"created": "20150315234410875",
"modified": "20150315235324760",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
},
"$:/core/images/line-width": {
"title": "$:/core/images/line-width",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
},
"$:/core/images/link": {
"title": "$:/core/images/link",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
},
"$:/core/images/linkify": {
"title": "$:/core/images/linkify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
},
"$:/core/images/list-bullet": {
"title": "$:/core/images/list-bullet",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
},
"$:/core/images/list-number": {
"title": "$:/core/images/list-number",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
},
"$:/core/images/list": {
"title": "$:/core/images/list",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/mail": {
"title": "$:/core/images/mail",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
},
"$:/core/images/mono-block": {
"title": "$:/core/images/mono-block",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
},
"$:/core/images/mono-line": {
"title": "$:/core/images/mono-line",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
},
"$:/core/images/new-image-button": {
"title": "$:/core/images/new-image-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
},
"$:/core/images/opacity": {
"title": "$:/core/images/opacity",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
},
"$:/core/images/open-window": {
"title": "$:/core/images/open-window",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
},
"$:/core/images/paint": {
"title": "$:/core/images/paint",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
},
"$:/core/images/palette": {
"title": "$:/core/images/palette",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
},
"$:/core/images/picture": {
"title": "$:/core/images/picture",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
},
"$:/core/images/preview-closed": {
"title": "$:/core/images/preview-closed",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
},
"$:/core/images/preview-open": {
"title": "$:/core/images/preview-open",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
},
"$:/core/images/print-button": {
"title": "$:/core/images/print-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
},
"$:/core/images/quote": {
"title": "$:/core/images/quote",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
},
"$:/core/images/rotate-left": {
"title": "$:/core/images/rotate-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
},
"$:/core/images/size": {
"title": "$:/core/images/size",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
},
"$:/core/images/spiral": {
"title": "$:/core/images/spiral",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
},
"$:/core/images/stamp": {
"title": "$:/core/images/stamp",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
},
"$:/core/images/strikethrough": {
"title": "$:/core/images/strikethrough",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
},
"$:/core/images/subscript": {
"title": "$:/core/images/subscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/superscript": {
"title": "$:/core/images/superscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
},
"$:/core/images/timestamp-off": {
"title": "$:/core/images/timestamp-off",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
},
"$:/core/images/timestamp-on": {
"title": "$:/core/images/timestamp-on",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
},
"$:/core/images/transcludify": {
"title": "$:/core/images/transcludify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
},
"$:/core/images/twitter": {
"title": "$:/core/images/twitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
},
"$:/core/images/underline": {
"title": "$:/core/images/underline",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
},
"$:/core/images/unfold-all-button": {
"title": "$:/core/images/unfold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unfold-button": {
"title": "$:/core/images/unfold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/up-arrow": {
"title": "$:/core/images/up-arrow",
"created": "20150316000544368",
"modified": "20150316000831867",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/CopyToClipboard/Caption": {
"title": "$:/language/Buttons/CopyToClipboard/Caption",
"text": "copy to clipboard"
},
"$:/language/Buttons/CopyToClipboard/Hint": {
"title": "$:/language/Buttons/CopyToClipboard/Hint",
"text": "Copy this text to the clipboard"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/SidebarSearch/Hint": {
"title": "$:/language/Buttons/SidebarSearch/Hint",
"text": "Select the sidebar search field"
},
"$:/language/Buttons/Fold/Caption": {
"title": "$:/language/Buttons/Fold/Caption",
"text": "fold tiddler"
},
"$:/language/Buttons/Fold/Hint": {
"title": "$:/language/Buttons/Fold/Hint",
"text": "Fold the body of this tiddler"
},
"$:/language/Buttons/Fold/FoldBar/Caption": {
"title": "$:/language/Buttons/Fold/FoldBar/Caption",
"text": "fold-bar"
},
"$:/language/Buttons/Fold/FoldBar/Hint": {
"title": "$:/language/Buttons/Fold/FoldBar/Hint",
"text": "Optional bars to fold and unfold tiddlers"
},
"$:/language/Buttons/Unfold/Caption": {
"title": "$:/language/Buttons/Unfold/Caption",
"text": "unfold tiddler"
},
"$:/language/Buttons/Unfold/Hint": {
"title": "$:/language/Buttons/Unfold/Hint",
"text": "Unfold the body of this tiddler"
},
"$:/language/Buttons/FoldOthers/Caption": {
"title": "$:/language/Buttons/FoldOthers/Caption",
"text": "fold other tiddlers"
},
"$:/language/Buttons/FoldOthers/Hint": {
"title": "$:/language/Buttons/FoldOthers/Hint",
"text": "Fold the bodies of other opened tiddlers"
},
"$:/language/Buttons/FoldAll/Caption": {
"title": "$:/language/Buttons/FoldAll/Caption",
"text": "fold all tiddlers"
},
"$:/language/Buttons/FoldAll/Hint": {
"title": "$:/language/Buttons/FoldAll/Hint",
"text": "Fold the bodies of all opened tiddlers"
},
"$:/language/Buttons/UnfoldAll/Caption": {
"title": "$:/language/Buttons/UnfoldAll/Caption",
"text": "unfold all tiddlers"
},
"$:/language/Buttons/UnfoldAll/Hint": {
"title": "$:/language/Buttons/UnfoldAll/Hint",
"text": "Unfold the bodies of all opened tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import many types of file including text, image, TiddlyWiki or JSON"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/Manager/Caption": {
"title": "$:/language/Buttons/Manager/Caption",
"text": "tiddler manager"
},
"$:/language/Buttons/Manager/Hint": {
"title": "$:/language/Buttons/Manager/Hint",
"text": "Open tiddler manager"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewImage/Caption": {
"title": "$:/language/Buttons/NewImage/Caption",
"text": "new image"
},
"$:/language/Buttons/NewImage/Hint": {
"title": "$:/language/Buttons/NewImage/Hint",
"text": "Create a new image tiddler"
},
"$:/language/Buttons/NewMarkdown/Caption": {
"title": "$:/language/Buttons/NewMarkdown/Caption",
"text": "new Markdown tiddler"
},
"$:/language/Buttons/NewMarkdown/Hint": {
"title": "$:/language/Buttons/NewMarkdown/Hint",
"text": "Create a new Markdown tiddler"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/OpenWindow/Caption": {
"title": "$:/language/Buttons/OpenWindow/Caption",
"text": "open in new window"
},
"$:/language/Buttons/OpenWindow/Hint": {
"title": "$:/language/Buttons/OpenWindow/Hint",
"text": "Open tiddler in new window"
},
"$:/language/Buttons/Palette/Caption": {
"title": "$:/language/Buttons/Palette/Caption",
"text": "palette"
},
"$:/language/Buttons/Palette/Hint": {
"title": "$:/language/Buttons/Palette/Hint",
"text": "Choose the colour palette"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Print/Caption": {
"title": "$:/language/Buttons/Print/Caption",
"text": "print page"
},
"$:/language/Buttons/Print/Hint": {
"title": "$:/language/Buttons/Print/Hint",
"text": "Print the current page"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Confirm changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Timestamp/Caption": {
"title": "$:/language/Buttons/Timestamp/Caption",
"text": "timestamps"
},
"$:/language/Buttons/Timestamp/Hint": {
"title": "$:/language/Buttons/Timestamp/Hint",
"text": "Choose whether modifications update timestamps"
},
"$:/language/Buttons/Timestamp/On/Caption": {
"title": "$:/language/Buttons/Timestamp/On/Caption",
"text": "timestamps are on"
},
"$:/language/Buttons/Timestamp/On/Hint": {
"title": "$:/language/Buttons/Timestamp/On/Hint",
"text": "Update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Timestamp/Off/Caption": {
"title": "$:/language/Buttons/Timestamp/Off/Caption",
"text": "timestamps are off"
},
"$:/language/Buttons/Timestamp/Off/Hint": {
"title": "$:/language/Buttons/Timestamp/Off/Hint",
"text": "Don't update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/Buttons/Bold/Caption": {
"title": "$:/language/Buttons/Bold/Caption",
"text": "bold"
},
"$:/language/Buttons/Bold/Hint": {
"title": "$:/language/Buttons/Bold/Hint",
"text": "Apply bold formatting to selection"
},
"$:/language/Buttons/Clear/Caption": {
"title": "$:/language/Buttons/Clear/Caption",
"text": "clear"
},
"$:/language/Buttons/Clear/Hint": {
"title": "$:/language/Buttons/Clear/Hint",
"text": "Clear image to solid colour"
},
"$:/language/Buttons/EditorHeight/Caption": {
"title": "$:/language/Buttons/EditorHeight/Caption",
"text": "editor height"
},
"$:/language/Buttons/EditorHeight/Caption/Auto": {
"title": "$:/language/Buttons/EditorHeight/Caption/Auto",
"text": "Automatically adjust height to fit content"
},
"$:/language/Buttons/EditorHeight/Caption/Fixed": {
"title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
"text": "Fixed height:"
},
"$:/language/Buttons/EditorHeight/Hint": {
"title": "$:/language/Buttons/EditorHeight/Hint",
"text": "Choose the height of the text editor"
},
"$:/language/Buttons/Excise/Caption": {
"title": "$:/language/Buttons/Excise/Caption",
"text": "excise"
},
"$:/language/Buttons/Excise/Caption/Excise": {
"title": "$:/language/Buttons/Excise/Caption/Excise",
"text": "Perform excision"
},
"$:/language/Buttons/Excise/Caption/MacroName": {
"title": "$:/language/Buttons/Excise/Caption/MacroName",
"text": "Macro name:"
},
"$:/language/Buttons/Excise/Caption/NewTitle": {
"title": "$:/language/Buttons/Excise/Caption/NewTitle",
"text": "Title of new tiddler:"
},
"$:/language/Buttons/Excise/Caption/Replace": {
"title": "$:/language/Buttons/Excise/Caption/Replace",
"text": "Replace excised text with:"
},
"$:/language/Buttons/Excise/Caption/Replace/Macro": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
"text": "macro"
},
"$:/language/Buttons/Excise/Caption/Replace/Link": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Link",
"text": "link"
},
"$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
"text": "transclusion"
},
"$:/language/Buttons/Excise/Caption/Tag": {
"title": "$:/language/Buttons/Excise/Caption/Tag",
"text": "Tag new tiddler with the title of this tiddler"
},
"$:/language/Buttons/Excise/Caption/TiddlerExists": {
"title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
"text": "Warning: tiddler already exists"
},
"$:/language/Buttons/Excise/Hint": {
"title": "$:/language/Buttons/Excise/Hint",
"text": "Excise the selected text into a new tiddler"
},
"$:/language/Buttons/Heading1/Caption": {
"title": "$:/language/Buttons/Heading1/Caption",
"text": "heading 1"
},
"$:/language/Buttons/Heading1/Hint": {
"title": "$:/language/Buttons/Heading1/Hint",
"text": "Apply heading level 1 formatting to lines containing selection"
},
"$:/language/Buttons/Heading2/Caption": {
"title": "$:/language/Buttons/Heading2/Caption",
"text": "heading 2"
},
"$:/language/Buttons/Heading2/Hint": {
"title": "$:/language/Buttons/Heading2/Hint",
"text": "Apply heading level 2 formatting to lines containing selection"
},
"$:/language/Buttons/Heading3/Caption": {
"title": "$:/language/Buttons/Heading3/Caption",
"text": "heading 3"
},
"$:/language/Buttons/Heading3/Hint": {
"title": "$:/language/Buttons/Heading3/Hint",
"text": "Apply heading level 3 formatting to lines containing selection"
},
"$:/language/Buttons/Heading4/Caption": {
"title": "$:/language/Buttons/Heading4/Caption",
"text": "heading 4"
},
"$:/language/Buttons/Heading4/Hint": {
"title": "$:/language/Buttons/Heading4/Hint",
"text": "Apply heading level 4 formatting to lines containing selection"
},
"$:/language/Buttons/Heading5/Caption": {
"title": "$:/language/Buttons/Heading5/Caption",
"text": "heading 5"
},
"$:/language/Buttons/Heading5/Hint": {
"title": "$:/language/Buttons/Heading5/Hint",
"text": "Apply heading level 5 formatting to lines containing selection"
},
"$:/language/Buttons/Heading6/Caption": {
"title": "$:/language/Buttons/Heading6/Caption",
"text": "heading 6"
},
"$:/language/Buttons/Heading6/Hint": {
"title": "$:/language/Buttons/Heading6/Hint",
"text": "Apply heading level 6 formatting to lines containing selection"
},
"$:/language/Buttons/Italic/Caption": {
"title": "$:/language/Buttons/Italic/Caption",
"text": "italic"
},
"$:/language/Buttons/Italic/Hint": {
"title": "$:/language/Buttons/Italic/Hint",
"text": "Apply italic formatting to selection"
},
"$:/language/Buttons/LineWidth/Caption": {
"title": "$:/language/Buttons/LineWidth/Caption",
"text": "line width"
},
"$:/language/Buttons/LineWidth/Hint": {
"title": "$:/language/Buttons/LineWidth/Hint",
"text": "Set line width for painting"
},
"$:/language/Buttons/Link/Caption": {
"title": "$:/language/Buttons/Link/Caption",
"text": "link"
},
"$:/language/Buttons/Link/Hint": {
"title": "$:/language/Buttons/Link/Hint",
"text": "Create wikitext link"
},
"$:/language/Buttons/Linkify/Caption": {
"title": "$:/language/Buttons/Linkify/Caption",
"text": "wikilink"
},
"$:/language/Buttons/Linkify/Hint": {
"title": "$:/language/Buttons/Linkify/Hint",
"text": "Wrap selection in square brackets"
},
"$:/language/Buttons/ListBullet/Caption": {
"title": "$:/language/Buttons/ListBullet/Caption",
"text": "bulleted list"
},
"$:/language/Buttons/ListBullet/Hint": {
"title": "$:/language/Buttons/ListBullet/Hint",
"text": "Apply bulleted list formatting to lines containing selection"
},
"$:/language/Buttons/ListNumber/Caption": {
"title": "$:/language/Buttons/ListNumber/Caption",
"text": "numbered list"
},
"$:/language/Buttons/ListNumber/Hint": {
"title": "$:/language/Buttons/ListNumber/Hint",
"text": "Apply numbered list formatting to lines containing selection"
},
"$:/language/Buttons/MonoBlock/Caption": {
"title": "$:/language/Buttons/MonoBlock/Caption",
"text": "monospaced block"
},
"$:/language/Buttons/MonoBlock/Hint": {
"title": "$:/language/Buttons/MonoBlock/Hint",
"text": "Apply monospaced block formatting to lines containing selection"
},
"$:/language/Buttons/MonoLine/Caption": {
"title": "$:/language/Buttons/MonoLine/Caption",
"text": "monospaced"
},
"$:/language/Buttons/MonoLine/Hint": {
"title": "$:/language/Buttons/MonoLine/Hint",
"text": "Apply monospaced character formatting to selection"
},
"$:/language/Buttons/Opacity/Caption": {
"title": "$:/language/Buttons/Opacity/Caption",
"text": "opacity"
},
"$:/language/Buttons/Opacity/Hint": {
"title": "$:/language/Buttons/Opacity/Hint",
"text": "Set painting opacity"
},
"$:/language/Buttons/Paint/Caption": {
"title": "$:/language/Buttons/Paint/Caption",
"text": "paint colour"
},
"$:/language/Buttons/Paint/Hint": {
"title": "$:/language/Buttons/Paint/Hint",
"text": "Set painting colour"
},
"$:/language/Buttons/Picture/Caption": {
"title": "$:/language/Buttons/Picture/Caption",
"text": "picture"
},
"$:/language/Buttons/Picture/Hint": {
"title": "$:/language/Buttons/Picture/Hint",
"text": "Insert picture"
},
"$:/language/Buttons/Preview/Caption": {
"title": "$:/language/Buttons/Preview/Caption",
"text": "preview"
},
"$:/language/Buttons/Preview/Hint": {
"title": "$:/language/Buttons/Preview/Hint",
"text": "Show preview pane"
},
"$:/language/Buttons/PreviewType/Caption": {
"title": "$:/language/Buttons/PreviewType/Caption",
"text": "preview type"
},
"$:/language/Buttons/PreviewType/Hint": {
"title": "$:/language/Buttons/PreviewType/Hint",
"text": "Choose preview type"
},
"$:/language/Buttons/Quote/Caption": {
"title": "$:/language/Buttons/Quote/Caption",
"text": "quote"
},
"$:/language/Buttons/Quote/Hint": {
"title": "$:/language/Buttons/Quote/Hint",
"text": "Apply quoted text formatting to lines containing selection"
},
"$:/language/Buttons/RotateLeft/Caption": {
"title": "$:/language/Buttons/RotateLeft/Caption",
"text": "rotate left"
},
"$:/language/Buttons/RotateLeft/Hint": {
"title": "$:/language/Buttons/RotateLeft/Hint",
"text": "Rotate image left by 90 degrees"
},
"$:/language/Buttons/Size/Caption": {
"title": "$:/language/Buttons/Size/Caption",
"text": "image size"
},
"$:/language/Buttons/Size/Caption/Height": {
"title": "$:/language/Buttons/Size/Caption/Height",
"text": "Height:"
},
"$:/language/Buttons/Size/Caption/Resize": {
"title": "$:/language/Buttons/Size/Caption/Resize",
"text": "Resize image"
},
"$:/language/Buttons/Size/Caption/Width": {
"title": "$:/language/Buttons/Size/Caption/Width",
"text": "Width:"
},
"$:/language/Buttons/Size/Hint": {
"title": "$:/language/Buttons/Size/Hint",
"text": "Set image size"
},
"$:/language/Buttons/Stamp/Caption": {
"title": "$:/language/Buttons/Stamp/Caption",
"text": "stamp"
},
"$:/language/Buttons/Stamp/Caption/New": {
"title": "$:/language/Buttons/Stamp/Caption/New",
"text": "Add your own"
},
"$:/language/Buttons/Stamp/Hint": {
"title": "$:/language/Buttons/Stamp/Hint",
"text": "Insert a preconfigured snippet of text"
},
"$:/language/Buttons/Stamp/New/Title": {
"title": "$:/language/Buttons/Stamp/New/Title",
"text": "Name as shown in menu"
},
"$:/language/Buttons/Stamp/New/Text": {
"title": "$:/language/Buttons/Stamp/New/Text",
"text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
},
"$:/language/Buttons/Strikethrough/Caption": {
"title": "$:/language/Buttons/Strikethrough/Caption",
"text": "strikethrough"
},
"$:/language/Buttons/Strikethrough/Hint": {
"title": "$:/language/Buttons/Strikethrough/Hint",
"text": "Apply strikethrough formatting to selection"
},
"$:/language/Buttons/Subscript/Caption": {
"title": "$:/language/Buttons/Subscript/Caption",
"text": "subscript"
},
"$:/language/Buttons/Subscript/Hint": {
"title": "$:/language/Buttons/Subscript/Hint",
"text": "Apply subscript formatting to selection"
},
"$:/language/Buttons/Superscript/Caption": {
"title": "$:/language/Buttons/Superscript/Caption",
"text": "superscript"
},
"$:/language/Buttons/Superscript/Hint": {
"title": "$:/language/Buttons/Superscript/Hint",
"text": "Apply superscript formatting to selection"
},
"$:/language/Buttons/ToggleSidebar/Hint": {
"title": "$:/language/Buttons/ToggleSidebar/Hint",
"text": "Toggle the sidebar visibility"
},
"$:/language/Buttons/Transcludify/Caption": {
"title": "$:/language/Buttons/Transcludify/Caption",
"text": "transclusion"
},
"$:/language/Buttons/Transcludify/Hint": {
"title": "$:/language/Buttons/Transcludify/Hint",
"text": "Wrap selection in curly brackets"
},
"$:/language/Buttons/Underline/Caption": {
"title": "$:/language/Buttons/Underline/Caption",
"text": "underline"
},
"$:/language/Buttons/Underline/Hint": {
"title": "$:/language/Buttons/Underline/Hint",
"text": "Apply underline formatting to selection"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration"
},
"$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
"title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
"text": "Default focus field for new tiddlers"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
"text": "Text for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
"text": "Title of new tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
"text": "Tags for new tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
"text": "Type shortcut here"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
"text": "add shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
"text": "Keyboard Shortcuts"
},
"$:/language/ControlPanel/KeyboardShortcuts/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
"text": "Manage keyboard shortcut assignments"
},
"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
"text": "No keyboard shortcuts assigned"
},
"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
"text": "remove keyboard shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
"text": "All platforms"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
"text": "Macintosh platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
"text": "Non-Macintosh platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
"text": "Linux platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
"text": "Non-Linux platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
"text": "Windows platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
"text": "Non-Windows platforms only"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
"title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
"text": "delete this entry from the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
"title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
"text": "Show color names that are not part of the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Parsing/Caption": {
"title": "$:/language/ControlPanel/Parsing/Caption",
"text": "Parsing"
},
"$:/language/ControlPanel/Parsing/Hint": {
"title": "$:/language/ControlPanel/Parsing/Hint",
"text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
},
"$:/language/ControlPanel/Parsing/Block/Caption": {
"title": "$:/language/ControlPanel/Parsing/Block/Caption",
"text": "Block Parse Rules"
},
"$:/language/ControlPanel/Parsing/Inline/Caption": {
"title": "$:/language/ControlPanel/Parsing/Inline/Caption",
"text": "Inline Parse Rules"
},
"$:/language/ControlPanel/Parsing/Pragma/Caption": {
"title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
"text": "Pragma Parse Rules"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Get more plugins"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install plugins from the official library"
},
"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
"text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
},
"$:/language/ControlPanel/Plugins/AlsoRequires": {
"title": "$:/language/ControlPanel/Plugins/AlsoRequires",
"text": "Also requires:"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Downgrade/Caption": {
"title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
"text": "downgrade"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Install/Caption": {
"title": "$:/language/ControlPanel/Plugins/Install/Caption",
"text": "install"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins:"
},
"$:/language/ControlPanel/Plugins/Languages/Caption": {
"title": "$:/language/ControlPanel/Plugins/Languages/Caption",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Languages/Hint": {
"title": "$:/language/ControlPanel/Plugins/Languages/Hint",
"text": "Language pack plugins"
},
"$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
"title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
"text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
},
"$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
"text": "This plugin is not currently installed"
},
"$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
"text": "open plugin library"
},
"$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
"text": "close plugin library"
},
"$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
"title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
"text": "(requires reload)"
},
"$:/language/ControlPanel/Plugins/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Plugins/Hint": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Reinstall/Caption": {
"title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
"text": "reinstall"
},
"$:/language/ControlPanel/Plugins/Themes/Caption": {
"title": "$:/language/ControlPanel/Plugins/Themes/Caption",
"text": "Themes"
},
"$:/language/ControlPanel/Plugins/Themes/Hint": {
"title": "$:/language/ControlPanel/Plugins/Themes/Hint",
"text": "Theme plugins"
},
"$:/language/ControlPanel/Plugins/Update/Caption": {
"title": "$:/language/ControlPanel/Plugins/Update/Caption",
"text": "update"
},
"$:/language/ControlPanel/Plugins/Updates/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/Caption",
"text": "Updates"
},
"$:/language/ControlPanel/Plugins/Updates/Hint": {
"title": "$:/language/ControlPanel/Plugins/Updates/Hint",
"text": "Available updates to installed plugins"
},
"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
"text": "Update <<update-count>> plugins"
},
"$:/language/ControlPanel/Plugins/SubPluginPrompt": {
"title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
"text": "With <<count>> sub-plugins available"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
"text": "Permit automatic saving for the download saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
"text": "Enable Autosave for Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
"text": "Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
"text": "These settings apply to the HTML5-compatible download saver"
},
"$:/language/ControlPanel/Saving/General/Caption": {
"title": "$:/language/ControlPanel/Saving/General/Caption",
"text": "General"
},
"$:/language/ControlPanel/Saving/General/Hint": {
"title": "$:/language/ControlPanel/Saving/General/Hint",
"text": "These settings apply to all the loaded savers"
},
"$:/language/ControlPanel/Saving/Hint": {
"title": "$:/language/ControlPanel/Saving/Hint",
"text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
},
"$:/language/ControlPanel/Saving/GitService/Branch": {
"title": "$:/language/ControlPanel/Saving/GitService/Branch",
"text": "Target branch for saving"
},
"$:/language/ControlPanel/Saving/GitService/CommitMessage": {
"title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
"text": "Saved by TiddlyWiki"
},
"$:/language/ControlPanel/Saving/GitService/Description": {
"title": "$:/language/ControlPanel/Saving/GitService/Description",
"text": "These settings are only used when saving to <<service-name>>"
},
"$:/language/ControlPanel/Saving/GitService/Filename": {
"title": "$:/language/ControlPanel/Saving/GitService/Filename",
"text": "Filename of target file (e.g. `index.html`)"
},
"$:/language/ControlPanel/Saving/GitService/Path": {
"title": "$:/language/ControlPanel/Saving/GitService/Path",
"text": "Path to target file (e.g. `/wiki/`)"
},
"$:/language/ControlPanel/Saving/GitService/Repo": {
"title": "$:/language/ControlPanel/Saving/GitService/Repo",
"text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
},
"$:/language/ControlPanel/Saving/GitService/ServerURL": {
"title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
"text": "Server API URL"
},
"$:/language/ControlPanel/Saving/GitService/UserName": {
"title": "$:/language/ControlPanel/Saving/GitService/UserName",
"text": "Username"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
"text": "~GitHub Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
"text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
"text": "~GitLab Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
"text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
"text": "Gitea Saver"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
"text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
"text": "~TiddlySpot Saver"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Attempt to automatically save changes during editing when using a supporting saver"
},
"$:/language/ControlPanel/Settings/CamelCase/Caption": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
"text": "Camel Case Wiki Links"
},
"$:/language/ControlPanel/Settings/CamelCase/Hint": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
"text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/CamelCase/Description": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Description",
"text": "Enable automatic ~CamelCase linking"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
"text": "Enable or disable the editor toolbar:"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Description": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
"text": "Show editor toolbar"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
"text": "Tiddler Info Panel Mode"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
"text": "Control when the tiddler info panel closes:"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
"text": "Tiddler info panel closes automatically"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
"text": "Tiddler info panel stays open until explicitly closed"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
"text": "Permalink/permaview Mode"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
"text": "Choose how permalink/permaview is handled:"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
"text": "Copy permalink/permaview URL to clipboard"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
"text": "Update address bar with permalink/permaview URL"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
"text": "Performance Instrumentation"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
"text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
"text": "Enable performance instrumentation"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
"text": "Toolbar Button Style"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
"text": "Choose the style for toolbar buttons:"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
"text": "Borderless"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
"text": "Boxed"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
"text": "Rounded"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
"text": "Default More Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
"text": "Specify which More sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
"text": "Tiddler Opening Behaviour"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
"text": "Navigation from //within// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
"text": "Navigation from //outside// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
"text": "Open above the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
"text": "Open below the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
"text": "Open at the top of the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
"text": "Open at the bottom of the story river"
},
"$:/language/ControlPanel/Settings/TitleLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
"text": "Tiddler Titles"
},
"$:/language/ControlPanel/Settings/TitleLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
"text": "Optionally display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
"text": "Do not display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
"text": "Display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
"text": "Wiki Links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
"text": "Choose whether to link to tiddlers that do not exist yet"
},
"$:/language/ControlPanel/Settings/MissingLinks/Description": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
"text": "Enable links to missing tiddlers"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Stylesheets/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Caption",
"text": "Stylesheets"
},
"$:/language/ControlPanel/Stylesheets/Expand/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
"text": "Expand All"
},
"$:/language/ControlPanel/Stylesheets/Hint": {
"title": "$:/language/ControlPanel/Stylesheets/Hint",
"text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
},
"$:/language/ControlPanel/Stylesheets/Restore/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
"text": "Restore"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
"text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/allfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/allfilteroperator",
"text": "A sub-operator for the ''all'' filter operator."
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/authenticator": {
"title": "$:/language/Docs/ModuleTypes/authenticator",
"text": "Defines how requests are authenticated by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
"title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
"text": "A bitmap editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/info": {
"title": "$:/language/Docs/ModuleTypes/info",
"text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/library": {
"title": "$:/language/Docs/ModuleTypes/library",
"text": "Generic module type for general purpose JavaScript modules."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/route": {
"title": "$:/language/Docs/ModuleTypes/route",
"text": "Defines how individual URL patterns are handled by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/texteditoroperation": {
"title": "$:/language/Docs/ModuleTypes/texteditoroperation",
"text": "A text editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/button-background": {
"title": "$:/language/Docs/PaletteColours/button-background",
"text": "Default button background"
},
"$:/language/Docs/PaletteColours/button-border": {
"title": "$:/language/Docs/PaletteColours/button-border",
"text": "Default button border"
},
"$:/language/Docs/PaletteColours/button-foreground": {
"title": "$:/language/Docs/PaletteColours/button-foreground",
"text": "Default button foreground"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/menubar-background": {
"title": "$:/language/Docs/PaletteColours/menubar-background",
"text": "Menu bar background"
},
"$:/language/Docs/PaletteColours/menubar-foreground": {
"title": "$:/language/Docs/PaletteColours/menubar-foreground",
"text": "Menu bar foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/select-tag-background": {
"title": "$:/language/Docs/PaletteColours/select-tag-background",
"text": "`<select>` element background"
},
"$:/language/Docs/PaletteColours/select-tag-foreground": {
"title": "$:/language/Docs/PaletteColours/select-tag-foreground",
"text": "`<select>` element text"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/site-title-foreground": {
"title": "$:/language/Docs/PaletteColours/site-title-foreground",
"text": "Site title foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Type/Output": {
"title": "$:/language/EditTemplate/Body/Preview/Type/Output",
"text": "output"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Field/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Field/Dropdown/Caption",
"text": "field list"
},
"$:/language/EditTemplate/Field/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Field/Dropdown/Hint",
"text": "Show field list"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
"text": "Add the new field to the tiddler"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/System": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
"text": "System fields"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/User": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
"text": "User fields"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
"text": "add tag"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Title/BadCharacterWarning": {
"title": "$:/language/EditTemplate/Title/BadCharacterWarning",
"text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
},
"$:/language/EditTemplate/Title/Exists/Prompt": {
"title": "$:/language/EditTemplate/Title/Exists/Prompt",
"text": "Target tiddler already exists"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following references to this tiddler will not be automatically updated:"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "Static HTML"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "\".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hide-body": {
"title": "$:/language/Docs/Fields/hide-body",
"text": "The view template will hide bodies of tiddlers if set to: ''yes''"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/throttle.refresh": {
"title": "$:/language/Docs/Fields/throttle.refresh",
"text": "If present, throttles refreshes of this tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/toc-link": {
"title": "$:/language/Docs/Fields/toc-link",
"text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Docs/Fields/_is_skinny": {
"title": "$:/language/Docs/Fields/_is_skinny",
"text": "If present, indicates that the tiddler text field must be loaded from the server"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SessionTiddlers": {
"title": "$:/language/Filters/SessionTiddlers",
"text": "Tiddlers modified since the wiki was loaded"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/StoryList": {
"title": "$:/language/Filters/StoryList",
"text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/deletetiddlers": {
"title": "$:/language/Help/deletetiddlers",
"description": "Deletes a group of tiddlers",
"text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/fetch": {
"title": "$:/language/Help/fetch",
"description": "Fetch tiddlers from wiki by URL",
"text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/import": {
"title": "$:/language/Help/import",
"description": "Import tiddlers from a file",
"text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/listen": {
"title": "$:/language/Help/listen",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
},
"$:/language/Help/render": {
"title": "$:/language/Help/render",
"description": "Renders individual tiddlers to files",
"text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/save": {
"title": "$:/language/Help/save",
"description": "Saves individual raw tiddlers to files",
"text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/savewikifolder": {
"title": "$:/language/Help/savewikifolder",
"description": "Saves a wiki to a new wiki folder",
"text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
"text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Imported/Hint": {
"title": "$:/language/Import/Imported/Hint",
"text": "The following tiddlers were imported:"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Listing/Preview": {
"title": "$:/language/Import/Listing/Preview",
"text": "Preview:"
},
"$:/language/Import/Listing/Preview/Text": {
"title": "$:/language/Import/Listing/Preview/Text",
"text": "Text"
},
"$:/language/Import/Listing/Preview/TextRaw": {
"title": "$:/language/Import/Listing/Preview/TextRaw",
"text": "Text (Raw)"
},
"$:/language/Import/Listing/Preview/Fields": {
"title": "$:/language/Import/Listing/Preview/Fields",
"text": "Fields"
},
"$:/language/Import/Listing/Preview/Diff": {
"title": "$:/language/Import/Listing/Preview/Diff",
"text": "Diff"
},
"$:/language/Import/Listing/Preview/DiffFields": {
"title": "$:/language/Import/Listing/Preview/DiffFields",
"text": "Diff (Fields)"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/System/Warning": {
"title": "$:/language/Import/Upgrader/System/Warning",
"text": "Core module tiddler"
},
"$:/language/Import/Upgrader/System/Alert": {
"title": "$:/language/Import/Upgrader/System/Alert",
"text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/AboveStory/ClassicPlugin/Warning": {
"title": "$:/language/AboveStory/ClassicPlugin/Warning",
"text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ColourPicker/Recent": {
"title": "$:/language/ColourPicker/Recent",
"text": "Recent:"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/Count": {
"title": "$:/language/Count",
"text": "count"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/Diffs/CountMessage": {
"title": "$:/language/Diffs/CountMessage",
"text": "<<diff-count>> differences"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/Cancel": {
"title": "$:/language/Encryption/Cancel",
"text": "Cancel"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/Encryption/Username": {
"title": "$:/language/Encryption/Username",
"text": "Username"
},
"$:/language/Encryption/Password": {
"title": "$:/language/Encryption/Password",
"text": "Password"
},
"$:/language/Encryption/RepeatPassword": {
"title": "$:/language/Encryption/RepeatPassword",
"text": "Repeat password"
},
"$:/language/Encryption/PasswordNoMatch": {
"title": "$:/language/Encryption/PasswordNoMatch",
"text": "Passwords do not match"
},
"$:/language/Encryption/SetPassword": {
"title": "$:/language/Encryption/SetPassword",
"text": "Set password"
},
"$:/language/Error/Caption": {
"title": "$:/language/Error/Caption",
"text": "Error"
},
"$:/language/Error/EditConflict": {
"title": "$:/language/Error/EditConflict",
"text": "File changed on server"
},
"$:/language/Error/Filter": {
"title": "$:/language/Error/Filter",
"text": "Filter error"
},
"$:/language/Error/FilterSyntax": {
"title": "$:/language/Error/FilterSyntax",
"text": "Syntax error in filter expression"
},
"$:/language/Error/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' filter operator"
},
"$:/language/Error/LoadingPluginLibrary": {
"title": "$:/language/Error/LoadingPluginLibrary",
"text": "Error loading plugin library"
},
"$:/language/Error/NetworkErrorAlert": {
"title": "$:/language/Error/NetworkErrorAlert",
"text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
},
"$:/language/Error/RecursiveTransclusion": {
"title": "$:/language/Error/RecursiveTransclusion",
"text": "Recursive transclusion error in transclude widget"
},
"$:/language/Error/RetrievingSkinny": {
"title": "$:/language/Error/RetrievingSkinny",
"text": "Error retrieving skinny tiddler list"
},
"$:/language/Error/SavingToTWEdit": {
"title": "$:/language/Error/SavingToTWEdit",
"text": "Error saving to TWEdit"
},
"$:/language/Error/WhileSaving": {
"title": "$:/language/Error/WhileSaving",
"text": "Error while saving"
},
"$:/language/Error/XMLHttpRequest": {
"title": "$:/language/Error/XMLHttpRequest",
"text": "XMLHttpRequest error code"
},
"$:/language/InternalJavaScriptError/Title": {
"title": "$:/language/InternalJavaScriptError/Title",
"text": "Internal JavaScript Error"
},
"$:/language/InternalJavaScriptError/Hint": {
"title": "$:/language/InternalJavaScriptError/Hint",
"text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/LazyLoadingWarning": {
"title": "$:/language/LazyLoadingWarning",
"text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
},
"$:/language/LoginToTiddlySpace": {
"title": "$:/language/LoginToTiddlySpace",
"text": "Login to TiddlySpace"
},
"$:/language/Manager/Controls/FilterByTag/None": {
"title": "$:/language/Manager/Controls/FilterByTag/None",
"text": "(none)"
},
"$:/language/Manager/Controls/FilterByTag/Prompt": {
"title": "$:/language/Manager/Controls/FilterByTag/Prompt",
"text": "Filter by tag:"
},
"$:/language/Manager/Controls/Order/Prompt": {
"title": "$:/language/Manager/Controls/Order/Prompt",
"text": "Reverse order"
},
"$:/language/Manager/Controls/Search/Placeholder": {
"title": "$:/language/Manager/Controls/Search/Placeholder",
"text": "Search"
},
"$:/language/Manager/Controls/Search/Prompt": {
"title": "$:/language/Manager/Controls/Search/Prompt",
"text": "Search:"
},
"$:/language/Manager/Controls/Show/Option/Tags": {
"title": "$:/language/Manager/Controls/Show/Option/Tags",
"text": "tags"
},
"$:/language/Manager/Controls/Show/Option/Tiddlers": {
"title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
"text": "tiddlers"
},
"$:/language/Manager/Controls/Show/Prompt": {
"title": "$:/language/Manager/Controls/Show/Prompt",
"text": "Show:"
},
"$:/language/Manager/Controls/Sort/Prompt": {
"title": "$:/language/Manager/Controls/Sort/Prompt",
"text": "Sort by:"
},
"$:/language/Manager/Item/Colour": {
"title": "$:/language/Manager/Item/Colour",
"text": "Colour"
},
"$:/language/Manager/Item/Fields": {
"title": "$:/language/Manager/Item/Fields",
"text": "Fields"
},
"$:/language/Manager/Item/Icon/None": {
"title": "$:/language/Manager/Item/Icon/None",
"text": "(none)"
},
"$:/language/Manager/Item/Icon": {
"title": "$:/language/Manager/Item/Icon",
"text": "Icon"
},
"$:/language/Manager/Item/RawText": {
"title": "$:/language/Manager/Item/RawText",
"text": "Raw text"
},
"$:/language/Manager/Item/Tags": {
"title": "$:/language/Manager/Item/Tags",
"text": "Tags"
},
"$:/language/Manager/Item/Tools": {
"title": "$:/language/Manager/Item/Tools",
"text": "Tools"
},
"$:/language/Manager/Item/WikifiedText": {
"title": "$:/language/Manager/Item/WikifiedText",
"text": "Wikified text"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
},
"$:/language/No": {
"title": "$:/language/No",
"text": "No"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/OfficialPluginLibrary/Hint": {
"title": "$:/language/OfficialPluginLibrary/Hint",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/SystemTiddlers/Include/Prompt": {
"title": "$:/language/SystemTiddlers/Include/Prompt",
"text": "Include system tiddlers"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Count/Heading": {
"title": "$:/language/TagManager/Count/Heading",
"text": "Count"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Icons/None": {
"title": "$:/language/TagManager/Icons/None",
"text": "None"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/Tiddler/DateFormat": {
"title": "$:/language/Tiddler/DateFormat",
"text": "DDth MMM YYYY at hh12:0mmam"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Yes": {
"title": "$:/language/Yes",
"text": "Yes"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Text": {
"title": "$:/config/NewJournal/Text",
"text": ""
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"tags": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Notifications/CopiedToClipboard/Succeeded": {
"title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
"text": "Copied to clipboard!"
},
"$:/language/Notifications/CopiedToClipboard/Failed": {
"title": "$:/language/Notifications/CopiedToClipboard/Failed",
"text": "Failed to copy to clipboard!"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches/All": {
"title": "$:/language/Search/Matches/All",
"text": "All matches:"
},
"$:/language/Search/Matches/Title": {
"title": "$:/language/Search/Matches/Title",
"text": "Title matches:"
},
"$:/language/Search/Search": {
"title": "$:/language/Search/Search",
"text": "Search"
},
"$:/language/Search/Search/TooShort": {
"title": "$:/language/Search/Search/TooShort",
"text": "Search text too short"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Explorer/Caption": {
"title": "$:/language/SideBar/Explorer/Caption",
"text": "Explorer"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/Snippets/ListByTag": {
"title": "$:/language/Snippets/ListByTag",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "List of tiddlers by tag",
"text": "<<list-links \"[tag[task]sort[title]]\">>\n"
},
"$:/language/Snippets/MacroDefinition": {
"title": "$:/language/Snippets/MacroDefinition",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Macro definition",
"text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
},
"$:/language/Snippets/Table4x3": {
"title": "$:/language/Snippets/Table4x3",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table with 4 columns by 3 rows",
"text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
},
"$:/language/Snippets/TableOfContents": {
"title": "$:/language/Snippets/TableOfContents",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table of Contents",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
},
"$:/language/ThemeTweaks/ThemeTweaks": {
"title": "$:/language/ThemeTweaks/ThemeTweaks",
"text": "Theme Tweaks"
},
"$:/language/ThemeTweaks/ThemeTweaks/Hint": {
"title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
"text": "You can tweak certain aspects of the ''Vanilla'' theme."
},
"$:/language/ThemeTweaks/Options": {
"title": "$:/language/ThemeTweaks/Options",
"text": "Options"
},
"$:/language/ThemeTweaks/Options/SidebarLayout": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout",
"text": "Sidebar layout"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
"text": "Fixed story, fluid sidebar"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
"text": "Fluid story, fixed sidebar"
},
"$:/language/ThemeTweaks/Options/StickyTitles": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles",
"text": "Sticky titles"
},
"$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
"text": "Causes tiddler titles to \"stick\" to the top of the browser window"
},
"$:/language/ThemeTweaks/Options/CodeWrapping": {
"title": "$:/language/ThemeTweaks/Options/CodeWrapping",
"text": "Wrap long lines in code blocks"
},
"$:/language/ThemeTweaks/Settings": {
"title": "$:/language/ThemeTweaks/Settings",
"text": "Settings"
},
"$:/language/ThemeTweaks/Settings/FontFamily": {
"title": "$:/language/ThemeTweaks/Settings/FontFamily",
"text": "Font family"
},
"$:/language/ThemeTweaks/Settings/CodeFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
"text": "Code font family"
},
"$:/language/ThemeTweaks/Settings/EditorFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
"text": "Editor font family"
},
"$:/language/ThemeTweaks/Settings/BackgroundImage": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
"text": "Page background image"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
"text": "Page background image attachment"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
"text": "Scroll with tiddlers"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
"text": "Fixed to window"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
"text": "Page background image size"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
"text": "Auto"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
"text": "Cover"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
"text": "Contain"
},
"$:/language/ThemeTweaks/Metrics": {
"title": "$:/language/ThemeTweaks/Metrics",
"text": "Sizes"
},
"$:/language/ThemeTweaks/Metrics/FontSize": {
"title": "$:/language/ThemeTweaks/Metrics/FontSize",
"text": "Font size"
},
"$:/language/ThemeTweaks/Metrics/LineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/LineHeight",
"text": "Line height"
},
"$:/language/ThemeTweaks/Metrics/BodyFontSize": {
"title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
"text": "Font size for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
"text": "Line height for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
"text": "Story left position"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
"text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryTop": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop",
"text": "Story top position"
},
"$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
"text": "how far the top margin of the story river<br>is from the top of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryRight": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight",
"text": "Story right"
},
"$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
"text": "how far the left margin of the sidebar <br>is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
"text": "Story width"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
"text": "the overall width of the story river"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
"text": "Tiddler width"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
"text": "within the story river"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
"text": "Sidebar breakpoint"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
"text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
"text": "Sidebar width"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
"text": "the width of the sidebar in fluid-fixed layout"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"title": "$:/core/modules/commander.js",
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"title": "$:/core/modules/commands/build.js",
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"title": "$:/core/modules/commands/clearpassword.js",
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/deletetiddlers.js": {
"title": "$:/core/modules/commands/deletetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"title": "$:/core/modules/commands/editions.js",
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/fetch.js": {
"title": "$:/core/modules/commands/fetch.js",
"text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = $tw.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"title": "$:/core/modules/commands/help.js",
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/import.js": {
"title": "$:/core/modules/commands/import.js",
"text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"title": "$:/core/modules/commands/init.js",
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/listen.js": {
"title": "$:/core/modules/commands/listen.js",
"text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"title": "$:/core/modules/commands/load.js",
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"title": "$:/core/modules/commands/makelibrary.js",
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"title": "$:/core/modules/commands/output.js",
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"title": "$:/core/modules/commands/password.js",
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/render.js": {
"title": "$:/core/modules/commands/render.js",
"text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"title": "$:/core/modules/commands/rendertiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"title": "$:/core/modules/commands/rendertiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/save.js": {
"title": "$:/core/modules/commands/save.js",
"text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!$tw.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"title": "$:/core/modules/commands/savetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"title": "$:/core/modules/commands/savetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savewikifolder.js": {
"title": "$:/core/modules/commands/savewikifolder.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"title": "$:/core/modules/commands/server.js",
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"title": "$:/core/modules/commands/setfield.js",
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"title": "$:/core/modules/commands/unpackplugin.js",
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"title": "$:/core/modules/commands/verbose.js",
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"title": "$:/core/modules/commands/version.js",
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"title": "$:/core/modules/config.js",
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"title": "$:/core/modules/deserializers.js",
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/editor/engines/framed.js": {
"title": "$:/core/modules/editor/engines/framed.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\tthis.domNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/engines/simple.js": {
"title": "$:/core/modules/editor/engines/simple.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/factory.js": {
"title": "$:/core/modules/editor/factory.js",
"text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/operations/bitmap/clear.js": {
"title": "$:/core/modules/editor/operations/bitmap/clear.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/resize.js": {
"title": "$:/core/modules/editor/operations/bitmap/resize.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/rotate-left.js": {
"title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/text/excise.js": {
"title": "$:/core/modules/editor/operations/text/excise.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/make-link.js": {
"title": "$:/core/modules/editor/operations/text/make-link.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/prefix-lines.js": {
"title": "$:/core/modules/editor/operations/text/prefix-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-all.js": {
"title": "$:/core/modules/editor/operations/text/replace-all.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-selection.js": {
"title": "$:/core/modules/editor/operations/text/replace-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/save-selection.js": {
"title": "$:/core/modules/editor/operations/text/save-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-lines.js": {
"title": "$:/core/modules/editor/operations/text/wrap-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-selection.js": {
"title": "$:/core/modules/editor/operations/text/wrap-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/filters/addprefix.js": {
"title": "$:/core/modules/filters/addprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"title": "$:/core/modules/filters/addsuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"title": "$:/core/modules/filters/after.js",
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"title": "$:/core/modules/filters/all/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"title": "$:/core/modules/filters/all/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"title": "$:/core/modules/filters/all/orphans.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"title": "$:/core/modules/filters/all/shadows.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tags.js": {
"title": "$:/core/modules/filters/all/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"title": "$:/core/modules/filters/all/tiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"title": "$:/core/modules/filters/all.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"title": "$:/core/modules/filters/backlinks.js",
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"title": "$:/core/modules/filters/before.js",
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"title": "$:/core/modules/filters/commands.js",
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/compare.js": {
"title": "$:/core/modules/filters/compare.js",
"text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = types[type] || types.number,\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar types = {\n\t\"number\": function(a,b) {\n\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t},\n\t\"integer\": function(a,b) {\n\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t},\n\t\"string\": function(a,b) {\n\t\treturn compare(\"\" + a,\"\" +b);\n\t},\n\t\"date\": function(a,b) {\n\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\tdateB = $tw.utils.parseDate(b);\n\t\tif(!isFinite(dateA)) {\n\t\t\tdateA = new Date(0);\n\t\t}\n\t\tif(!isFinite(dateB)) {\n\t\t\tdateB = new Date(0);\n\t\t}\n\t\treturn compare(dateA,dateB);\n\t},\n\t\"version\": function(a,b) {\n\t\treturn $tw.utils.compareVersions(a,b);\n\t}\n};\n\nfunction compare(a,b) {\n\tif(a > b) {\n\t\treturn +1;\n\t} else if(a < b) {\n\t\treturn -1;\n\t} else {\n\t\treturn 0;\n\t}\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/contains.js": {
"title": "$:/core/modules/filters/contains.js",
"text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/count.js": {
"title": "$:/core/modules/filters/count.js",
"text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/days.js": {
"title": "$:/core/modules/filters/days.js",
"text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"title": "$:/core/modules/filters/each.js",
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"title": "$:/core/modules/filters/eachday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"title": "$:/core/modules/filters/editiondescription.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"title": "$:/core/modules/filters/editions.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/else.js": {
"title": "$:/core/modules/filters/else.js",
"text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/decodeuricomponent.js": {
"title": "$:/core/modules/filters/decodeuricomponent.js",
"text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/enlist.js": {
"title": "$:/core/modules/filters/enlist.js",
"text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"title": "$:/core/modules/filters/field.js",
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"title": "$:/core/modules/filters/fields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"title": "$:/core/modules/filters/get.js",
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"title": "$:/core/modules/filters/getindex.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getvariable.js": {
"title": "$:/core/modules/filters/getvariable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"title": "$:/core/modules/filters/has.js",
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === \"\")) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === \"\" || tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"title": "$:/core/modules/filters/haschanged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"title": "$:/core/modules/filters/indexes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/insertbefore.js": {
"title": "$:/core/modules/filters/insertbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/binary.js": {
"title": "$:/core/modules/filters/is/binary.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/blank.js": {
"title": "$:/core/modules/filters/is/blank.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/current.js": {
"title": "$:/core/modules/filters/is/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"title": "$:/core/modules/filters/is/image.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"title": "$:/core/modules/filters/is/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"title": "$:/core/modules/filters/is/orphan.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"title": "$:/core/modules/filters/is/shadow.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"title": "$:/core/modules/filters/is/system.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"title": "$:/core/modules/filters/is/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"title": "$:/core/modules/filters/is/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/variable.js": {
"title": "$:/core/modules/filters/is/variable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"title": "$:/core/modules/filters/is.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"title": "$:/core/modules/filters/limit.js",
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"title": "$:/core/modules/filters/links.js",
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"title": "$:/core/modules/filters/list.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"title": "$:/core/modules/filters/listed.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"title": "$:/core/modules/filters/listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/lookup.js": {
"title": "$:/core/modules/filters/lookup.js",
"text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/match.js": {
"title": "$:/core/modules/filters/match.js",
"text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/math.js": {
"title": "$:/core/modules/filters/math.js",
"text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/minlength.js": {
"title": "$:/core/modules/filters/minlength.js",
"text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"title": "$:/core/modules/filters/modules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"title": "$:/core/modules/filters/moduletypes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"title": "$:/core/modules/filters/next.js",
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"title": "$:/core/modules/filters/plugintiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"title": "$:/core/modules/filters/prefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"title": "$:/core/modules/filters/previous.js",
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/range.js": {
"title": "$:/core/modules/filters/range.js",
"text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"title": "$:/core/modules/filters/regexp.js",
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"title": "$:/core/modules/filters/removeprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"title": "$:/core/modules/filters/removesuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"title": "$:/core/modules/filters/sameday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"title": "$:/core/modules/filters/search.js",
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"title": "$:/core/modules/filters/shadowsource.js",
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"title": "$:/core/modules/filters/sort.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"title": "$:/core/modules/filters/splitbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"title": "$:/core/modules/filters/storyviews.js",
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/strings.js": {
"title": "$:/core/modules/filters/strings.js",
"text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.trim(a)];}\n);\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subfilter.js": {
"title": "$:/core/modules/filters/subfilter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subtiddlerfields.js": {
"title": "$:/core/modules/filters/subtiddlerfields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"title": "$:/core/modules/filters/suffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"title": "$:/core/modules/filters/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"title": "$:/core/modules/filters/tagging.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"title": "$:/core/modules/filters/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/then.js": {
"title": "$:/core/modules/filters/then.js",
"text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"title": "$:/core/modules/filters/title.js",
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"title": "$:/core/modules/filters/untagged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/variables.js": {
"title": "$:/core/modules/filters/variables.js",
"text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/wikiparserrules.js": {
"title": "$:/core/modules/filters/wikiparserrules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/x-listops.js": {
"title": "$:/core/modules/filters/x-listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n /*\n Fetch titles from the current list\n */\n var prepare_results = function (source) {\n var results = [];\n source(function (tiddler, title) {\n results.push(title);\n });\n return results;\n };\n\n /*\n Moves a number of items from the tail of the current list before the item named in the operand\n */\n exports.putbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list after the item named in the operand\n */\n exports.putafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Replaces the item named in the operand with a number of items from the tail of the current list\n */\n exports.replace = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -count) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list to the head of the list\n */\n exports.putfirst = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(-count).concat(results.slice(0, -count));\n };\n\n /*\n Moves a number of items from the head of the current list to the tail of the list\n */\n exports.putlast = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(count).concat(results.slice(0, count));\n };\n\n /*\n Moves the item named in the operand a number of places forward or backward in the list\n */\n exports.move = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1),\n marker = results.splice(index, 1),\n offset = (index + count) > 0 ? index + count : 0;\n return results.slice(0, offset).concat(marker).concat(results.slice(offset));\n };\n\n /*\n Returns the items from the current list that are after the item named in the operand\n */\n exports.allafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(index) :\n results.slice(index + 1);\n };\n\n /*\n Returns the items from the current list that are before the item named in the operand\n */\n exports.allbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(0, index + 1) :\n results.slice(0, index);\n };\n\n /*\n Appends the items listed in the operand array to the tail of the current list\n */\n exports.append = function (source, operator) {\n var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || append.length;\n return (append.length === 0) ? results :\n (operator.prefix) ? results.concat(append.slice(-count)) :\n results.concat(append.slice(0, count));\n };\n\n /*\n Prepends the items listed in the operand array to the head of the current list\n */\n exports.prepend = function (source, operator) {\n var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,prepend.length);\n return (prepend.length === 0) ? results :\n (operator.prefix) ? prepend.slice(-count).concat(results) :\n prepend.slice(0, count).concat(results);\n };\n\n /*\n Returns all items from the current list except the items listed in the operand array\n */\n exports.remove = function (source, operator) {\n var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || array.length,\n p,\n len,\n index;\n len = array.length - 1;\n for (p = 0; p < count; ++p) {\n if (operator.prefix) {\n index = results.indexOf(array[len - p]);\n } else {\n index = results.indexOf(array[p]);\n }\n if (index !== -1) {\n results.splice(index, 1);\n }\n }\n return results;\n };\n\n /*\n Returns all items from the current list sorted in the order of the items in the operand array\n */\n exports.sortby = function (source, operator) {\n var results = prepare_results(source);\n if (!results || results.length < 2) {\n return results;\n }\n var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n results.sort(function (a, b) {\n return lookup.indexOf(a) - lookup.indexOf(b);\n });\n return results;\n };\n\n /*\n Removes all duplicate items from the current list\n */\n exports.unique = function (source, operator) {\n var results = prepare_results(source);\n var set = results.reduce(function (a, b) {\n if (a.indexOf(b) < 0) {\n a.push(b);\n }\n return a;\n }, []);\n return set;\n };\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"title": "$:/core/modules/filters.js",
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tArray.prototype.push.apply(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tif(results.length === 0) {\n\t\t\t\t\t\t\t// Main result so far is empty\n\t\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/indexers/backlinks-indexer.js": {
"title": "$:/core/modules/indexers/backlinks-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t oldLinks = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/field-indexer.js": {
"title": "$:/core/modules/indexers/field-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/tag-indexer.js": {
"title": "$:/core/modules/indexers/tag-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/info/platform.js": {
"title": "$:/core/modules/info/platform.js",
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/keyboard.js": {
"title": "$:/core/modules/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/language.js": {
"title": "$:/core/modules/language.js",
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"title": "$:/core/modules/macros/changecount.js",
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"title": "$:/core/modules/macros/contrastcolour.js",
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"title": "$:/core/modules/macros/csvtiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/displayshortcuts.js": {
"title": "$:/core/modules/macros/displayshortcuts.js",
"text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddler.js": {
"title": "$:/core/modules/macros/jsontiddler.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"title": "$:/core/modules/macros/jsontiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"title": "$:/core/modules/macros/makedatauri.js",
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"title": "$:/core/modules/macros/now.js",
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"title": "$:/core/modules/macros/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"title": "$:/core/modules/macros/resolvepath.js",
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/unusedtitle.js": {
"title": "$:/core/modules/macros/unusedtitle.js",
"text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"title": "$:/core/modules/macros/version.js",
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"title": "$:/core/modules/parsers/audioparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/binaryparser.js": {
"title": "$:/core/modules/parsers/binaryparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"title": "$:/core/modules/parsers/csvparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"title": "$:/core/modules/parsers/htmlparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"title": "$:/core/modules/parsers/imageparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"title": "$:/core/modules/utils/parseutils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/pdfparser.js": {
"title": "$:/core/modules/parsers/pdfparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/textparser.js": {
"title": "$:/core/modules/parsers/textparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/videoparser.js": {
"title": "$:/core/modules/parsers/videoparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/import.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/import.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"title": "$:/core/modules/pluginswitcher.js",
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"title": "$:/core/modules/saver-handler.js",
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"title": "$:/core/modules/savers/andtidwiki.js",
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/beaker.js": {
"title": "$:/core/modules/savers/beaker.js",
"text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"title": "$:/core/modules/savers/download.js",
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"title": "$:/core/modules/savers/fsosaver.js",
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitea.js": {
"title": "$:/core/modules/savers/gitea.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/github.js": {
"title": "$:/core/modules/savers/github.js",
"text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitlab.js": {
"title": "$:/core/modules/savers/gitlab.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"title": "$:/core/modules/savers/manualdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"title": "$:/core/modules/savers/msdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/put.js": {
"title": "$:/core/modules/savers/put.js",
"text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"title": "$:/core/modules/savers/tiddlyfox.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"title": "$:/core/modules/savers/tiddlyie.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"title": "$:/core/modules/savers/twedit.js",
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"title": "$:/core/modules/savers/upload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/server/authenticators/basic.js": {
"title": "$:/core/modules/server/authenticators/basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve($tw.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/authenticators/header.js": {
"title": "$:/core/modules/server/authenticators/header.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\");\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/routes/delete-tiddler.js": {
"title": "$:/core/modules/server/routes/delete-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-favicon.js": {
"title": "$:/core/modules/server/routes/get-favicon.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-file.js": {
"title": "$:/core/modules/server/routes/get-file.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve($tw.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-index.js": {
"title": "$:/core/modules/server/routes/get-index.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-login-basic.js": {
"title": "$:/core/modules/server/routes/get-login-basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-status.js": {
"title": "$:/core/modules/server/routes/get-status.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler-html.js": {
"title": "$:/core/modules/server/routes/get-tiddler-html.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler.js": {
"title": "$:/core/modules/server/routes/get-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddlers-json.js": {
"title": "$:/core/modules/server/routes/get-tiddlers-json.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif($tw.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif($tw.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/put-tiddler.js": {
"title": "$:/core/modules/server/routes/put-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/server.js": {
"title": "$:/core/modules/server/server.js",
"text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"path-prefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response) {\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = self.wiki;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/browser-messaging.js": {
"title": "$:/core/modules/browser-messaging.js",
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"title": "$:/core/modules/startup/commands.js",
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/CSSescape.js": {
"title": "$:/core/modules/startup/CSSescape.js",
"text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"title": "$:/core/modules/startup/favicon.js",
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"title": "$:/core/modules/startup/info.js",
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\tvar fields = {\n\t\ttitle: TITLE_INFO_PLUGIN,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"title": "$:/core/modules/startup/load-modules.js",
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"title": "$:/core/modules/startup/password.js",
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/plugins.js": {
"title": "$:/core/modules/startup/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"title": "$:/core/modules/startup/render.js",
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"title": "$:/core/modules/startup/rootwidget.js",
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"title": "$:/core/modules/startup.js",
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\tvar executeStartupTiddlers = function(tag) {\n\t\t$tw.utils.each($tw.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\t\t$tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget);\n\t\t});\n\t};\n\texecuteStartupTiddlers(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"title": "$:/core/modules/startup/story.js",
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\t$tw.wiki.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/windows.js": {
"title": "$:/core/modules/startup/windows.js",
"text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t},{\n\t\t\tname: \"click\",\n\t\t\thandlerObject: $tw.popup,\n\t\t\thandlerMethod: \"handleEvent\"\n\t\t}]);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/story.js": {
"title": "$:/core/modules/story.js",
"text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/storyviews/classic.js": {
"title": "$:/core/modules/storyviews/classic.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"title": "$:/core/modules/storyviews/pop.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"title": "$:/core/modules/storyviews/zoomin.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"title": "$:/core/modules/syncer.js",
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif($tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t};\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || $tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"title": "$:/core/modules/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"title": "$:/core/modules/upgraders/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"title": "$:/core/modules/upgraders/system.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"title": "$:/core/modules/upgraders/themetweaks.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
"text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,n,i,d,f,a,h,c=\"\",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,n,i,d,f,a,h=\"\",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
"module-type": "library"
},
"$:/core/modules/utils/crypto.js": {
"title": "$:/core/modules/utils/crypto.js",
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/csv.js": {
"title": "$:/core/modules/utils/csv.js",
"text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
"text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
"module-type": "library"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"title": "$:/core/modules/utils/dom/animations/slide.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"title": "$:/core/modules/utils/dom/animator.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"title": "$:/core/modules/utils/dom/browser.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"title": "$:/core/modules/utils/dom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/dragndrop.js": {
"title": "$:/core/modules/utils/dom/dragndrop.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"title": "$:/core/modules/utils/dom/http.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!$tw.utils.hop(headers,\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"title": "$:/core/modules/utils/dom/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"title": "$:/core/modules/utils/dom/modal.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"title": "$:/core/modules/utils/dom/notifier.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"title": "$:/core/modules/utils/dom/popup.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"title": "$:/core/modules/utils/dom/scroller.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"title": "$:/core/modules/utils/edition-info.js",
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"title": "$:/core/modules/utils/fakedom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"title": "$:/core/modules/utils/filesystem.js",
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {};\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\tfilepath;\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// If not, generate a base pathname\n\tif(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t// Don't let the filename start with a dot because such files are invisible on *nix\n\tfilepath = filepath.replace(/^\\./g,\"_\");\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"title": "$:/core/modules/utils/logger.js",
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"title": "$:/core/modules/utils/parsetree.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"title": "$:/core/modules/utils/performance.js",
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"title": "$:/core/modules/utils/pluginmaker.js",
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/transliterate.js": {
"title": "$:/core/modules/utils/transliterate.js",
"text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"title": "$:/core/modules/utils/utils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s) {\n\t// See http://www.json.org/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-createtiddler.js": {
"title": "$:/core/modules/widgets/action-createtiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletefield.js": {
"title": "$:/core/modules/widgets/action-deletefield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-listops.js": {
"title": "$:/core/modules/widgets/action-listops.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"title": "$:/core/modules/widgets/action-navigate.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-popup.js": {
"title": "$:/core/modules/widgets/action-popup.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords);\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"title": "$:/core/modules/widgets/action-sendmessage.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"title": "$:/core/modules/widgets/action-setfield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"title": "$:/core/modules/widgets/browse.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"title": "$:/core/modules/widgets/button.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\t\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"title": "$:/core/modules/widgets/checkbox.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"title": "$:/core/modules/widgets/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"title": "$:/core/modules/widgets/count.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/diff-text.js": {
"title": "$:/core/modules/widgets/diff-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/draggable.js": {
"title": "$:/core/modules/widgets/draggable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/droppable.js": {
"title": "$:/core/modules/widgets/droppable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tvar domNode = this.document.createElement(tag),\n\t\tclasses = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tdomNode.className = classes.join(\" \");\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = event.ctrlKey && ! event.shiftKey ? \"ctrl\" : event.shiftKey && !event.ctrlKey ? \"shift\" : \n\t\t\t\tevent.ctrlKey && event.shiftKey ? \"ctrl-shift\" : \"normal\" ;\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableClass = this.getAttribute(\"class\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"] || changedAttributes.tag || changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"title": "$:/core/modules/widgets/dropzone.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"title": "$:/core/modules/widgets/edit-binary.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"title": "$:/core/modules/widgets/edit-bitmap.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-shortcut.js": {
"title": "$:/core/modules/widgets/edit-shortcut.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"title": "$:/core/modules/widgets/edit-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"title": "$:/core/modules/widgets/edit.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex},\n\t\t\t\"focus\": {type: \"string\", value: this.editFocus}\n\t\t},\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"title": "$:/core/modules/widgets/element.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\ttag = \"h\" + headingLevel;\n\t}\n\t// Create the DOM node\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"title": "$:/core/modules/widgets/encrypt.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"title": "$:/core/modules/widgets/entity.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"title": "$:/core/modules/widgets/fieldmangler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"title": "$:/core/modules/widgets/fields.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"title": "$:/core/modules/widgets/image.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"title": "$:/core/modules/widgets/importvariables.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.makeChildWidgets([node]);\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"title": "$:/core/modules/widgets/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tself.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"title": "$:/core/modules/widgets/link.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"title": "$:/core/modules/widgets/linkcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"title": "$:/core/modules/widgets/list.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"title": "$:/core/modules/widgets/macrocall.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"title": "$:/core/modules/widgets/navigator.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.wiki.addToStory(title,fromTitle,this.storyTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\tthis.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"title": "$:/core/modules/widgets/password.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/qualify.js": {
"title": "$:/core/modules/widgets/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"title": "$:/core/modules/widgets/radio.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n \t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n \t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/range.js": {
"title": "$:/core/modules/widgets/range.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\t\t\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField || \"text\",\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue || \"\");\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue || \"\";\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\t\t\t\t\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"title": "$:/core/modules/widgets/raw.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"title": "$:/core/modules/widgets/reveal.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"title": "$:/core/modules/widgets/scrollable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"title": "$:/core/modules/widgets/select.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"title": "$:/core/modules/widgets/set.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"title": "$:/core/modules/widgets/text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"title": "$:/core/modules/widgets/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"title": "$:/core/modules/widgets/transclude.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/vars.js": {
"title": "$:/core/modules/widgets/vars.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"title": "$:/core/modules/widgets/view.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"title": "$:/core/modules/widgets/widget.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/wikify.js": {
"title": "$:/core/modules/widgets/wikify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki-bulkops.js": {
"title": "$:/core/modules/wiki-bulkops.js",
"text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/wiki.js": {
"title": "$:/core/modules/wiki.js",
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t// indexOf unless we have a new\n\t\t\t\t\t// position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title}},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\t\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\t\t\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastLight": {
"title": "$:/palettes/ContrastLight",
"name": "Contrast (Light)",
"description": "High contrast and unambiguous (light version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastDark": {
"title": "$:/palettes/ContrastDark",
"name": "Contrast (Dark)",
"description": "High contrast and unambiguous (dark version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/DarkPhotos": {
"title": "$:/palettes/DarkPhotos",
"created": "20150402111612188",
"description": "Good with dark photo backgrounds",
"modified": "20150402112344080",
"name": "DarkPhotos",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/GruvboxDark": {
"title": "$:/palettes/GruvboxDark",
"name": "Gruvbox Dark",
"description": "Retro groove color scheme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "https://github.com/morhetz/gruvbox",
"text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #504945\nbutton-foreground: #fbf1c7\nbutton-border: transparent\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: #7c6f64\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #282828\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: <<colour button-background>>\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>"
},
"$:/palettes/Nord": {
"title": "$:/palettes/Nord",
"name": "Nord",
"description": "An arctic, north-bluish color palette.",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
"text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #4C566A\nbutton-foreground: #D8DEE9\nbutton-border: transparent\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #2e3440\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarFlare": {
"title": "$:/palettes/SolarFlare",
"name": "Solar Flare",
"description": "Warm, relaxing earth colours",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarizedLight": {
"title": "$:/palettes/SolarizedLight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedLight",
"text": "alert-background: #eee8d5\nalert-border: #073642\nalert-highlight: #cb4b16\nalert-muted-foreground: #586e75\nbackground: #fdf6e3\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #cb4b16\nbutton-foreground: #fdf6e3\nbutton-border: transparent\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #d33682\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #859900\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #D08770\ndownload-background: #859900\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #fdf6e3\ndropdown-tab-background: #93a1a1\ndropzone-background: #859900\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: #d33682\nexternal-link-foreground-visited: #b58900\nexternal-link-foreground: #cb4b16\nforeground: #839496\nmessage-background: #586e75\nmessage-border: #586e75\nmessage-foreground: #eee8d5\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #eee8d5\nmodal-footer-background: #eee8d5\nmodal-footer-border: #eee8d5\nmodal-header-border: #eee8d5\nmuted-foreground: #93a1a1\nnotification-background: #EBCB8B\nnotification-border: #D08770\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #93a1a1\nprimary: #2aa198\nselect-tag-background: #eee8d5\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: #eee8d5\nsidebar-controls-foreground-hover: #268bd2\nsidebar-controls-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #839496\nsidebar-muted-foreground-hover: #657b83\nsidebar-muted-foreground: #93a1a1\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-background: #839496\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #657b83\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #839496\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #859900\nsidebar-tiddler-link-foreground: #268bd2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #dc322f\ntab-background-selected: #fdf6e3\ntab-background: #839496\ntab-border-selected: #93a1a1\ntab-border: #93a1a1\ntab-divider: #fdf6e3\ntab-foreground-selected: #839496\ntab-foreground: #eee8d5\ntable-border: #657b83\ntable-footer-background: #657b83\ntable-header-background: #93a1a1\ntag-background: #6c71c4\ntag-foreground: #eee8d5\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #b58900\ntiddler-controls-foreground-selected: #b58900\ntiddler-controls-foreground: #073642\ntiddler-editor-background: #eee8d5\ntiddler-editor-border-image: #eee8d5\ntiddler-editor-border: #eee8d5\ntiddler-editor-fields-even: #eee8d5\ntiddler-editor-fields-odd: #fdf6e3\ntiddler-info-background: #eee8d5\ntiddler-info-border: #eee8d5\ntiddler-info-tab-background: #586e75\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #586e75\ntiddler-title-foreground: #073642\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #839496\nvery-muted-foreground: #93a1a1\n"
},
"$:/palettes/SpartanDay": {
"title": "$:/palettes/SpartanDay",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Cold, spartan day colors",
"name": "Spartan Day",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
},
"$:/palettes/SpartanNight": {
"title": "$:/palettes/SpartanNight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Dark spartan colors",
"name": "Spartan Night",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
},
"$:/palettes/Twilight": {
"title": "$:/palettes/Twilight",
"tags": "$:/tags/Palette",
"author": "Thomas Elmiger",
"type": "application/x-tiddler-dictionary",
"name": "Twilight",
"description": "Delightful, soft darkness.",
"text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/library/sjcl.js/license": {
"title": "$:/library/sjcl.js/license",
"type": "text/plain",
"text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-raw": {
"title": "$:/core/templates/canonical-uri-external-raw",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-text": {
"title": "$:/core/templates/canonical-uri-external-text",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
},
"$:/core/save/all-external-js": {
"title": "$:/core/save/all-external-js",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
},
"$:/core/templates/tiddlywiki5.js": {
"title": "$:/core/templates/tiddlywiki5.js",
"text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
},
"$:/core/templates/tiddlywiki5.js/tiddlers": {
"title": "$:/core/templates/tiddlywiki5.js/tiddlers",
"text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/all-external-js\"\n}]);\n`\n"
},
"$:/core/templates/tiddlywiki5-external-js.html": {
"title": "$:/core/templates/tiddlywiki5-external-js.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
},
"$:/core/templates/html-div-skinny-tiddler": {
"title": "$:/core/templates/html-div-skinny-tiddler",
"text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/json-tiddler": {
"title": "$:/core/templates/json-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/raw-static-tiddler": {
"title": "$:/core/templates/raw-static-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/server/static.sidebar.wikitext": {
"title": "$:/core/templates/server/static.sidebar.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
},
"$:/core/templates/server/static.tiddler.html": {
"title": "$:/core/templates/server/static.tiddler.html",
"text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
},
"$:/core/templates/server/static.tiddler.wikitext": {
"title": "$:/core/templates/server/static.tiddler.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
},
"$:/core/templates/single.tiddler.window": {
"title": "$:/core/templates/single.tiddler.window",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AboveStory/tw2-plugin-check": {
"title": "$:/core/ui/AboveStory/tw2-plugin-check",
"tags": "$:/tags/AboveStory",
"text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/Actions/new-image": {
"title": "$:/core/ui/Actions/new-image",
"tags": "$:/tags/Actions",
"description": "create a new image tiddler",
"text": "\\define get-type()\nimage/$(imageType)$\n\\end\n<$vars imageType={{$:/config/NewImageType}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/>\n</$vars>\n"
},
"$:/core/ui/Actions/new-journal": {
"title": "$:/core/ui/Actions/new-journal",
"tags": "$:/tags/Actions",
"description": "create a new journal tiddler",
"text": "<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
},
"$:/core/ui/Actions/new-tiddler": {
"title": "$:/core/ui/Actions/new-tiddler",
"tags": "$:/tags/Actions",
"description": "create a new empty tiddler",
"text": "<$action-sendmessage $message=\"tm-new-tiddler\" tags={{$:/config/NewTiddler/Tags!!tags}}/>\n"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
},
"$:/core/ui/Components/plugin-info": {
"title": "$:/core/ui/Components/plugin-info",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewTiddler/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewJournal/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/KeyboardShortcuts": {
"title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Modals/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
"subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Parsing": {
"title": "$:/core/ui/ControlPanel/Parsing",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
},
"$:/core/ui/ControlPanel/Plugins/Add/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
"text": "<<display-server-assets language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
"text": "<<display-server-assets plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
"text": "<<display-server-assets theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Updates": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
"caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
"text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"[[<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Plugins/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
"text": "<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
"text": "<<plugin-table plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
"text": "<<plugin-table theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[title]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"
},
"$:/core/ui/ControlPanel/Saving/DownloadSaver": {
"title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Saving/General": {
"title": "$:/core/ui/ControlPanel/Saving/General",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
"list-before": "",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Saving/GitHub": {
"title": "$:/core/ui/ControlPanel/Saving/GitHub",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/GitLab": {
"title": "$:/core/ui/ControlPanel/Saving/GitLab",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/TiddlySpot": {
"title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<backupLink>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>"
},
"$:/core/ui/ControlPanel/Saving/Gitea": {
"title": "$:/core/ui/ControlPanel/Saving/Gitea",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Saving/General\">>\n</div>\n"
},
"$:/core/buttonstyles/Borderless": {
"title": "$:/core/buttonstyles/Borderless",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
"text": "tc-btn-invisible"
},
"$:/core/buttonstyles/Boxed": {
"title": "$:/core/buttonstyles/Boxed",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
"text": "tc-btn-boxed"
},
"$:/core/buttonstyles/Rounded": {
"title": "$:/core/buttonstyles/Rounded",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
"text": "tc-btn-rounded"
},
"$:/core/ui/ControlPanel/Settings/CamelCase": {
"title": "$:/core/ui/ControlPanel/Settings/CamelCase",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
"title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
"title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/MissingLinks": {
"title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
"title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/TitleLinks": {
"title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Stylesheets": {
"title": "$:/core/ui/ControlPanel/Stylesheets",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
},
"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-current": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
"tags": "$:/tags/EditPreview",
"caption": "differences from current",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
"tags": "$:/tags/EditPreview",
"caption": "differences from shadow (if any)",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/output": {
"title": "$:/core/ui/EditTemplate/body/preview/output",
"tags": "$:/tags/EditPreview",
"caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
"text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
},
"$:/state/showeditpreview": {
"title": "$:/state/showeditpreview",
"text": "no"
},
"$:/core/ui/EditTemplate/body/editor": {
"title": "$:/core/ui/EditTemplate/body/editor",
"text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
},
"$:/core/ui/EditTemplate/body/toolbar/button": {
"title": "$:/core/ui/EditTemplate/body/toolbar/button",
"text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}}></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>> \n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=<<newFieldNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>\n</span> \n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> \n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}}/>\n</$keyboard>\n</$set>\n</span> \n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon)\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon)\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\"/>\n\\end\n\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>\n</$list>\n<$set name=\"tabIndex\" value={{$:/config/EditTabIndex}}>\n<$macrocall $name=\"tag-picker\"/>\n</$set>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}}/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\whitespace trim\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "\\define save-tiddler-button()\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
},
"$:/core/ui/EditorToolbar/bold": {
"title": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}}",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
},
"$:/core/ui/EditorToolbar/clear-dropdown": {
"title": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
},
"$:/core/ui/EditorToolbar/clear": {
"title": "$:/core/ui/EditorToolbar/clear",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/erase",
"caption": "{{$:/language/Buttons/Clear/Caption}}",
"description": "{{$:/language/Buttons/Clear/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/editor-height-dropdown": {
"title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
},
"$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/core/ui/EditorToolbar/editor-height",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/fixed-height",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
"description": "{{$:/language/Buttons/EditorHeight/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/excise-dropdown": {
"title": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
},
"$:/core/ui/EditorToolbar/excise": {
"title": "$:/core/ui/EditorToolbar/excise",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/excise",
"caption": "{{$:/language/Buttons/Excise/Caption}}",
"description": "{{$:/language/Buttons/Excise/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
"shortcuts": "((excise))",
"dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}}",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}}",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}}",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}}",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}}",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}}",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
},
"$:/core/ui/EditorToolbar/italic": {
"title": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}}",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
},
"$:/core/ui/EditorToolbar/line-width-dropdown": {
"title": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/line-width": {
"title": "$:/core/ui/EditorToolbar/line-width",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/line-width",
"caption": "{{$:/language/Buttons/LineWidth/Caption}}",
"description": "{{$:/language/Buttons/LineWidth/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>"
},
"$:/core/ui/EditorToolbar/link-dropdown": {
"title": "$:/core/ui/EditorToolbar/link-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/core/ui/EditorToolbar/link": {
"title": "$:/core/ui/EditorToolbar/link",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/link",
"caption": "{{$:/language/Buttons/Link/Caption}}",
"description": "{{$:/language/Buttons/Link/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((link))",
"dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/linkify": {
"title": "$:/core/ui/EditorToolbar/linkify",
"caption": "{{$:/language/Buttons/Linkify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Linkify/Hint}}",
"icon": "$:/core/images/linkify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((linkify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}}",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-number": {
"title": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}}",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/core/ui/EditorToolbar/mono-block",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-block",
"caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
"description": "{{$:/language/Buttons/MonoBlock/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((mono-block))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}}",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/core/ui/EditorToolbar/more-dropdown": {
"title": "$:/core/ui/EditorToolbar/more-dropdown",
"text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
},
"$:/core/ui/EditorToolbar/more": {
"title": "$:/core/ui/EditorToolbar/more",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/down-arrow",
"caption": "{{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"condition": "[<targetTiddler>]",
"dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/opacity-dropdown": {
"title": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/EditorToolbar/opacity": {
"title": "$:/core/ui/EditorToolbar/opacity",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/opacity",
"caption": "{{$:/language/Buttons/Opacity/Caption}}",
"description": "{{$:/language/Buttons/Opacity/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
},
"$:/core/ui/EditorToolbar/paint-dropdown": {
"title": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/paint": {
"title": "$:/core/ui/EditorToolbar/paint",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/paint",
"caption": "{{$:/language/Buttons/Paint/Caption}}",
"description": "{{$:/language/Buttons/Paint/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
},
"$:/core/ui/EditorToolbar/picture-dropdown": {
"title": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/picture": {
"title": "$:/core/ui/EditorToolbar/picture",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/picture",
"caption": "{{$:/language/Buttons/Picture/Caption}}",
"description": "{{$:/language/Buttons/Picture/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((picture))",
"dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/preview-type-dropdown": {
"title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
"text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/preview-type": {
"title": "$:/core/ui/EditorToolbar/preview-type",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/chevron-down",
"caption": "{{$:/language/Buttons/PreviewType/Caption}}",
"description": "{{$:/language/Buttons/PreviewType/Hint}}",
"condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
"button-classes": "tc-text-editor-toolbar-item-adjunct",
"dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
},
"$:/core/ui/EditorToolbar/preview": {
"title": "$:/core/ui/EditorToolbar/preview",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/preview-open",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/Preview/Caption}}",
"description": "{{$:/language/Buttons/Preview/Hint}}",
"condition": "[<targetTiddler>]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((preview))",
"text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/quote": {
"title": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}}",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
},
"$:/core/ui/EditorToolbar/rotate-left": {
"title": "$:/core/ui/EditorToolbar/rotate-left",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/rotate-left",
"caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
"description": "{{$:/language/Buttons/RotateLeft/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
},
"$:/core/ui/EditorToolbar/size-dropdown": {
"title": "$:/core/ui/EditorToolbar/size-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
},
"$:/core/ui/EditorToolbar/size": {
"title": "$:/core/ui/EditorToolbar/size",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/size",
"caption": "{{$:/language/Buttons/Size/Caption}}",
"description": "{{$:/language/Buttons/Size/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/stamp-dropdown": {
"title": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
},
"$:/core/ui/EditorToolbar/stamp": {
"title": "$:/core/ui/EditorToolbar/stamp",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/stamp",
"caption": "{{$:/language/Buttons/Stamp/Caption}}",
"description": "{{$:/language/Buttons/Stamp/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"shortcuts": "((stamp))",
"dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/core/ui/EditorToolbar/strikethrough",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/strikethrough",
"caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
"description": "{{$:/language/Buttons/Strikethrough/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((strikethrough))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
},
"$:/core/ui/EditorToolbar/subscript": {
"title": "$:/core/ui/EditorToolbar/subscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/subscript",
"caption": "{{$:/language/Buttons/Subscript/Caption}}",
"description": "{{$:/language/Buttons/Subscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((subscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
},
"$:/core/ui/EditorToolbar/superscript": {
"title": "$:/core/ui/EditorToolbar/superscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/superscript",
"caption": "{{$:/language/Buttons/Superscript/Caption}}",
"description": "{{$:/language/Buttons/Superscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((superscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
},
"$:/core/ui/EditorToolbar/transcludify": {
"title": "$:/core/ui/EditorToolbar/transcludify",
"caption": "{{$:/language/Buttons/Transcludify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Transcludify/Hint}}",
"icon": "$:/core/images/transcludify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((transcludify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
},
"$:/core/ui/EditorToolbar/underline": {
"title": "$:/core/ui/EditorToolbar/underline",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/underline",
"caption": "{{$:/language/Buttons/Underline/Caption}}",
"description": "{{$:/language/Buttons/Underline/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((underline))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/SessionTiddlers": {
"title": "$:/core/Filters/SessionTiddlers",
"tags": "$:/tags/Filter",
"filter": "[haschanged[]]",
"description": "{{$:/language/Filters/SessionTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/StoryList": {
"title": "$:/core/Filters/StoryList",
"tags": "$:/tags/Filter",
"filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
"description": "{{$:/language/Filters/StoryList}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table>\n<tbody>\n<tr>\n<th>\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" stateTitle=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Diff": {
"title": "$:/core/ui/ImportPreviews/Diff",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Diff}}",
"text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
},
"$:/core/ui/ImportPreviews/DiffFields": {
"title": "$:/core/ui/ImportPreviews/DiffFields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
"text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
},
"$:/core/ui/ImportPreviews/Fields": {
"title": "$:/core/ui/ImportPreviews/Fields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Fields}}",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Text": {
"title": "$:/core/ui/ImportPreviews/Text",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Text}}",
"text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
},
"$:/core/ui/ImportPreviews/TextRaw": {
"title": "$:/core/ui/ImportPreviews/TextRaw",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
"text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
},
"$:/core/ui/KeyboardShortcuts/advanced-search": {
"title": "$:/core/ui/KeyboardShortcuts/advanced-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((advanced-search))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\"/>\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-image": {
"title": "$:/core/ui/KeyboardShortcuts/new-image",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-image))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-journal": {
"title": "$:/core/ui/KeyboardShortcuts/new-journal",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-journal))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-tiddler": {
"title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-tiddler))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/sidebar-search": {
"title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((sidebar-search))",
"text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
},
"$:/core/ui/KeyboardShortcut/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcut/toggle-sidebar",
"tags": "$:/tags/KeyboardShortcut",
"key": "((toggle-sidebar))",
"text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
},
"$:/Manager/ItemMain/Fields": {
"title": "$:/Manager/ItemMain/Fields",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/Fields}}",
"text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/Manager/ItemMain/RawText": {
"title": "$:/Manager/ItemMain/RawText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/RawText}}",
"text": "<pre><code><$view/></code></pre>\n"
},
"$:/Manager/ItemMain/WikifiedText": {
"title": "$:/Manager/ItemMain/WikifiedText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/WikifiedText}}",
"text": "<$transclude mode=\"block\"/>\n"
},
"$:/Manager/ItemSidebar/Colour": {
"title": "$:/Manager/ItemSidebar/Colour",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Colour}}",
"text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Icon": {
"title": "$:/Manager/ItemSidebar/Icon",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Icon}}",
"text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tags": {
"title": "$:/Manager/ItemSidebar/Tags",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tags}}",
"text": "\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tools": {
"title": "$:/Manager/ItemSidebar/Tools",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tools}}",
"text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
},
"$:/Manager": {
"title": "$:/Manager",
"icon": "$:/core/images/list",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Explorer": {
"title": "$:/core/ui/MoreSideBar/Explorer",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Explorer/Caption}}",
"text": "<<tree \"$:/\">>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Plugins/Plugins\">>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Languages": {
"title": "$:/core/ui/MoreSideBar/Plugins/Languages",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Theme": {
"title": "$:/core/ui/MoreSideBar/Plugins/Theme",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/fold-all": {
"title": "$:/core/ui/Buttons/fold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
"description": "{{$:/language/Buttons/FoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/manager": {
"title": "$:/core/ui/Buttons/manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
"description": "{{$:/language/Buttons/Manager/Hint}}",
"text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-image": {
"title": "$:/core/ui/Buttons/new-image",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
"description": "{{$:/language/Buttons/NewImage/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/palette": {
"title": "$:/core/ui/Buttons/palette",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
"description": "{{$:/language/Buttons/Palette/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/print": {
"title": "$:/core/ui/Buttons/print",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
"description": "{{$:/language/Buttons/Print/Hint}}",
"text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/timestamp": {
"title": "$:/core/ui/Buttons/timestamp",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
"description": "{{$:/language/Buttons/Timestamp/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/unfold-all": {
"title": "$:/core/ui/Buttons/unfold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
"description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/drafts": {
"title": "$:/core/ui/PageTemplate/drafts",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-enable-drag-and-drop\" value={{$:/config/DragAndDrop/Enable}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/PaletteManager": {
"title": "$:/PaletteManager",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"> <<lingo Names/External/Show>></$checkbox>\n\n<<palette-manager-table>>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/PluginInfo/Default/contents": {
"title": "$:/core/ui/PluginInfo/Default/contents",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
},
"$:/core/ui/PluginListItemTemplate": {
"title": "$:/core/ui/PluginListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" />\n</div>"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
},
"$:/core/ui/SideBarSegments/page-controls": {
"title": "$:/core/ui/SideBarSegments/page-controls",
"tags": "$:/tags/SideBarSegment",
"text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
},
"$:/core/ui/SideBarSegments/search": {
"title": "$:/core/ui/SideBarSegments/search",
"tags": "$:/tags/SideBarSegment",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-subtitle": {
"title": "$:/core/ui/SideBarSegments/site-subtitle",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-title": {
"title": "$:/core/ui/SideBarSegments/site-title",
"tags": "$:/tags/SideBarSegment",
"text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
},
"$:/core/ui/SideBarSegments/tabs": {
"title": "$:/core/ui/SideBarSegments/tabs",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\"/>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate/unfold": {
"title": "$:/core/ui/ViewTemplate/unfold",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/fold-bar": {
"title": "$:/core/ui/Buttons/fold-bar",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
"description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
"text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
},
"$:/core/ui/Buttons/fold-others": {
"title": "$:/core/ui/Buttons/fold-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
"description": "{{$:/language/Buttons/FoldOthers/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/fold": {
"title": "$:/core/ui/Buttons/fold",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
"description": "{{$:/language/Buttons/Fold/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags!!tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags!!tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
},
"$:/core/ui/Buttons/open-window": {
"title": "$:/core/ui/Buttons/open-window",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
"description": "{{$:/language/Buttons/OpenWindow/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoFocus": {
"title": "$:/config/AutoFocus",
"text": "title"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#444"
},
"$:/config/BitmapEditor/ImageSizes": {
"title": "$:/config/BitmapEditor/ImageSizes",
"text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3px"
},
"$:/config/BitmapEditor/LineWidths": {
"title": "$:/config/BitmapEditor/LineWidths",
"text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
},
"$:/config/BitmapEditor/Opacities": {
"title": "$:/config/BitmapEditor/Opacities",
"text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
},
"$:/config/BitmapEditor/Opacity": {
"title": "$:/config/BitmapEditor/Opacity",
"text": "1.0"
},
"$:/config/DefaultMoreSidebarTab": {
"title": "$:/config/DefaultMoreSidebarTab",
"text": "$:/core/ui/MoreSideBar/Tags"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/DownloadSaver/AutoSave": {
"title": "$:/config/DownloadSaver/AutoSave",
"text": "no"
},
"$:/config/Drafts/TypingTimeout": {
"title": "$:/config/Drafts/TypingTimeout",
"text": "400"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/webp": {
"title": "$:/config/EditorTypeMappings/image/webp",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heic": {
"title": "$:/config/EditorTypeMappings/image/heic",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heif": {
"title": "$:/config/EditorTypeMappings/image/heif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Manager/Show": {
"title": "$:/config/Manager/Show",
"text": "tiddlers"
},
"$:/config/Manager/Filter": {
"title": "$:/config/Manager/Filter",
"text": ""
},
"$:/config/Manager/Order": {
"title": "$:/config/Manager/Order",
"text": "forward"
},
"$:/config/Manager/Sort": {
"title": "$:/config/Manager/Sort",
"text": "title"
},
"$:/config/Manager/System": {
"title": "$:/config/Manager/System",
"text": "system"
},
"$:/config/Manager/Tag": {
"title": "$:/config/Manager/Tag",
"text": ""
},
"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
"title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
"text": "hide"
},
"$:/config/MissingLinks": {
"title": "$:/config/MissingLinks",
"text": "yes"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/NewImageType": {
"title": "$:/config/NewImageType",
"text": "jpeg"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "https://tiddlywiki.com/library/v5.1.22/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
},
"$:/config/Navigation/openLinkFromInsideRiver": {
"title": "$:/config/Navigation/openLinkFromInsideRiver",
"text": "below"
},
"$:/config/Navigation/openLinkFromOutsideRiver": {
"title": "$:/config/Navigation/openLinkFromOutsideRiver",
"text": "top"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
"text": "hide"
},
"$:/config/Performance/Instrumentation": {
"title": "$:/config/Performance/Instrumentation",
"text": "no"
},
"$:/config/RegisterPluginType/plugin": {
"title": "$:/config/RegisterPluginType/plugin",
"text": "yes"
},
"$:/config/RegisterPluginType/theme": {
"title": "$:/config/RegisterPluginType/theme",
"text": "no"
},
"$:/config/RegisterPluginType/language": {
"title": "$:/config/RegisterPluginType/language",
"text": "no"
},
"$:/config/RegisterPluginType/info": {
"title": "$:/config/RegisterPluginType/info",
"text": "no"
},
"$:/config/RegisterPluginType/import": {
"title": "$:/config/RegisterPluginType/import",
"text": "no"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Search/AutoFocus": {
"title": "$:/config/Search/AutoFocus",
"text": "true"
},
"$:/config/Search/MinLength": {
"title": "$:/config/Search/MinLength",
"text": "3"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
"title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
"text": "yes"
},
"$:/config/ShortcutInfo/add-field": {
"title": "$:/config/ShortcutInfo/add-field",
"text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
},
"$:/config/ShortcutInfo/advanced-search": {
"title": "$:/config/ShortcutInfo/advanced-search",
"text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/bold": {
"title": "$:/config/ShortcutInfo/bold",
"text": "{{$:/language/Buttons/Bold/Hint}}"
},
"$:/config/ShortcutInfo/cancel-edit-tiddler": {
"title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
"text": "{{$:/language/Buttons/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/excise": {
"title": "$:/config/ShortcutInfo/excise",
"text": "{{$:/language/Buttons/Excise/Hint}}"
},
"$:/config/ShortcutInfo/heading-1": {
"title": "$:/config/ShortcutInfo/heading-1",
"text": "{{$:/language/Buttons/Heading1/Hint}}"
},
"$:/config/ShortcutInfo/heading-2": {
"title": "$:/config/ShortcutInfo/heading-2",
"text": "{{$:/language/Buttons/Heading2/Hint}}"
},
"$:/config/ShortcutInfo/heading-3": {
"title": "$:/config/ShortcutInfo/heading-3",
"text": "{{$:/language/Buttons/Heading3/Hint}}"
},
"$:/config/ShortcutInfo/heading-4": {
"title": "$:/config/ShortcutInfo/heading-4",
"text": "{{$:/language/Buttons/Heading4/Hint}}"
},
"$:/config/ShortcutInfo/heading-5": {
"title": "$:/config/ShortcutInfo/heading-5",
"text": "{{$:/language/Buttons/Heading5/Hint}}"
},
"$:/config/ShortcutInfo/heading-6": {
"title": "$:/config/ShortcutInfo/heading-6",
"text": "{{$:/language/Buttons/Heading6/Hint}}"
},
"$:/config/ShortcutInfo/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/Hint}}"
},
"$:/config/ShortcutInfo/list-bullet": {
"title": "$:/config/ShortcutInfo/list-bullet",
"text": "{{$:/language/Buttons/ListBullet/Hint}}"
},
"$:/config/ShortcutInfo/list-number": {
"title": "$:/config/ShortcutInfo/list-number",
"text": "{{$:/language/Buttons/ListNumber/Hint}}"
},
"$:/config/ShortcutInfo/mono-block": {
"title": "$:/config/ShortcutInfo/mono-block",
"text": "{{$:/language/Buttons/MonoBlock/Hint}}"
},
"$:/config/ShortcutInfo/mono-line": {
"title": "$:/config/ShortcutInfo/mono-line",
"text": "{{$:/language/Buttons/MonoLine/Hint}}"
},
"$:/config/ShortcutInfo/new-image": {
"title": "$:/config/ShortcutInfo/new-image",
"text": "{{$:/language/Buttons/NewImage/Hint}}"
},
"$:/config/ShortcutInfo/new-journal": {
"title": "$:/config/ShortcutInfo/new-journal",
"text": "{{$:/language/Buttons/NewJournal/Hint}}"
},
"$:/config/ShortcutInfo/new-tiddler": {
"title": "$:/config/ShortcutInfo/new-tiddler",
"text": "{{$:/language/Buttons/NewTiddler/Hint}}"
},
"$:/config/ShortcutInfo/picture": {
"title": "$:/config/ShortcutInfo/picture",
"text": "{{$:/language/Buttons/Picture/Hint}}"
},
"$:/config/ShortcutInfo/preview": {
"title": "$:/config/ShortcutInfo/preview",
"text": "{{$:/language/Buttons/Preview/Hint}}"
},
"$:/config/ShortcutInfo/quote": {
"title": "$:/config/ShortcutInfo/quote",
"text": "{{$:/language/Buttons/Quote/Hint}}"
},
"$:/config/ShortcutInfo/save-tiddler": {
"title": "$:/config/ShortcutInfo/save-tiddler",
"text": "{{$:/language/Buttons/Save/Hint}}"
},
"$:/config/ShortcutInfo/sidebar-search": {
"title": "$:/config/ShortcutInfo/sidebar-search",
"text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
},
"$:/config/ShortcutInfo/stamp": {
"title": "$:/config/ShortcutInfo/stamp",
"text": "{{$:/language/Buttons/Stamp/Hint}}"
},
"$:/config/ShortcutInfo/strikethrough": {
"title": "$:/config/ShortcutInfo/strikethrough",
"text": "{{$:/language/Buttons/Strikethrough/Hint}}"
},
"$:/config/ShortcutInfo/subscript": {
"title": "$:/config/ShortcutInfo/subscript",
"text": "{{$:/language/Buttons/Subscript/Hint}}"
},
"$:/config/ShortcutInfo/superscript": {
"title": "$:/config/ShortcutInfo/superscript",
"text": "{{$:/language/Buttons/Superscript/Hint}}"
},
"$:/config/ShortcutInfo/toggle-sidebar": {
"title": "$:/config/ShortcutInfo/toggle-sidebar",
"text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
},
"$:/config/ShortcutInfo/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Tags/MinLength": {
"title": "$:/config/Tags/MinLength",
"text": "0"
},
"$:/config/TextEditor/EditorHeight/Height": {
"title": "$:/config/TextEditor/EditorHeight/Height",
"text": "400px"
},
"$:/config/TextEditor/EditorHeight/Mode": {
"title": "$:/config/TextEditor/EditorHeight/Mode",
"text": "auto"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/TiddlerInfo/Mode": {
"title": "$:/config/TiddlerInfo/Mode",
"text": "popup"
},
"$:/config/Tiddlers/TitleLinks": {
"title": "$:/config/Tiddlers/TitleLinks",
"text": "no"
},
"$:/config/Toolbar/ButtonClass": {
"title": "$:/config/Toolbar/ButtonClass",
"text": "tc-btn-invisible"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
"text": "hide"
},
"$:/config/shortcuts-mac/bold": {
"title": "$:/config/shortcuts-mac/bold",
"text": "meta-B"
},
"$:/config/shortcuts-mac/italic": {
"title": "$:/config/shortcuts-mac/italic",
"text": "meta-I"
},
"$:/config/shortcuts-mac/underline": {
"title": "$:/config/shortcuts-mac/underline",
"text": "meta-U"
},
"$:/config/shortcuts-mac/new-image": {
"title": "$:/config/shortcuts-mac/new-image",
"text": "ctrl-I"
},
"$:/config/shortcuts-mac/new-journal": {
"title": "$:/config/shortcuts-mac/new-journal",
"text": "ctrl-J"
},
"$:/config/shortcuts-mac/new-tiddler": {
"title": "$:/config/shortcuts-mac/new-tiddler",
"text": "ctrl-N"
},
"$:/config/shortcuts-not-mac/bold": {
"title": "$:/config/shortcuts-not-mac/bold",
"text": "ctrl-B"
},
"$:/config/shortcuts-not-mac/italic": {
"title": "$:/config/shortcuts-not-mac/italic",
"text": "ctrl-I"
},
"$:/config/shortcuts-not-mac/underline": {
"title": "$:/config/shortcuts-not-mac/underline",
"text": "ctrl-U"
},
"$:/config/shortcuts-not-mac/new-image": {
"title": "$:/config/shortcuts-not-mac/new-image",
"text": "alt-I"
},
"$:/config/shortcuts-not-mac/new-journal": {
"title": "$:/config/shortcuts-not-mac/new-journal",
"text": "alt-J"
},
"$:/config/shortcuts-not-mac/new-tiddler": {
"title": "$:/config/shortcuts-not-mac/new-tiddler",
"text": "alt-N"
},
"$:/config/shortcuts/add-field": {
"title": "$:/config/shortcuts/add-field",
"text": "enter"
},
"$:/config/shortcuts/advanced-search": {
"title": "$:/config/shortcuts/advanced-search",
"text": "ctrl-shift-A"
},
"$:/config/shortcuts/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/config/shortcuts/excise": {
"title": "$:/config/shortcuts/excise",
"text": "ctrl-E"
},
"$:/config/shortcuts/sidebar-search": {
"title": "$:/config/shortcuts/sidebar-search",
"text": "ctrl-shift-F"
},
"$:/config/shortcuts/heading-1": {
"title": "$:/config/shortcuts/heading-1",
"text": "ctrl-1"
},
"$:/config/shortcuts/heading-2": {
"title": "$:/config/shortcuts/heading-2",
"text": "ctrl-2"
},
"$:/config/shortcuts/heading-3": {
"title": "$:/config/shortcuts/heading-3",
"text": "ctrl-3"
},
"$:/config/shortcuts/heading-4": {
"title": "$:/config/shortcuts/heading-4",
"text": "ctrl-4"
},
"$:/config/shortcuts/heading-5": {
"title": "$:/config/shortcuts/heading-5",
"text": "ctrl-5"
},
"$:/config/shortcuts/heading-6": {
"title": "$:/config/shortcuts/heading-6",
"text": "ctrl-6"
},
"$:/config/shortcuts/link": {
"title": "$:/config/shortcuts/link",
"text": "ctrl-L"
},
"$:/config/shortcuts/linkify": {
"title": "$:/config/shortcuts/linkify",
"text": "alt-shift-L"
},
"$:/config/shortcuts/list-bullet": {
"title": "$:/config/shortcuts/list-bullet",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/list-number": {
"title": "$:/config/shortcuts/list-number",
"text": "ctrl-shift-N"
},
"$:/config/shortcuts/mono-block": {
"title": "$:/config/shortcuts/mono-block",
"text": "ctrl-shift-M"
},
"$:/config/shortcuts/mono-line": {
"title": "$:/config/shortcuts/mono-line",
"text": "ctrl-M"
},
"$:/config/shortcuts/picture": {
"title": "$:/config/shortcuts/picture",
"text": "ctrl-shift-I"
},
"$:/config/shortcuts/preview": {
"title": "$:/config/shortcuts/preview",
"text": "alt-P"
},
"$:/config/shortcuts/quote": {
"title": "$:/config/shortcuts/quote",
"text": "ctrl-Q"
},
"$:/config/shortcuts/save-tiddler": {
"title": "$:/config/shortcuts/save-tiddler",
"text": "ctrl+enter"
},
"$:/config/shortcuts/stamp": {
"title": "$:/config/shortcuts/stamp",
"text": "ctrl-S"
},
"$:/config/shortcuts/strikethrough": {
"title": "$:/config/shortcuts/strikethrough",
"text": "ctrl-T"
},
"$:/config/shortcuts/subscript": {
"title": "$:/config/shortcuts/subscript",
"text": "ctrl-shift-B"
},
"$:/config/shortcuts/superscript": {
"title": "$:/config/shortcuts/superscript",
"text": "ctrl-shift-P"
},
"$:/config/shortcuts/toggle-sidebar": {
"title": "$:/config/shortcuts/toggle-sidebar",
"text": "alt-shift-S"
},
"$:/config/shortcuts/transcludify": {
"title": "$:/config/shortcuts/transcludify",
"text": "alt-shift-T"
},
"$:/config/ui/EditTemplate": {
"title": "$:/config/ui/EditTemplate",
"text": "$:/core/ui/EditTemplate"
},
"$:/config/ui/ViewTemplate": {
"title": "$:/config/ui/ViewTemplate",
"text": "$:/core/ui/ViewTemplate"
},
"$:/config/WikiParserRules/Inline/wikilink": {
"title": "$:/config/WikiParserRules/Inline/wikilink",
"text": "enable"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}\n><div class=\"tc-swatch\" style=<<swatchStyle>> title=<<colour>>/></$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/colour-picker": {
"title": "$:/core/macros/colour-picker",
"tags": "$:/tags/Macro",
"text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
},
"$:/core/macros/copy-to-clipboard": {
"title": "$:/core/macros/copy-to-clipboard",
"tags": "$:/tags/Macro",
"text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
},
"$:/core/macros/diff": {
"title": "$:/core/macros/diff",
"tags": "$:/tags/Macro",
"text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
},
"$:/core/macros/dumpvariables": {
"title": "$:/core/macros/dumpvariables",
"tags": "$:/tags/Macro",
"text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/image-picker": {
"title": "$:/core/macros/image-picker",
"created": "20170715180840889",
"modified": "20170715180914005",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n</$type$>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"text": "\\define add-tag-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n\\end\n\n\\define tag-button()\n<$button class=\"tc-btn-invisible\" tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<tag>>/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker-inner()\n\\whitespace trim\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$keyboard key=\"ENTER\" actions=<<add-tag-actions>>>\n<$edit-text tiddler=<<newTagNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/>\n</$keyboard>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<add-tag-actions>>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$set name=\"newTagName\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n<hr>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n\\end\n\\define tag-picker()\n\\whitespace trim\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=<<tag-picker-inner>>>\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<<tag-picker-inner>>\n</$set>\n</$list>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/thumbnails": {
"title": "$:/core/macros/thumbnails",
"tags": "$:/tags/Macro",
"text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
},
"$:/core/macros/timeline": {
"title": "$:/core/macros/timeline",
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/core/macros/translink": {
"title": "$:/core/macros/translink",
"tags": "$:/tags/Macro",
"text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tree": {
"title": "$:/core/macros/tree",
"tags": "$:/tags/Macro",
"text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/utils": {
"title": "$:/core/macros/utils",
"text": "\\define colour(colour)\n$colour$\n\\end\n"
},
"$:/snippets/minifocusswitcher": {
"title": "$:/snippets/minifocusswitcher",
"text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/snippets/peek-stylesheets": {
"title": "$:/snippets/peek-stylesheets",
"text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/AdvancedSearch/FilterButton": {
"title": "$:/tags/AdvancedSearch/FilterButton",
"list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/EditorToolbar": {
"title": "$:/tags/EditorToolbar",
"list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
},
"$:/tags/Manager/ItemMain": {
"title": "$:/tags/Manager/ItemMain",
"list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
},
"$:/tags/Manager/ItemSidebar": {
"title": "$:/tags/Manager/ItemSidebar",
"list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/PluginLibrary": {
"title": "$:/tags/PluginLibrary",
"list": "$:/config/OfficialPluginLibrary"
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/SideBarSegment": {
"title": "$:/tags/SideBarSegment",
"list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
}
}
}
\define exportButtonFilename(baseFilename)
$baseFilename$$(extension)$
\end
\define exportButton(exportFilter:"[!is[system]sort[title]]",lingoBase,baseFilename:"tiddlers")
<span class="tc-popup-keep">
<$button popup=<<qualify "$:/state/popup/export">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected">
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/export-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text={{$lingoBase$Caption}}/></span>
</$list>
</$button>
</span>
<$reveal state=<<qualify "$:/state/popup/export">> type="popup" position="below" animate="yes">
<div class="tc-drop-down">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Exporter]]">
<$set name="extension" value={{!!extension}}>
<$button class="tc-btn-invisible">
<$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter="""$exportFilter$""" filename=<<exportButtonFilename """$baseFilename$""">>/>
<$action-deletetiddler $tiddler=<<qualify "$:/state/popup/export">>/>
<$transclude field="description"/>
</$button>
</$set>
</$list>
</div>
</$reveal>
\end
\define list-links(filter,type:"ul",subtype:"li",class:"")
<$type$ class="$class$">
<$list filter="$filter$">
<$subtype$>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</$subtype$>
</$list>
</$type$>
\end
\define list-links-draggable-drop-actions()
<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
\end
\define list-links-draggable(tiddler,field:"list",type:"ul",subtype:"li",class:"",itemTemplate)
<$vars targetTiddler="""$tiddler$""" targetField="""$field$""">
<$type$ class="$class$">
<$list filter="[list[$tiddler$!!$field$]]">
<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""">
<div class="tc-droppable-placeholder">
</div>
<div>
<$link to={{!!title}}>
<$transclude tiddler="""$itemTemplate$""">
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$transclude>
</$link>
</div>
</$droppable>
</$list>
<$tiddler tiddler="">
<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""">
<div class="tc-droppable-placeholder">
</div>
<div>
</div>
</$droppable>
</$tiddler>
</$type$>
</$vars>
\end
\define list-tagged-draggable-drop-actions()
<!-- Save the current ordering of the tiddlers with this tag -->
<$set name="order" filter="[<tag>tagging[]]">
<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->
<$list filter="[<tag>tagging[]]">
<$action-deletefield $field="list-before"/>
<$action-deletefield $field="list-after"/>
</$list>
<!-- Assign the list field of the tag with the current ordering -->
<$action-setfield $tiddler=<<tag>> $field="list" $value=<<order>>/>
<!-- Add the newly inserted item to the list -->
<$action-listops $tiddler=<<tag>> $field="list" $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
<!-- Make sure the newly added item has the right tag -->
<$action-listops $tiddler=<<actionTiddler>> $tags="[<tag>]"/>
</$set>
\end
\define list-tagged-draggable(tag,itemTemplate,elementTag:"div")
<$set name="tag" value="""$tag$""">
<$list filter="[<tag>tagging[]]">
<$elementTag$ class="tc-menu-list-item">
<$droppable actions=<<list-tagged-draggable-drop-actions>>>
<$elementTag$ class="tc-droppable-placeholder">
</$elementTag$>
<$elementTag$>
<$transclude tiddler="""$itemTemplate$""">
<$link to={{!!title}}>
<$view field="title"/>
</$link>
</$transclude>
</$elementTag$>
</$droppable>
</$elementTag$>
</$list>
<$tiddler tiddler="">
<$droppable actions=<<list-tagged-draggable-drop-actions>>>
<$elementTag$ class="tc-droppable-placeholder">
</$elementTag$>
<$elementTag$ style="height:0.5em;">
</$elementTag$>
</$droppable>
</$tiddler>
</$set>
\end
<div class="tc-more-sidebar">
<<tabs "[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]" "$:/core/ui/MoreSideBar/Tags" "$:/state/tab/moresidebar" "tc-vertical">>
</div>
\define lingo-base() $:/language/CloseAll/
\define drop-actions()
<$action-listops $tiddler="$:/StoryList" $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
\end
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop">
<div style="position: relative;">
<$droppable actions=<<drop-actions>>>
<div class="tc-droppable-placeholder">
</div>
<div>
<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">×</$button> <$link to={{!!title}}><$view field="title"/></$link>
</div>
</$droppable>
</div>
</$list>
<$tiddler tiddler="">
<$droppable actions=<<drop-actions>>>
<div class="tc-droppable-placeholder">
</div>
<$button message="tm-close-all-tiddlers" class="tc-btn-invisible tc-btn-mini"><<lingo Button>></$button>
</$droppable>
</$tiddler>
<$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}}/>
\define lingo-base() $:/language/ControlPanel/
\define config-title()
$:/config/PageControlButtons/Visibility/$(listItem)$
\end
<<lingo Basics/Version/Prompt>> <<version>>
<$set name="tv-config-toolbar-icons" value="yes">
<$set name="tv-config-toolbar-text" value="yes">
<$set name="tv-config-toolbar-class" value="">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem">
<div style="position:relative;">
<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <$transclude tiddler=<<listItem>>/> <i class="tc-muted"><$transclude tiddler=<<listItem>> field="description"/></i>
</div>
</$list>
</$set>
</$set>
</$set>
[[Приветствую тебя, Путник!]]
<$button>
<$action-deletetiddler $filter="[tag[listbyschool]]"/>
<$action-deletetiddler $tiddler="Заклинания по Школам (Beta)"/>
Delete
</$button>
<$button>
Main Tiddler Creator
<$action-createtiddler $basetitle="Заклинания Воплощения (Beta)" text="""<evoc class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/evocation">></evoc>""" />
<$action-navigate $to="Заклинания Воплощения (Beta)"/>
</$button>
<$button>
Tiddler Creator
<$action-createtiddler $basetitle="$:/cantrip evocation" tags="$:/evocation" text= <<list-links filter:"[tag[cantrip]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/1lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[1lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/2lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[2lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/3lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[3lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/4lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[4lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/5lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[5lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/6lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[6lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/7lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[7lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/8lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[8lvl]tag[evoc]]">> />
<$action-createtiddler $basetitle="$:/9lvl evocation" tags="$:/evocation" text= <<list-links filter:"[tag[9lvl]tag[evoc]]">> />
</$button>
<$button>
toc-link disabler
<$action-setfield $tiddler="{{{ [tag[$:/Spells by class]!field:toc-link[no]] }}}" toc-link="no"/>
</$button>
<$button>
Caption insert
<$action-setfield $tiddler="$:/Spells by class" caption="Заклинания по Классу"/>
</$button>
<$fieldmangler tiddler={{{ [tag[cantrip]tag[evoc]!tag[$:/cantrip evocation]] }}}>
<$button>
Tagger cantrip <$action-sendmessage $message="tm-add-tag" $param="$:/cantrip evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[1lvl]tag[evoc]!tag[$:/1lvl evocation]] }}}>
<$button>
Tagger 1lvl <$action-sendmessage $message="tm-add-tag" $param="$:/1lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[2lvl]tag[evoc]!tag[$:/2lvl evocation]] }}}>
<$button>
Tagger 2lvl<$action-sendmessage $message="tm-add-tag" $param="$:/2lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[3lvl]tag[evoc]!tag[$:/3lvl evocation]] }}}>
<$button>
Tagger 3lvl<$action-sendmessage $message="tm-add-tag" $param="$:/3lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[4lvl]tag[evoc]!tag[$:/4lvl evocation]] }}}>
<$button>
Tagger 4lvl<$action-sendmessage $message="tm-add-tag" $param="$:/4lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[5lvl]tag[evoc]!tag[$:/5lvl evocation]] }}}>
<$button>
Tagger 5lvl<$action-sendmessage $message="tm-add-tag" $param="$:/5lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[6lvl]tag[evoc]!tag[$:/6lvl evocation]] }}}>
<$button>
Tagger 6lvl<$action-sendmessage $message="tm-add-tag" $param="$:/6lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[7lvl]tag[evoc]!tag[$:/7lvl evocation]] }}}>
<$button>
Tagger 7lvl<$action-sendmessage $message="tm-add-tag" $param="$:/7lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[8lvl]tag[evoc]!tag[$:/8lvl evocation]] }}}>
<$button>
Tagger 8lvl<$action-sendmessage $message="tm-add-tag" $param="$:/8lvl evocation"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[9lvl]tag[evoc]!tag[$:/9lvl evocation]] }}}>
<$button>
Tagger 9lvl<$action-sendmessage $message="tm-add-tag" $param="$:/9lvl evocation"/>
</$button>
</$fieldmangler>
<$button>
Delete
<$action-deletetiddler $filter="[tag[03. Предыстория]]"/>
</$button>
<div class="tc-table-of-contents">
<<toc-selective-expandable "DMG" "sort[order]">>
</div>
<ul class="">
<$list filter="[tag[$:/Druid 1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 6lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 7lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 8lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Druid 9lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
The following tiddlers were imported:
# [[01. Связывание приключений]]
# [[02. Ход кампании]]
# [[03. Постоянные расходы]]
# [[04. Деятельность во время простоя]]
<<list-links "[tag[task]sort[title]]">>
<<list-links "[tag[beta]sort[tag]]">>
\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]
\rules only filteredtranscludeinline transcludeinline macrocallinline
<div class="tc-remove-when-wiki-loaded">
<style scoped>
.tc-splash-text {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 16px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
margin: 20px auto 0;
width: 200px;
text-align: center;
color: <<colour foreground>>;
fill: <<colour foreground>>;
}
html body.tc-body {
background: <<colour page-background>>;
}
</style>
<div class="tc-splash-text">
Открываем книгу заклинаний...
</div>
<div class="tc-splash-text">
<img src="https://cdn.edu.buncee.com/assets/abbde3e5bc174eb59c55d4b2f278ec48/animation-library-magicbookp-022120.gif" width="200"/>
</div>
</div>
<$button>
<$action-createtiddler $basetitle="Заклинания Прорицания (Beta)" text="""<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "listbyschool">></div>""" />
<$action-navigate $to="Заклинания по Прорицания (Beta)"/>
Main Tiddler Creator
</$button>
\define NavMacro(GoTo:"GoTo" Name:"Name")
<$button>
<$action-navigate $to="$GoTo$"/>
$Name$
</$button>
\end
<<NavMacro "TiddlerName""ButtonName">>
<div class="tc-table-of-contents">
<<toc-selective-expandable '$:/opener' 'sort[order]'>>
</div>
Таг главы <$edit-text tiddler="$:/OrderEditor" field="a"/>
Номер <$edit-text tiddler="$:/OrderEditor" field="b"/>
<$button>
<$action-setfield $tiddler={{{ [tag{$:/OrderEditor!!a}!field:check[1]] }}} $field="order" $value={{$:/OrderEditor!!b}}/>
<$action-deletefield $tiddler={{{ [tag{$:/OrderEditor!!a}!field:check[1]] }}} list/>
<$action-setfield $tiddler={{{ [tag{$:/OrderEditor!!a}!field:check[1]] }}} $field="check" $value="1"/>
order number
</$button>
<$button>
<$action-deletefield $tiddler={{{ [tag{$:/OrderEditor!!a}field:check[1]] }}} check/>
check delete
</$button>
<ul class="">
<$list filter="[tag[$:/Paladin 1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Paladin 2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Paladin 3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Paladin 4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Paladin 5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'PHB' 'sort[order]'>>
</div>
{
"tiddlers": {
"$:/config/EditorTypeMappings/application/javascript": {
"title": "$:/config/EditorTypeMappings/application/javascript",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/json": {
"title": "$:/config/EditorTypeMappings/application/json",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/x-tiddler-dictionary": {
"title": "$:/config/EditorTypeMappings/application/x-tiddler-dictionary",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/css": {
"title": "$:/config/EditorTypeMappings/text/css",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/html": {
"title": "$:/config/EditorTypeMappings/text/html",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/plain": {
"title": "$:/config/EditorTypeMappings/text/plain",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-markdown": {
"title": "$:/config/EditorTypeMappings/text/x-markdown",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/x-tiddlywiki",
"text": "codemirror"
},
"$:/config/codemirror/cursorBlinkRate": {
"title": "$:/config/codemirror/cursorBlinkRate",
"type": "integer",
"text": "530"
},
"$:/config/codemirror/extraKeysTW": {
"title": "$:/config/codemirror/extraKeysTW",
"extend": "extraKeys",
"type": "json",
"text": "{\n\t\"Ctrl-Esc\": \"singleSelection\",\n\t\"Esc\": \"\",\n\t\"Ctrl-S\": \"\",\n\t\"Ctrl-U\": \"\",\n\t\"Ctrl-T\": \"\",\n\t\"Alt-T\": \"transposeChars\",\n\t\"Alt-U\": \"undoSelection\",\n\t\"Shift-Alt-U\": \"redoSelection\",\n\t\"Cmd-U\": \"\",\n\t\"Tab\": \"indentAuto()\",\n\t\"Enter\": \"newLineAndIndent()\"\n}\n"
},
"$:/config/codemirror/indentUnit": {
"title": "$:/config/codemirror/indentUnit",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/indentWithTabs": {
"title": "$:/config/codemirror/indentWithTabs",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/inputStyle": {
"title": "$:/config/codemirror/inputStyle",
"type": "string",
"text": "textarea"
},
"$:/config/codemirror/keyMap": {
"title": "$:/config/codemirror/keyMap",
"type": "string",
"text": "default"
},
"$:/config/codemirror/lineNumbers": {
"title": "$:/config/codemirror/lineNumbers",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/lineWrapping": {
"title": "$:/config/codemirror/lineWrapping",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/showCursorWhenSelecting": {
"title": "$:/config/codemirror/showCursorWhenSelecting",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/smartIndent": {
"title": "$:/config/codemirror/smartIndent",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/styleActiveLine": {
"title": "$:/config/codemirror/styleActiveLine",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/tabSize": {
"title": "$:/config/codemirror/tabSize",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/theme": {
"title": "$:/config/codemirror/theme",
"type": "string",
"text": "default"
},
"$:/language/codemirror/homeUrl": {
"title": "$:/language/codemirror/homeUrl",
"text": "http://codemirror.net"
},
"$:/language/codemirror/addOnUrl": {
"title": "$:/language/codemirror/addOnUrl",
"text": "http://codemirror.net/doc/manual.html#addons"
},
"$:/language/codemirror/configUrl": {
"title": "$:/language/codemirror/configUrl",
"text": "http://codemirror.net/doc/manual.html#config"
},
"$:/language/codemirror/controlPanel/hint": {
"title": "$:/language/codemirror/controlPanel/hint",
"text": "These settings let you customise the behaviour of [[CodeMirror|$:/plugins/tiddlywiki/codemirror]]."
},
"$:/language/codemirror/controlPanel/usage": {
"title": "$:/language/codemirror/controlPanel/usage",
"text": "Usage information"
},
"$:/language/codemirror/editorFont/hint": {
"title": "$:/language/codemirror/editorFont/hint",
"text": "Editor font family"
},
"$:/language/codemirror/editorFont/info": {
"title": "$:/language/codemirror/editorFont/info",
"text": "Set the font family for the ~CodeMirror text-editor"
},
"$:/language/codemirror/controlPanel/keyboard": {
"title": "$:/language/codemirror/controlPanel/keyboard",
"text": "Keyboard shortcuts"
},
"$:/language/codemirror/keyMap/hint": {
"title": "$:/language/codemirror/keyMap/hint",
"text": "~CodeMirror keymap"
},
"$:/language/codemirror/keyMap/info": {
"title": "$:/language/codemirror/keyMap/info",
"text": "~The Keyboard KeyMap used within the ~CodeMirror text-editor"
},
"$:/language/codemirror/lineNumbers/hint": {
"title": "$:/language/codemirror/lineNumbers/hint",
"text": "Enable line numbers"
},
"$:/language/codemirror/lineNumbers/info": {
"title": "$:/language/codemirror/lineNumbers/info",
"text": "Whether to show line numbers to the left of the editor."
},
"$:/language/codemirror/lineWrapping/hint": {
"title": "$:/language/codemirror/lineWrapping/hint",
"text": "Enable line wrapping"
},
"$:/language/codemirror/lineWrapping/info": {
"title": "$:/language/codemirror/lineWrapping/info",
"text": "Whether CodeMirror should scroll or wrap for long lines. Defaults to `false` (scroll)."
},
"$:/language/codemirror/showCursorWhenSelecting/hint": {
"title": "$:/language/codemirror/showCursorWhenSelecting/hint",
"text": "Show cursor, when selecting"
},
"$:/language/codemirror/showCursorWhenSelecting/info": {
"title": "$:/language/codemirror/showCursorWhenSelecting/info",
"text": "Whether the cursor should be drawn when a selection is active."
},
"$:/language/codemirror/styleActiveLine/hint": {
"title": "$:/language/codemirror/styleActiveLine/hint",
"text": "Highlight active line"
},
"$:/language/codemirror/styleActiveLine/info": {
"title": "$:/language/codemirror/styleActiveLine/info",
"text": "Whether or not to highlight the active text-editor line"
},
"$:/language/codemirror/theme/hint": {
"title": "$:/language/codemirror/theme/hint",
"text": "Select a theme"
},
"$:/language/codemirror/theme/info": {
"title": "$:/language/codemirror/theme/info",
"text": "Choose between ~CodeMirror themes"
},
"$:/plugins/tiddlywiki/codemirror/edit-codemirror.js": {
"title": "$:/plugins/tiddlywiki/codemirror/edit-codemirror.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/edit-codemirror.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-codemirror widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tCodeMirrorEngine = require(\"$:/plugins/tiddlywiki/codemirror/engine.js\").CodeMirrorEngine;\n\nexports[\"edit-codemirror\"] = editTextWidgetFactory(CodeMirrorEngine,CodeMirrorEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/codemirror/engine.js": {
"title": "$:/plugins/tiddlywiki/codemirror/engine.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/engine.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a CodeMirror instance\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CODEMIRROR_OPTIONS = \"$:/config/CodeMirror\",\nHEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\",\nCONFIG_FILTER = \"[all[shadows+tiddlers]prefix[$:/config/codemirror/]]\"\n\t\n// Install CodeMirror\nif($tw.browser && !window.CodeMirror) {\n\n\tvar modules = $tw.modules.types[\"codemirror\"];\n\tvar req = Object.getOwnPropertyNames(modules);\n\n\twindow.CodeMirror = require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js\");\n\t// Install required CodeMirror plugins\n\tif(req) {\n\t\tif($tw.utils.isArray(req)) {\n\t\t\tfor(var index=0; index<req.length; index++) {\n\t\t\t\trequire(req[index]);\n\t\t\t}\n\t\t} else {\n\t\t\trequire(req);\n\t\t}\n\t}\n}\n\nfunction getCmConfig() {\n\tvar type,\n\t\ttest,\n\t\tvalue,\n\t\telement,\n\t\textend,\n\t\ttiddler,\n\t\tconfig = {},\n\t\tconfigTiddlers = $tw.wiki.filterTiddlers(CONFIG_FILTER);\n\n\tif ($tw.utils.isArray(configTiddlers)) {\n\t\tfor (var i=0; i<configTiddlers.length; i++) {\n\t\t\ttiddler = $tw.wiki.getTiddler(configTiddlers[i]);\n\t\t\t\tif (tiddler) {\n\t\t\t\telement = configTiddlers[i].replace(/\\$:\\/config\\/codemirror\\//ig,\"\");\n\t\t\t\t\ttype = (tiddler.fields.type) ? tiddler.fields.type.trim().toLocaleLowerCase() : \"string\";\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase \"bool\":\n\t\t\t\t\ttest = tiddler.fields.text.trim().toLowerCase();\n\t\t\t\t\tvalue = (test === \"true\") ? true : false;\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\tvalue = tiddler.fields.text.trim();\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"integer\":\n\t\t\t\t\tvalue = parseInt(tiddler.fields.text.trim(), 10);\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"json\":\n\t\t\t\t\tvalue = JSON.parse(tiddler.fields.text.trim());\n\t\t\t\t\t\textend = (tiddler.fields.extend) ? tiddler.fields.extend : element;\n\n\t\t\t\t\tif (config[extend]) {\n\t\t\t\t\t\t$tw.utils.extend(config[extend], value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig[extend] = value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn config;\n}\n\nfunction CodeMirrorEngine(options) {\n\n\t// Save our options\n\tvar self = this;\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create the wrapper DIV\n\tthis.domNode = this.widget.document.createElement(\"div\");\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tthis.domNode.style.display = \"inline-block\";\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\t\n\t// Set all cm-plugin defaults\n\t// Get the configuration options for the CodeMirror object\n\tvar config = getCmConfig();\n\n\tconfig.mode = options.type;\n\tconfig.value = options.value;\n\tif(this.widget.editTabIndex) {\n\t\tconfig[\"tabindex\"] = this.widget.editTabIndex;\n\t}\n\t// Create the CodeMirror instance\n\tthis.cm = window.CodeMirror(function(cmDomNode) {\n\t\t// Note that this is a synchronous callback that is called before the constructor returns\n\t\tif(!self.widget.document.isTiddlyWikiFakeDom) {\n\t\t\tself.domNode.appendChild(cmDomNode);\n\t\t}\n\t},config);\n\n\t// Set up a change event handler\n\tthis.cm.on(\"change\",function() {\n\t\tself.widget.saveChanges(self.getText());\n\t});\n\tthis.cm.on(\"drop\",function(cm,event) {\n\t\tevent.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event\n\t\treturn false;\n\t});\n\tthis.cm.on(\"keydown\",function(cm,event) {\n\t\treturn self.widget.handleKeydownEvent.call(self.widget,event);\n\t});\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nCodeMirrorEngine.prototype.setText = function(text,type) {\n\tvar self = this;\n\tself.cm.setOption(\"mode\",type);\n\tif(!this.cm.hasFocus()) {\n\t\tthis.cm.setValue(text);\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nCodeMirrorEngine.prototype.getText = function() {\n\treturn this.cm.getValue();\n};\n\n/*\nFix the height of textarea to fit content\n*/\nCodeMirrorEngine.prototype.fixHeight = function() {\n\tif(this.widget.editAutoHeight) {\n\t\t// Resize to fit\n\t\tthis.cm.setSize(null,null);\n\t} else {\n\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\tthis.cm.setSize(null,fixedHeight);\n\t}\n};\n\n/*\nFocus the engine node\n*/\nCodeMirrorEngine.prototype.focus = function() {\n\tthis.cm.focus();\n}\n\n/*\nCreate a blank structure representing a text operation\n*/\nCodeMirrorEngine.prototype.createTextOperation = function() {\n\tvar selections = this.cm.listSelections();\n\tif(selections.length > 0) {\n\t\tvar anchorPos = this.cm.indexFromPos(selections[0].anchor),\n\t\theadPos = this.cm.indexFromPos(selections[0].head);\n\t}\n\tvar operation = {\n\t\ttext: this.cm.getValue(),\n\t\tselStart: Math.min(anchorPos,headPos),\n\t\tselEnd: Math.max(anchorPos,headPos),\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nCodeMirrorEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tthis.cm.replaceRange(operation.replacement,this.cm.posFromIndex(operation.cutStart),this.cm.posFromIndex(operation.cutEnd));\n\t\tthis.cm.setSelection(this.cm.posFromIndex(operation.newSelStart),this.cm.posFromIndex(operation.newSelEnd));\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t}\n\tthis.cm.focus();\n\treturn newText;\n};\n\nexports.CodeMirrorEngine = CodeMirrorEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){\"use strict\";var e=navigator.userAgent,t=navigator.platform,r=/gecko\\/\\d/i.test(e),n=/MSIE \\d/.test(e),i=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(e),o=/Edge\\/(\\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\\//.test(e),u=a&&/Qt\\/\\d+\\.\\d+/.test(e),c=!o&&/Chrome\\//.test(e),h=/Opera\\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\\/\\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\\bCrOS\\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\\/(\\d*\\.\\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp(\"(^|\\\\s)\"+e+\"(?:$|\\\\s)\\\\s*\")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:\"\")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),\"string\"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute(\"role\",\"presentation\"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?\" \":\"\")+t)}function F(e,t){for(var r=e.split(\" \"),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=\" \"+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd(\"character\",r),n.moveStart(\"character\",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function z(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function I(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\\s\\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf(\"\\t\",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null};function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var G=30,U={toString:function(){return\"CodeMirror.Pass\"}},V={scroll:!1},K={origin:\"*mouse\"},j={origin:\"+move\"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf(\"\\t\",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[\"\"];function _(e){for(;Y.length<=e;)Y.push(q(Y)+\" \");return Y[e]}function q(e){return e[e.length-1]}function $(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&z(t,r),r}var J=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;function ee(e){return/\\w/.test(e)||e>\"\"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf(\"\\\\w\")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}function se(e,t){if((t-=e.first)<0||t>=e.size)throw new Error(\"There is no line \"+(t+e.first)+\" in the document.\");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function ae(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function ue(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function ce(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function he(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function fe(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function de(e,t){return t>=e.first&&t<e.first+e.size}function pe(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function ge(e,t,r){if(void 0===r&&(r=null),!(this instanceof ge))return new ge(e,t,r);this.line=e,this.ch=t,this.sticky=r}function ve(e,t){return e.line-t.line||e.ch-t.ch}function me(e,t){return e.sticky==t.sticky&&0==ve(e,t)}function ye(e){return ge(e.line,e.ch)}function be(e,t){return ve(e,t)<0?t:e}function we(e,t){return ve(e,t)<0?e:t}function xe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function Ce(e,t){if(t.line<e.first)return ge(e.first,0);var r,n,i,o=e.first+e.size-1;return t.line>o?ge(o,se(e,o).text.length):(r=t,n=se(e,t.line).text.length,null==(i=r.ch)||i>n?ge(r.line,n):i<0?ge(r.line,0):r)}function Se(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=Ce(e,t[n]);return r}var Le=!1,ke=!1;function Te(e,t,r){this.marker=e,this.from=t,this.to=r}function Me(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function Ne(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Oe(e,t){if(t.full)return null;var r=de(e,t.from.line)&&se(e,t.from.line).markedSpans,n=de(e,t.to.line)&&se(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==ve(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&\"bookmark\"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new Te(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&\"bookmark\"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new Te(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=q(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Me(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Me(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Ae(s)),a&&a!=s&&(a=Ae(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new Te(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Ae(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function De(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function We(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function He(e){return e.inclusiveLeft?-1:0}function Fe(e){return e.inclusiveRight?1:0}function Pe(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=ve(n.from,i.from)||He(e)-He(t);if(o)return-o;var l=ve(n.to,i.to)||Fe(e)-Fe(t);return l||t.id-e.id}function Ee(e,t){var r,n=ke&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Pe(r,i.marker)<0)&&(r=i.marker);return r}function ze(e){return Ee(e,!0)}function Ie(e){return Ee(e,!1)}function Re(e,t,r,n,i){var o=se(e,t),l=ke&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=ve(u.from,r)||He(a.marker)-He(i),h=ve(u.to,n)||Fe(a.marker)-Fe(i);if(!(c>=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.to,r)>=0:ve(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.from,n)<=0:ve(u.from,n)<0)))return!0}}}function Be(e){for(var t;t=ze(e);)e=t.find(-1,!0).line;return e}function Ge(e,t){var r=se(e,t),n=Be(r);return r==n?t:he(n)}function Ue(e,t){if(t>e.lastLine())return t;var r,n=se(e,t);if(!Ve(e,n))return t;for(;r=Ie(n);)n=r.find(1,!0).line;return he(n)+1}function Ve(e,t){var r=ke&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ke(e,t,n))return!0}}function Ke(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ke(e,n.line,Me(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ke(e,t,i))return!0}function je(e){for(var t=0,r=(e=Be(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Xe(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=ze(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Ie(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function Ye(e){var t=e.display,r=e.doc;t.maxLine=se(r,r.first),t.maxLineLength=Xe(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Xe(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var _e=null;function qe(e,t,r){var n;_e=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&\"before\"==r?n=i:_e=i),o.from==t&&(o.from!=o.to&&\"before\"!=r?n=i:_e=i)}return null!=n?n:_e}var $e=function(){var e=\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\",t=\"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";var r=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c=\"ltr\"==u?\"L\":\"R\";if(0==a.length||\"ltr\"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?\"R\":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?\"r\":8192<=h&&h<=8203?\"w\":8204==h?\"b\":\"L\");for(var g=0,v=c;g<f;++g){var m=d[g];\"m\"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];\"1\"==w&&\"r\"==b?d[y]=\"n\":i.test(w)&&(b=w,\"r\"==w&&(d[y]=\"R\"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];\"+\"==S&&\"1\"==C&&\"1\"==d[x+1]?d[x]=\"1\":\",\"!=S||C!=d[x+1]||\"1\"!=C&&\"n\"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(\",\"==k)d[L]=\"N\";else if(\"%\"==k){var T=void 0;for(T=L+1;T<f&&\"%\"==d[T];++T);for(var M=L&&\"!\"==d[L-1]||T<f&&\"1\"==d[T]?\"1\":\"N\",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];\"L\"==A&&\"1\"==D?d[O]=\"L\":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F=\"L\"==(W?d[W-1]:c),P=F==(\"L\"==(H<f?d[H]:c))?F?\"L\":\"R\":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var z,I=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);I.push(new s(0,B,R))}else{var G=R,U=I.length;for(++R;R<f&&\"L\"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&I.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);I.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&I.splice(U,0,new s(1,G,R))}return\"ltr\"==u&&(1==I[0].level&&(z=a.match(/^\\s+/))&&(I[0].from=z[0].length,I.unshift(new s(0,0,z[0].length))),1==q(I).level&&(z=a.match(/\\s+$/))&&(q(I).to-=z[0].length,I.push(new s(0,f-z[0].length,f)))),\"rtl\"==u?I.reverse():I}}();function Ze(e,t){var r=e.order;return null==r&&(r=e.order=$e(e.text,t)),r}var Qe=[],Je=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent(\"on\"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||Qe).concat(r)}};function et(e,t){return e._handlers&&e._handlers[t]||Qe}function tt(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent(\"on\"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function rt(e,t){var r=et(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function nt(e,t,r){return\"string\"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),rt(e,r||t.type,e,t),ut(t)||t.codemirrorIgnore}function it(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ot(e,t){return et(e,t).length>0}function lt(e){e.prototype.on=function(e,t){Je(this,e,t)},e.prototype.off=function(e,t){tt(this,e,t)}}function st(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function at(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function ut(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function ct(e){st(e),at(e)}function ht(e){return e.target||e.srcElement}function ft(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var dt,pt,gt=function(){if(l&&s<9)return!1;var e=O(\"div\");return\"draggable\"in e||\"dragDrop\"in e}();function vt(e){if(null==dt){var t=O(\"span\",\"\");N(e,O(\"span\",[t,document.createTextNode(\"x\")])),0!=e.firstChild.offsetHeight&&(dt=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=dt?O(\"span\",\"\"):O(\"span\",\" \",null,\"display: inline-block; width: 1px; margin-right: -1px\");return r.setAttribute(\"cm-text\",\"\"),r}function mt(e){if(null!=pt)return pt;var t=N(e,document.createTextNode(\"AخA\")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(pt=n.right-r.right<3)}var yt,bt=3!=\"\\n\\nb\".split(/\\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf(\"\\n\",t);-1==i&&(i=e.length);var o=e.slice(t,\"\\r\"==e.charAt(i-1)?i-1:i),l=o.indexOf(\"\\r\");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\\r\\n?|\\n/)},wt=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints(\"StartToEnd\",t)},xt=\"oncopy\"in(yt=O(\"div\"))||(yt.setAttribute(\"oncopy\",\"return;\"),\"function\"==typeof yt.oncopy),Ct=null;var St={},Lt={};function kt(e){if(\"string\"==typeof e&&Lt.hasOwnProperty(e))e=Lt[e];else if(e&&\"string\"==typeof e.name&&Lt.hasOwnProperty(e.name)){var t=Lt[e.name];\"string\"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(e))return kt(\"application/xml\");if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(e))return kt(\"application/json\")}return\"string\"==typeof e?{name:e}:e||{name:\"null\"}}function Tt(e,t){t=kt(t);var r=St[t.name];if(!r)return Tt(e,\"text/plain\");var n=r(e,t);if(Mt.hasOwnProperty(t.name)){var i=Mt[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n[\"_\"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Mt={};function Nt(e,t){z(t,Mt.hasOwnProperty(e)?Mt[e]:Mt[e]={})}function Ot(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function At(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Dt(e,t,r){return!e.startState||e.startState(t,r)}var Wt=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};Wt.prototype.eol=function(){return this.pos>=this.string.length},Wt.prototype.sol=function(){return this.pos==this.lineStart},Wt.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Wt.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Wt.prototype.eat=function(e){var t=this.string.charAt(this.pos);if(\"string\"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},Wt.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Wt.prototype.eatSpace=function(){for(var e=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Wt.prototype.skipToEnd=function(){this.pos=this.string.length},Wt.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Wt.prototype.backUp=function(e){this.pos-=e},Wt.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=I(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.indentation=function(){return I(this.string,null,this.tabSize)-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.match=function(e,t,r){if(\"string\"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Wt.prototype.current=function(){return this.string.slice(this.start,this.pos)},Wt.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Wt.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Wt.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var Ht=function(e,t){this.state=e,this.lookAhead=t},Ft=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function Pt(e,t,r,n){var i=[e.state.modeGen],o={};Kt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,Kt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,\"overlay \"+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+\" \":\"\")+\"overlay \"+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Et(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=zt(e,he(t)),i=t.text.length>e.options.maxHighlightLength&&Ot(e.doc.mode,n.state),o=Pt(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function zt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new Ft(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=se(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof Ht?u.lookAhead:0)<=o.modeFrontier))return s;var c=I(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&se(n,o-1).stateAfter,s=l?Ft.fromSaved(n,l,o):new Ft(n,Dt(n.mode),o);return n.iter(o,t,function(r){It(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function It(e,t,r,n){var i=e.doc.mode,o=new Wt(t,e.options.tabSize,r);for(o.start=o.pos=n||0,\"\"==t&&Rt(i,r.state);!o.eol();)Bt(i,o,r.state),o.start=o.pos}function Rt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=At(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function Bt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=At(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error(\"Mode \"+e.name+\" failed to advance stream.\")}Ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,\"\"),size:this.baseTokens[this.baseTokenPos]-e}},Ft.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Ft.fromSaved=function(e,t,r){return t instanceof Ht?new Ft(e,Ot(e.mode,t.state),r,t.lookAhead):new Ft(e,Ot(e.mode,t),r)},Ft.prototype.save=function(e){var t=!1!==e?Ot(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new Ht(t,this.maxLookAhead):t};var Gt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function Ut(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=se(l,(t=Ce(l,t)).line),u=zt(e,t.line,r),c=new Wt(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Bt(s,c,u.state),n&&o.push(new Gt(c,i,Ot(l.mode,u.state)));return n?o:new Gt(c,i,u.state)}function Vt(e,t){if(e)for(;;){var r=e.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?\"bgClass\":\"textClass\";null==t[n]?t[n]=r[2]:new RegExp(\"(?:^|s)\"+r[2]+\"(?:$|s)\").test(t[n])||(t[n]+=\" \"+r[2])}return e}function Kt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new Wt(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(\"\"==t&&Vt(Rt(r,n.state),o);!h.eol();){if(h.pos>e.options.maxHighlightLength?(s=!1,l&&It(e,t,n,h.pos),h.pos=t.length,a=null):a=Vt(Bt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a=\"m-\"+(a?d+\" \"+a:d))}if(!s||c!=a){for(;u<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var jt=function(e,t,r){this.text=e,We(this,t),this.height=r?r(this):1};jt.prototype.lineNo=function(){return he(this)},lt(jt);var Xt={},Yt={};function _t(e,t){if(!e||/^\\s*$/.test(e))return null;var r=t.addModeClass?Yt:Xt;return r[e]||(r[e]=e.replace(/\\S+/g,\"cm-$&\"))}function qt(e,t){var r=A(\"span\",null,null,a?\"padding-right: .1px\":null),n={pre:A(\"pre\",[r],\"CodeMirror-line\"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(l||a)&&e.getOption(\"lineWrapping\")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,s=void 0;n.pos=0,n.addToken=Zt,mt(e.display.measure)&&(s=Ze(o,e.doc.direction))&&(n.addToken=Qt(n.addToken,s)),n.map=[],er(o,n,Et(e,o,t!=e.display.externalMeasured&&he(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||\"\")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||\"\"))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(vt(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var u=n.content.lastChild;(/\\bcm-tab\\b/.test(u.className)||u.querySelector&&u.querySelector(\".cm-tab\"))&&(n.content.className=\"cm-tab-wrap-hack\")}return rt(e,\"renderLine\",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||\"\")),n}function $t(e){var t=O(\"span\",\"•\",\"cm-invalidchar\");return t.title=\"\\\\u\"+e.charCodeAt(0).toString(16),t.setAttribute(\"aria-label\",t.title),t}function Zt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n=\"\",i=0;i<e.length;i++){var o=e.charAt(i);\" \"!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=\" \"),n+=o,r=\" \"==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O(\"span\",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if(\"\\t\"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O(\"span\",_(b),\"cm-tab\"))).setAttribute(\"role\",\"presentation\"),m.setAttribute(\"cm-text\",\"\\t\"),e.col+=b}else\"\\r\"==p[0]||\"\\n\"==p[0]?((m=u.appendChild(O(\"span\",\"\\r\"==p[0]?\"␍\":\"\",\"cm-invalidchar\"))).setAttribute(\"cm-text\",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute(\"cm-text\",p[0]),l&&s<9?u.appendChild(O(\"span\",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||a){var w=r||\"\";n&&(w+=n),i&&(w+=i);var x=O(\"span\",[u],w,a);return o&&(x.title=o),e.content.appendChild(x)}e.content.appendChild(u)}}function Qt(e,t){return function(r,n,i,o,l,s,a){i=i?i+\" cm-force-border\":\"cm-force-border\";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function Jt(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement(\"span\"))),i.setAttribute(\"cm-marker\",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function er(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v=\"\",m=0;;){if(m==p){a=u=c=h=s=\"\",f=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;\"bookmark\"==C.type&&x.from==p&&C.widgetNode?y.push(C):x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)?(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=\"\"),C.className&&(a+=\" \"+C.className),C.css&&(s=(s?s+\";\":\"\")+C.css),C.startStyle&&x.from==p&&(c+=\" \"+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&!h&&(h=C.title),C.collapsed&&(!f||Pe(f.marker,C)<0)&&(f=x)):x.from>p&&m>x.from&&(m=x.from)}if(b)for(var S=0;S<b.length;S+=2)b[S+1]==m&&(u+=\" \"+b[S]);if(!f||f.from==p)for(var L=0;L<y.length;++L)Jt(t,0,y[L]);if(f&&(f.from||0)==p){if(Jt(t,(null==f.to?d+1:f.to)-p,f.marker,null==f.from),null==f.to)return;f.to==p&&(f=!1)}}if(p>=d)break;for(var k=Math.min(d,m);;){if(v){var T=p+v.length;if(!f){var M=T>k?v.slice(0,k-p):v;t.addToken(t,M,l?l+a:a,c,p+M.length==m?u:\"\",h,s)}if(T>=k){v=v.slice(k-p),p=k;break}p=T,c=\"\"}v=i.slice(o,o=r[g++]),l=_t(r[g++],t.cm.options)}}else for(var N=1;N<r.length;N+=2)t.addToken(t,i.slice(o,o=r[N]),_t(r[N+1],t.cm.options))}function tr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Ie(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?he(q(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Ve(e,t)}function rr(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new tr(e.doc,se(e.doc,o),o);n=o+l.size,i.push(l)}return i}var nr=null;var ir=null;function or(e,t){var r=et(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);nr?n=nr.delayedCallbacks:ir?n=ir:(n=ir=[],setTimeout(lr,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function lr(){var e=ir;ir=null;for(var t=0;t<e.length;++t)e[t]()}function sr(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];\"text\"==o?cr(e,t):\"gutter\"==o?fr(e,t,r,n):\"class\"==o?hr(e,t):\"widget\"==o&&dr(e,t,n)}t.changes=null}function ar(e){return e.node==e.text&&(e.node=O(\"div\",null,null,\"position: relative\"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function ur(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):qt(e,t)}function cr(e,t){var r=t.text.className,n=ur(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,hr(e,t)):r&&(t.text.className=r)}function hr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+\" \"+(t.line.bgClass||\"\"):t.line.bgClass;if(r&&(r+=\" CodeMirror-linebackground\"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=ar(t);t.background=n.insertBefore(O(\"div\",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?ar(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className=\"\");var r=t.textClass?t.textClass+\" \"+(t.line.textClass||\"\"):t.line.textClass;t.text.className=r||\"\"}function fr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=ar(t);t.gutterBackground=O(\"div\",null,\"CodeMirror-gutter-background \"+t.line.gutterClass,\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px; width: \"+n.gutterTotalWidth+\"px\"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=ar(t),s=t.gutter=O(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px\");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=\" \"+t.line.gutterClass),!e.options.lineNumbers||o&&o[\"CodeMirror-linenumbers\"]||(t.lineNumber=s.appendChild(O(\"div\",pe(e.options,r),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+e.display.lineNumInnerWidth+\"px\"))),o)for(var a=0;a<e.options.gutters.length;++a){var u=e.options.gutters[a],c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O(\"div\",[c],\"CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[u]+\"px; width: \"+n.gutterWidth[u]+\"px\"))}}}function dr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,\"CodeMirror-linewidget\"==n.className&&t.node.removeChild(n);pr(e,t,r)}function pr(e,t,r){if(gr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)gr(e,t.rest[n],t,r,!1)}function gr(e,t,r,n,i){if(t.widgets)for(var o=ar(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O(\"div\",[a.node],\"CodeMirror-linewidget\");a.handleMouseEvents||u.setAttribute(\"cm-ignore-events\",\"true\"),vr(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),or(a,\"redraw\")}}function vr(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+\"px\",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+\"px\"),t.style.width=i+\"px\"}e.coverGutter&&(t.style.zIndex=5,t.style.position=\"relative\",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+\"px\"))}function mr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r=\"position: relative;\";e.coverGutter&&(r+=\"margin-left: -\"+t.display.gutters.offsetWidth+\"px;\"),e.noHScroll&&(r+=\"width: \"+t.display.wrapper.clientWidth+\"px;\"),N(t.display.measure,O(\"div\",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function yr(e,t){for(var r=ht(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&\"true\"==r.getAttribute(\"cm-ignore-events\")||r.parentNode==e.sizer&&r!=e.mover)return!0}function br(e){return e.lineSpace.offsetTop}function wr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function xr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O(\"pre\",\"x\")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function Cr(e){return G-e.display.nativeBarWidth}function Sr(e){return e.display.scroller.clientWidth-Cr(e)-e.display.barWidth}function Lr(e){return e.display.scroller.clientHeight-Cr(e)-e.display.barHeight}function kr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(he(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Tr(e,t,r,n){return Or(e,Nr(e,t),r,n)}function Mr(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[on(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Nr(e,t){var r=he(t),n=Mr(e,r);n&&!n.text?n=null:n&&n.changes&&(sr(e,n,r,Jr(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=he(t=Be(t)),n=e.display.externalMeasured=new tr(e.doc,t,r);n.lineN=r;var i=n.built=qt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=kr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Or(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||\"\");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Sr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Wr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Hr(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h=\"right\"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ct)return Ct;var t=N(e,O(\"span\",\"x\")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Ct=Math.abs(r.left-n.left)>1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n=\"right\"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d[\"right\"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+Qr(e.display),top:p.top,bottom:p.bottom}:Dr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:(\"right\"==h?i.right:i.left)-t.rect.left,right:(\"left\"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Ar,Dr={left:0,right:0,top:0,bottom:0};function Wr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l=\"left\"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,t>=a&&(l=\"right\")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?\"left\":\"right\")&&(l=r),\"left\"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l=\"left\";if(\"right\"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l=\"right\";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Hr(e,t){var r=Dr;if(\"left\"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Fr(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fr(e.display.view[t])}function Er(e){Pr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function zr(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Ir(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Rr(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=mr(e.widgets[r]));return t}function Br(e,t,r,n,i){if(!i){var o=Rr(t);r.top+=o,r.bottom+=o}if(\"line\"==n)return r;n||(n=\"local\");var l=je(t);if(\"local\"==n?l+=br(e.display):l-=e.display.viewOffset,\"page\"==n||\"window\"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+(\"window\"==n?0:Ir());var a=s.left+(\"window\"==n?0:zr());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Gr(e,t,r){if(\"div\"==r)return t;var n=t.left,i=t.top;if(\"page\"==r)n-=zr(),i-=Ir();else if(\"local\"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function Ur(e,t,r,n,i){return n||(n=se(e.doc,t.line)),Br(e,n,Tr(e,n,t.ch,i),r)}function Vr(e,t,r,n,i,o){function l(t,l){var s=Or(e,i,t,l?\"right\":\"left\",o);return l?s.left=s.right:s.right=s.left,Br(e,n,s,r)}n=n||se(e.doc,t.line),i||(i=Nr(e,n));var s=Ze(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=n.text.length?(a=n.text.length,u=\"before\"):a<=0&&(a=0,u=\"after\"),!s)return l(\"before\"==u?a-1:a,\"before\"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=qe(s,a,u),f=_e,d=c(a,h,\"before\"==u);return null!=f&&(d.other=c(a,f,\"before\"!=u)),d}function Kr(e,t){var r=0;t=Ce(e.doc,t),e.options.lineWrapping||(r=Qr(e.display)*t.ch);var n=se(e.doc,t.line),i=je(n)+br(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function jr(e,t,r,n,i){var o=ge(e,t,r);return o.xRel=i,n&&(o.outside=!0),o}function Xr(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return jr(n.first,0,null,!0,-1);var i=fe(n,r),o=n.first+n.size-1;if(i>o)return jr(n.first+n.size-1,se(n,o).text.length,null,!0,1);t<0&&(t=0);for(var l=se(n,i);;){var s=$r(e,l,i,t,r),a=Ie(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=he(l=u.to.line)}}function Yr(e,t,r,n){n-=Rr(t);var i=t.text.length,o=le(function(t){return Or(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Or(e,r,t).top>n},o,i)}}function _r(e,t,r,n){return r||(r=Nr(e,t)),Yr(e,t,r,Br(e,t,Or(e,r,n),\"line\").top)}function qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function $r(e,t,r,n,i){i-=je(t);var o=Nr(e,t),l=Rr(t),s=0,a=t.text.length,u=!0,c=Ze(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=Yr(e,t,n,l),a=s.begin,u=s.end;/\\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f<i.length;f++){var d=i[f];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=Or(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return qr(Vr(e,ge(r,u?a.to:a.from,u?\"before\":\"after\"),\"line\",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Vr(e,ge(r,u?a.from:a.to,u?\"after\":\"before\"),\"line\",t,n);qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Or(e,o,t);return r.top+=l,r.bottom+=l,!!qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?\"after\":\"before\",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?\"after\":v==t.text.length?\"before\":Or(e,o,v-(u?1:0)).bottom+l<=i==u?\"after\":\"before\";var w=Vr(e,ge(r,v,d),\"line\",t,o);f=w.left,m=i<w.top||i>=w.bottom}return jr(r,v=oe(t.text,v,1),d,m,n-f)}function Zr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Ar){Ar=O(\"pre\");for(var t=0;t<49;++t)Ar.appendChild(document.createTextNode(\"x\")),Ar.appendChild(O(\"br\"));Ar.appendChild(document.createTextNode(\"x\"))}N(e.measure,Ar);var r=Ar.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function Qr(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O(\"span\",\"xxxxxxxxxx\"),r=O(\"pre\",[t]);N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function Jr(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)r[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,n[e.options.gutters[l]]=o.clientWidth;return{fixedPos:en(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function en(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function tn(e){var t=Zr(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/Qr(e.display)-3);return function(i){if(Ve(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function rn(e){var t=e.doc,r=tn(e);t.iter(function(e){var t=r(e);t!=e.height&&ce(e,t)})}function nn(e,t,r,n){var i=e.display;if(!r&&\"true\"==ht(t).getAttribute(\"cm-not-content\"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=Xr(e,o,l);if(n&&1==u.xRel&&(a=se(e.doc,u.line).text).length==u.ch){var c=I(a,a.length,e.options.tabSize)-a.length;u=ge(u.line,Math.max(0,Math.round((o-xr(e.display).left)/Qr(e.display))-c))}return u}function on(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function ln(e){e.display.input.showSelection(e.display.input.prepareSelection())}function sn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&an(e,s.head,i),a||cn(e,s,o)}}return n}function an(e,t,r){var n=Vr(e,t,\"div\",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor\"));if(i.style.left=n.left+\"px\",i.style.top=n.top+\"px\",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+\"px\",n.other){var o=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor CodeMirror-secondarycursor\"));o.style.display=\"\",o.style.left=n.other.left+\"px\",o.style.top=n.other.top+\"px\",o.style.height=.85*(n.other.bottom-n.other.top)+\"px\"}}function un(e,t){return e.top-t.top||e.left-t.left}function cn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=xr(e.display),s=l.left,a=Math.max(n.sizerWidth,Sr(e)-n.sizer.offsetLeft)-l.right,u=\"ltr\"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+e+\"px;\\n top: \"+t+\"px; width: \"+(null==r?a-e:r)+\"px;\\n height: \"+(n-t)+\"px\"))}function h(t,r,n){var o,l,h=se(i,t),f=h.text.length;function d(r,n){return Ur(e,ge(t,r),\"div\",h,n)}function p(t,r,n){var i=_r(e,h,null,t),o=\"ltr\"==r==(\"after\"==n)?\"left\":\"right\";return d(\"after\"==n?i.begin:i.end-(/\\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=Ze(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,\"ltr\",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?\"rtl\":\"ltr\",o),i=!0)}i||n(t,r,\"ltr\")}(g,r||0,null==n?f:n,function(e,t,i,h){var v=\"ltr\"==i,m=d(e,v?\"left\":\"right\"),y=d(t-1,v?\"right\":\"left\"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,\"before\"),N=u?s:p(t,i,\"after\"),O=u&&w&&C?a:y.right):(T=u?p(e,i,\"before\"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,\"after\"):a),c(T,m.top,M-T,m.bottom),m.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||un(m,o)<0)&&(o=m),un(y,o)<0&&(o=y),(!l||un(m,l)<0)&&(l=m),un(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=se(i,f.line),g=se(i,d.line),v=Be(p)==Be(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function hn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility=\"\",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?\"\":\"hidden\"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility=\"hidden\")}}function fn(e){e.state.focused||(e.display.input.focus(),pn(e))}function dn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,gn(e))},100)}function pn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),\"nocursor\"!=e.options.readOnly&&(e.state.focused||(rt(e,\"focus\",e,t),e.state.focused=!0,H(e.display.wrapper,\"CodeMirror-focused\"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),hn(e))}function gn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(rt(e,\"blur\",e,t),e.state.focused=!1,T(e.display.wrapper,\"CodeMirror-focused\")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function vn(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=void 0;if(!i.hidden){if(l&&s<8){var a=i.node.offsetTop+i.node.offsetHeight;o=a-r,r=a}else{var u=i.node.getBoundingClientRect();o=u.bottom-u.top}var c=i.line.height-o;if(o<2&&(o=Zr(t)),(c>.005||c<-.005)&&(ce(i.line,o),mn(i.line),i.rest))for(var h=0;h<i.rest.length;h++)mn(i.rest[h])}}}function mn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function yn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-br(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=fe(t,n),l=fe(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=fe(t,je(se(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=fe(t,je(se(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function bn(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=en(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+\"px\",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+\"px\")}}function wn(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=pe(e.options,t.first+t.size-1),n=e.display;if(r.length!=n.lineNumChars){var i=n.measure.appendChild(O(\"div\",[O(\"div\",r)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return n.lineGutter.style.width=\"\",n.lineNumInnerWidth=Math.max(o,n.lineGutter.offsetWidth-l)+1,n.lineNumWidth=n.lineNumInnerWidth+l,n.lineNumChars=n.lineNumInnerWidth?r.length:-1,n.lineGutter.style.width=n.lineNumWidth+\"px\",oi(e),!0}return!1}function xn(e,t){var r=e.display,n=Zr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Lr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+wr(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Sr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Cn(e,t){null!=t&&(kn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sn(e){kn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ln(e,t,r){null==t&&null==r||kn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function kn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tn(e,Kr(e,t.from),Kr(e,t.to),t.margin))}function Tn(e,t,r,n){var i=xn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});Ln(e,i.scrollLeft,i.scrollTop)}function Mn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||ii(e,{top:t}),Nn(e,t,!0),r&&ii(e),Jn(e,100))}function Nn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function On(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,bn(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function An(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+wr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Cr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var Dn=function(e,t,r){this.cm=r;var n=this.vert=O(\"div\",[O(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),i=this.horiz=O(\"div\",[O(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");e(n),e(i),Je(n,\"scroll\",function(){n.clientHeight&&t(n.scrollTop,\"vertical\")}),Je(i,\"scroll\",function(){i.clientWidth&&t(i.scrollLeft,\"horizontal\")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")};Dn.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display=\"block\",this.vert.style.bottom=t?n+\"px\":\"0\";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+\"px\"}else this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\";if(t){this.horiz.style.display=\"block\",this.horiz.style.right=r?n+\"px\":\"0\",this.horiz.style.left=e.barLeft+\"px\";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+\"px\"}else this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},Dn.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,\"horiz\")},Dn.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,\"vert\")},Dn.prototype.zeroWidthHack=function(){var e=y&&!d?\"12px\":\"18px\";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents=\"none\",this.disableHoriz=new R,this.disableVert=new R},Dn.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents=\"auto\",t.set(1e3,function n(){var i=e.getBoundingClientRect();(\"vert\"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents=\"none\":t.set(1e3,n)})},Dn.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Wn=function(){};function Hn(e,t){t||(t=An(e));var r=e.display.barWidth,n=e.display.barHeight;Fn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&vn(e),Fn(e,An(e)),r=e.display.barWidth,n=e.display.barHeight}function Fn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+\"px\",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+\"px\",r.heightForcer.style.borderBottom=n.bottom+\"px solid transparent\",n.right&&n.bottom?(r.scrollbarFiller.style.display=\"block\",r.scrollbarFiller.style.height=n.bottom+\"px\",r.scrollbarFiller.style.width=n.right+\"px\"):r.scrollbarFiller.style.display=\"\",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display=\"block\",r.gutterFiller.style.height=n.bottom+\"px\",r.gutterFiller.style.width=t.gutterWidth+\"px\"):r.gutterFiller.style.display=\"\"}Wn.prototype.update=function(){return{bottom:0,right:0}},Wn.prototype.setScrollLeft=function(){},Wn.prototype.setScrollTop=function(){},Wn.prototype.clear=function(){};var Pn={native:Dn,null:Wn};function En(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Pn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Je(t,\"mousedown\",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute(\"cm-not-content\",\"true\")},function(t,r){\"horizontal\"==r?On(e,t):Mn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var zn=0;function In(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++zn},t=e.curOp,nr?nr.ops.push(t):t.ownsGroup=nr={ops:[t],delayedCallbacks:[]}}function Rn(e){!function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{nr=null,t(r)}}(e.curOp,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Bn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ri(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Gn(t[o]);for(var l=0;l<t.length;l++)Un(t[l]);for(var s=0;s<t.length;s++)Vn(t[s])}(e)})}function Bn(e){var t,r,n=e.cm,i=n.display;!(r=(t=n).display).scrollbarsClipped&&r.scroller.offsetWidth&&(r.nativeBarWidth=r.scroller.offsetWidth-r.scroller.clientWidth,r.heightForcer.style.height=Cr(t)+\"px\",r.sizer.style.marginBottom=-r.nativeBarWidth+\"px\",r.sizer.style.borderRightWidth=Cr(t)+\"px\",r.scrollbarsClipped=!0),e.updateMaxLine&&Ye(n),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<i.viewFrom||e.scrollToPos.to.line>=i.viewTo)||i.maxLineChanged&&n.options.lineWrapping,e.update=e.mustUpdate&&new ti(n,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Gn(e){var t=e.cm,r=t.display;e.updatedDisplay&&vn(t),e.barMeasure=An(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Tr(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Cr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Sr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function Un(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<t.doc.scrollLeft&&On(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Hn(t,e.barMeasure),e.updatedDisplay&&li(t,e.barMeasure),e.selectionChanged&&hn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&fn(e.cm)}function Vn(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ni(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Nn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&On(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!nt(e,\"scrollCursorIntoView\")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O(\"div\",\"\",null,\"position: absolute;\\n top: \"+(t.top-r.viewOffset-br(e.display))+\"px;\\n height: \"+(t.bottom-t.top+Cr(e)+r.barHeight)+\"px;\\n left: \"+t.left+\"px; width: \"+Math.max(2,t.right-t.left)+\"px;\");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r=\"before\"==(t=t.ch?ge(t.line,\"before\"==t.sticky?t.ch-1:t.ch,\"after\"):t).sticky?ge(t.line,t.ch+1,\"before\"):t);for(var o=0;o<5;o++){var l=!1,s=Vr(e,t),a=r&&r!=t?Vr(e,r):s,u=xn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(On(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,Ce(n,e.scrollToPos.from),Ce(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||rt(i[l],\"hide\");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&rt(o[s],\"unhide\");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&rt(t,\"changes\",t,e.changeObjs),e.update&&e.update.finish()}function Kn(e,t){if(e.curOp)return t();In(e);try{return t()}finally{Rn(e)}}function jn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);In(e);try{return t.apply(e,arguments)}finally{Rn(e)}}}function Xn(e){return function(){if(this.curOp)return e.apply(this,arguments);In(this);try{return e.apply(this,arguments)}finally{Rn(this)}}}function Yn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);In(t);try{return e.apply(this,arguments)}finally{Rn(t)}}}function _n(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)ke&&Ge(e.doc,t)<i.viewTo&&$n(e);else if(r<=i.viewFrom)ke&&Ue(e.doc,r+n)>i.viewFrom?$n(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)$n(e);else if(t<=i.viewFrom){var o=Zn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):$n(e)}else if(r>=i.viewTo){var l=Zn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):$n(e)}else{var s=Zn(e,t,t,-1),a=Zn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(rr(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):$n(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function qn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[on(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function $n(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Zn(e,t,r,n){var i,o=on(e,t),l=e.display.view;if(!ke||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Ge(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function Qn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function Jn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ei,e))}function ei(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=zt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ot(t.mode,n.state):null,a=Pt(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&It(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return Jn(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&Kn(e,function(){for(var t=0;t<i.length;t++)qn(e,i[t],\"text\")})}}var ti=function(e,t,r){var n=e.display;this.viewport=t,this.visible=yn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Sr(e),this.force=r,this.dims=Jr(e),this.events=[]};function ri(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return $n(e),!1;if(!t.force&&t.visible.from>=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==Qn(e))return!1;wn(e)&&($n(e),t.dims=Jr(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),ke&&(o=Ge(e.doc,o),l=Ue(e.doc,l));var s,u,c,h,f=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;u=o,c=l,0==(h=(s=e).display).view.length||u>=h.viewTo||c<=h.viewFrom?(h.view=rr(s,u,c),h.viewFrom=u):(h.viewFrom>u?h.view=rr(s,u,h.viewFrom).concat(h.view):h.viewFrom<u&&(h.view=h.view.slice(on(s,u))),h.viewFrom=u,h.viewTo<c?h.view=h.view.concat(rr(s,h.viewTo,c)):h.viewTo>c&&(h.view=h.view.slice(0,on(s,c)))),h.viewTo=c,r.viewOffset=je(se(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+\"px\";var d=Qn(e);if(!f&&0==d&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var p=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return d>4&&(r.lineDiv.style.display=\"none\"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display=\"none\":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,\"gutter\")>-1&&(d=!1),sr(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(pe(e.options,c)))),l=f.node.nextSibling}else{var p=(m=c,b=r,void 0,w=ur(g=e,v=f),v.text=v.node=w.pre,w.bgClass&&(v.bgClass=w.bgClass),w.textClass&&(v.textClass=w.textClass),hr(g,v),fr(g,v,m,b),pr(g,v,b),v.node);o.insertBefore(p,l)}c+=f.size}var g,v,m,b,w;for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),d>4&&(r.lineDiv.style.display=\"\"),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(p),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,f&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,Jn(e,400)),r.updateLineNumbers=null,!0}function ni(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Sr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+wr(e.display)-Lr(e),r.top)}),t.visible=yn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ri(e,t);n=!1){vn(e);var i=An(e);ln(e),Hn(e,i),li(e,i),t.force=!1}t.signal(e,\"update\",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,\"viewportChange\",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function ii(e,t){var r=new ti(e,t);if(ri(e,r)){vn(e),ni(e,r);var n=An(e);ln(e),Hn(e,n),li(e,n),r.finish()}}function oi(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+\"px\"}function li(e,t){e.display.sizer.style.minHeight=t.docHeight+\"px\",e.display.heightForcer.style.top=t.docHeight+\"px\",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Cr(e)+\"px\"}function si(e){var t=e.display.gutters,r=e.options.gutters;M(t);for(var n=0;n<r.length;++n){var i=r[n],o=t.appendChild(O(\"div\",null,\"CodeMirror-gutter \"+i));\"CodeMirror-linenumbers\"==i&&(e.display.lineGutter=o,o.style.width=(e.display.lineNumWidth||1)+\"px\")}t.style.display=n?\"\":\"none\",oi(e)}function ai(e){var t=B(e.gutters,\"CodeMirror-linenumbers\");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat([\"CodeMirror-linenumbers\"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}ti.prototype.signal=function(e,t){ot(e,t)&&this.events.push(arguments)},ti.prototype.finish=function(){for(var e=0;e<this.events.length;e++)rt.apply(null,this.events[e])};var ui=0,ci=null;function hi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function fi(e){var t=hi(e);return t.x*=ci,t.y*=ci,t}function di(e,t){var n=hi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.scrollWidth>s.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p<d.length;p++)if(d[p].node==f){e.display.currentWheelTarget=f;break e}if(i&&!r&&!h&&null!=ci)return o&&c&&Mn(e,Math.max(0,s.scrollTop+o*ci)),On(e,Math.max(0,s.scrollLeft+i*ci)),(!o||o&&c)&&st(t),void(l.wheelStartX=null);if(o&&null!=ci){var g=o*ci,v=e.doc.scrollTop,m=v+l.wrapper.clientHeight;g<0?v=Math.max(0,v+g-50):m=Math.min(e.doc.height,m+g+50),ii(e,{top:v,bottom:m})}ui<20&&(null==l.wheelStartX?(l.wheelStartX=s.scrollLeft,l.wheelStartY=s.scrollTop,l.wheelDX=i,l.wheelDY=o,setTimeout(function(){if(null!=l.wheelStartX){var e=s.scrollLeft-l.wheelStartX,t=s.scrollTop-l.wheelStartY,r=t&&l.wheelDY&&t/l.wheelDY||e&&l.wheelDX&&e/l.wheelDX;l.wheelStartX=l.wheelStartY=null,r&&(ci=(ci*ui+r)/(ui+1),++ui)}},200)):(l.wheelDX+=i,l.wheelDY+=o))}}l?ci=-.53:r?ci=15:c?ci=-.7:f&&(ci=-1/3);var pi=function(e,t){this.ranges=e,this.primIndex=t};pi.prototype.primary=function(){return this.ranges[this.primIndex]},pi.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var r=this.ranges[t],n=e.ranges[t];if(!me(r.anchor,n.anchor)||!me(r.head,n.head))return!1}return!0},pi.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new gi(ye(this.ranges[t].anchor),ye(this.ranges[t].head));return new pi(e,this.primIndex)},pi.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},pi.prototype.contains=function(e,t){t||(t=e);for(var r=0;r<this.ranges.length;r++){var n=this.ranges[r];if(ve(t,n.from())>=0&&ve(e,n.to())<=0)return r}return-1};var gi=function(e,t){this.anchor=e,this.head=t};function vi(e,t){var r=e[t];e.sort(function(e,t){return ve(e.from(),t.from())}),t=B(e,r);for(var n=1;n<e.length;n++){var i=e[n],o=e[n-1];if(ve(o.to(),i.from())>=0){var l=we(o.from(),i.from()),s=be(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;n<=t&&--t,e.splice(--n,2,new gi(a?s:l,a?l:s))}}return new pi(e,t)}function mi(e,t){return new pi([new gi(e,t||e)],0)}function yi(e){return e.text?ge(e.from.line+e.text.length-1,q(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function bi(e,t){if(ve(e,t.from)<0)return e;if(ve(e,t.to)<=0)return yi(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=yi(t).ch-t.to.ch),ge(r,n)}function wi(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new gi(bi(i.anchor,t),bi(i.head,t)))}return vi(r,e.sel.primIndex)}function xi(e,t,r){return e.line==t.line?ge(r.line,e.ch-t.ch+r.ch):ge(r.line+(e.line-t.line),e.ch)}function Ci(e){e.doc.mode=Tt(e.options,e.doc.modeOption),Si(e)}function Si(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Jn(e,100),e.state.modeGen++,e.curOp&&_n(e)}function Li(e,t){return 0==t.from.ch&&0==t.to.ch&&\"\"==q(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function ki(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){!function(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),De(e),We(e,r);var i=n?n(e):1;i!=e.height&&ce(e,i)}(e,r,i,n),or(e,\"change\",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new jt(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=se(e,s.line),h=se(e,a.line),f=q(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Li(e,t)){var g=l(0,u.length-1);o(h,h.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==h)if(1==u.length)o(c,c.text.slice(0,s.ch)+f+c.text.slice(a.ch),d);else{var v=l(1,u.length-1);v.push(new jt(f+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,v)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+h.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(h,f+h.text.slice(a.ch),d);var m=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}or(e,\"change\",e,t)}function Ti(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked.length;++l){var s=n.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),e(s.doc,n,a))}}}(e,null,!0)}function Mi(e,t){if(t.cm)throw new Error(\"This document is already in use.\");e.doc=t,t.cm=e,rn(e),Ci(e),Ni(e),e.options.lineWrapping||Ye(e),e.options.mode=t.modeOption,_n(e)}function Ni(e){(\"rtl\"==e.doc.direction?H:T)(e.display.lineDiv,\"CodeMirror-rtl\")}function Oi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Ai(e,t){var r={from:ye(t.from),to:yi(t),text:ae(e,t.from,t.to)};return Pi(e,r,t.from.line,t.to.line+1),Ti(e,function(e){return Pi(e,r,t.from.line,t.to.line+1)},!0),r}function Di(e){for(;e.length;){if(!q(e).ranges)break;e.pop()}}function Wi(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&(\"+\"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||\"*\"==t.origin.charAt(0)))&&(s=i,o=i.lastOp==n?(Di(s.done),q(s.done)):s.done.length&&!q(s.done).ranges?q(s.done):s.done.length>1&&!s.done[s.done.length-2].ranges?(s.done.pop(),q(s.done)):void 0))l=q(o.changes),0==ve(t.from,t.to)&&0==ve(t.from,l.to)?l.to=yi(t):o.changes.push(Ai(e,t));else{var u=q(i.done);for(u&&u.ranges||Fi(e.sel,i.done),o={changes:[Ai(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||rt(e,\"historyAdded\")}function Hi(e,t,r,n){var i,o,l,s,a,u=e.history,c=n&&n.origin;r==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=q(u.done),s=t,\"*\"==(a=o.charAt(0))||\"+\"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Fi(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=r,n&&!1!==n.clearRedo&&Di(u.undone)}function Fi(e,t){var r=q(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Pi(e,t,r,n){var i=t[\"spans_\"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t[\"spans_\"+e.id]={}))[o]=r.markedSpans),++o})}function Ei(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function zi(e,t){var r=function(e,t){var r=t[\"spans_\"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(Ei(r[i]));return n}(e,t),n=Oe(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function Ii(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?pi.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\\d+)$/))&&B(t,Number(c[1]))>-1&&(q(s)[h]=u[h],delete u[h])}}}return n}function Ri(e,t,r,n){if(n){var i=e.anchor;if(r){var o=ve(t,i)<0;o!=ve(r,i)<0?(i=t,t=r):o!=ve(t,r)<0&&(t=r)}return new gi(i,t)}return new gi(r||t,t)}function Bi(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),ji(e,new pi([Ri(e.sel.primary(),t,r,i)],0),n)}function Gi(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=Ri(e.sel.ranges[o],t[o],null,i);ji(e,vi(n,e.sel.primIndex),r)}function Ui(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,ji(e,vi(i,e.sel.primIndex),n)}function Vi(e,t,r,n){ji(e,mi(t,r),n)}function Ki(e,t,r){var n=e.history.done,i=q(n);i&&i.ranges?(n[n.length-1]=t,Xi(e,t,r)):ji(e,t,r)}function ji(e,t,r){Xi(e,t,r),Hi(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function Xi(e,t,r){var n,i,o,l;(ot(e,\"beforeSelectionChange\")||e.cm&&ot(e.cm,\"beforeSelectionChange\"))&&(n=e,o=r,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new gi(Ce(n,e[t].anchor),Ce(n,e[t].head))},origin:o&&o.origin},rt(n,\"beforeSelectionChange\",n,l),n.cm&&rt(n.cm,\"beforeSelectionChange\",n.cm,l),t=l.ranges!=i.ranges?vi(l.ranges,l.ranges.length-1):i),Yi(e,qi(e,t,r&&r.bias||(ve(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||Sn(e.cm)}function Yi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,it(e.cm)),or(e,\"cursorActivity\",e))}function _i(e){Yi(e,qi(e,e.sel,null,!1))}function qi(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Zi(e,l.anchor,s&&s.anchor,r,n),u=Zi(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new gi(a,u))}return i?vi(i,t.primIndex):t}function $i(e,t,r,n,i){var o=se(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker;if((null==s.from||(a.inclusiveLeft?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(a.inclusiveRight?s.to>=t.ch:s.to>t.ch))){if(i&&(rt(a,\"beforeCursorEnter\"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var u=a.find(n<0?1:-1),c=void 0;if((n<0?a.inclusiveRight:a.inclusiveLeft)&&(u=Qi(e,u,-n,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=ve(u,r))&&(n<0?c<0:c>0))return $i(e,u,t,n,i)}var h=a.find(n<0?-1:1);return(n<0?a.inclusiveLeft:a.inclusiveRight)&&(h=Qi(e,h,n,h.line==t.line?o:null)),h?$i(e,h,t,n,i):null}}return t}function Zi(e,t,r,n,i){var o=n||1,l=$i(e,t,r,o,i)||!i&&$i(e,t,r,o,!0)||$i(e,t,r,-o,i)||!i&&$i(e,t,r,-o,!0);return l||(e.cantEdit=!0,ge(e.first,0))}function Qi(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?Ce(e,ge(t.line-1)):null:r>0&&t.ch==(n||se(e,t.line)).text.length?t.line<e.first+e.size-1?ge(t.line+1,0):null:new ge(t.line,t.ch+r)}function Ji(e){e.setSelection(ge(e.firstLine(),0),ge(e.lastLine()),V)}function eo(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=Ce(e,t)),r&&(n.to=Ce(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),rt(e,\"beforeChange\",e,n),e.cm&&rt(e.cm,\"beforeChange\",e.cm,n),n.canceled?null:{from:n.from,to:n.to,text:n.text,origin:n.origin}}function to(e,t,r){if(e.cm){if(!e.cm.curOp)return jn(e.cm,to)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"))||(t=eo(e,t,!0))){var n=Le&&!r&&function(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=B(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(ve(u.to,s.from)<0||ve(u.from,s.to)>0)){var c=[a,1],h=ve(u.from,s.from),f=ve(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)ro(e,{from:n[i].from,to:n[i].to,text:i?[\"\"]:t.text,origin:t.origin});else ro(e,t)}}function ro(e,t){if(1!=t.text.length||\"\"!=t.text[0]||0!=ve(t.from,t.to)){var r=wi(e,t);Wi(e,t,r,e.cm?e.cm.curOp.id:NaN),oo(e,t,r,Oe(e,t));var n=[];Ti(e,function(e,r){r||-1!=B(n,e.history)||(uo(e.history,t),n.push(e.history)),oo(e,t,null,Oe(e,t))})}}function no(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s=\"undo\"==t?o.done:o.undone,a=\"undo\"==t?o.undone:o.done,u=0;u<s.length&&(i=s[u],r?!i.ranges||i.equals(e.sel):i.ranges);u++);if(u!=s.length){for(o.lastOrigin=o.lastSelOrigin=null;;){if(!(i=s.pop()).ranges){if(n)return void s.push(i);break}if(Fi(i,a),r&&!i.equals(e.sel))return void ji(e,i,{clearRedo:!1});l=i}var c=[];Fi(l,a),a.push({changes:c,generation:o.generation}),o.generation=i.generation||++o.maxGeneration;for(var h=ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"),f=function(r){var n=i.changes[r];if(n.origin=t,h&&!eo(e,n,!1))return s.length=0,{};c.push(Ai(e,n));var o=r?wi(e,n):q(s);oo(e,n,o,zi(e,n)),!r&&e.cm&&e.cm.scrollIntoView({from:n.from,to:yi(n)});var l=[];Ti(e,function(e,t){t||-1!=B(l,e.history)||(uo(e.history,n),l.push(e.history)),oo(e,n,null,zi(e,n))})},d=i.changes.length-1;d>=0;--d){var p=f(d);if(p)return p.v}}}}function io(e,t){if(0!=t&&(e.first+=t,e.sel=new pi($(e.sel.ranges,function(e){return new gi(ge(e.anchor.line+t,e.anchor.ch),ge(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){_n(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)qn(e.cm,n,\"gutter\")}}function oo(e,t,r,n){if(e.cm&&!e.cm.curOp)return jn(e.cm,oo)(e,t,r,n);if(t.to.line<e.first)io(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);io(e,i),t={from:ge(e.first,0),to:ge(t.to.line+i,t.to.ch),text:[q(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:ge(o,se(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ae(e,t.from,t.to),r||(r=wi(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=he(Be(se(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&it(e);ki(n,t,r,tn(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Xe(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=se(e,n).stateAfter;if(i&&(!(i instanceof Ht)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}})(n,o.line),Jn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?_n(e):o.line!=l.line||1!=t.text.length||Li(e.doc,t)?_n(e,o.line,l.line+1,u):qn(e,o.line,\"text\");var c=ot(e,\"changes\"),h=ot(e,\"change\");if(h||c){var f={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};h&&or(e,\"change\",e,f),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(f)}e.display.selForContextMenu=null}(e.cm,t,n):ki(e,t,n),Xi(e,r,V)}}function lo(e,t,r,n,i){var o;(n||(n=r),ve(n,r)<0)&&(r=(o=[n,r])[0],n=o[1]);\"string\"==typeof t&&(t=e.splitLines(t)),to(e,{from:r,to:n,text:t,origin:i})}function so(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function ao(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)so(o.ranges[s].anchor,t,r,n),so(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=ge(u.from.line+n,u.from.ch),u.to=ge(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function uo(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;ao(e.done,r,n,i),ao(e.undone,r,n,i)}function co(e,t,r,n){var i=t,o=t;return\"number\"==typeof t?o=se(e,xe(e,t)):i=he(t),null==i?null:(n(o,i)&&e.cm&&qn(e.cm,i,r),o)}function ho(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;++r)e[r].parent=this,t+=e[r].height;this.height=t}function fo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i=e[n];t+=i.chunkSize(),r+=i.height,i.parent=this}this.size=t,this.height=r,this.parent=null}gi.prototype.from=function(){return we(this.anchor,this.head)},gi.prototype.to=function(){return be(this.anchor,this.head)},gi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},ho.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r,n=e,i=e+t;n<i;++n){var o=this.lines[n];this.height-=o.height,(r=o).parent=null,De(r),or(o,\"delete\")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;n<t.length;++n)t[n].parent=this},iterN:function(e,t,r){for(var n=e+t;e<n;++e)if(r(this.lines[e]))return!0}},fo.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;r<this.children.length;++r){var n=this.children[r],i=n.chunkSize();if(e<i){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ho))){var s=[];this.collapse(s),this.children=[new ho(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,r){this.size+=t.length,this.height+=r;for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new ho(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++n,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new fo(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var r=B(e.parent.children,e);e.parent.children.splice(r+1,0,t)}else{var n=new fo(e.children);n.parent=e,e.children=[n,t],e=n}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var po=function(e,t,r){if(r)for(var n in r)r.hasOwnProperty(n)&&(this[n]=r[n]);this.doc=e,this.node=t};function go(e,t,r){je(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cn(e,r)}po.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,r=this.line,n=he(r);if(null!=n&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(r.widgets=null);var o=mr(this);ce(r,Math.max(0,r.height-o)),e&&(Kn(e,function(){go(e,r,-o),qn(e,n,\"widget\")}),or(e,\"lineWidgetCleared\",e,this,n))}},po.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=mr(this)-t;i&&(ce(n,n.height+i),r&&Kn(r,function(){r.curOp.forceUpdate=!0,go(r,n,i),or(r,\"lineWidgetChanged\",r,e,he(n))}))},lt(po);var vo=0,mo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++vo};function yo(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=z(n)).shared=!1;var o=[yo(e,t,r,n,i)],l=o[0],s=n.widgetNode;return Ti(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(yo(e,Ce(e,t),Ce(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=q(o)}),new bo(o,l)}(e,t,r,n,i);if(e.cm&&!e.cm.curOp)return jn(e.cm,yo)(e,t,r,n,i);var o=new mo(e,i),l=ve(t,r);if(n&&z(n,o,!1),l>0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A(\"span\",[o.replacedWith],\"CodeMirror-widget\"),n.handleMouseEvents||o.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Re(e,t.line,t,r,o)||t.line!=r.line&&Re(e,r.line,t,r,o))throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");ke=!0}o.addToHistory&&Wi(e,{from:t,to:r,origin:\"markText\"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){var n,i;u&&o.collapsed&&!u.options.lineWrapping&&Be(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&ce(e,0),n=e,i=new Te(o,a==t.line?t.ch:null,a==r.line?r.ch:null),n.markedSpans=n.markedSpans?n.markedSpans.concat([i]):[i],i.marker.attachLine(n),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Ve(e,t)&&ce(t,0)}),o.clearOnEnter&&Je(o,\"beforeCursorEnter\",function(){return o.clear()}),o.readOnly&&(Le=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++vo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)_n(u,t.line,r.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var c=t.line;c<=r.line;c++)qn(u,c,\"text\");o.atomic&&_i(u.doc),or(u,\"markerAdded\",u,o)}return o}mo.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){var t=this.doc.cm,r=t&&!t.curOp;if(r&&In(t),ot(this,\"clear\")){var n=this.find();n&&or(this,\"clear\",n.from,n.to)}for(var i=null,o=null,l=0;l<this.lines.length;++l){var s=e.lines[l],a=Me(s.markedSpans,e);t&&!e.collapsed?qn(t,he(s),\"text\"):t&&(null!=a.to&&(o=he(s)),null!=a.from&&(i=he(s))),s.markedSpans=Ne(s.markedSpans,a),null==a.from&&e.collapsed&&!Ve(e.doc,s)&&t&&ce(s,Zr(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var u=0;u<this.lines.length;++u){var c=Be(e.lines[u]),h=Xe(c);h>t.display.maxLineLength&&(t.display.maxLine=c,t.display.maxLineLength=h,t.display.maxLineChanged=!0)}null!=i&&t&&this.collapsed&&_n(t,i,o+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&_i(t.doc)),t&&or(t,\"markerCleared\",t,this,i,o),r&&Rn(t),this.parent&&this.parent.clear()}},mo.prototype.find=function(e,t){var r,n;null==e&&\"bookmark\"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Me(o.markedSpans,this);if(null!=l.from&&(r=ge(t?o:he(o),l.from),-1==e))return r;if(null!=l.to&&(n=ge(t?o:he(o),l.to),1==e))return n}return r&&{from:r,to:n}},mo.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&Kn(n,function(){var i=t.line,o=he(t.line),l=Mr(n,o);if(l&&(Fr(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!Ve(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=mr(r)-s;a&&ce(i,i.height+a)}or(n,\"markerChanged\",n,e)})},mo.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},mo.prototype.detachLine=function(e){if(this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},lt(mo);var bo=function(e,t){this.markers=e,this.primary=t;for(var r=0;r<e.length;++r)e[r].parent=this};function wo(e){return e.findMarks(ge(e.first,0),e.clipPos(ge(e.lastLine())),function(e){return e.parent})}function xo(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ti(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==B(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}},r=0;r<e.length;r++)t(r)}bo.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();or(this,\"clear\")}},bo.prototype.find=function(e,t){return this.primary.find(e,t)},lt(bo);var Co=0,So=function(e,t,r,n,i){if(!(this instanceof So))return new So(e,t,r,n,i);null==r&&(r=0),fo.call(this,[new ho([new jt(\"\",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=ge(r,0);this.sel=mi(o),this.history=new Oi(null),this.id=++Co,this.modeOption=t,this.lineSep=n,this.direction=\"rtl\"==i?\"rtl\":\"ltr\",this.extend=!1,\"string\"==typeof e&&(e=this.splitLines(e)),ki(this,{from:o,to:o,text:e}),ji(this,mi(o),V)};So.prototype=Q(fo.prototype,{constructor:So,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=ue(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Yn(function(e){var t=ge(this.first,0),r=this.first+this.size-1;to(this,{from:t,to:ge(r,se(this,r).text.length),text:this.splitLines(e),origin:\"setValue\",full:!0},!0),this.cm&&Ln(this.cm,0,0),ji(this,mi(t),V)}),replaceRange:function(e,t,r,n){lo(this,e,t=Ce(this,t),r=r?Ce(this,r):t,n)},getRange:function(e,t,r){var n=ae(this,Ce(this,e),Ce(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(de(this,e))return se(this,e)},getLineNumber:function(e){return he(e)},getLineHandleVisualStart:function(e){return\"number\"==typeof e&&(e=se(this,e)),Be(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return Ce(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||\"head\"==e?t.head:\"anchor\"==e?t.anchor:\"end\"==e||\"to\"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Yn(function(e,t,r){Vi(this,Ce(this,\"number\"==typeof e?ge(e,t||0):e),null,r)}),setSelection:Yn(function(e,t,r){Vi(this,Ce(this,e),Ce(this,t||e),r)}),extendSelection:Yn(function(e,t,r){Bi(this,Ce(this,e),t&&Ce(this,t),r)}),extendSelections:Yn(function(e,t){Gi(this,Se(this,e),t)}),extendSelectionsBy:Yn(function(e,t){Gi(this,Se(this,$(this.sel.ranges,e)),t)}),setSelections:Yn(function(e,t,r){if(e.length){for(var n=[],i=0;i<e.length;i++)n[i]=new gi(Ce(this,e[i].anchor),Ce(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),ji(this,vi(n,t),r)}}),addSelection:Yn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new gi(Ce(this,e),Ce(this,t||e))),ji(this,vi(n,n.length-1),r)}),getSelection:function(e){for(var t,r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[n]=i}return t},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||\"+input\")},replaceSelections:Yn(function(e,t,r){for(var n=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];n[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:r}}for(var s=t&&\"end\"!=t&&function(e,t,r){for(var n=[],i=ge(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=xi(s.from,i,o),u=xi(yi(s),i,o);if(i=s.to,o=u,\"around\"==r){var c=e.sel.ranges[l],h=ve(c.head,c.anchor)<0;n[l]=new gi(h?u:a,h?a:u)}else n[l]=new gi(a,a)}return new pi(n,e.sel.primIndex)}(this,n,t),a=n.length-1;a>=0;a--)to(this,n[a]);s?Ki(this,s):this.cm&&Sn(this.cm)}),undo:Yn(function(){no(this,\"undo\")}),redo:Yn(function(){no(this,\"redo\")}),undoSelection:Yn(function(){no(this,\"undo\",!0)}),redoSelection:Yn(function(){no(this,\"redo\",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new Oi(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ii(this.history.done),undone:Ii(this.history.undone)}},setHistory:function(e){var t=this.history=new Oi(this.history.maxGeneration);t.done=Ii(e.done.slice(0),null,!0),t.undone=Ii(e.undone.slice(0),null,!0)},setGutterMarker:Yn(function(e,t,r){return co(this,e,\"gutter\",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&re(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Yn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&co(t,r,\"gutter\",function(){return r.gutterMarkers[e]=null,re(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if(\"number\"==typeof e){if(!de(this,e))return null;if(t=e,!(e=se(this,e)))return null}else if(null==(t=he(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\";if(e[n]){if(L(r).test(e[n]))return!1;e[n]+=\" \"+r}else e[n]=r;return!0})}),removeLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\",i=e[n];if(!i)return!1;if(null==r)e[n]=null;else{var o=i.match(L(r));if(!o)return!1;var l=o.index+o[0].length;e[n]=i.slice(0,o.index)+(o.index&&l!=i.length?\" \":\"\")+i.slice(l)||null}return!0})}),addLineWidget:Yn(function(e,t,r){return i=e,o=new po(n=this,t,r),(l=n.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),co(n,i,\"widget\",function(e){var t=e.widgets||(e.widgets=[]);if(null==o.insertAt?t.push(o):t.splice(Math.min(t.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!Ve(n,e)){var r=je(e)<n.scrollTop;ce(e,e.height+mr(o)),r&&Cn(l,o.height),l.curOp.forceUpdate=!0}return!0}),l&&or(l,\"lineWidgetAdded\",l,o,\"number\"==typeof i?i:he(i)),o;var n,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return yo(this,Ce(this,e),Ce(this,t),r,r&&r.type||\"range\")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return yo(this,e=Ce(this,e),e,r,\"bookmark\")},findMarksAt:function(e){var t=[],r=se(this,(e=Ce(this,e)).line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=Ce(this,e),t=Ce(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),Ce(this,ge(r,t))},indexFromPos:function(e){var t=(e=Ce(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new So(ue(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new So(ue(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(ve(o,l)){var s=yo(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}(n,wo(this)),n},unlinkDoc:function(e){if(e instanceof wl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),xo(wo(this));break}}if(e.history==this.history){var r=[e.id];Ti(e,function(e){return r.push(e.id)},!0),e.history=new Oi(null),e.history.done=Ii(this.history.done,r),e.history.undone=Ii(this.history.undone,r)}},iterLinkedDocs:function(e){Ti(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):bt(e)},lineSeparator:function(){return this.lineSep||\"\\n\"},setDirection:Yn(function(e){var t;(\"rtl\"!=e&&(e=\"ltr\"),e!=this.direction)&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Kn(t=this.cm,function(){Ni(t),_n(t)}))})}),So.prototype.eachLine=So.prototype.iter;var Lo=0;function ko(e){var t=this;if(To(t),!nt(t,e)&&!yr(t.display,e)){st(e),l&&(Lo=+new Date);var r=nn(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),s=0,a=function(e,n){if(!t.options.allowDropFileTypes||-1!=B(t.options.allowDropFileTypes,e.type)){var l=new FileReader;l.onload=jn(t,function(){var e=l.result;if(/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(e)&&(e=\"\"),o[n]=e,++s==i){var a={from:r=Ce(t.doc,r),to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:\"paste\"};to(t.doc,a),Ki(t.doc,mi(r,yi(a)))}}),l.readAsText(e)}},u=0;u<i;++u)a(n[u],u);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData(\"Text\");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),Xi(t.doc,mi(r,r)),h)for(var f=0;f<h.length;++f)lo(t.doc,\"\",h[f].anchor,h[f].head,\"drag\");t.replaceSelection(c,\"around\",\"paste\"),t.display.input.focus()}}catch(e){}}}}function To(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Mo(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName(\"CodeMirror\"),r=0;r<t.length;r++){var n=t[r].CodeMirror;n&&e(n)}}var No=!1;function Oo(){var e;No||(Je(window,\"resize\",function(){null==e&&(e=setTimeout(function(){e=null,Mo(Ao)},100))}),Je(window,\"blur\",function(){return Mo(gn)}),No=!0)}function Ao(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}for(var Do={3:\"Pause\",8:\"Backspace\",9:\"Tab\",13:\"Enter\",16:\"Shift\",17:\"Ctrl\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"PrintScrn\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Mod\",92:\"Mod\",93:\"Mod\",106:\"*\",107:\"=\",109:\"-\",110:\".\",111:\"/\",127:\"Delete\",145:\"ScrollLock\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",63272:\"Delete\",63273:\"Home\",63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"},Wo=0;Wo<10;Wo++)Do[Wo+48]=Do[Wo+96]=String(Wo);for(var Ho=65;Ho<=90;Ho++)Do[Ho]=String.fromCharCode(Ho);for(var Fo=1;Fo<=12;Fo++)Do[Fo+111]=Do[Fo+63235]=\"F\"+Fo;var Po={};function Eo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))r=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error(\"Unrecognized modifier name: \"+s);n=!0}}return t&&(e=\"Alt-\"+e),r&&(e=\"Ctrl-\"+e),i&&(e=\"Cmd-\"+e),n&&(e=\"Shift-\"+e),e}function zo(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if(\"...\"==n){delete e[r];continue}for(var i=$(r.split(\" \"),Eo),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(\" \"),l=n):(s=i.slice(0,o+1).join(\" \"),l=\"...\");var a=t[s];if(a){if(a!=l)throw new Error(\"Inconsistent bindings for \"+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function Io(e,t,r,n){var i=(t=Uo(t)).call?t.call(e,n):t[e];if(!1===i)return\"nothing\";if(\"...\"===i)return\"multi\";if(null!=i&&r(i))return\"handled\";if(t.fallthrough){if(\"[object Array]\"!=Object.prototype.toString.call(t.fallthrough))return Io(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=Io(e,t.fallthrough[o],r,n);if(l)return l}}}function Ro(e){var t=\"string\"==typeof e?e:Do[e.keyCode];return\"Ctrl\"==t||\"Alt\"==t||\"Shift\"==t||\"Mod\"==t}function Bo(e,t,r){var n=e;return t.altKey&&\"Alt\"!=n&&(e=\"Alt-\"+e),(C?t.metaKey:t.ctrlKey)&&\"Ctrl\"!=n&&(e=\"Ctrl-\"+e),(C?t.ctrlKey:t.metaKey)&&\"Cmd\"!=n&&(e=\"Cmd-\"+e),!r&&t.shiftKey&&\"Shift\"!=n&&(e=\"Shift-\"+e),e}function Go(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Do[e.keyCode];return null!=r&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(r=e.code),Bo(r,e,t))}function Uo(e){return\"string\"==typeof e?Po[e]:e}function Vo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&ve(o.from,q(n).to)<=0;){var l=n.pop();if(ve(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}Kn(e,function(){for(var t=n.length-1;t>=0;t--)lo(e.doc,\"\",n[t].from,n[t].to,\"+delete\");Sn(e)})}function Ko(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function jo(e,t,r){var n=Ko(e,t.ch,r);return null==n?null:new ge(t.line,n,r<0?\"after\":\"before\")}function Xo(e,t,r,n,i){if(e){var o=Ze(r,t.doc.direction);if(o){var l,s=i<0?q(o):o[0],a=i<0==(1==s.level)?\"after\":\"before\";if(s.level>0||\"rtl\"==t.doc.direction){var u=Nr(t,r);l=i<0?r.text.length-1:0;var c=Or(t,u,l).top;l=le(function(e){return Or(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),\"before\"==a&&(l=Ko(r,l,1))}else l=i<0?s.to:s.from;return new ge(n,l,a)}}return new ge(n,i<0?r.text.length:0,i<0?\"before\":\"after\")}Po.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",PageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"},Po.pcDefault={\"Ctrl-A\":\"selectAll\",\"Ctrl-D\":\"deleteLine\",\"Ctrl-Z\":\"undo\",\"Shift-Ctrl-Z\":\"redo\",\"Ctrl-Y\":\"redo\",\"Ctrl-Home\":\"goDocStart\",\"Ctrl-End\":\"goDocEnd\",\"Ctrl-Up\":\"goLineUp\",\"Ctrl-Down\":\"goLineDown\",\"Ctrl-Left\":\"goGroupLeft\",\"Ctrl-Right\":\"goGroupRight\",\"Alt-Left\":\"goLineStart\",\"Alt-Right\":\"goLineEnd\",\"Ctrl-Backspace\":\"delGroupBefore\",\"Ctrl-Delete\":\"delGroupAfter\",\"Ctrl-S\":\"save\",\"Ctrl-F\":\"find\",\"Ctrl-G\":\"findNext\",\"Shift-Ctrl-G\":\"findPrev\",\"Shift-Ctrl-F\":\"replace\",\"Shift-Ctrl-R\":\"replaceAll\",\"Ctrl-[\":\"indentLess\",\"Ctrl-]\":\"indentMore\",\"Ctrl-U\":\"undoSelection\",\"Shift-Ctrl-U\":\"redoSelection\",\"Alt-U\":\"redoSelection\",fallthrough:\"basic\"},Po.emacsy={\"Ctrl-F\":\"goCharRight\",\"Ctrl-B\":\"goCharLeft\",\"Ctrl-P\":\"goLineUp\",\"Ctrl-N\":\"goLineDown\",\"Alt-F\":\"goWordRight\",\"Alt-B\":\"goWordLeft\",\"Ctrl-A\":\"goLineStart\",\"Ctrl-E\":\"goLineEnd\",\"Ctrl-V\":\"goPageDown\",\"Shift-Ctrl-V\":\"goPageUp\",\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\",\"Ctrl-O\":\"openLine\"},Po.macDefault={\"Cmd-A\":\"selectAll\",\"Cmd-D\":\"deleteLine\",\"Cmd-Z\":\"undo\",\"Shift-Cmd-Z\":\"redo\",\"Cmd-Y\":\"redo\",\"Cmd-Home\":\"goDocStart\",\"Cmd-Up\":\"goDocStart\",\"Cmd-End\":\"goDocEnd\",\"Cmd-Down\":\"goDocEnd\",\"Alt-Left\":\"goGroupLeft\",\"Alt-Right\":\"goGroupRight\",\"Cmd-Left\":\"goLineLeft\",\"Cmd-Right\":\"goLineRight\",\"Alt-Backspace\":\"delGroupBefore\",\"Ctrl-Alt-Backspace\":\"delGroupAfter\",\"Alt-Delete\":\"delGroupAfter\",\"Cmd-S\":\"save\",\"Cmd-F\":\"find\",\"Cmd-G\":\"findNext\",\"Shift-Cmd-G\":\"findPrev\",\"Cmd-Alt-F\":\"replace\",\"Shift-Cmd-Alt-F\":\"replaceAll\",\"Cmd-[\":\"indentLess\",\"Cmd-]\":\"indentMore\",\"Cmd-Backspace\":\"delWrappedLineLeft\",\"Cmd-Delete\":\"delWrappedLineRight\",\"Cmd-U\":\"undoSelection\",\"Shift-Cmd-U\":\"redoSelection\",\"Ctrl-Up\":\"goDocStart\",\"Ctrl-Down\":\"goDocEnd\",fallthrough:[\"basic\",\"emacsy\"]},Po.default=y?Po.macDefault:Po.pcDefault;var Yo={selectAll:Ji,singleSelection:function(e){return e.setSelection(e.getCursor(\"anchor\"),e.getCursor(\"head\"),V)},killLine:function(e){return Vo(e,function(t){if(t.empty()){var r=se(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:ge(t.head.line+1,0)}:{from:t.head,to:ge(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Vo(e,function(t){return{from:ge(t.from().line,0),to:Ce(e.doc,ge(t.to().line+1,0))}})},delLineLeft:function(e){return Vo(e,function(e){return{from:ge(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5;return{from:e.coordsChar({left:0,top:r},\"div\"),to:t.from()}})},delWrappedLineRight:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(ge(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(ge(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return _o(e,t.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return qo(e,t.head)},{origin:\"+move\",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var r=se(e.doc,t),n=function(e){for(var t;t=Ie(e);)e=t.find(1,!0).line;return e}(r);n!=r&&(t=he(n));return Xo(!0,e,r,t,-1)}(e,t.head.line)},{origin:\"+move\",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\")},j)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:0,top:r},\"div\")},j)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5,n=e.coordsChar({left:0,top:r},\"div\");return n.ch<e.getLine(n.line).search(/\\S/)?qo(e,t.head):n},j)},goLineUp:function(e){return e.moveV(-1,\"line\")},goLineDown:function(e){return e.moveV(1,\"line\")},goPageUp:function(e){return e.moveV(-1,\"page\")},goPageDown:function(e){return e.moveV(1,\"page\")},goCharLeft:function(e){return e.moveH(-1,\"char\")},goCharRight:function(e){return e.moveH(1,\"char\")},goColumnLeft:function(e){return e.moveH(-1,\"column\")},goColumnRight:function(e){return e.moveH(1,\"column\")},goWordLeft:function(e){return e.moveH(-1,\"word\")},goGroupRight:function(e){return e.moveH(1,\"group\")},goGroupLeft:function(e){return e.moveH(-1,\"group\")},goWordRight:function(e){return e.moveH(1,\"word\")},delCharBefore:function(e){return e.deleteH(-1,\"char\")},delCharAfter:function(e){return e.deleteH(1,\"char\")},delWordBefore:function(e){return e.deleteH(-1,\"word\")},delWordAfter:function(e){return e.deleteH(1,\"word\")},delGroupBefore:function(e){return e.deleteH(-1,\"group\")},delGroupAfter:function(e){return e.deleteH(1,\"group\")},indentAuto:function(e){return e.indentSelection(\"smart\")},indentMore:function(e){return e.indentSelection(\"add\")},indentLess:function(e){return e.indentSelection(\"subtract\")},insertTab:function(e){return e.replaceSelection(\"\\t\")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=I(e.getLine(o.line),o.ch,n);t.push(_(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection(\"add\"):e.execCommand(\"insertTab\")},transposeChars:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=se(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new ge(i.line,i.ch-1)),i.ch>0)i=new ge(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),ge(i.line,i.ch-2),i,\"+transpose\");else if(i.line>e.doc.first){var l=se(e.doc,i.line-1).text;l&&(i=new ge(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ge(i.line-1,l.length-1),i,\"+transpose\"))}r.push(new gi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,\"+input\");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);Sn(e)})},openLine:function(e){return e.replaceSelection(\"\\n\",\"start\")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function _o(e,t){var r=se(e.doc,t),n=Be(r);return n!=r&&(t=he(n)),Xo(!0,e,n,t,1)}function qo(e,t){var r=_o(e,t.line),n=se(e.doc,r.line),i=Ze(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return ge(r.line,l?0:o,r.sticky)}return r}function $o(e,t,r){if(\"string\"==typeof t&&!(t=Yo[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}var Zo=new R;function Qo(e,t,r,n){var i=e.state.keySeq;if(i){if(Ro(t))return\"handled\";if(/\\'$/.test(t)?e.state.keySeq=null:Zo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),Jo(e,i+\" \"+t,r,n))return!0}return Jo(e,t,r,n)}function Jo(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=Io(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&Io(t,e.options.extraKeys,r,e)||Io(t,e.options.keyMap,r,e)}(e,t,n);return\"multi\"==i&&(e.state.keySeq=t),\"handled\"==i&&or(e,\"keyHandled\",e,t,r),\"handled\"!=i&&\"multi\"!=i||(st(r),hn(e)),!!i}function el(e,t){var r=Go(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?Qo(e,\"Shift-\"+r,t,function(t){return $o(e,t,!0)})||Qo(e,r,t,function(t){if(\"string\"==typeof t?/^go[A-Z]/.test(t):t.motion)return $o(e,t)}):Qo(e,r,t,function(t){return $o(e,t)}))}var tl=null;function rl(e){var t=this;if(t.curOp.focus=W(),!nt(t,e)){l&&s<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=el(t,e);h&&(tl=n?r:null,!n&&88==r&&!xt&&(y?e.metaKey:e.ctrlKey)&&t.replaceSelection(\"\",null,\"cut\")),18!=r||/\\bCodeMirror-crosshair\\b/.test(t.display.lineDiv.className)||function(e){var t=e.display.lineDiv;function r(e){18!=e.keyCode&&e.altKey||(T(t,\"CodeMirror-crosshair\"),tt(document,\"keyup\",r),tt(document,\"mouseover\",r))}H(t,\"CodeMirror-crosshair\"),Je(document,\"keyup\",r),Je(document,\"mouseover\",r)}(t)}}function nl(e){16==e.keyCode&&(this.doc.sel.shift=!1),nt(this,e)}function il(e){var t=this;if(!(yr(t.display,e)||nt(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(h&&r==tl)return tl=null,void st(e);if(!h||e.which&&!(e.which<10)||!el(t,e)){var i,o=String.fromCharCode(null==n?r:n);if(\"\\b\"!=o)if(!Qo(i=t,\"'\"+o+\"'\",e,function(e){return $o(i,e,!0)}))t.display.input.onKeyPress(e)}}}var ol,ll,sl=function(e,t,r){this.time=e,this.pos=t,this.button=r};function al(e){var t=this,r=t.display;if(!(nt(t,e)||r.activeTouch&&r.input.supportsTouch()))if(r.input.ensurePolled(),r.shift=e.shiftKey,yr(r,e))a||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100));else if(!hl(t,e)){var n,i,o,u=nn(t,e),c=ft(e),h=u?(n=u,i=c,o=+new Date,ll&&ll.compare(o,n,i)?(ol=ll=null,\"triple\"):ol&&ol.compare(o,n,i)?(ll=new sl(o,n,i),ol=null,\"double\"):(ol=new sl(o,n,i),ll=null,\"single\")):\"single\";window.focus(),1==c&&t.state.selectingText&&t.state.selectingText(e),u&&function(e,t,r,n,i){var o=\"Click\";\"double\"==n?o=\"Double\"+o:\"triple\"==n&&(o=\"Triple\"+o);return Qo(e,Bo(o=(1==t?\"Left\":2==t?\"Middle\":\"Right\")+o,i),i,function(t){if(\"string\"==typeof t&&(t=Yo[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=U}finally{e.state.suppressEdits=!1}return n})}(t,c,u,h,e)||(1==c?u?function(e,t,r,n){l?setTimeout(E(fn,e),0):e.curOp.focus=W();var i,o=function(e,t,r){var n=e.getOption(\"configureMouse\"),i=n?n(e,t,r):{};if(null==i.unit){var o=b?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?\"rectangle\":\"single\"==t?\"char\":\"double\"==t?\"word\":\"line\"}(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey);null==i.addNew&&(i.addNew=y?r.metaKey:r.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?r.altKey:r.ctrlKey));return i}(e,r,n),u=e.doc.sel;e.options.dragDrop&>&&!e.isReadOnly()&&\"single\"==r&&(i=u.contains(t))>-1&&(ve((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(ve(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=jn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,tt(i.wrapper.ownerDocument,\"mouseup\",u),tt(i.wrapper.ownerDocument,\"mousemove\",c),tt(i.scroller,\"dragstart\",h),tt(i.scroller,\"drop\",u),o||(st(t),n.addNew||Bi(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();Je(i.wrapper.ownerDocument,\"mouseup\",u),Je(i.wrapper.ownerDocument,\"mousemove\",c),Je(i.scroller,\"dragstart\",h),Je(i.scroller,\"drop\",u),dn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;st(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new gi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if(\"rectangle\"==n.unit)n.addNew||(l=new gi(r,r)),r=nn(e,t,!0,!0),s=-1;else{var c=ul(e,r,n.unit);l=n.extend?Ri(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,ji(o,vi(u.concat([l]),s),{scroll:!1,origin:\"*mouse\"})):u.length>1&&u[s].empty()&&\"char\"==n.unit&&!n.extend?(ji(o,vi(u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:\"*mouse\"}),a=o.sel):Ui(o,s,l,K):(s=0,ji(o,new pi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=ve(h,t))if(h=t,\"rectangle\"==n.unit){for(var i=[],u=e.options.tabSize,c=I(se(o,r.line).text,r.ch,u),f=I(se(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=se(o,g).text,y=X(m,d,u);d==p?i.push(new gi(ge(g,y),ge(g,y))):m.length>y&&i.push(new gi(ge(g,y),ge(g,X(m,p,u))))}i.length||i.push(new gi(r,r)),ji(o,vi(a.ranges.slice(0,s).concat(i),s),{origin:\"*mouse\",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=ul(e,t,n.unit),C=w.anchor;ve(x.anchor,C)>0?(b=x.head,C=we(w.from(),x.anchor)):(b=x.anchor,C=be(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=se(e.doc,r.line);if(0==ve(r,n)&&r.sticky==n.sticky)return t;var o=Ze(i);if(!o)return t;var l=qe(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*(\"ltr\"==e.doc.direction?1:-1)>0;else{var c=qe(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?\"after\":\"before\";return r.ch==p&&r.sticky==g?t:new gi(new ge(r.line,p,g),n)}(e,new gi(Ce(o,C),b)),ji(o,vi(S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,st(t),i.input.focus(),tt(i.wrapper.ownerDocument,\"mousemove\",v),tt(i.wrapper.ownerDocument,\"mouseup\",m),o.history.lastSelOrigin=null}var v=jn(e,function(t){ft(t)?function t(r){var l=++p;var s=nn(e,r,!0,\"rectangle\"==n.unit);if(!s)return;if(0!=ve(s,h)){e.curOp.focus=W(),f(s);var a=yn(i,o);(s.line>=a.to||s.line<a.from)&&setTimeout(jn(e,function(){p==l&&t(r)}),150)}else{var u=r.clientY<d.top?-20:r.clientY>d.bottom?20:0;u&&setTimeout(jn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=jn(e,g);e.state.selectingText=m,Je(i.wrapper.ownerDocument,\"mousemove\",v),Je(i.wrapper.ownerDocument,\"mouseup\",m)}(e,n,t,o)}(t,u,h,e):ht(e)==r.scroller&&st(e):2==c?(u&&Bi(t.doc,u),setTimeout(function(){return r.input.focus()},20)):3==c&&(S?fl(t,e):dn(t)))}}function ul(e,t,r){if(\"char\"==r)return new gi(t,t);if(\"word\"==r)return e.findWordAt(t);if(\"line\"==r)return new gi(ge(t.line,0),Ce(e.doc,ge(t.line+1,0)));var n=r(e,t);return new gi(n.from,n.to)}function cl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&st(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ot(e,r))return ut(t);o-=s.top-l.viewOffset;for(var a=0;a<e.options.gutters.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return rt(e,r,e,fe(e.doc,o),e.options.gutters[a],t),ut(t)}}function hl(e,t){return cl(e,t,\"gutterClick\",!0)}function fl(e,t){yr(e.display,t)||function(e,t){if(!ot(e,\"gutterContextMenu\"))return!1;return cl(e,t,\"gutterContextMenu\",!1)}(e,t)||nt(e,t,\"contextmenu\")||e.display.input.onContextMenu(t)}function dl(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\"\")+e.options.theme.replace(/(^|\\s)\\s*/g,\" cm-s-\"),Er(e)}sl.prototype.compare=function(e,t,r){return this.time+400>e&&0==ve(t,this.pos)&&r==this.button};var pl={toString:function(){return\"CodeMirror.Init\"}},gl={},vl={};function ml(e){si(e),_n(e),bn(e)}function yl(e,t,r){if(!t!=!(r&&r!=pl)){var n=e.display.dragFunctions,i=t?Je:tt;i(e.display.scroller,\"dragstart\",n.start),i(e.display.scroller,\"dragenter\",n.enter),i(e.display.scroller,\"dragover\",n.over),i(e.display.scroller,\"dragleave\",n.leave),i(e.display.scroller,\"drop\",n.drop)}}function bl(e){e.options.lineWrapping?(H(e.display.wrapper,\"CodeMirror-wrap\"),e.display.sizer.style.minWidth=\"\",e.display.sizerWidth=null):(T(e.display.wrapper,\"CodeMirror-wrap\"),Ye(e)),rn(e),_n(e),Er(e),setTimeout(function(){return Hn(e)},100)}function wl(e,t){var n=this;if(!(this instanceof wl))return new wl(e,t);this.options=t=t?z(t):{},z(gl,t,!1),ai(t);var i=t.value;\"string\"==typeof i&&(i=new So(i,t.mode,null,t.lineSeparator,t.direction)),this.doc=i;var o=new wl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n){var i=this;this.input=n,i.scrollbarFiller=O(\"div\",null,\"CodeMirror-scrollbar-filler\"),i.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\"),i.gutterFiller=O(\"div\",null,\"CodeMirror-gutter-filler\"),i.gutterFiller.setAttribute(\"cm-not-content\",\"true\"),i.lineDiv=A(\"div\",null,\"CodeMirror-code\"),i.selectionDiv=O(\"div\",null,null,\"position: relative; z-index: 1\"),i.cursorDiv=O(\"div\",null,\"CodeMirror-cursors\"),i.measure=O(\"div\",null,\"CodeMirror-measure\"),i.lineMeasure=O(\"div\",null,\"CodeMirror-measure\"),i.lineSpace=A(\"div\",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,\"position: relative; outline: none\");var o=A(\"div\",[i.lineSpace],\"CodeMirror-lines\");i.mover=O(\"div\",[o],null,\"position: relative\"),i.sizer=O(\"div\",[i.mover],\"CodeMirror-sizer\"),i.sizerWidth=null,i.heightForcer=O(\"div\",null,null,\"position: absolute; height: \"+G+\"px; width: 1px;\"),i.gutters=O(\"div\",null,\"CodeMirror-gutters\"),i.lineGutter=null,i.scroller=O(\"div\",[i.sizer,i.heightForcer,i.gutters],\"CodeMirror-scroll\"),i.scroller.setAttribute(\"tabIndex\",\"-1\"),i.wrapper=O(\"div\",[i.scrollbarFiller,i.gutterFiller,i.scroller],\"CodeMirror\"),l&&s<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),a||r&&m||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,n.init(i)}(e,i,o);for(var c in u.wrapper.CodeMirror=this,si(this),dl(this),t.lineWrapping&&(this.display.wrapper.className+=\" CodeMirror-wrap\"),En(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;Je(t.scroller,\"mousedown\",jn(e,al)),Je(t.scroller,\"dblclick\",l&&s<11?jn(e,function(t){if(!nt(e,t)){var r=nn(e,t);if(r&&!hl(e,t)&&!yr(e.display,t)){st(t);var n=e.findWordAt(r);Bi(e.doc,n.anchor,n.head)}}}):function(t){return nt(e,t)||st(t)});S||Je(t.scroller,\"contextmenu\",function(t){return fl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}Je(t.scroller,\"touchstart\",function(i){if(!nt(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!hl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),Je(t.scroller,\"touchmove\",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Je(t.scroller,\"touchend\",function(r){var n=t.activeTouch;if(n&&!yr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,\"page\");l=!n.prev||o(n,n.prev)?new gi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new gi(ge(s.line,0),Ce(e.doc,ge(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),st(r)}i()}),Je(t.scroller,\"touchcancel\",i),Je(t.scroller,\"scroll\",function(){t.scroller.clientHeight&&(Mn(e,t.scroller.scrollTop),On(e,t.scroller.scrollLeft,!0),rt(e,\"scroll\",e))}),Je(t.scroller,\"mousewheel\",function(t){return di(e,t)}),Je(t.scroller,\"DOMMouseScroll\",function(t){return di(e,t)}),Je(t.wrapper,\"scroll\",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){nt(e,t)||ct(t)},over:function(t){nt(e,t)||(!function(e,t){var r=nn(e,t);if(r){var n=document.createDocumentFragment();an(e,r,n),e.display.dragCursor||(e.display.dragCursor=O(\"div\",null,\"CodeMirror-cursors CodeMirror-dragcursors\"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),ct(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-Lo<100))ct(t);else if(!nt(e,t)&&!yr(e.display,t)&&(t.dataTransfer.setData(\"Text\",e.getSelection()),t.dataTransfer.effectAllowed=\"copyMove\",t.dataTransfer.setDragImage&&!f)){var r=O(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");r.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:jn(e,ko),leave:function(t){nt(e,t)||To(e)}};var a=t.input.getField();Je(a,\"keyup\",function(t){return nl.call(e,t)}),Je(a,\"keydown\",jn(e,rl)),Je(a,\"keypress\",jn(e,il)),Je(a,\"focus\",function(t){return pn(e,t)}),Je(a,\"blur\",function(t){return gn(e,t)})}(this),Oo(),In(this),this.curOp.forceUpdate=!0,Mi(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(pn,this),20):gn(this),vl)vl.hasOwnProperty(c)&&vl[c](n,t[c],pl);wn(this),t.finishInit&&t.finishInit(this);for(var d=0;d<xl.length;++d)xl[d](n);Rn(this),a&&t.lineWrapping&&\"optimizelegibility\"==getComputedStyle(u.lineDiv).textRendering&&(u.lineDiv.style.textRendering=\"auto\")}wl.defaults=gl,wl.optionHandlers=vl;var xl=[];function Cl(e,t,r,n){var i,o=e.doc;null==r&&(r=\"add\"),\"smart\"==r&&(o.mode.indent?i=zt(e,t).state:r=\"prev\");var l=e.options.tabSize,s=se(o,t),a=I(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\\s*/)[0];if(n||/\\S/.test(s.text)){if(\"smart\"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||u>150)){if(!n)return;r=\"prev\"}}else u=0,r=\"not\";\"prev\"==r?u=t>o.first?I(se(o,t-1).text,null,l):0:\"add\"==r?u=a+e.options.indentUnit:\"subtract\"==r?u=a-e.options.indentUnit:\"number\"==typeof r&&(u=a+r),u=Math.max(0,u);var h=\"\",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+=\"\\t\";if(f<u&&(h+=_(u-f)),h!=c)return lo(o,h,ge(t,0),ge(t,c.length),\"+input\"),s.stateAfter=null,!0;for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var v=ge(t,c.length);Ui(o,p,new gi(v,v));break}}}wl.defineInitHook=function(e){return xl.push(e)};var Sl=null;function Ll(e){Sl=e}function kl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l,s=e.state.pasteIncoming||\"paste\"==i,a=bt(t),u=null;if(s&&n.ranges.length>1)if(Sl&&Sl.text.join(\"\\n\")==t){if(n.ranges.length%Sl.text.length==0){u=[];for(var c=0;c<Sl.text.length;c++)u.push(o.splitLines(Sl.text[c]))}}else a.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(u=$(a,function(e){return[e]}));for(var h=n.ranges.length-1;h>=0;h--){var f=n.ranges[h],d=f.from(),p=f.to();f.empty()&&(r&&r>0?d=ge(d.line,d.ch-r):e.state.overwrite&&!s?p=ge(p.line,Math.min(se(o,p.line).text.length,p.ch+q(a).length)):Sl&&Sl.lineWise&&Sl.text.join(\"\\n\")==t&&(d=p=ge(d.line,0))),l=e.curOp.updateInput;var g={from:d,to:p,text:u?u[h%u.length]:a,origin:i||(s?\"paste\":e.state.cutIncoming?\"cut\":\"+input\")};to(e.doc,g),or(e,\"inputRead\",e,g)}t&&!s&&Ml(e,t),Sn(e),e.curOp.updateInput=l,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Tl(e,t){var r=e.clipboardData&&e.clipboardData.getData(\"Text\");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Kn(t,function(){return kl(t,r,0,null,\"paste\")}),!0}function Ml(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=Cl(e,i.head.line,\"smart\");break}}else o.electricInput&&o.electricInput.test(se(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Cl(e,i.head.line,\"smart\"));l&&or(e,\"electricInput\",e,i.head.line)}}}function Nl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:ge(i,0),head:ge(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function Ol(e,t){e.setAttribute(\"autocorrect\",\"off\"),e.setAttribute(\"autocapitalize\",\"off\"),e.setAttribute(\"spellcheck\",!!t)}function Al(){var e=O(\"textarea\",null,null,\"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\"),t=O(\"div\",[e],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");return a?e.style.width=\"1000px\":e.setAttribute(\"wrap\",\"off\"),g&&(e.style.border=\"1px solid black\"),Ol(e),t}function Dl(e,t,r,n,i){var o=t,l=r,s=se(e,t.line);function a(n){var o,l;if(null==(o=i?function(e,t,r,n){var i=Ze(t,e.doc.direction);if(!i)return jo(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky=\"before\"):r.ch<=0&&(r.ch=0,r.sticky=\"after\");var o=qe(i,r.ch,r.sticky),l=i[o];if(\"ltr\"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return jo(t,r,n);var s,a=function(e,r){return Ko(t,e instanceof ge?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Nr(e,t),_r(e,t,s,r)):{begin:0,end:t.text.length}},c=u(\"before\"==r.sticky?a(r,-1):r.ch);if(\"rtl\"==e.doc.direction||1==l.level){var h=1==l.level==n<0,f=a(r,h?1:-1);if(null!=f&&(h?f<=l.to&&f<=c.end:f>=l.from&&f>=c.begin)){var d=h?\"before\":\"after\";return new ge(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new ge(r.line,a(e,1),\"before\"):new ge(r.line,e,\"after\")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):jo(s,t,r))){if(n||(l=t.line+r)<e.first||l>=e.first+e.size||(t=new ge(l,t.ch,t.sticky),!(s=se(e,l))))return!1;t=Xo(i,e.cm,s,t.line,r)}else t=o;return!0}if(\"char\"==n)a();else if(\"column\"==n)a(!0);else if(\"word\"==n||\"group\"==n)for(var u=null,c=\"group\"==n,h=e.cm&&e.cm.getHelper(t,\"wordChars\"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||\"\\n\",p=te(d,h)?\"w\":c&&\"\\n\"==d?\"n\":!c||/\\s/.test(d)?null:\"p\";if(!c||f||p||(p=\"s\"),u&&u!=p){r<0&&(r=1,a(),t.sticky=\"after\");break}if(p&&(u=p),r>0&&!a(!f))break}var g=Zi(e,t,o,l,!0);return me(o,g)&&(g.hitSide=!0),g}function Wl(e,t,r,n){var i,o,l=e.doc,s=t.left;if(\"page\"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*Zr(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else\"line\"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=Xr(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var Hl=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Fl(e,t){var r=Mr(e,t.line);if(!r||r.hidden)return null;var n=se(e.doc,t.line),i=kr(r,n,t.line),o=Ze(n,e.doc.direction),l=\"left\";o&&(l=qe(o,t.ch)%2?\"right\":\"left\");var s=Wr(i.map,t.ch,l);return s.offset=\"right\"==s.collapse?s.end:s.start,s}function Pl(e,t){return t&&(e.bad=!0),e}function El(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return Pl(e.clipPos(ge(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return zl(o,t,r)}}function zl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return Pl(ge(he(e.line),0),!0);if(t==n&&(i=!0,t=n.childNodes[r],r=0,!t)){var o=e.rest?q(e.rest):e.line;return Pl(ge(he(o),o.text.length),i)}var l=3==t.nodeType?t:null,s=t;for(l||1!=t.childNodes.length||3!=t.firstChild.nodeType||(l=t.firstChild,r&&(r=l.nodeValue.length));s.parentNode!=n;)s=s.parentNode;var a=e.measure,u=a.maps;function c(t,r,n){for(var i=-1;i<(u?u.length:0);i++)for(var o=i<0?a.map:u[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var c=he(i<0?e.line:e.rest[i]),h=o[l]+n;return(n<0||s!=t)&&(h=o[l+(n?1:0)]),ge(c,h)}}}var h=c(l,s,r);if(h)return Pl(h,i);for(var f=s.nextSibling,d=l?l.nodeValue.length-r:0;f;f=f.nextSibling){if(h=c(f,f.firstChild,0))return Pl(ge(h.line,h.ch-d),i);d+=f.textContent.length}for(var p=s.previousSibling,g=r;p;p=p.previousSibling){if(h=c(p,p.firstChild,-1))return Pl(ge(h.line,h.ch+g),i);g+=p.textContent.length}}Hl.prototype.init=function(e){var t=this,r=this,n=r.cm,i=r.div=e.lineDiv;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()}),\"cut\"==e.type&&n.replaceSelection(\"\",null,\"cut\");else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,V),n.replaceSelection(\"\",null,\"cut\")})}if(e.clipboardData){e.clipboardData.clearData();var o=Sl.text.join(\"\\n\");if(e.clipboardData.setData(\"Text\",o),e.clipboardData.getData(\"Text\")==o)return void e.preventDefault()}var l=Al(),s=l.firstChild;n.display.lineSpace.insertBefore(l,n.display.lineSpace.firstChild),s.value=Sl.text.join(\"\\n\");var a=document.activeElement;P(s),setTimeout(function(){n.display.lineSpace.removeChild(l),a.focus(),a==i&&r.showPrimarySelection()},50)}}Ol(i,n.options.spellcheck),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||s<=11&&setTimeout(jn(n,function(){return t.updateFromDOM()}),20)}),Je(i,\"compositionstart\",function(e){t.composing={data:e.data,done:!1}}),Je(i,\"compositionupdate\",function(e){t.composing||(t.composing={data:e.data,done:!1})}),Je(i,\"compositionend\",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Je(i,\"touchstart\",function(){return r.forceCompositionEnd()}),Je(i,\"input\",function(){t.composing||t.readFromDOMSoon()}),Je(i,\"copy\",o),Je(i,\"cut\",o)},Hl.prototype.prepareSelection=function(){var e=sn(this.cm,!1);return e.focus=this.cm.state.focused,e},Hl.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Hl.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,n=t.doc.sel.primary(),i=n.from(),o=n.to();if(t.display.viewTo==t.display.viewFrom||i.line>=t.display.viewTo||o.line<t.display.viewFrom)e.removeAllRanges();else{var l=El(t,e.anchorNode,e.anchorOffset),s=El(t,e.focusNode,e.focusOffset);if(!l||l.bad||!s||s.bad||0!=ve(we(l,s),i)||0!=ve(be(l,s),o)){var a=t.display.view,u=i.line>=t.display.viewFrom&&Fl(t,i)||{node:a[0].measure.map[2],offset:0},c=o.line<t.display.viewTo&&Fl(t,o);if(!c){var h=a[a.length-1].measure,f=h.maps?h.maps[h.maps.length-1]:h.map;c={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(u&&c){var d,p=e.rangeCount&&e.getRangeAt(0);try{d=k(u.node,u.offset,c.offset,c.node)}catch(e){}d&&(!r&&t.state.focused?(e.collapse(u.node,u.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),p&&null==e.anchorNode?e.addRange(p):r&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Hl.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Hl.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Hl.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Hl.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Hl.prototype.focus=function(){\"nocursor\"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Hl.prototype.blur=function(){this.div.blur()},Hl.prototype.getField=function(){return this.div},Hl.prototype.supportsTouch=function(){return!0},Hl.prototype.receivedFocus=function(){var e=this;this.selectionInEditor()?this.pollSelection():Kn(this.cm,function(){return e.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function t(){e.cm.state.focused&&(e.pollSelection(),e.polling.set(e.cm.options.pollInterval,t))})},Hl.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Hl.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(v&&c&&this.cm.options.gutters.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(e.anchorNode))return this.cm.triggerOnKeyDown({type:\"keydown\",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=El(t,e.anchorNode,e.anchorOffset),n=El(t,e.focusNode,e.focusOffset);r&&n&&Kn(t,function(){ji(t.doc,mi(r,n),V),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},Hl.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,r,n=this.cm,i=n.display,o=n.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>n.firstLine()&&(l=ge(l.line-1,se(n.doc,l.line-1).length)),s.ch==se(n.doc,s.line).text.length&&s.line<n.lastLine()&&(s=ge(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;l.line==i.viewFrom||0==(e=on(n,l.line))?(t=he(i.view[0].line),r=i.view[0].node):(t=he(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=on(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=he(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o=\"\",l=!1,s=e.doc.lineSeparator();function a(){l&&(o+=s,l=!1)}function u(e){e&&(a(),o+=e)}function c(t){if(1==t.nodeType){var r=t.getAttribute(\"cm-text\");if(null!=r)return void u(r||t.textContent.replace(/\\u200b/g,\"\"));var o,h=t.getAttribute(\"cm-marker\");if(h){var f=e.findMarks(ge(n,0),ge(i+1,0),(g=+h,function(e){return e.id==g}));return void(f.length&&(o=f[0].find(0))&&u(ae(e.doc,o.from,o.to).join(s)))}if(\"false\"==t.getAttribute(\"contenteditable\"))return;var d=/^(pre|div|p)$/i.test(t.nodeName);d&&a();for(var p=0;p<t.childNodes.length;p++)c(t.childNodes[p]);d&&(l=!0)}else 3==t.nodeType&&u(t.nodeValue);var g}for(;c(t),t!=r;)t=t.nextSibling;return o}(n,r,u,t,a)),f=ae(n.doc,ge(t,0),ge(a,se(n.doc,a).text.length));h.length>1&&f.length>1;)if(q(h)==q(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);d<m&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=q(h),b=q(f),w=Math.min(y.length-(1==h.length?d:0),b.length-(1==f.length?d:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==f.length&&t==l.line)for(;d&&d>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\\u200b+/,\"\"),h[0]=h[0].slice(d).replace(/\\u200b+$/,\"\");var x=ge(t,d),C=ge(a,f.length?q(f).length-p:0);return h.length>1||h[0]||ve(x,C)?(lo(n.doc,h,x,C,\"+input\"),!0):void 0},Hl.prototype.ensurePolled=function(){this.forceCompositionEnd()},Hl.prototype.reset=function(){this.forceCompositionEnd()},Hl.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Hl.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Hl.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Kn(this.cm,function(){return _n(e.cm)})},Hl.prototype.setUneditable=function(e){e.contentEditable=\"false\"},Hl.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||jn(this.cm,kl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Hl.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(\"nocursor\"!=e)},Hl.prototype.onContextMenu=function(){},Hl.prototype.resetPosition=function(){},Hl.prototype.needsContentAttribute=!0;var Il,Rl,Bl,Gl=function(e){this.cm=e,this.prevInput=\"\",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput=\"\",i.value=t.text.join(\"\\n\"),P(i))}\"cut\"==e.type&&(n.state.cutIncoming=!0)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width=\"0px\"),Je(i,\"input\",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||(n.state.pasteIncoming=!0,r.fastPoll())}),Je(i,\"cut\",o),Je(i,\"copy\",o),Je(e.scroller,\"paste\",function(t){yr(e,t)||nt(n,t)||(n.state.pasteIncoming=!0,r.focus())}),Je(e.lineSpace,\"selectstart\",function(t){yr(e,t)||st(t)}),Je(i,\"compositionstart\",function(){var e=n.getCursor(\"from\");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}}),Je(i,\"compositionend\",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Al(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=sn(e);if(e.options.moveInputWithCursor){var i=Vr(e,r.sel.primary().head,\"div\"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+\"px\",this.wrapper.style.left=e.teLeft+\"px\")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput=\"\";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value=\"\",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||wt(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\\uf700-\\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n=\"\"),8666==o)return this.reset(),this.cm.execCommand(\"undo\")}for(var a=0,u=Math.min(n.length,i.length);a<u&&n.charCodeAt(a)==i.charCodeAt(a);)++a;return Kn(t,function(){kl(t,i.slice(a),n.length-a,null,e.composing?\"*compose\":null),i.length>1e3||i.indexOf(\"\\n\")>-1?r.value=e.prevInput=\"\":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea,o=nn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&jn(r,ji)(r.doc,mi(o),V);var c=i.style.cssText,f=t.wrapper.style.cssText;t.wrapper.style.cssText=\"position: absolute\";var d,p=t.wrapper.getBoundingClientRect();if(i.style.cssText=\"position: absolute; width: 30px; height: 30px;\\n top: \"+(e.clientY-p.top-5)+\"px; left: \"+(e.clientX-p.left-5)+\"px;\\n z-index: 1000; background: \"+(l?\"rgba(255, 255, 255, .05)\":\"transparent\")+\";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\",a&&(d=window.scrollY),n.input.focus(),a&&window.scrollTo(null,d),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=\" \"),t.contextMenuPending=!0,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){ct(e);var g=function(){tt(window,\"mouseup\",g),setTimeout(m,20)};Je(window,\"mouseup\",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o=\"\"+(e?i.value:\"\");i.value=\"⇚\",i.value=o,t.prevInput=e?\"\":\"\",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending=!1,t.wrapper.style.cssText=f,i.style.cssText=c,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&\"\"==t.prevInput?jn(r,Ji)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=\"nocursor\"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=pl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=pl,r(\"value\",\"\",function(e,t){return e.setValue(t)},!0),r(\"mode\",null,function(e,t){e.doc.modeOption=t,Ci(e)},!0),r(\"indentUnit\",2,Ci,!0),r(\"indentWithTabs\",!1),r(\"smartIndent\",!0),r(\"tabSize\",4,function(e){Si(e),Er(e),_n(e)},!0),r(\"lineSeparator\",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(ge(n,o))}n++});for(var i=r.length-1;i>=0;i--)lo(e.doc,t,r[i],ge(r[i].line,r[i].ch+t.length))}}),r(\"specialChars\",/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test(\"\\t\")?\"\":\"|\\t\"),\"g\"),r!=pl&&e.refresh()}),r(\"specialCharPlaceholder\",$t,function(e){return e.refresh()},!0),r(\"electricChars\",!0),r(\"inputStyle\",m?\"contenteditable\":\"textarea\",function(){throw new Error(\"inputStyle can not (yet) be changed in a running editor\")},!0),r(\"spellcheck\",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r(\"rtlMoveVisually\",!w),r(\"wholeLineUpdateBefore\",!0),r(\"theme\",\"default\",function(e){dl(e),ml(e)},!0),r(\"keyMap\",\"default\",function(e,t,r){var n=Uo(t),i=r!=pl&&Uo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r(\"extraKeys\",null),r(\"configureMouse\",null),r(\"lineWrapping\",!1,bl,!0),r(\"gutters\",[],function(e){ai(e.options),ml(e)},!0),r(\"fixedGutter\",!0,function(e,t){e.display.gutters.style.left=t?en(e.display)+\"px\":\"0\",e.refresh()},!0),r(\"coverGutterNextToScrollbar\",!1,function(e){return Hn(e)},!0),r(\"scrollbarStyle\",\"native\",function(e){En(e),Hn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r(\"lineNumbers\",!1,function(e){ai(e.options),ml(e)},!0),r(\"firstLineNumber\",1,ml,!0),r(\"lineNumberFormatter\",function(e){return e},ml,!0),r(\"showCursorWhenSelecting\",!1,ln,!0),r(\"resetSelectionOnContextMenu\",!0),r(\"lineWiseCopyCut\",!0),r(\"pasteLinesPerSelection\",!0),r(\"readOnly\",!1,function(e,t){\"nocursor\"==t&&(gn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r(\"disableInput\",!1,function(e,t){t||e.display.input.reset()},!0),r(\"dragDrop\",!0,yl),r(\"allowDropFileTypes\",null),r(\"cursorBlinkRate\",530),r(\"cursorScrollMargin\",0),r(\"cursorHeight\",1,ln,!0),r(\"singleCursorHeightPerLine\",!0,ln,!0),r(\"workTime\",100),r(\"workDelay\",100),r(\"flattenSpans\",!0,Si,!0),r(\"addModeClass\",!1,Si,!0),r(\"pollInterval\",100),r(\"undoDepth\",200,function(e,t){return e.doc.history.undoDepth=t}),r(\"historyEventDelay\",1250),r(\"viewportMargin\",10,function(e){return e.refresh()},!0),r(\"maxHighlightLength\",1e4,Si,!0),r(\"moveInputWithCursor\",!0,function(e,t){t||e.display.input.resetPosition()}),r(\"tabindex\",null,function(e,t){return e.display.input.getField().tabIndex=t||\"\"}),r(\"autofocus\",null),r(\"direction\",\"ltr\",function(e,t){return e.doc.setDirection(t)},!0)}(wl),Rl=(Il=wl).optionHandlers,Bl=Il.helpers={},Il.prototype={constructor:Il,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var r=this.options,n=r[e];r[e]==t&&\"mode\"!=e||(r[e]=t,Rl.hasOwnProperty(e)&&jn(this,Rl[e])(this,t,n),rt(this,\"optionChange\",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?\"push\":\"unshift\"](Uo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:Xn(function(e,t){var r=e.token?e:Il.getMode(this.options,e);if(r.startState)throw new Error(\"Overlays may not be stateful.\");!function(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}(this.state.overlays,{mode:r,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,_n(this)}),removeOverlay:Xn(function(e){for(var t=this.state.overlays,r=0;r<t.length;++r){var n=t[r].modeSpec;if(n==e||\"string\"==typeof e&&n.name==e)return t.splice(r,1),this.state.modeGen++,void _n(this)}}),indentLine:Xn(function(e,t,r){\"string\"!=typeof t&&\"number\"!=typeof t&&(t=null==t?this.options.smartIndent?\"smart\":\"prev\":t?\"add\":\"subtract\"),de(this.doc,e)&&Cl(this,e,t,r)}),indentSelection:Xn(function(e){for(var t=this,r=this.doc.sel.ranges,n=-1,i=0;i<r.length;i++){var o=r[i];if(o.empty())o.head.line>n&&(Cl(t,o.head.line,e,!0),n=o.head.line,i==t.doc.sel.primIndex&&Sn(t));else{var l=o.from(),s=o.to(),a=Math.max(n,l.line);n=Math.min(t.lastLine(),s.line-(s.ch?0:1))+1;for(var u=a;u<n;++u)Cl(t,u,e);var c=t.doc.sel.ranges;0==l.ch&&r.length==c.length&&c[i].from().ch>0&&Ui(t.doc,i,new gi(l,c[i].to()),V)}}}),getTokenAt:function(e,t){return Ut(this,e,t)},getLineTokens:function(e,t){return Ut(this,ge(e),t,!0)},getTokenTypeAt:function(e){e=Ce(this.doc,e);var t,r=Et(this,se(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf(\"overlay \"):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Il.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!Bl.hasOwnProperty(t))return r;var n=Bl[t],i=this.getModeAt(e);if(\"string\"==typeof i[t])n[i[t]]&&r.push(n[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=n[i[t][o]];l&&r.push(l)}else i.helperType&&n[i.helperType]?r.push(n[i.helperType]):n[i.name]&&r.push(n[i.name]);for(var s=0;s<n._global.length;s++){var a=n._global[s];a.pred(i,this)&&-1==B(r,a.val)&&r.push(a.val)}return r},getStateAfter:function(e,t){var r=this.doc;return zt(this,(e=xe(r,null==e?r.first+r.size-1:e))+1,t).state},cursorCoords:function(e,t){var r=this.doc.sel.primary();return Vr(this,null==e?r.head:\"object\"==typeof e?Ce(this.doc,e):e?r.from():r.to(),t||\"page\")},charCoords:function(e,t){return Ur(this,Ce(this.doc,e),t||\"page\")},coordsChar:function(e,t){return Xr(this,(e=Gr(this,e,t||\"page\")).left,e.top)},lineAtHeight:function(e,t){return e=Gr(this,{top:e,left:0},t||\"page\").top,fe(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if(\"number\"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=se(this.doc,e)}else n=e;return Br(this,n,{top:0,left:0},t||\"page\",r||i).top+(i?this.doc.height-je(n):0)},defaultTextHeight:function(){return Zr(this.display)},defaultCharWidth:function(){return Qr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Vr(this,Ce(this.doc,e))).bottom,c=e.left;if(t.style.position=\"absolute\",t.setAttribute(\"cm-ignore-events\",\"true\"),this.display.input.setUneditable(t),a.sizer.appendChild(t),\"over\"==n)u=e.top;else if(\"above\"==n||\"near\"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);(\"above\"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+\"px\",t.style.left=t.style.right=\"\",\"right\"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right=\"0px\"):(\"left\"==i?c=0:\"middle\"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+\"px\"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=xn(o,l)).scrollTop&&Mn(o,s.scrollTop),null!=s.scrollLeft&&On(o,s.scrollLeft))},triggerOnKeyDown:Xn(rl),triggerOnKeyPress:Xn(il),triggerOnKeyUp:nl,triggerOnMouseDown:Xn(al),execCommand:function(e){if(Yo.hasOwnProperty(e))return Yo[e].call(null,this)},triggerElectric:Xn(function(e){Ml(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=Ce(this.doc,e),l=0;l<t&&!(o=Dl(this.doc,o,i,r,n)).hitSide;++l);return o},moveH:Xn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Dl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},j)}),deleteH:Xn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection(\"\",null,\"+delete\"):Vo(this,function(r){var i=Dl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;t<0&&(i=-1,t=-t);for(var l=Ce(this.doc,e),s=0;s<t;++s){var a=Vr(this,l,\"div\");if(null==o?o=a.left:a.left=o,(l=Wl(this,a,i,r)).hitSide)break}return l},moveV:Xn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=Vr(r,l.head,\"div\");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Wl(r,s,e,t);return\"page\"==t&&l==n.sel.primary()&&Cn(r,Ur(r,a,\"div\").top-s.top),a},j),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=se(this.doc,e.line).text,r=e.ch,n=e.ch;if(t){var i=this.getHelper(e,\"wordChars\");\"before\"!=e.sticky&&n!=t.length||!r?++n:--r;for(var o=t.charAt(r),l=te(o,i)?function(e){return te(e,i)}:/\\s/.test(o)?function(e){return/\\s/.test(e)}:function(e){return!/\\s/.test(e)&&!te(e)};r>0&&l(t.charAt(r-1));)--r;for(;n<t.length&&l(t.charAt(n));)++n}return new gi(ge(e.line,r),ge(e.line,n))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?H(this.display.cursorDiv,\"CodeMirror-overwrite\"):T(this.display.cursorDiv,\"CodeMirror-overwrite\"),rt(this,\"overwriteToggle\",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Xn(function(e,t){Ln(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Cr(this)-this.display.barHeight,width:e.scrollWidth-Cr(this)-this.display.barWidth,clientHeight:Lr(this),clientWidth:Sr(this)}},scrollIntoView:Xn(function(e,t){var r,n;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):\"number\"==typeof e?e={from:ge(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(n=e,kn(r=this),r.curOp.scrollToPos=n):Tn(this,e.from,e.to,e.margin)}),setSize:Xn(function(e,t){var r=this,n=function(e){return\"number\"==typeof e||/^\\d+$/.test(String(e))?e+\"px\":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pr(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){qn(r,i,\"widget\");break}++i}),this.curOp.forceUpdate=!0,rt(this,\"refresh\",this)}),operation:function(e){return Kn(this,e)},startOperation:function(){return In(this)},endOperation:function(){return Rn(this)},refresh:Xn(function(){var e=this.display.cachedTextHeight;_n(this),this.curOp.forceUpdate=!0,Er(this),Ln(this,this.doc.scrollLeft,this.doc.scrollTop),oi(this),(null==e||Math.abs(e-Zr(this.display))>.5)&&rn(this),rt(this,\"refresh\",this)}),swapDoc:Xn(function(e){var t=this.doc;return t.cm=null,Mi(this,e),Er(this),this.display.input.reset(),Ln(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,or(this,\"swapDoc\",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},lt(Il),Il.registerHelper=function(e,t,r){Bl.hasOwnProperty(e)||(Bl[e]=Il[e]={_global:[]}),Bl[e][t]=r},Il.registerGlobalHelper=function(e,t,r,n){Il.registerHelper(e,t,n),Bl[e]._global.push({pred:r,val:n})};var Ul,Vl=\"iter insert remove copy getEditor constructor\".split(\" \");for(var Kl in So.prototype)So.prototype.hasOwnProperty(Kl)&&B(Vl,Kl)<0&&(wl.prototype[Kl]=function(e){return function(){return e.apply(this.doc,arguments)}}(So.prototype[Kl]));return lt(So),wl.inputStyles={textarea:Gl,contenteditable:Hl},wl.defineMode=function(e){wl.defaults.mode||\"null\"==e||(wl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),St[e]=t}.apply(this,arguments)},wl.defineMIME=function(e,t){Lt[e]=t},wl.defineMode(\"null\",function(){return{token:function(e){return e.skipToEnd()}}}),wl.defineMIME(\"text/plain\",\"null\"),wl.defineExtension=function(e,t){wl.prototype[e]=t},wl.defineDocExtension=function(e,t){So.prototype[e]=t},wl.fromTextArea=function(e,t){if((t=t?z(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute(\"autofocus\")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(Je(e.form,\"submit\",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(t){t.save=n,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,n(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display=\"\",e.form&&(tt(e.form,\"submit\",n),\"function\"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display=\"none\";var s=wl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},(Ul=wl).off=tt,Ul.on=Je,Ul.wheelEventPixels=fi,Ul.Doc=So,Ul.splitLines=bt,Ul.countColumn=I,Ul.findColumn=X,Ul.isWordChar=ee,Ul.Pass=U,Ul.signal=rt,Ul.Line=jt,Ul.changeEnd=yi,Ul.scrollbarModel=Pn,Ul.Pos=ge,Ul.cmpPos=ve,Ul.modes=St,Ul.mimeModes=Lt,Ul.resolveMode=kt,Ul.getMode=Tt,Ul.modeExtensions=Mt,Ul.extendMode=Nt,Ul.copyState=Ot,Ul.startState=Dt,Ul.innerMode=At,Ul.commands=Yo,Ul.keyMap=Po,Ul.keyName=Go,Ul.isModifierKey=Ro,Ul.lookupKey=Io,Ul.normalizeKeyMap=zo,Ul.StringStream=Wt,Ul.SharedTextMarker=bo,Ul.TextMarker=mo,Ul.LineWidget=po,Ul.e_preventDefault=st,Ul.e_stopPropagation=at,Ul.e_stop=ct,Ul.addClass=H,Ul.contains=D,Ul.rmClass=T,Ul.keyNames=Do,wl.version=\"5.37.1\",wl});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.css": {
"text": ".CodeMirror{font-family:monospace;height:300px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{0%{}50%{background-color:transparent}}@-webkit-keyframes blink{0%{}50%{background-color:transparent}}@keyframes blink{0%{}50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css": {
"text": ".CodeMirror-dialog {\n position: absolute;\n left: 0; right: 0;\n background: inherit;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: inherit;\n}\n\n.CodeMirror-dialog-top {\n border-bottom: 1px solid #eee;\n top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n border-top: 1px solid #eee;\n bottom: 0;\n}\n\n.CodeMirror-dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n font-size: 70%;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){function o(e,o,n){var t;return(t=e.getWrapperElement().appendChild(document.createElement(\"div\"))).className=n?\"CodeMirror-dialog CodeMirror-dialog-bottom\":\"CodeMirror-dialog CodeMirror-dialog-top\",\"string\"==typeof o?t.innerHTML=o:t.appendChild(o),t}function n(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}e.defineExtension(\"openDialog\",function(t,i,r){r||(r={}),n(this,null);var u=o(this,t,r.bottom),l=!1,c=this;function a(e){if(\"string\"==typeof e)s.value=e;else{if(l)return;l=!0,u.parentNode.removeChild(u),c.focus(),r.onClose&&r.onClose(u)}}var f,s=u.getElementsByTagName(\"input\")[0];return s?(s.focus(),r.value&&(s.value=r.value,!1!==r.selectValueOnOpen&&s.select()),r.onInput&&e.on(s,\"input\",function(e){r.onInput(e,s.value,a)}),r.onKeyUp&&e.on(s,\"keyup\",function(e){r.onKeyUp(e,s.value,a)}),e.on(s,\"keydown\",function(o){r&&r.onKeyDown&&r.onKeyDown(o,s.value,a)||((27==o.keyCode||!1!==r.closeOnEnter&&13==o.keyCode)&&(s.blur(),e.e_stop(o),a()),13==o.keyCode&&i(s.value,o))}),!1!==r.closeOnBlur&&e.on(s,\"blur\",a)):(f=u.getElementsByTagName(\"button\")[0])&&(e.on(f,\"click\",function(){a(),c.focus()}),!1!==r.closeOnBlur&&e.on(f,\"blur\",a),f.focus()),a}),e.defineExtension(\"openConfirm\",function(t,i,r){n(this,null);var u=o(this,t,r&&r.bottom),l=u.getElementsByTagName(\"button\"),c=!1,a=this,f=1;function s(){c||(c=!0,u.parentNode.removeChild(u),a.focus())}l[0].focus();for(var d=0;d<l.length;++d){var p=l[d];!function(o){e.on(p,\"click\",function(n){e.e_preventDefault(n),s(),o&&o(a)})}(i[d]),e.on(p,\"blur\",function(){--f,setTimeout(function(){f<=0&&s()},200)}),e.on(p,\"focus\",function(){++f})}}),e.defineExtension(\"openNotification\",function(t,i){n(this,a);var r,u=o(this,t,i&&i.bottom),l=!1,c=i&&void 0!==i.duration?i.duration:5e3;function a(){l||(l=!0,clearTimeout(r),u.parentNode.removeChild(u))}return e.on(u,\"click\",function(o){e.e_preventDefault(o),a()}),c&&(r=setTimeout(a,c)),a})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var t=\"CodeMirror-activeline\",n=\"CodeMirror-activeline-background\",i=\"CodeMirror-activeline-gutter\";function r(e){for(var r=0;r<e.state.activeLines.length;r++)e.removeLineClass(e.state.activeLines[r],\"wrap\",t),e.removeLineClass(e.state.activeLines[r],\"background\",n),e.removeLineClass(e.state.activeLines[r],\"gutter\",i)}function o(e,o){for(var a=[],s=0;s<o.length;s++){var c=o[s],l=e.getOption(\"styleActiveLine\");if(\"object\"==typeof l&&l.nonEmpty?c.anchor.line==c.head.line:c.empty()){var f=e.getLineHandleVisualStart(c.head.line);a[a.length-1]!=f&&a.push(f)}}(function(e,t){if(e.length!=t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0})(e.state.activeLines,a)||e.operation(function(){r(e);for(var o=0;o<a.length;o++)e.addLineClass(a[o],\"wrap\",t),e.addLineClass(a[o],\"background\",n),e.addLineClass(a[o],\"gutter\",i);e.state.activeLines=a})}function a(e,t){o(e,t.ranges)}e.defineOption(\"styleActiveLine\",!1,function(t,n,i){var s=i!=e.Init&&i;n!=s&&(s&&(t.off(\"beforeSelectionChange\",a),r(t),delete t.state.activeLines),n&&(t.state.activeLines=[],o(t,t.listSelections()),t.on(\"beforeSelectionChange\",a)))})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.modeInfo=[{name:\"CMake\",mime:\"text/x-cmake\",mode:\"cmake\",ext:[\"cmake\",\"cmake.in\"],file:/^CMakeLists.txt$/},{name:\"Cython\",mime:\"text/x-cython\",mode:\"python\",ext:[\"pyx\",\"pxd\",\"pxi\"]},{name:\"CSS\",mime:\"text/css\",mode:\"css\",ext:[\"css\"]},{name:\"diff\",mime:\"text/x-diff\",mode:\"diff\",ext:[\"diff\",\"patch\"]},{name:\"Embedded Javascript\",mime:\"application/x-ejs\",mode:\"htmlembedded\",ext:[\"ejs\"]},{name:\"Embedded Ruby\",mime:\"application/x-erb\",mode:\"htmlembedded\",ext:[\"erb\"]},{name:\"Erlang\",mime:\"text/x-erlang\",mode:\"erlang\",ext:[\"erl\"]},{name:\"GitHub Flavored Markdown\",mime:\"text/x-gfm\",mode:\"gfm\",file:/^(readme|contributing|history).md$/i},{name:\"Go\",mime:\"text/x-go\",mode:\"go\",ext:[\"go\"]},{name:\"ASP.NET\",mime:\"application/x-aspx\",mode:\"htmlembedded\",ext:[\"aspx\"],alias:[\"asp\",\"aspx\"]},{name:\"HTML\",mime:\"text/html\",mode:\"htmlmixed\",ext:[\"html\",\"htm\",\"handlebars\",\"hbs\"],alias:[\"xhtml\"]},{name:\"HTTP\",mime:\"message/http\",mode:\"http\"},{name:\"JavaScript\",mimes:[\"text/javascript\",\"text/ecmascript\",\"application/javascript\",\"application/x-javascript\",\"application/ecmascript\"],mode:\"javascript\",ext:[\"js\"],alias:[\"ecmascript\",\"js\",\"node\"]},{name:\"JSON\",mimes:[\"application/json\",\"application/x-json\"],mode:\"javascript\",ext:[\"json\",\"map\"],alias:[\"json5\"]},{name:\"JSON-LD\",mime:\"application/ld+json\",mode:\"javascript\",ext:[\"jsonld\"],alias:[\"jsonld\"]},{name:\"Lua\",mime:\"text/x-lua\",mode:\"lua\",ext:[\"lua\"]},{name:\"Markdown\",mime:\"text/x-markdown\",mode:\"markdown\",ext:[\"markdown\",\"md\",\"mkd\"]},{name:\"MySQL\",mime:\"text/x-mysql\",mode:\"sql\"},{name:\"Plain Text\",mime:\"text/plain\",mode:\"null\",ext:[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\"]},{name:\"Python\",mime:\"text/x-python\",mode:\"python\",ext:[\"BUILD\",\"bzl\",\"py\",\"pyw\"],file:/^(BUCK|BUILD)$/},{name:\"SCSS\",mime:\"text/x-scss\",mode:\"css\",ext:[\"scss\"]},{name:\"LaTeX\",mime:\"text/x-latex\",mode:\"stex\",ext:[\"text\",\"ltx\",\"tex\"],alias:[\"tex\"]},{name:\"TiddlyWiki \",mime:\"text/x-tiddlywiki\",mode:\"tiddlywiki\"}];for(var t=0;t<e.modeInfo.length;t++){var m=e.modeInfo[t];m.mimes&&(m.mime=m.mimes[0])}e.findModeByMIME=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.mime==t)return i;if(i.mimes)for(var a=0;a<i.mimes.length;a++)if(i.mimes[a]==t)return i}return/\\+xml$/.test(t)?e.findModeByMIME(\"application/xml\"):/\\+json$/.test(t)?e.findModeByMIME(\"application/json\"):void 0},e.findModeByExtension=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.ext)for(var a=0;a<i.ext.length;a++)if(i.ext[a]==t)return i}},e.findModeByFileName=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.file&&i.file.test(t))return i}var a=t.lastIndexOf(\".\"),o=a>-1&&t.substring(a+1,t.length);if(o)return e.findModeByExtension(o)},e.findModeByName=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.name.toLowerCase()==t)return i;if(i.alias)for(var a=0;a<i.alias.length;a++)if(i.alias[a].toLowerCase()==t)return i}}});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/keyboard": {
"title": "$:/plugins/tiddlywiki/codemirror/keyboard",
"text": "\n!!Default keyboard shortcuts\n\n!!!Basic shortcuts\n\n|Shortcut |Function |h\n|Left |goCharLeft |\n|Right |goCharRight |\n|Up |goLineUp |\n|Down |goLineDown |\n|End |goLineEnd |\n|Home |goLineStartSmart |\n|~PageUp |goPageUp |\n|~PageDown |goPageDown |\n|Delete |delCharAfter |\n|Backspace |delCharBefore |\n|Shift-Backspace |delCharBefore |\n|Tab |defaultTab |\n|Shift-Tab |indentAuto |\n|Enter |newlineAndIndent |\n|Insert |toggleOverwrite |\n|Ctrl-Esc |singleSelection |\n\n\n!!!Shortcuts on Windows and Linux\n\n|Shortcut |Function |h\n|Ctrl-A |selectAll |\n|Ctrl-D |deleteLine |\n|Ctrl-Z |undo |\n|Shift-Ctrl-Z |redo |\n|Ctrl-Y |redo |\n|Ctrl-Home |goDocStart |\n|Ctrl-End |goDocEnd |\n|Ctrl-Up |goLineUp |\n|Ctrl-Down |goLineDown |\n|Ctrl-Left |goGroupLeft |\n|Ctrl-Right |goGroupRight |\n|Alt-Left |goLineStart |\n|Alt-Right |goLineEnd |\n|Ctrl-Backspace |delGroupBefore |\n|Ctrl-Delete |delGroupAfter |\n|Ctrl-F |find |\n|Ctrl-G |findNext |\n|Shift-Ctrl-G |findPrev |\n|Shift-Ctrl-F |replace |\n|Shift-Ctrl-R |replaceAll |\n|Ctrl-[ |indentLess |\n|Ctrl-] |indentMore |\n|Alt-U |undoSelection |\n|Shift-Ctrl-U |redoSelection |\n|Shift-Alt-U |redoSelection |\n\n\n!!!Shortcuts on ~MacOs\n\n|Shortcut |Function |h\n|Cmd-A |selectAll |\n|Cmd-D |deleteLine |\n|Cmd-Z |undo |\n|Shift-Cmd-Z |redo |\n|Cmd-Y |redo |\n|Cmd-Home |goDocStart |\n|Cmd-Up |goDocStart |\n|Cmd-End |goDocEnd |\n|Cmd-Down |goDocEnd |\n|Alt-Left |goGroupLeft |\n|Alt-Right |goGroupRight |\n|Cmd-Left |goLineLeft |\n|Cmd-Right |goLineRight |\n|Alt-Backspace |delGroupBefore |\n|Ctrl-Alt-Backspace |delGroupAfter |\n|Alt-Delete |delGroupAfter |\n|Cmd-F |find |\n|Cmd-G |findNext |\n|Shift-Cmd-G |findPrev |\n|Cmd-Alt-F |replace |\n|Shift-Cmd-Alt-F |replaceAll |\n|Cmd-[ |indentLess |\n|Cmd-] |indentMore |\n|Cmd-Backspace |delWrappedLineLeft |\n|Cmd-Delete |delWrappedLineRight |\n|Alt-U |undoSelection |\n|Shift-Alt-U |redoSelection |\n|Ctrl-Up |goDocStart |\n|Ctrl-Down |goDocEnd |\n|Ctrl-F |goCharRight |\n|Ctrl-B |goCharLeft |\n|Ctrl-P |goLineUp |\n|Ctrl-N |goLineDown |\n|Alt-F |goWordRight |\n|Alt-B |goWordLeft |\n|Ctrl-A |goLineStart |\n|Ctrl-E |goLineEnd |\n|Ctrl-V |goPageDown |\n|Shift-Ctrl-V |goPageUp |\n|Ctrl-D |delCharAfter |\n|Ctrl-H |delCharBefore |\n|Alt-D |delWordAfter |\n|Alt-Backspace |delWordBefore |\n|Ctrl-K |killLine |\n|Alt-T |transposeChars |\n|Ctrl-O |openLine |\n\n\n"
},
"$:/plugins/tiddlywiki/codemirror/license": {
"title": "$:/plugins/tiddlywiki/codemirror/license",
"text": "\"\"\"\n~CodeMirror, copyright (c) by Marijn Haverbeke and others\nDistributed under an MIT license: http://codemirror.net/LICENSE\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2018, UnaMesa Association\nDistributed under an BSD license: https://tiddlywiki.com/#License\n\"\"\"\n"
},
"$:/plugins/tiddlywiki/codemirror/readme": {
"title": "$:/plugins/tiddlywiki/codemirror/readme",
"text": "This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. The basic configuration is designed to be as lightweight as possible and is just around 235kb of size. Additional features can be installed with ~CodeMirror ~AddOns from the plugin library.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]]\n\nBased on ~CodeMirror version 5.37.0\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/editorFont": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/editorFont",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/editorFont/hint}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/keyMap": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/keyMap",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/keyMap/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/keyMap\n\n<$link to=\"$:/config/codemirror/keyMap\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/keyMap\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]module-type[codemirror-keymap]!has[draft.of]get[text]]\">\n<option value=<<currentTiddler>>><$transclude><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineNumbers/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineNumbers/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineNumbers\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/lineNumbers\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineWrapping/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineWrapping/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineWrapping\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/lineWrapping\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/showCursorWhenSelecting/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/showCursorWhenSelecting/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/showCursorWhenSelecting\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/showCursorWhenSelecting\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/styleActiveLine/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/styleActiveLine/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/styleActiveLine\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/styleActiveLine\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/theme": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/theme",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/theme/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/\n\n<$link to=\"$:/config/codemirror/theme\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/theme\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]module-type[codemirror-theme]!has[draft.of]get[name]]\">\n<option value=<<currentTiddler>>><$transclude field=\"name\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n//see the [[CodeMirror Usage|$:/plugins/tiddlywiki/codemirror/usage]] how to add themes//\n"
},
"$:/plugins/tiddlywiki/codemirror/styles": {
"title": "$:/plugins/tiddlywiki/codemirror/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Make the editor resize to fit its content */\n\n.CodeMirror {\n\theight: auto;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.5;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n}\n\n.CodeMirror-scroll {\n\toverflow-x: auto;\n\toverflow-y: hidden;\t\n}\n"
},
"$:/core/ui/ControlPanel/Settings/CodeMirror": {
"title": "$:/core/ui/ControlPanel/Settings/CodeMirror",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "CodeMirror",
"list-after": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"text": "\\define lingo-base() $:/language/codemirror/controlPanel/\n\n<<lingo hint>>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/usage\"><<lingo usage>></$link>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/keyboard\"><<lingo keyboard>></$link>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings/CodeMirror]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Settings/TiddlyWiki\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Settings/TiddlyWiki": {
"title": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "TiddlyWiki",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/codemirror/usage": {
"title": "$:/plugins/tiddlywiki/codemirror/usage",
"text": "! Configuration\n\nConfiguration for the ~CodeMirror text-editor can be done from within the CodeMirror Settings Tab in the [[ControlPanel|$:/ControlPanel]] (Settings - ~CodeMirror)\n\n\n!!Setting a different Theme\n\n~CodeMirror themes are available in the [ext[official GitHub repository|https://github.com/codemirror/CodeMirror/tree/master/theme]]\n\nMore themes can be found at https://github.com/FarhadG/code-mirror-themes/tree/master/themes and previewed [ext[here|http://farhadg.github.io/code-mirror-themes/]]\n\n\nTo add a theme to your wiki, follow these four steps:\n\n* choose one of the CSS files and copy its content to a new tiddler\n* remove all comments from the top and tag the tiddler with <<tag-pill \"$:/tags/Stylesheet\">>\n* add a field \"module-type\" with the value \"codemirror-theme\". add a field \"name\" with the exact ''name'' of the theme as value\n* save the tiddler and go to the Settings tab in $:/ControlPanel - look for the \"theme\" dropdown to select your newly added theme\n\n\n!!Line Numbers\n\nTo show or hide the Line Numbers at the left, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Numbers\" checkbox\n\n\n!!Line Wrapping\n\nControls if long lines get visually wrapped to a new line if they're too long to fit the editor width or if the editor should scroll horizontally\n\nTo change the line-wrapping behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Wrapping\" checkbox\n\n\n!!Show Cursor when selecting\n\nDefines whether the Mouse cursor should be visually shown or hidden when making a text-selection\n\nTo change the show-cursor-when-selecting behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Show cursor when selecting\" checkbox\n\n\n!!~CodeMirror Font Family\n\nThe Font-Family used within the ~CodeMirror text-editor defaults to \"monospace\" which will choose your configured monospace system-font\n\nThat setting can be overridden entering one or more Font-Families in the \"Font Family\" input field at ~ControlPanel - Settings - ~CodeMirror\n\n* The entries must be separated by semicolons ','\n* Font-Family Names that contain spaces must be quoted like \"My Font\"\n* If a list of Font-Families is specified, the last Font-Family found on the user-system gets used, non-existing fonts get ignored\n* If none of the specified Font-Families is available, ~CodeMirror uses the default \"monospace\"\n\n\n!!\"Hidden\" Settings:\n\n!!!Cursor Blink Rate\n\nThe cursor blink-rate defines how fast (in milliseconds) the cursor blinks inside the textarea\n\nYou can change it by editing $:/config/codemirror/cursorBlinkRate\n\"0\" disables blinking\n\n!!!Tabsize\n\nThe Tabsize defines the width of a tab character. Default is 4.\n\nYou can change it by editing $:/config/codemirror/tabSize\n\n!!!Indent Unit\n\nNot enabled for vnd.tiddlywiki and x-tiddlywiki\n\nDefines how many spaces a text-block should be indented. Defaults to 2.\n\nYou can change it by editing $:/config/codemirror/indentUnit\n\n"
}
}
}
{
"tiddlers": {
"$:/config/codemirror/autoCloseTags": {
"title": "$:/config/codemirror/autoCloseTags",
"type": "bool",
"text": "true\n"
},
"$:/language/codemirror/autoCloseTags/hint": {
"title": "$:/language/codemirror/autoCloseTags/hint",
"text": "Auto-close tags"
},
"$:/language/codemirror/autoCloseTags/info": {
"title": "$:/language/codemirror/autoCloseTags/info",
"text": "Whether or not to automatically close tags"
},
"$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var n=e.Pos;function t(e,n){return e.line-n.line||e.ch-n.ch}var i=\"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",r=new RegExp(\"<(/?)([\"+i+\"][A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD-:.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*)\",\"g\");function u(e,n,t,i){this.line=n,this.ch=t,this.cm=e,this.text=e.getLine(n),this.min=i?Math.max(i.from,e.firstLine()):e.firstLine(),this.max=i?Math.min(i.to-1,e.lastLine()):e.lastLine()}function f(e,t){var i=e.cm.getTokenTypeAt(n(e.line,t));return i&&/\\btag\\b/.test(i)}function o(e){if(!(e.line>=e.max))return e.ch=0,e.text=e.cm.getLine(++e.line),!0}function l(e){if(!(e.line<=e.min))return e.text=e.cm.getLine(--e.line),e.ch=e.text.length,!0}function c(e){for(;;){var n=e.text.indexOf(\">\",e.ch);if(-1==n){if(o(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf(\"/\",n),i=t>-1&&!/\\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?\"selfClose\":\"regular\"}e.ch=n+1}}function a(e){for(;;){var n=e.ch?e.text.lastIndexOf(\"<\",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){r.lastIndex=n,e.ch=n;var t=r.exec(e.text);if(t&&t.index==n)return t}else e.ch=n}}function s(e){for(;;){r.lastIndex=e.ch;var n=r.exec(e.text);if(!n){if(o(e))continue;return}if(f(e,n.index+1))return e.ch=n.index+n[0].length,n;e.ch=n.index+1}}function h(e){for(;;){var n=e.ch?e.text.lastIndexOf(\">\",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf(\"/\",n),i=t>-1&&!/\\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?\"selfClose\":\"regular\"}e.ch=n}}function F(e,t){for(var i=[];;){var r,u=s(e),f=e.line,o=e.ch-(u?u[0].length:0);if(!u||!(r=c(e)))return;if(\"selfClose\"!=r)if(u[1]){for(var l=i.length-1;l>=0;--l)if(i[l]==u[2]){i.length=l;break}if(l<0&&(!t||t==u[2]))return{tag:u[2],from:n(f,o),to:n(e.line,e.ch)}}else i.push(u[2])}}function x(e,t){for(var i=[];;){var r=h(e);if(!r)return;if(\"selfClose\"!=r){var u=e.line,f=e.ch,o=a(e);if(!o)return;if(o[1])i.push(o[2]);else{for(var l=i.length-1;l>=0;--l)if(i[l]==o[2]){i.length=l;break}if(l<0&&(!t||t==o[2]))return{tag:o[2],from:n(e.line,e.ch),to:n(u,f)}}}else a(e)}}e.registerHelper(\"fold\",\"xml\",function(e,i){for(var r=new u(e,i.line,0);;){var f=s(r);if(!f||r.line!=i.line)return;var o=c(r);if(!o)return;if(!f[1]&&\"selfClose\"!=o){var l=n(r.line,r.ch),a=F(r,f[2]);return a&&t(a.from,l)>0?{from:l,to:a.from}:null}}}),e.findMatchingTag=function(e,i,r){var f=new u(e,i.line,i.ch,r);if(-1!=f.text.indexOf(\">\")||-1!=f.text.indexOf(\"<\")){var o=c(f),l=o&&n(f.line,f.ch),s=o&&a(f);if(o&&s&&!(t(f,i)>0)){var h={from:n(f.line,f.ch),to:l,tag:s[2]};return\"selfClose\"==o?{open:h,close:null,at:\"open\"}:s[1]?{open:x(f,s[2]),close:h,at:\"close\"}:{open:h,close:F(f=new u(e,l.line,l.ch,r),s[2]),at:\"open\"}}}},e.findEnclosingTag=function(e,n,t,i){for(var r=new u(e,n.line,n.ch,t);;){var f=x(r,i);if(!f)break;var o=F(new u(e,n.line,n.ch,t),f.tag);if(o)return{open:f,close:o}}},e.scanForClosingTag=function(e,n,t,i){return F(new u(e,n.line,n.ch,i?{from:0,to:i}:null),t)}});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/edit/closetag.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../fold/xml-fold\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../fold/xml-fold\"],e):e(CodeMirror)}(function(e){e.defineOption(\"autoCloseTags\",!1,function(i,s,l){if(l!=e.Init&&l&&i.removeKeyMap(\"autoCloseTags\"),s){var d={name:\"autoCloseTags\"};(\"object\"!=typeof s||s.whenClosing)&&(d[\"'/'\"]=function(t){return(n=t).getOption(\"disableInput\")?e.Pass:o(n,!0);var n}),(\"object\"!=typeof s||s.whenOpening)&&(d[\"'>'\"]=function(o){return function(o){if(o.getOption(\"disableInput\"))return e.Pass;for(var i=o.listSelections(),s=[],l=o.getOption(\"autoCloseTags\"),d=0;d<i.length;d++){if(!i[d].empty())return e.Pass;var c=i[d].head,f=o.getTokenAt(c),g=e.innerMode(o.getMode(),f.state),u=g.state;if(\"xml\"!=g.mode.name||!u.tagName)return e.Pass;var m=\"html\"==g.mode.configuration,h=\"object\"==typeof l&&l.dontCloseTags||m&&t,p=\"object\"==typeof l&&l.indentTags||m&&n,v=u.tagName;f.end>c.ch&&(v=v.slice(0,v.length-f.end+c.ch));var b=v.toLowerCase();if(!v||\"string\"==f.type&&(f.end!=c.ch||!/[\\\"\\']/.test(f.string.charAt(f.string.length-1))||1==f.string.length)||\"tag\"==f.type&&\"closeTag\"==u.type||f.string.indexOf(\"/\")==f.string.length-1||h&&a(h,b)>-1||r(o,v,c,u,!0))return e.Pass;var y=p&&a(p,b)>-1;s[d]={indent:y,text:\">\"+(y?\"\\n\\n\":\"\")+\"</\"+v+\">\",newPos:y?e.Pos(c.line+1,0):e.Pos(c.line,c.ch+1)}}for(var x=\"object\"==typeof l&&l.dontIndentOnAutoClose,d=i.length-1;d>=0;d--){var P=s[d];o.replaceRange(P.text,i[d].head,i[d].anchor,\"+insert\");var T=o.listSelections().slice(0);T[d]={head:P.newPos,anchor:P.newPos},o.setSelections(T),!x&&P.indent&&(o.indentLine(P.newPos.line,null,!0),o.indentLine(P.newPos.line+1,null,!0))}}(o)}),i.addKeyMap(d)}});var t=[\"area\",\"base\",\"br\",\"col\",\"command\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"param\",\"source\",\"track\",\"wbr\"],n=[\"applet\",\"blockquote\",\"body\",\"button\",\"div\",\"dl\",\"fieldset\",\"form\",\"frameset\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"html\",\"iframe\",\"layer\",\"legend\",\"object\",\"ol\",\"p\",\"select\",\"table\",\"ul\"];function o(t,n){for(var o=t.listSelections(),a=[],i=n?\"/\":\"</\",s=t.getOption(\"autoCloseTags\"),l=\"object\"==typeof s&&s.dontIndentOnSlash,d=0;d<o.length;d++){if(!o[d].empty())return e.Pass;var c,f=o[d].head,g=t.getTokenAt(f),u=e.innerMode(t.getMode(),g.state),m=u.state;if(n&&(\"string\"==g.type||\"<\"!=g.string.charAt(0)||g.start!=f.ch-1))return e.Pass;if(\"xml\"!=u.mode.name)if(\"htmlmixed\"==t.getMode().name&&\"javascript\"==u.mode.name)c=i+\"script\";else{if(\"htmlmixed\"!=t.getMode().name||\"css\"!=u.mode.name)return e.Pass;c=i+\"style\"}else{if(!m.context||!m.context.tagName||r(t,m.context.tagName,f,m))return e.Pass;c=i+m.context.tagName}\">\"!=t.getLine(f.line).charAt(g.end)&&(c+=\">\"),a[d]=c}if(t.replaceSelections(a),o=t.listSelections(),!l)for(d=0;d<o.length;d++)(d==o.length-1||o[d].head.line<o[d+1].head.line)&&t.indentLine(o[d].head.line)}function a(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;++n)if(e[n]==t)return n;return-1}function r(t,n,o,a,r){if(!e.scanForClosingTag)return!1;var i=Math.min(t.lastLine()+1,o.line+500),s=e.scanForClosingTag(t,o,null,i);if(!s||s.tag!=n)return!1;for(var l=a.context,d=r?1:0;l&&l.tagName==n;l=l.prev)++d;o=s.to;for(var c=1;c<d;c++){var f=e.scanForClosingTag(t,o,null,i);if(!f||f.tag!=n)return!1;o=f.to}return!0}e.commands.closeTag=function(e){return o(e)}});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/edit/closetag.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-closetag/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-closetag/readme",
"text": "This plugin adds the ability to ''automatically close Tags''. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/autoCloseTags": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/autoCloseTags",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/autoCloseTags/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/autoCloseTags/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/autoCloseTags\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/autoCloseTags\"><<lingo info>></$link> </$checkbox>\n\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/codemirror/addon/search/search.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"./searchcursor\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./searchcursor\",\"../dialog/dialog\"],e):e(CodeMirror)}(function(e){\"use strict\";function o(e){return e.state.search||(e.state.search=new function(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null})}function n(e){return\"string\"==typeof e&&e==e.toLowerCase()}function r(e,o,r){return e.getSearchCursor(o,r,{caseFold:n(o),multiline:!0})}function t(e,o,n,r,t){e.openDialog?e.openDialog(o,t,{value:r,selectValueOnOpen:!0}):t(prompt(n,r))}function i(e){return e.replace(/\\\\(.)/g,function(e,o){return\"n\"==o?\"\\n\":\"r\"==o?\"\\r\":o})}function a(e){var o=e.match(/^\\/(.*)\\/([a-z]*)$/);if(o)try{e=new RegExp(o[1],-1==o[2].indexOf(\"i\")?\"\":\"i\")}catch(e){}else e=i(e);return(\"string\"==typeof e?\"\"==e:e.test(\"\"))&&(e=/x^/),e}var s='<span class=\"CodeMirror-search-label\">Search:</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>';function c(e,o,r){var t,i;o.queryText=r,o.query=a(r),e.removeOverlay(o.overlay,n(o.query)),o.overlay=(t=o.query,i=n(o.query),\"string\"==typeof t?t=new RegExp(t.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\"),i?\"gi\":\"g\"):t.global||(t=new RegExp(t.source,t.ignoreCase?\"gi\":\"g\")),{token:function(e){t.lastIndex=e.pos;var o=t.exec(e.string);if(o&&o.index==e.pos)return e.pos+=o[0].length||1,\"searching\";o?e.pos=o.index:e.skipToEnd()}}),e.addOverlay(o.overlay),e.showMatchesOnScrollbar&&(o.annotate&&(o.annotate.clear(),o.annotate=null),o.annotate=e.showMatchesOnScrollbar(o.query,n(o.query)))}function l(n,r,i,a){var l=o(n);if(l.query)return u(n,r);var p,d,y,m,g,h=n.getSelection()||l.lastQuery;if(h instanceof RegExp&&\"x^\"==h.source&&(h=null),i&&n.openDialog){var v=null,x=function(o,r){e.e_stop(r),o&&(o!=l.queryText&&(c(n,l,o),l.posFrom=l.posTo=n.getCursor()),v&&(v.style.opacity=1),u(n,r.shiftKey,function(e,o){var r;o.line<3&&document.querySelector&&(r=n.display.wrapper.querySelector(\".CodeMirror-dialog\"))&&r.getBoundingClientRect().bottom-4>n.cursorCoords(o,\"window\").top&&((v=r).style.opacity=.4)}))};d=s,y=h,m=x,g=function(r,t){var i=e.keyName(r),a=n.getOption(\"extraKeys\"),s=a&&a[i]||e.keyMap[n.getOption(\"keyMap\")][i];\"findNext\"==s||\"findPrev\"==s||\"findPersistentNext\"==s||\"findPersistentPrev\"==s?(e.e_stop(r),c(n,o(n),t),n.execCommand(s)):\"find\"!=s&&\"findPersistent\"!=s||(e.e_stop(r),x(t,r))},(p=n).openDialog(d,m,{value:y,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){f(p)},onKeyDown:g}),a&&h&&(c(n,l,h),u(n,r))}else t(n,s,\"Search for:\",h,function(e){e&&!l.query&&n.operation(function(){c(n,l,e),l.posFrom=l.posTo=n.getCursor(),u(n,r)})})}function u(n,t,i){n.operation(function(){var a=o(n),s=r(n,a.query,t?a.posFrom:a.posTo);(s.find(t)||(s=r(n,a.query,t?e.Pos(n.lastLine()):e.Pos(n.firstLine(),0))).find(t))&&(n.setSelection(s.from(),s.to()),n.scrollIntoView({from:s.from(),to:s.to()},20),a.posFrom=s.from(),a.posTo=s.to(),i&&i(s.from(),s.to()))})}function f(e){e.operation(function(){var n=o(e);n.lastQuery=n.query,n.query&&(n.query=n.queryText=null,e.removeOverlay(n.overlay),n.annotate&&(n.annotate.clear(),n.annotate=null))})}var p=' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>',d='<span class=\"CodeMirror-search-label\">With:</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/>',y='<span class=\"CodeMirror-search-label\">Replace?</span> <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>';function m(e,o,n){e.operation(function(){for(var t=r(e,o);t.findNext();)if(\"string\"!=typeof o){var i=e.getRange(t.from(),t.to()).match(o);t.replace(n.replace(/\\$(\\d)/g,function(e,o){return i[o]}))}else t.replace(n)})}function g(e,n){if(!e.getOption(\"readOnly\")){var s=e.getSelection()||o(e).lastQuery,c='<span class=\"CodeMirror-search-label\">'+(n?\"Replace all:\":\"Replace:\")+\"</span>\";t(e,c+p,c,s,function(o){o&&(o=a(o),t(e,d,\"Replace with:\",\"\",function(t){if(t=i(t),n)m(e,o,t);else{f(e);var a=r(e,o,e.getCursor(\"from\")),s=function(){var n,i,l,u,f,p=a.from();!(n=a.findNext())&&(a=r(e,o),!(n=a.findNext())||p&&a.from().line==p.line&&a.from().ch==p.ch)||(e.setSelection(a.from(),a.to()),e.scrollIntoView({from:a.from(),to:a.to()}),l=y,u=\"Replace?\",f=[function(){c(n)},s,function(){m(e,o,t)}],(i=e).openConfirm?i.openConfirm(l,f):confirm(u)&&f[0]())},c=function(e){a.replace(\"string\"==typeof o?t:t.replace(/\\$(\\d)/g,function(o,n){return e[n]})),s()};s()}}))})}}e.commands.find=function(e){f(e),l(e)},e.commands.findPersistent=function(e){f(e),l(e,!1,!0)},e.commands.findPersistentNext=function(e){l(e,!1,!0,!0)},e.commands.findPersistentPrev=function(e){l(e,!0,!0,!0)},e.commands.findNext=l,e.commands.findPrev=function(e){l(e,!0)},e.commands.clearSearch=f,e.commands.replace=g,e.commands.replaceAll=function(e){g(e,!0)}});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/search.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/search/jump-to-line.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../dialog/dialog\"],e):e(CodeMirror)}(function(e){\"use strict\";function o(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.commands.jumpToLine=function(e){var r,i,t,s,n,l=e.getCursor();r=e,i='Jump to line: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use line:column or scroll% syntax)</span>',t=\"Jump to line:\",s=l.line+1+\":\"+l.ch,n=function(r){var i;if(r)if(i=/^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(r))e.setCursor(o(e,i[1]),Number(i[2]));else if(i=/^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(r)){var t=Math.round(e.lineCount()*Number(i[1])/100);/^[-+]/.test(i[1])&&(t=l.line+t+1),e.setCursor(t-1,l.ch)}else(i=/^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(r))&&e.setCursor(o(e,i[1]),l.ch)},r.openDialog?r.openDialog(i,n,{value:s,selectValueOnOpen:!0}):n(prompt(t,s))},e.keyMap.default[\"Alt-G\"]=\"jumpToLine\"});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/jump-to-line.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){\"use strict\";var e,n,r=t.Pos;function i(t,e){for(var n,r,i=null!=(r=(n=t).flags)?r:(n.ignoreCase?\"i\":\"\")+(n.global?\"g\":\"\")+(n.multiline?\"m\":\"\"),o=i,l=0;l<e.length;l++)-1==o.indexOf(e.charAt(l))&&(o+=e.charAt(l));return i==o?t:new RegExp(t.source,o)}function o(t,e,n){e=i(e,\"g\");for(var o=n.line,l=n.ch,h=t.lastLine();o<=h;o++,l=0){e.lastIndex=l;var s=t.getLine(o),c=e.exec(s);if(c)return{from:r(o,c.index),to:r(o,c.index+c[0].length),match:c}}}function l(t,e){for(var n,r=0;;){e.lastIndex=r;var i=e.exec(t);if(!i)return n;if((r=(n=i).index+(n[0].length||1))==t.length)return n}}function h(t,e,n,r){if(t.length==e.length)return n;for(var i=0,o=n+Math.max(0,t.length-e.length);;){if(i==o)return i;var l=i+o>>1,h=r(t.slice(0,l)).length;if(h==n)return l;h>n?o=l:i=l+1}}function s(t,s,c,f){var u;this.atOccurrence=!1,this.doc=t,c=c?t.clipPos(c):r(0,0),this.pos={from:c,to:c},\"object\"==typeof f?u=f.caseFold:(u=f,f=null),\"string\"==typeof s?(null==u&&(u=!1),this.matches=function(i,o){return(i?function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\\r|\\n\\r?/);t:for(var f=o.line,u=o.ch,a=t.firstLine()-1+c.length;f>=a;f--,u=-1){var g=t.getLine(f);u>-1&&(g=g.slice(0,u));var m=s(g);if(1==c.length){var d=m.lastIndexOf(c[0]);if(-1==d)continue t;return{from:r(f,h(g,m,d,s)),to:r(f,h(g,m,d+c[0].length,s))}}var v=c[c.length-1];if(m.slice(0,v.length)==v){var p=1;for(o=f-c.length+1;p<c.length-1;p++)if(s(t.getLine(o+p))!=c[p])continue t;var x=t.getLine(f+1-c.length),L=s(x);if(L.slice(L.length-c[0].length)==c[0])return{from:r(f+1-c.length,h(x,L,x.length-c[0].length,s)),to:r(f,h(g,m,v.length,s))}}}}:function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\\r|\\n\\r?/);t:for(var f=o.line,u=o.ch,a=t.lastLine()+1-c.length;f<=a;f++,u=0){var g=t.getLine(f).slice(u),m=s(g);if(1==c.length){var d=m.indexOf(c[0]);if(-1==d)continue t;return o=h(g,m,d,s)+u,{from:r(f,h(g,m,d,s)+u),to:r(f,h(g,m,d+c[0].length,s)+u)}}var v=m.length-c[0].length;if(m.slice(v)==c[0]){for(var p=1;p<c.length-1;p++)if(s(t.getLine(f+p))!=c[p])continue t;var x=t.getLine(f+c.length-1),L=s(x),C=c[c.length-1];if(L.slice(0,C.length)==C)return{from:r(f,h(g,m,v,s)+u),to:r(f+c.length-1,h(x,L,C.length,s))}}}})(t,s,o,u)}):(s=i(s,\"gm\"),f&&!1===f.multiline?this.matches=function(e,n){return(e?function(t,e,n){e=i(e,\"g\");for(var o=n.line,h=n.ch,s=t.firstLine();o>=s;o--,h=-1){var c=t.getLine(o);h>-1&&(c=c.slice(0,h));var f=l(c,e);if(f)return{from:r(o,f.index),to:r(o,f.index+f[0].length),match:f}}}:o)(t,s,n)}:this.matches=function(e,n){return(e?function(t,e,n){e=i(e,\"gm\");for(var o,h=1,s=n.line,c=t.firstLine();s>=c;){for(var f=0;f<h;f++){var u=t.getLine(s--);o=null==o?u.slice(0,n.ch):u+\"\\n\"+o}h*=2;var a=l(o,e);if(a){var g=o.slice(0,a.index).split(\"\\n\"),m=a[0].split(\"\\n\"),d=s+g.length,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}}:function(t,e,n){if(!/\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(e.source))return o(t,e,n);e=i(e,\"gm\");for(var l,h=1,s=n.line,c=t.lastLine();s<=c;){for(var f=0;f<h&&!(s>c);f++){var u=t.getLine(s++);l=null==l?u:l+\"\\n\"+u}h*=2,e.lastIndex=n.ch;var a=e.exec(l);if(a){var g=l.slice(0,a.index).split(\"\\n\"),m=a[0].split(\"\\n\"),d=n.line+g.length-1,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}})(t,s,n)})}String.prototype.normalize?(e=function(t){return t.normalize(\"NFD\").toLowerCase()},n=function(t){return t.normalize(\"NFD\")}):(e=function(t){return t.toLowerCase()},n=function(t){return t}),s.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(e){for(var n=this.matches(e,this.doc.clipPos(e?this.pos.from:this.pos.to));n&&0==t.cmpPos(n.from,n.to);)e?n.from.ch?n.from=r(n.from.line,n.from.ch-1):n=n.from.line==this.doc.firstLine()?null:this.matches(e,this.doc.clipPos(r(n.from.line-1))):n.to.ch<this.doc.getLine(n.to.line).length?n.to=r(n.to.line,n.to.ch+1):n=n.to.line==this.doc.lastLine()?null:this.matches(e,r(n.to.line+1,0));if(n)return this.pos=n,this.atOccurrence=!0,this.pos.match||!0;var i=r(e?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:i,to:i},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(e,n){if(this.atOccurrence){var i=t.splitLines(e);this.doc.replaceRange(i,this.pos.from,this.pos.to,n),this.pos.to=r(this.pos.from.line+i.length-1,i[i.length-1].length+(1==i.length?this.pos.from.ch:0))}}},t.defineExtension(\"getSearchCursor\",function(t,e,n){return new s(this.doc,t,e,n)}),t.defineDocExtension(\"getSearchCursor\",function(t,e,n){return new s(this,t,e,n)}),t.defineExtension(\"selectMatches\",function(e,n){for(var r=[],i=this.getSearchCursor(e,this.getCursor(\"from\"),n);i.findNext()&&!(t.cmpPos(i.to(),this.getCursor(\"to\"))>0);)r.push({anchor:i.from(),head:i.to()});r.length&&this.setSelections(r,0)})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-search-replace/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-search-replace/readme",
"text": "This plugin enhances the [[CodeMirror|http://codemirror.net]] text editor with Search and Replace functionality. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\nIt adds these Keyboard Shortcuts to ~CodeMirror:\n\n|Shortcut |Function |h\n|Ctrl-F / Cmd-F |Start searching |\n|Ctrl-G / Cmd-G / Shift-F3 |Find next |\n|Shift-Ctrl-G / Shift-Cmd-G / F3 |Find previous |\n|Shift-Ctrl-F / Cmd-Option-F |Replace |\n|Shift-Ctrl-R / Shift-Cmd-Option-F |Replace all |\n|Alt-F |Persistent search (dialog doesn't autoclose, enter to find next, Shift-Enter to find previous) |\n|Alt-G |Jump to line |\n\n"
}
}
}
{
"tiddlers": {
"$:/config/DefaultColourMappings/menubar-foreground": {
"title": "$:/config/DefaultColourMappings/menubar-foreground",
"text": "#fff"
},
"$:/config/DefaultColourMappings/menubar-background": {
"title": "$:/config/DefaultColourMappings/menubar-background",
"text": "#5778d8"
},
"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols": {
"title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols",
"text": "hide"
},
"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server": {
"title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server",
"text": "hide"
},
"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar": {
"title": "$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar",
"text": "hide"
},
"$:/config/plugins/menubar/breakpoint": {
"title": "$:/config/plugins/menubar/breakpoint",
"text": "620px"
},
"$:/plugins/tiddlywiki/menubar/config": {
"title": "$:/plugins/tiddlywiki/menubar/config",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "Menu Bar",
"text": "\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\n\n! Menu Bar Configuration\n\n!! Menu Items\n\nSelect which menu items will be shown. You can also drag items to reorder them.\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/MenuBar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n\n!! Breakpoint Position\n\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\n\n<$edit-text tiddler=\"$:/config/plugins/menubar/breakpoint\" default=\"\" tag=\"input\"/>\n\n!! Menu Bar Colours\n\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\n"
},
"$:/plugins/tiddlywiki/menubar/items/contents": {
"title": "$:/plugins/tiddlywiki/menubar/items/contents",
"caption": "Contents",
"description": "Table of Contents",
"is-dropdown": "yes",
"tags": "$:/tags/MenuBar",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>\n"
},
"$:/plugins/tiddlywiki/menubar/items/hamburger": {
"title": "$:/plugins/tiddlywiki/menubar/items/hamburger",
"tags": "$:/tags/MenuBar",
"caption": "Hamburger",
"description": "Show the full menu bar on a narrow screen",
"custom-menu-content": "{{$:/plugins/tiddlywiki/menubar/items/hamburger}}",
"show-when": "narrow",
"text": "<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"yes\">\n{{$:/core/images/menu-button}}\n</$button>\n</$list>\n<$list filter=\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\">\n<$button set=\"$:/state/popup/menubar/hamburger\" setTo=\"no\">\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n"
},
"$:/plugins/tiddlywiki/menubar/items/pagecontrols": {
"title": "$:/plugins/tiddlywiki/menubar/items/pagecontrols",
"tags": "$:/tags/MenuBar",
"description": "Page controls from the sidebar",
"caption": "Page controls",
"custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\" mode=\"inline\"/>",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n"
},
"$:/plugins/tiddlywiki/menubar/items/search": {
"title": "$:/plugins/tiddlywiki/menubar/items/search",
"custom-menu-content": "{{$:/plugins/tiddlywiki/menubar/items/search}}",
"description": "Search",
"caption": "Search",
"tags": "$:/tags/MenuBar",
"text": "<$set name=\"searchTiddler\" value=\"$:/temp/menubarsearch\">\n\n<span style=\"margin: 0 0.5em;\">\n\n<$edit-text tiddler=<<searchTiddler>> tag=\"input\" type=\"search\" focusPopup=\"$:/state/popup/menubar-search-dropdown\" class=\"tc-popup-handle tc-menu-show-when-wide\" placeholder=\"Search...\" default=\"\"/>\n\n</span>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/state/popup/menubar-search-dropdown\" type=\"nomatch\" text=\"\" default=\"\">\n\n<div class=\"tc-block-dropdown tc-search-drop-down\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">Type your search terms</div>\"\"\" variable=\"ignore\">\n\n<$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n</$set>\n"
},
"$:/plugins/tiddlywiki/menubar/items/server": {
"title": "$:/plugins/tiddlywiki/menubar/items/server",
"tags": "$:/tags/MenuBar",
"description": "Server options",
"caption": "Server",
"custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/server\" mode=\"inline\"/>",
"text": "<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\" variable=\"ignore\">\n<$transclude tiddler=\"$:/core/ui/Buttons/save-wiki\" mode=\"inline\"/>\n</$list>\n<$list filter=\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\" variable=\"ignore\">\n<$button message=\"tm-login\">\nLogin\n</$button>\n</$list>\n"
},
"$:/plugins/tiddlywiki/menubar/items/sidebar": {
"title": "$:/plugins/tiddlywiki/menubar/items/sidebar",
"caption": "Sidebar",
"description": "Sidebar",
"is-dropdown": "yes",
"tags": "$:/tags/MenuBar",
"text": "<$scrollable fallthrough=\"none\" class=\"tc-popup-keep tc-menubar-dropdown-sidebar\">\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\" mode=\"inline\"/>\n\n</$scrollable>\n"
},
"$:/plugins/tiddlywiki/menubar/items/topleftbar": {
"title": "$:/plugins/tiddlywiki/menubar/items/topleftbar",
"tags": "$:/tags/MenuBar",
"description": "Items from $:/tags/TopLeftBar",
"caption": "Legacy Top Left Bar",
"custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/topleftbar\" mode=\"inline\"/>",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"
},
"$:/plugins/tiddlywiki/menubar/items/toprightbar": {
"title": "$:/plugins/tiddlywiki/menubar/items/toprightbar",
"tags": "$:/tags/MenuBar",
"description": "Items from $:/tags/TopRightBar",
"caption": "Legacy Top Right Bar",
"custom-menu-content": "<$transclude tiddler=\"$:/plugins/tiddlywiki/menubar/items/toprightbar\" mode=\"inline\"/>",
"custom-menu-styles-wide": "float: right;",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>"
},
"$:/plugins/tiddlywiki/menubar/menu": {
"title": "$:/plugins/tiddlywiki/menubar/menu",
"tags": "$:/tags/PageTemplate",
"text": "\\define menubar-inner(size)\n<ul class=\"tc-menubar-list\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$list filter=\"[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\" variable=\"ignore\">\n<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\n<$list filter=\"[<currentTiddler>!is-dropdown[yes]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Dropdown -->\n\t<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n\t<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n\t<$button popup=<<dropdown-state>> selectedClass=\"tc-selected\">\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t<$text text=\" \"/>\n\t<span class=\"tc-menubar-dropdown-arrow\">\n\t<$transclude tiddler=\"$:/core/images/down-arrow\" mode=\"inline\"/>\n\t</span>\n\t</$set>\n\t</$button>\n\t</$set>\n\t</$set>\n\"\"\">\n<$list filter=\"[<currentTiddler>has[custom-menu-content]]\" variable=\"listItem\" emptyMessage=\"\"\"\n\t<!-- Link -->\n\t<$link to={{!!target}}>\n\t<$set name=\"tv-wikilinks\" value=\"no\">\n\t<$transclude field=\"caption\" mode=\"inline\"/>\n\t</$set>\n\t</$link>\n\"\"\">\n<!-- Custom content -->\n<$transclude field=\"custom-menu-content\" mode=\"inline\"/>\n</$list>\n</$list>\n</li>\n</$list>\n</$list>\n</$list>\n</ul>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]\" variable=\"listItem\">\n<nav class=\"tc-menubar tc-adjust-top-of-scroll\">\n<div class=\"tc-menubar-narrow\">\n<<menubar-inner narrow>>\n</div>\n<div class=\"tc-menubar-wide\">\n<<menubar-inner wide>>\n</div>\n<div style=\"clear:both;\"/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\">\n<$list filter=\"[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\" variable=\"ignore\">\n<$set name=\"dropdown-state\" value=<<qualify \"$:/state/popup/topmenu/dropdown/\">>>\n<$set name=\"dropdown-state\" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>\n<$reveal type=\"popup\" state=<<dropdown-state>> class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag=\"div\">\n<div class=\"tc-drop-down\">\n<$transclude/>\n</div>\n</$reveal>\n</$set>\n</$set>\n</$list>\n</$list>\n</nav>\n</$list>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"text": "<!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"text": "<!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->"
},
"$:/plugins/tiddlywiki/menubar/readme": {
"title": "$:/plugins/tiddlywiki/menubar/readme",
"text": "!! Introduction\n\nThis plugin provides a menu bar with the following features:\n\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\n* Menu items can be individually enabled via the control panel\n* Responds to reduced screen width by abbreviating the menu items to a \"hamburger\" dropdown\n\n!! Menu Item Tiddlers\n\nMenu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by this plugin:\n\n|!Field Name |!Purpose |\n|title |Each menu item must have a unique title (not shown to the user) |\n|description |Description for use in listings |\n|tags |Must contain `$:/tags/MenuBar` |\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\n|target |For simple link menu items specifies a tiddler title as the target of the link |\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\n|text |For dropdown menu items, specifies the body of the dropdown |\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\n\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\n\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\n"
},
"$:/plugins/tiddlywiki/menubar/styles": {
"title": "$:/plugins/tiddlywiki/menubar/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define breakpoint-plus-one()\n<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] }}} />\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\nnav.tc-menubar {\n\tposition: fixed;\n\tz-index: 850;\n\tdisplay: inline-block;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\nnav.tc-menubar ul.tc-menubar-list {\n\tposition: relative;\n\tlist-style-type: none;\n\tmargin: 0;\n\tpadding: 0 0 0 42px;\n\tbackground: <<colour background>>;\n\tbackground: <<colour menubar-background>>;\n\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\thtml nav.tc-menubar ul.tc-menubar-list {\n\t\tpadding: 0 0 0 8px;\n\t}\n\n}\n\nnav.tc-menubar li.tc-menubar-item {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\n\tdisplay: block;\n}\n\nnav.tc-menubar li.tc-menubar-item > a,\nnav.tc-menubar li.tc-menubar-item > button {\n\tdisplay: inline-block;\n/*\ttext-transform: uppercase; */\n\tline-height: 1;\n\tfont-weight: 700;\n\tcolor: <<colour foreground>>;\n\tcolor: <<colour menubar-foreground>>;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n\ttext-decoration: none;\n\tpadding: 0.5em;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item svg {\n\ttransition: none;\n\twidth: 1em;\n\theight: 1em;\n\tfill: <<colour foreground>>;\n\tfill: <<colour menubar-foreground>>;\n}\n\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\n\twidth: 0.5em;\n\theight: 0.5em;\n}\n\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:hover,\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\nnav.tc-menubar li.tc-menubar-item > button:hover {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar li.tc-menubar-item > a:active,\nnav.tc-menubar li.tc-menubar-item > button:active svg,\nnav.tc-menubar li.tc-menubar-item > button:active {\n\tbackground: <<colour foreground>>;\n\tbackground: <<colour menubar-foreground>>;\n\tcolor: <<colour background>>;\n\tcolor: <<colour menubar-background>>;\n\tfill: <<colour background>>;\n\tfill: <<colour menubar-background>>;\n\tborder-radius: 0;\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down,\nnav.tc-menubar .tc-block-dropdown {\n\tmax-width: 70vw;\n\tmax-height: 70vh;\n\toverflow: auto;\n}\n\nnav.tc-menubar .tc-drop-down a {\n\ttext-decoration: none;\n}\n\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\n\tdisplay: inline-block;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-drop-down ol {\n\tmargin: 0;\n}\n\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\n\tdisplay: inline;\n\twidth: auto;\n}\n\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\n\n\t.tc-menubar-wide {\n\t\tdisplay: none;\n\t}\n\n}\n\n@media (min-width: <<breakpoint-plus-one>>) {\n\n\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\n\t.tc-menubar-narrow {\n\t\tdisplay: none;\n\t}\n\n}\n\n\n"
},
"$:/tags/MenuBar": {
"title": "$:/tags/MenuBar",
"list": "$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar"
}
}
}
<div class="tc-table-of-contents">
<<toc-selective-expandable 'PHB' 'sort[order]'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'DMG' 'sort[order]'>>
</div>
\define menubar-inner(size)
<ul class="tc-menubar-list">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]]">
<$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore">
<$list filter="[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]" variable="ignore">
<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>
<$list filter="[<currentTiddler>!is-dropdown[yes]]" variable="listItem" emptyMessage="""
<!-- Dropdown -->
<$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>>
<$set name="dropdown-state" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>
<$button popup=<<dropdown-state>> selectedClass="tc-selected">
<$set name="tv-wikilinks" value="no">
<$transclude field="caption" mode="inline"/>
<$text text=" "/>
<span class="tc-menubar-dropdown-arrow">
<$transclude tiddler="$:/core/images/down-arrow" mode="inline"/>
</span>
</$set>
</$button>
</$set>
</$set>
""">
<$list filter="[<currentTiddler>has[custom-menu-content]]" variable="listItem" emptyMessage="""
<!-- Link -->
<$link to={{!!target}}>
<$set name="tv-wikilinks" value="no">
<$transclude field="caption" mode="inline"/>
</$set>
</$link>
""">
<!-- Custom content -->
<$transclude field="custom-menu-content" mode="inline"/>
</$list>
</$list>
</li>
</$list>
</$list>
</$list>
</ul>
\end
<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]" variable="listItem">
<nav class="tc-menubar tc-adjust-top-of-scroll">
<div class="tc-menubar-narrow">
<<menubar-inner narrow>>
</div>
<div class="tc-menubar-wide">
<<menubar-inner wide>>
</div>
<div style="clear:both;"/>
<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]">
<$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore">
<$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>>
<$set name="dropdown-state" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}>
<$reveal type="popup" state=<<dropdown-state>> class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag="div">
<div class="tc-drop-down">
<$transclude/>
</div>
</$reveal>
</$set>
</$set>
</$list>
</$list>
</nav>
</$list>
{
"tiddlers": {
"$:/plugins/tiddlywiki/text-slicer/docs/exporters": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs/exporters",
"tags": "$:/plugins/tiddlywiki/text-slicer/docs",
"caption": "Exporters",
"text": "Documents can be saved under Node.js, or previewed in the browser.\n\n[TBD]\n"
},
"$:/plugins/tiddlywiki/text-slicer/docs/internals": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs/internals",
"tags": "$:/plugins/tiddlywiki/text-slicer/docs",
"caption": "Internals",
"text": "! Introduction\n\nThe slicing process is performed by a simple automaton that scans the document and applies simple declarative rules to yield a collection of tiddlers.\n\nThe automaton processes the incoming XML document starting with the root element and then recursively visits each child node and their children. Actions are triggered as each component of the document is encountered:\n\n* Opening tags of elements\n* Closing tags of elements\n* Text nodes\n\nComponents are matched against the current set of rules to determine what actions should be performed. They can include a combination of:\n\n* Starting a new tiddler with specified fields\n* Rendering the markup for the current tag into the current tiddler\n* Appending the content of the current text node to the current tiddler\n* Threading tiddlers to their parents using a combination of the `list` and `tags` fields\n\n! Slicing State Data\n\nAs the automaton performs its scan, it maintains the following state information:\n\n* ''chunks'' - an array of tiddlers without titles, addressed by their numeric index. The title field is reused to hold the plain text of the chunk that is later used to generate the final title for the tiddler\n* ''currentChunk'' - the numeric index of the chunk currently being filled, or `null` if there is no current chunk\n* ''parentStack'' - a stack of parent chunks stored as `{chunk: <chunk-index>, actions: <actions>}`\n\nAt the start, the special document chunk is created and pushed onto the stack of parent chunks\n\n! Slicing Rules\n\nSlicing rules are maintained in tiddlers tagged `$:/tags/text-slicer/slicer-rules` with the following fields:\n\n* ''title'' - title of the tiddler containing the listof rules\n* ''name'' - short, human readable name for the set of rules\n* ''inherits-from'' - (optional) the ''name'' field of another set of rules that should be inherited as a base\n* ''text'' - JSON data as described below\n\nThe JSON data is an array of rules, each of which is an object with the following fields:\n\n* ''selector'' - a selector string identifying the components to be matched by this rule\n* ''actions'' - an object describing the actions to be performed when this selector matches a tag\n\n!! Selectors\n\nThe selector format is a simplified form of CSS selectors. They are specified as follows:\n\n* A ''selector'' is a list of one or more ''match expressions'' separated by commas. The rule is triggered if any of the match expressions produce a positive match\n* A ''match expression'' is a list of one or element ''tag names'' separated by spaces. The rule is triggered if the final tag name in the list matches the tag of the current element, and all of the preceding tags in the expression exist as ancestors of the current element in the specified order (but not necessarily as immediate children of one another)\n* A ''tag name'' is the textual name of an element\n* Tag names in match expressions may optionally be separated by a `>` sign surrounded by spaces to impose the requirement that the left hand element be the immediate parent of the right hand element\n\n!!! Example Selectors\n\nThis XML document will be used to illustrate some examples:\n\n```\n<a>\n <b>\n <d>one</d>\n </b>\n <c>\n <d>two</d>\n <e>\n three\n <e>\n four\n </e>\n </e>\n </c>\n</a>\n\n```\n\n|!Selector |!Matches |\n|b |Matches the single `<b>` element |\n|d |Matches both of the two `<d>` elements |\n|c,d |Matches the `<c>` element and both of the two `<d>` elements |\n|c d |Matches the second of the two `<d>` elements |\n|a d |Matches both of the two `<d>` elements |\n|a > d |Doesn't match anything |\n|e |Matches both of the two `<e>` elements |\n|c > e |Matches the outermost of the two `<e>` elements |\n|e > e |Matches the innermost of the two `<e>` elements |\n\n!! Actions\n\nThe ''action'' property of a slicer rule is an object that can have any of the following optional fields:\n\n* ''startNewChunk'' - causes a new chunk to be started on encountering an opening tag. The value is an object containing the fields to be assigned to the new chunk\n* ''isParent'' - causes the new chunk to be marked as a child of the current chunk (boolean flag; only applies if ''startNewChunk'' is set)\n* ''headingLevel'' - arrange heading parents according to level (numerical index; only applies if ''startNewChunk'' and ''isParent'' are set)\n* ''dontRenderTag'' - disables the default rendering of opening and closing tags to the current chunk. By default the tags are rendered as XML tags, but this can be overridden via ''markup'' (boolean; defaults to ''false'')\n* ''isImage'' - identifies an element as representing an HTML image element, with special processing for the ''src'' attribute\n* ''markup'' - optional object with either or both of `{wiki: {prefix: <str>,suffix: <str>}}` and `{html: {prefix: <str>,suffix: <str>}}` allowing the rendered tags to be customised\n"
},
"$:/plugins/tiddlywiki/text-slicer/docs/model": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs/model",
"tags": "$:/plugins/tiddlywiki/text-slicer/docs",
"caption": "Document Model",
"text": "Individual tiddlers are created for each heading, paragraph and list item. They are linked together into a hierarchical outline using lists.\n\nFor example, consider a tiddler titled ''Example'' containing this simple text:\n\n<<<\n! This is a heading\n\nThis is a paragraph.\n\n* And the first list item\n* Second list item\n<<<\n\nIt will be sliced up into:\n\n* a tiddler for the overall document\n** a tiddler for the heading\n*** a tiddler for the paragraph\n*** a tiddler for the list\n**** and a tiddler for each list item\n\nThese tiddlers are bound together using lists: the parent tiddler has a ''list'' field that lists each child in the correct order.\n\n!! Slicing Process\n\nSlicing generates the following component tiddlers.\n\nTiddler titles are generated automatically in most cases (but can subsequently be changed manually). The automatically generated title is made up of concatenating the following elements:\n\n* root text (e.g. ''para'')\n* a dash ''-''\n* the first few words of the text of the item (up to 40 characters), separated with dashes ''-''\n* if necessary, a dash ''-'' and a numerical index to make the title unique\n\nFor example, ''para-how-to-use-pentagonal-tiles 23''.\n\nAny CSS classes used in the original document are assigned as tags to the associated tiddlers.\n\n!!! Document\n\nThe document itself is represented by a tiddler with the following fields:\n\n* ''toc-type'': the text \"document\"\n* ''title'': the text ''\"Sliced up \"'' plus the title of the tiddler that was sliced\n* ''text'': Available for comments about the document\n* ''list'': ordered list of tiddlers making up the root level of this document\n\n!!! Headings\n\nTiddlers representing headings have the following fields:\n\n* ''toc-type'': the text \"heading\"\n* ''toc-heading-level'': the heading level \"h1\", \"h2\", \"h3\" etc.\n* ''title'': an automatically generated unique title\n* ''text'': the text of the heading\n* ''list'': ordered list of tiddlers tagged with this heading (i.e. the child headings, paragraphs and lists displayed under this heading)\n** In addition, any CSS classes found in the HTML are converted into tags\n\n!!! Paragraphs\n\nTiddlers representing paragraphs have the following fields:\n\n* ''toc-type'': the text \"paragraph\"\n* ''title'': an automatically generated unique title\n* ''text'': the text of the paragraph\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\n!!! Lists\n\nLists are represented by several tiddlers: one for the list itself, and one for each item in the list.\n\nThe tiddler representing the list itself has the following fields:\n\n* ''toc-type'': the text \"list\"\n* ''toc-list-type'': the text \"ul\" or \"ol\"\n* ''toc-list-filter'': the default filter used to generate the titles of the list items\n* ''title'': an automatically generated unique title\n* ''list'': ordered list of titles of tiddlers representing the items in this list\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\nThe tiddlers representing items within the list have the following fields:\n\n* ''toc-type'': the text \"item\"\n* ''title'': an automatically generated unique title\n* ''text'': the text of the list item\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\n!!! Definition lists\n\nDefinition lists are represented by several tiddlers: one for the definition list itself, and one for each term and definition in the list.\n\nThe tiddler representing the definition list itself has the following fields:\n\n* ''toc-type'': the text \"def-list\"\n* ''toc-list-filter'': the default filter used to generate the titles of the definition list items\n* ''title'': an automatically generated unique title\n* ''list'': ordered list of titles of tiddlers representing the items (terms and/or definition) in the definition list\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\nThe tiddlers representing terms within the definition list have the following fields:\n\n* ''toc-type'': the text \"term\"\n* ''title'': an automatically generated unique title\n* ''text'': the text of the definition list term\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\nThe tiddlers representing definitions within the definition list have the following fields:\n\n* ''toc-type'': the text \"definition\"\n* ''title'': an automatically generated unique title\n* ''text'' : the text of the definition list definition\n* ''tags'': any CSS classes found in the HTML are converted into tags\n\n!!! Images\n\nTiddlers representing images have the following fields:\n\n* ''toc-type'': the text \"image\"\n* ''title'': an automatically generated unique title\n* ''type'': appropriate content type for the image (eg \"image/jpeg\")\n\n!!! Notes\n\nNotes are available during editing but hidden for static renderings. The slicing mechanism does not generate notes; they can only be subsequently added manually. Tiddlers representing notes have the following fields:\n\n* ''toc-type'': the text \"note\"\n* ''title'': an automatically generated unique title\n* ''text'': the text of the note\n* ''tags'': any CSS classes found in the HTML are converted into tags\n"
},
"$:/plugins/tiddlywiki/text-slicer/docs/preview": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs/preview",
"tags": "$:/plugins/tiddlywiki/text-slicer/docs",
"caption": "Preview",
"text": "The document preview column appears at the left side of the screen. The content of headings can be collapsed and expanded to help navigation. Clicking on a tiddler opens the corresponding tiddler in the main story river.\n\nClicking ''Show toolbar'' causes each tiddler to be preceded by a toolbar showing the underlying title. It can be edited directly to rename the tiddler. References to the tiddler in the ''tags'' and ''list'' are automatically updated to reflect the change, but note that links to the tiddler will not be automatically changed.\n\nThe following theme tweaks should be applied to enable the preview column:\n\n* Set [[story left position|$:/themes/tiddlywiki/vanilla/metrics/storyleft]] to ''400px'' (or more)\n* It is recommended to also set the [[sidebar layout|$:/themes/tiddlywiki/vanilla/options/sidebarlayout]] to ''fluid-fixed''.\n\nTo preview the entire document in a separate window, locate it in the preview column and click the button labelled \"View document\". The document will open in plain text in a new window. The window will be automatically updated as you work on the document.\n"
},
"$:/plugins/tiddlywiki/text-slicer/docs/usage": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs/usage",
"tags": "$:/plugins/tiddlywiki/text-slicer/docs",
"caption": "Usage",
"text": "The tool can slice any tiddler that can be rendered as HTML, including both WikiText and HTML itself.\n\nDocuments created with Microsoft Word will need to be first converted to HTML. The library [[mammoth.js|https://github.com/mwilliamson/mammoth.js]] is recommended for this purpose.\n\n!! Browser\n\nIn the browser, you can slice a monolithic document tiddler using the slicer toolbar button.\n\n!! Node.js\n\nThe `--slice` command allows a tiddler to be sliced under Node.js:\n\n```\ntiddlywiki mywiki --slice SourceDocument --build index\n```\n"
},
"$:/plugins/tiddlywiki/text-slicer/docs": {
"title": "$:/plugins/tiddlywiki/text-slicer/docs",
"list": "$:/plugins/tiddlywiki/text-slicer/docs/usage $:/plugins/tiddlywiki/text-slicer/docs/preview $:/plugins/tiddlywiki/text-slicer/docs/model $:/plugins/tiddlywiki/text-slicer/docs/exporters $:/plugins/tiddlywiki/text-slicer/docs/internals",
"text": "! Introduction\n\nThis plugin contains tools to help work with documents that are structured as a hierarchical outline of tiddlers. The structural relationships within the document are expressed through the `list` and `tags` fields: for example, headings have a list specifying the chunks of content to be shown under the heading.\n\nThe major components within the text slicer plugin include:\n\n* ''the slicer'', a tool that slices up an existing monolithic document according to the headings, lists and paragraphs. It is available as a toolbar button for the browser, or as a command for use under Node.js\n* ''document preview column'', a new sidebar on the left that shows the full text of any documents in the wiki and allows individual tiddlers to be opened with a click\n* ''templates'' for previewing and exporting the individual documents as HTML files\n\nMinor components include:\n\n* a new `list-children` filter that returns all the descendents listed in the `list` field of the selected tiddlers\n* a new canned filter for [[advanced search|$:/AdvancedSearch]] that lists orphans tiddlers that are not part of any document\n\n<<tabs \"[all[tiddlers+shadows]tag[$:/plugins/tiddlywiki/text-slicer/docs]!has[draft.of]]\" \"$:/plugins/tiddlywiki/text-slicer/docs/usage\">>\n"
},
"$:/plugins/tiddlywiki/text-slicer/readme": {
"title": "$:/plugins/tiddlywiki/text-slicer/readme",
"text": "This plugin contains tools to help slice up long texts into individual tiddlers. It currently works directly with XHTML documents and with Microsoft Word compatible DOCX documents via conversion to HTML.\n\nIt is an expression of the philosophy of TiddlyWiki: that text is easier to re-use and work with if it is sliced up into separate chunks that can be independently manipulated, and then woven back together to make up stories and narratives for publication.\n\n"
},
"$:/plugins/tiddlywiki/text-slicer/icon": {
"title": "$:/plugins/tiddlywiki/text-slicer/icon",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-text-slicer tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n <path d=\"M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\" ></path>\n <g transform=\"translate(32.000000, 32.000000) scale(2.19)\" fill=\"#ffffff\">\n {{$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon}}\n </g>\n </g>\n</svg>"
},
"$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon": {
"title": "$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-text-slicer tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\">\n\t\t<path d=\"M78.3637366,56.1312577 L78.3637366,60.2285796 L26.7489717,26.7095593 C23.9558586,24.8956905 23.1577753,21.1490577 24.9741388,18.3521031 C26.7898442,15.5561619 30.5337016,14.7576591 33.3309445,16.5742099 L87.6340125,51.8390346 L84.9731806,51.8390346 L103.852266,39.5788135 L105.182681,41.6274744 L104.070376,43.8022835 C102.858368,43.1824026 101.719662,42.4138485 100.675491,41.5061647 C93.6569185,35.4050129 92.9012893,24.7795163 98.9918187,17.7731637 C105.082348,10.766811 115.709601,10.0363032 122.728174,16.137455 C129.746746,22.2386068 130.502375,32.8641034 124.411846,39.870456 C123.229956,41.2300649 121.856251,42.3760135 120.416666,43.2314984 L94.2434565,60.2285796 L94.2434565,56.1312577 L120.765587,73.3549304 C121.152097,73.6059335 121.506081,73.898207 121.822516,74.2262669 L120.064365,75.9221214 L121.489555,73.938223 C121.915739,74.2443848 122.328975,74.5712591 122.728174,74.9182775 C129.746746,81.0194293 130.502375,91.6449259 124.411846,98.6512786 C118.321316,105.657631 107.694063,106.388139 100.675491,100.286987 C93.6569185,94.1858354 92.9012893,83.5603389 98.9918187,76.5539862 C100.441592,74.8862128 102.178627,73.5416182 104.115112,72.5685999 L105.211846,74.7513028 L103.88143,76.7999638 L84.9731806,64.5208027 L87.6340125,64.5208027 L61.3662147,81.57931 L61.3662147,67.1695775 L78.3637366,56.1312577 Z M114.533131,83.6707925 L115.961891,81.689464 L114.933771,83.9053132 C114.675216,83.7853476 114.424622,83.6467924 114.183613,83.4902793 L113.644945,83.1404643 L114.975362,81.0918038 L113.881545,83.2759699 C111.959385,82.3133637 109.605897,82.7611681 108.179792,84.4017143 C106.463272,86.3763445 106.676536,89.3752164 108.660203,91.0995921 C110.643871,92.8239678 113.643238,92.617794 115.359758,90.6431638 C117.076278,88.6685336 116.863014,85.6696617 114.879347,83.945286 C114.767376,83.8479516 114.651892,83.7564326 114.533131,83.6707925 Z M115.359758,31.8623412 C117.076278,29.8877111 116.863014,26.8888391 114.879347,25.1644635 C112.89568,23.4400878 109.896312,23.6462616 108.179792,25.6208918 C106.463272,27.5955219 106.676536,30.5943939 108.660203,32.3187696 C110.643871,34.0431452 113.643238,33.8369714 115.359758,31.8623412 Z\" fill-rule=\"nonzero\"></path>\n\t\t<g transform=\"translate(0.000000, 46.000000)\">\n\t\t\t<path d=\"M62.9632954,19.5390625 L62.984127,19.5390625 L62.984127,76.87441 C62.984127,79.7051952 60.6450077,82 57.7588318,82 L5.49996847,82 C2.61411765,82 0.274673329,79.7050809 0.274673329,76.87441 L0.274673329,5.12559005 C0.274673329,2.29480483 2.61379258,0 5.49996847,0 L42.7341992,0 L42.7341992,0.0129302741 C44.1445002,-0.0458264988 45.5745556,0.452971616 46.6523962,1.51002434 L61.4328365,16.0053998 C62.4299816,16.9833134 62.9403234,18.2577109 62.9632954,19.5390625 L62.9632954,19.5390625 Z M42.7341992,5.125 L5.50046113,5.125 L5.50046113,76.875 L57.7583392,76.875 L57.7583392,19.5390625 L47.9602131,19.5390625 C45.0739653,19.5390625 42.7341992,17.2466672 42.7341992,14.4138408 L42.7341992,5.125 Z\" ></path>\n\t\t\t<rect x=\"10.7262489\" y=\"23.0625\" width=\"41.8063024\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t\t<rect x=\"10.7262489\" y=\"33.3125\" width=\"41.8063024\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t\t<rect x=\"10.7262489\" y=\"43.5625\" width=\"41.8063024\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t\t<rect x=\"10.7262489\" y=\"53.8125\" width=\"41.8063024\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t\t<rect x=\"10.7262489\" y=\"64.0625\" width=\"41.8063024\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t\t<rect x=\"10.7262489\" y=\"12.8125\" width=\"26.128939\" height=\"5.125\" rx=\"2.5625\"></rect>\n\t\t</g>\n\t</g>\n</svg>\n"
},
"$:/language/Help/slice": {
"title": "$:/language/Help/slice",
"description": "Slice a hierarchical document into individual tiddlers",
"text": "Slices the specified tiddler\n\n```\n--slice <source-title> [<dest-title>] [<slicer-rules>] [<output-mode>]\n```\n\n* ''source-title'': Title of the tiddler to be sliced\n* ''dest-title'': Base title for the generated output tiddlers\n* ''slicer-rules'': Name of the slicer rules to use for the operation (see below)\n* ''output-mode'': \"html\" vs \"wiki\"\n\nThe plugin comes with several built-in sets of slicer rules:\n\n* //html-by-paragraph//: Slice every paragraph into a separate tiddler, threaded by heading\n* //html-by-heading//: Slice every heading into separate threaded tiddlers\n* //html-plain-paragraphs//: Slice every paragraph into a separate tiddler, without formatting or headings\n\nAdvanced users can create or edit their own slicer rules for precise control over the conversion process\n"
},
"$:/plugins/tiddlywiki/text-slicer/modules/commands/slice.js": {
"title": "$:/plugins/tiddlywiki/text-slicer/modules/commands/slice.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/text-slicer/modules/commands/slice.js\ntype: application/javascript\nmodule-type: command\n\nCommand to slice a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\"),\n\ttextSlicer = require(\"$:/plugins/tiddlywiki/text-slicer/modules/slicer.js\");\n\nexports.info = {\n\tname: \"slice\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tsourceTitle = this.params[0],\n\t\tdestTitle = this.params[1],\n\t\tslicerRules = this.params[2],\n\t\toutputMode = this.params[3],\n\t\tslicer = new textSlicer.Slicer({\n\t\t\tsourceTiddlerTitle: sourceTitle,\n\t\t\tbaseTiddlerTitle: destTitle,\n\t\t\tslicerRules: slicerRules,\n\t\t\toutputMode: outputMode,\n\t\t\twiki: wiki,\n\t\t\tcallback: function(err,tiddlers) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn self.callback(err);\n\t\t\t\t}\n\t\t\t\twiki.addTiddlers(tiddlers);\n\t\t\t\tself.callback();\t\n\t\t\t}\n\t\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/filters/list-children.js": {
"title": "$:/core/modules/filters/list-children.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list-children.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the descendents of a tiddler listed in the \"list\" field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports[\"list-children\"] = function(source,operator,options) {\n\tvar children = {},\n\t\tprocessTiddler = function(title) {\n\t\t\tvar tiddler = options.wiki.getTiddler(title);\n\t\t\tif(tiddler && !$tw.utils.hop(children,title)) {\n\t\t\t\tchildren[title] = true;\n\t\t\t\tvar list = options.wiki.getTiddlerList(title,operator.operand);\n\t\t\t\tlist.forEach(function(listItem) {\n\t\t\t\t\tif(!$tw.utils.hop(children,listItem)) {\n\t\t\t\t\t\tprocessTiddler(listItem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\tsource(function(tiddler,title) {\n\t\tprocessTiddler(title);\n\t});\n\treturn Object.keys(children);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-by-heading.json": {
"title": "$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-by-heading.json",
"name": "html-by-heading",
"caption": "By Heading (HTML)",
"description": "One tiddler per heading, threaded (HTML)",
"inherits-from": "html-by-paragraph",
"type": "application/json",
"tags": "$:/tags/text-slicer/slicer-rules",
"text": "[\n\t{\n\t\t\"selector\": \"address,center,fieldset,form,hr,iframe,isindex,noframes,noscript,ol,ul,li,pre,table\",\n\t\t\"actions\": {}\n\t},\n\t{\n\t\t\"selector\": \"blockquote\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"<<<\\n\",\n\t\t\t\t\t\"suffix\": \"<<<\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dd\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"\\n: \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dl\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"\\n\",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dt\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"\\n; \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h1\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h1\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 1,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h2\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h2\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 2,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"!! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h3\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h3\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 3,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"!!! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h4\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h4\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 4,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"!!!! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h5\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h5\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 5,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"!!!!! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h6\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h6\"\n\t\t\t},\n\t\t\t\"mergeNext\": true,\n\t\t\t\"setCaption\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 6,\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"!!!!!! \",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"p\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"\",\n\t\t\t\t\t\"suffix\": \"\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"*\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t}\n]\n"
},
"$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-by-paragraph.json": {
"title": "$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-by-paragraph.json",
"name": "html-by-paragraph",
"caption": "By Paragraph (HTML)",
"description": "One tiddler per paragraph, threaded by heading (HTML)",
"type": "application/json",
"tags": "$:/tags/text-slicer/slicer-rules",
"text": "[\n\t{\n\t\t\"selector\": \"address,center,fieldset,form,hr,iframe,isindex,noframes,noscript,pre,table\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"blockquote\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t},\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"<<<\\n\",\n\t\t\t\t\t\"suffix\": \"<<<\\n\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"body,div,head,html,span\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dd\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"definition\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dl\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"def-list\",\n\t\t\t\t\"toc-list-filter\": \"[list<currentTiddler>!has[draft.of]]\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"dt\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"term\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"em,i\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"//\",\n\t\t\t\t\t\"suffix\": \"//\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h1\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 1,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h1\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h2\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 2,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h2\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h3\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 3,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h3\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h4\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 4,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h4\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h5\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 5,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h5\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"h6\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"headingLevel\": 6,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"heading\",\n\t\t\t\t\"toc-heading-level\": \"h6\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"img\",\n\t\t\"actions\": {\n\t\t\t\"isImage\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"li\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"item\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"ol\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"list\",\n\t\t\t\t\"toc-list-type\": \"ol\",\n\t\t\t\t\"toc-list-filter\": \"[list<currentTiddler>!has[draft.of]]\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"p\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"strike\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"~~\",\n\t\t\t\t\t\"suffix\": \"~~\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"strong,b\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"''\",\n\t\t\t\t\t\"suffix\": \"''\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"sub\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \",,\",\n\t\t\t\t\t\"suffix\": \",,\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"sup\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"^^\",\n\t\t\t\t\t\"suffix\": \"^^\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"head > title\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"u\",\n\t\t\"actions\": {\n\t\t\t\"markup\": {\n\t\t\t\t\"wiki\": {\n\t\t\t\t\t\"prefix\": \"__\",\n\t\t\t\t\t\"suffix\": \"__\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"ul\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"isParent\": true,\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"list\",\n\t\t\t\t\"toc-list-type\": \"ul\",\n\t\t\t\t\"toc-list-filter\": \"[list<currentTiddler>!has[draft.of]]\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"*\",\n\t\t\"actions\": {}\n\t}\n]"
},
"$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-linear.json": {
"title": "$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-linear.json",
"name": "html-linear",
"caption": "Linear (HTML)",
"description": "One tiddler per paragraph in a single linear thread (HTML)",
"type": "application/json",
"tags": "$:/tags/text-slicer/slicer-rules",
"text": "[\n\t{\n\t\t\"selector\": \"li > p\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"p\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t},\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"a\",\n\t\t\"actions\": {\n\t\t\t\"isAnchor\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"address,blockquote,center,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,iframe,isindex,noframes,noscript,ol,pre,table,ul\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t}\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"br,caption,code,col,colgroup,em,i,dd,li,strike,strong,b,sub,sup,u,tbody,td,tfoot,th,thead,tr\",\n\t\t\"actions\": {\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"img\",\n\t\t\"actions\": {\n\t\t\t\"isImage\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"head\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true,\n\t\t\t\"discard\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"*\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t}\n]"
},
"$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-plain-paragraphs.json": {
"title": "$:/plugins/tiddlywiki/text-slicer/slicer-rules/html-plain-paragraphs.json",
"name": "html-plain-paragraphs",
"caption": "Plain Paragraphs (HTML)",
"description": "One tiddler per paragraph, without formatting (HTML)",
"type": "application/json",
"tags": "$:/tags/text-slicer/slicer-rules",
"text": "[\n\t{\n\t\t\"selector\": \"address,blockquote,center,dd,dt,h1,h2,h3,h4,h5,h6,li,p\",\n\t\t\"actions\": {\n\t\t\t\"startNewChunk\": {\n\t\t\t\t\"toc-type\": \"paragraph\"\n\t\t\t},\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t},\n\t{\n\t\t\"selector\": \"*\",\n\t\t\"actions\": {\n\t\t\t\"dontRenderTag\": true\n\t\t}\n\t}\n]\n"
},
"$:/plugins/tiddlywiki/text-slicer/modules/slicer.js": {
"title": "$:/plugins/tiddlywiki/text-slicer/modules/slicer.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/text-slicer/modules/slicer.js\ntype: application/javascript\nmodule-type: library\n\nSlice a tiddler or DOM document into individual tiddlers\n\nvar slicer = new textSlicer.Slicer(doc,{\n\t\tslicerRules: JSON data defining slicer rules -or- title of rules taken from tiddlers tagged $:/tags/text-slicer/slicer-rules\n\t\tsourceTiddlerTitle: tiddler to slice -or-\n\t\tsourceText: text to slice\n\t\toutputMode: \"html\" (default) -or- \"wiki\"\n\t\tbaseTiddlerTitle: \"MySlicedTiddlers-\"\n\t\trole: \"sliced-content\"\n\t\tcallback: function(err,tiddlers)\n\t});\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Slicer(options) {\n\t// Quick tests\n\tthis.testSlicerRuleMatching();\n\t// Marshal parameters\n\tthis.sourceTiddlerTitle = options.sourceTiddlerTitle;\n\tthis.sourceText = options.sourceText;\n\tthis.wiki = options.wiki;\n\tthis.role = options.role || \"sliced-html\";\n\tthis.outputMode = options.outputMode || \"html\";\n\tthis.escapeWikiText = options.escapeWikiText || false;\n\tthis.callbackFn = options.callback;\n\t// Get the slicer rules\n\tvar nameSlicerRules = null;\n\tif(!options.slicerRules) {\n\t\tnameSlicerRules = \"html-by-paragraph\";\n\t\tthis.slicerRules = this.loadSlicerRules(nameSlicerRules);\n\t} else if(typeof options.slicerRules === \"string\") {\n\t\tnameSlicerRules = options.slicerRules;\n\t\tthis.slicerRules = this.loadSlicerRules(nameSlicerRules);\n\t} else {\n\t\tthis.slicerRules = options.slicerRules;\n\t}\n\t// Set up the base tiddler title\n\tthis.baseTiddlerTitle = this.getBaseTiddlerTitle(options.baseTiddlerTitle);\n\t// Initialise state\n\tthis.namespaces = {}; // Hashmap of URLs\n\tthis.chunks = []; // Array of tiddlers without titles, addressed by their index. We use the title field to hold the plain text content\n\tthis.currentChunk = null; // Index of the chunk currently being written to\n\tthis.parentStack = []; // Stack of parent chunks {chunk: chunk index,actions:}\n\tthis.elementStack = []; // Stack of {tag:,isSelfClosing:,actions:}\n\tthis.titleCounts = {}; // Hashmap of counts of prefixed titles that have been issued\n\t// Set up the document tiddler as top level heading\n\tthis.chunks.push({\n\t\t\"toc-type\": \"document\",\n\t\ttitle: this.baseTiddlerTitle,\n\t\ttext: \"<div class='tc-table-of-contents'><<toc-selective-expandable \\\"\\\"\\\"\" + this.baseTiddlerTitle + \"document\\\"\\\"\\\">></div>\",\n\t\tlist: [],\n\t\ttags: [],\n\t\trole: this.role,\n\t\t\"slicer-rules\": nameSlicerRules,\n\t\t\"slicer-output-mode\": this.outputMode\n\t});\n\tthis.parentStack.push({chunk: 0, actions: this.getMatchingSlicerRuleActions(\"(document)\")});\n\tthis.insertPrecedingChunk({\n\t\t\"toc-type\": \"anchor\",\n\t\t\"title\": this.baseTiddlerTitle + \"-anchor-\"\n\t});\n\t// Set up the parser\n\tvar sax = require(\"$:/plugins/tiddlywiki/sax/sax.js\");\n\tthis.sax = sax.parser(false,{\n\t\txmlns: true,\n\t\tlowercase: true\n\t});\n\tthis.sax.onerror = this.onError.bind(this);\n\tthis.sax.onopennamespace = this.onOpenNamespace.bind(this);\n\tthis.sax.onclosenamespace = this.onCloseNamespace.bind(this);\n\tthis.sax.onopentag = this.onOpenTag.bind(this);\n\tthis.sax.onclosetag = this.onCloseTag.bind(this);\n\tthis.sax.ontext = this.onText.bind(this);\n\tthis.sax.onend = this.onEnd.bind(this);\n\t// Start streaming the data\n\tthis.sax.write(this.getSourceText());\n\tthis.sax.close();\n}\n\nSlicer.prototype.callback = function(err,tiddlers) {\n\tvar self = this;\n\t$tw.utils.nextTick(function() {\n\t\tself.callbackFn(err,tiddlers);\n\t});\n};\n\nSlicer.prototype.loadSlicerRules = function(name) {\n\t// Collect the available slicer rule tiddlers\n\tvar self = this,\n\t\ttitles = this.wiki.getTiddlersWithTag(\"$:/tags/text-slicer/slicer-rules\"),\n\t\ttiddlers = {},\n\t\trules = {},\n\t\truleNames = [];\n\ttitles.forEach(function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\ttiddlers[tiddler.fields.name] = tiddler;\n\t\trules[tiddler.fields.name] = self.wiki.getTiddlerData(title,[]);\n\t});\n\t// Follow the inheritance trail to get a stack of slicer rule names\n\tvar n = name;\n\tdo {\n\t\truleNames.push(n);\n\t\tn = tiddlers[n] && tiddlers[n].fields[\"inherits-from\"];\n\t} while(n && ruleNames.indexOf(n) === -1);\n\t// Concatenate the slicer rules\n\trules = ruleNames.reduce(function(accumulator,name) {\n\t\treturn accumulator.concat(rules[name]);\n\t},[]);\n\treturn rules;\n};\n\nSlicer.prototype.getMatchingSlicerRuleActions = function(name) {\n\tvar rule = this.searchSlicerRules(name,this.slicerRules,this.elementStack);\n\tif(!rule) {\n\t\treturn {};\n\t} else {\n\t\treturn rule.actions;\n\t}\n};\n\nSlicer.prototype.testSlicerRuleMatching = function() {\n\tvar tests = [\n\t\t\t{\n\t\t\t\ttest: this.searchSlicerRules(\"title\",[\n\t\t\t\t\t\t{selector: \"title,head,body\", rules: true},\n\t\t\t\t\t\t{selector: \"body\", rules: true}\n\t\t\t\t\t],[\n\t\t\t\t\t\t{tag:\"head\"}\n\t\t\t\t\t]),\n\t\t\t\tresult: \"title,head,body\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttest: this.searchSlicerRules(\"body\",[\n\t\t\t\t\t\t{selector: \"title,head,body\", rules: true},\n\t\t\t\t\t\t{selector: \"body\", rules: true}\n\t\t\t\t\t],[\n\t\t\t\t\t\t{tag:\"head\"}\n\t\t\t\t\t]),\n\t\t\t\tresult: \"title,head,body\"\n\t\t\t},\n\t\t\t{\t\n\t\t\t\ttest: this.searchSlicerRules(\"title\",[\n\t\t\t\t\t\t{selector: \"head > title\", rules: true},\n\t\t\t\t\t\t{selector: \"title\", rules: true}\n\t\t\t\t\t],[\n\t\t\t\t\t\t{tag:\"head\"}\n\t\t\t\t\t]),\n\t\t\t\tresult: \"head > title\"\n\t\t\t}\n\t\t],\n\t\tresults = tests.forEach(function(test,index) {\n\t\t\tif(test.test.selector !== test.result) {\n\t\t\t\tthrow \"Failing test \" + index + \", returns \" + test.test.selector + \" instead of \" + test.result;\n\t\t\t}\n\t\t});\n};\n\nSlicer.prototype.searchSlicerRules = function(name,rules,elementStack) {\n\treturn rules.find(function(rule) {\n\t\t// Split and trim the selectors for this rule\n\t\treturn !!rule.selector.split(\",\").map(function(selector) {\n\t\t\t\treturn selector.trim();\n\t\t\t// Find the first selector that matches, if any\n\t\t\t}).find(function(selector) {\n\t\t\t\t// Split and trim the parts of the selector\n\t\t\t\tvar parts = selector.split(\" \").map(function(part) {\n\t\t\t\t\treturn part.trim();\n\t\t\t\t});\n\t\t\t\t// * matches any element\n\t\t\t\tif(parts.length === 1 && parts[0] === \"*\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// Make a copy of the element stack so that we can be destructive\n\t\t\t\tvar elements = elementStack.slice(0).concat({tag: name}),\n\t\t\t\t\tnextElementMustBeAtTopOfStack = true,\n\t\t\t\t\tcurrentPart = parts.length - 1;\n\t\t\t\twhile(currentPart >= 0) {\n\t\t\t\t\tif(parts[currentPart] === \">\") {\n\t\t\t\t\t\tnextElementMustBeAtTopOfStack = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!nextElementMustBeAtTopOfStack) {\n\t\t\t\t\t\t\twhile(elements.length > 0 && elements[elements.length - 1].tag !== parts[currentPart]) {\n\t\t\t\t\t\t\t\telements.pop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(elements.length === 0 || elements[elements.length - 1].tag !== parts[currentPart]) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telements.pop();\n\t\t\t\t\t\tnextElementMustBeAtTopOfStack = false;\n\t\t\t\t\t}\n\t\t\t\t\tcurrentPart--;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t});\n};\n\nSlicer.prototype.getBaseTiddlerTitle = function(baseTiddlerTitle) {\n\tif(baseTiddlerTitle) {\n\t\treturn baseTiddlerTitle\t\t\n\t} else {\n\t\tif(this.sourceTiddlerTitle) {\n\t\t\treturn \"Sliced up \" + this.sourceTiddlerTitle + \":\";\n\t\t} else {\n\t\t\treturn \"SlicedTiddler\";\n\t\t}\n\t}\n};\n\nSlicer.prototype.getSourceText = function() {\n\tif(this.sourceTiddlerTitle) {\n\t\tvar tiddler = this.wiki.getTiddler(this.sourceTiddlerTitle);\n\t\tif(!tiddler) {\n\t\t\tconsole.log(\"Tiddler '\" + this.sourceTiddlerTitle + \"' does not exist\");\n\t\t\treturn \"\";\n\t\t}\n\t\tif(tiddler.fields.type === \"text/html\" || tiddler.fields.type === \"text/xml\" || (tiddler.fields.type || \"\").slice(-4) === \"+xml\") {\n\t\t\treturn tiddler.fields.text;\n\t\t} else {\n\t\t\treturn this.getTiddlerAsHtml(tiddler);\n\t\t}\n\t} else {\n\t\treturn this.sourceText;\n\t}\n};\n\nSlicer.prototype.getTiddlerAsHtml = function(tiddler) {\n\tvar widgetNode = this.wiki.makeTranscludeWidget(tiddler.fields.title,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparseAsInline: false,\n\t\t\timportPageMacros: true}),\n\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn [\"<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.1//EN\\\" \\\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\\\">\",\"<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\">\",\"<head>\",\"</head>\",\"<body>\",container.innerHTML,\"</body>\",\"</html>\"].join(\"\\n\");\n};\n\n\nSlicer.prototype.getImmediateParent = function() {\n\treturn this.parentStack.slice(-1)[0];\n};\n\nSlicer.prototype.onError = function(e) {\n\tconsole.error(\"Sax error: \", e)\n\t// Try to resume after errors\n\tthis.sax.error = null;\n\tthis.sax.resume();\n};\n\nSlicer.prototype.onOpenNamespace = function(info) {\n\tthis.namespaces[info.prefix] = info.uri;\n};\n\nSlicer.prototype.onCloseNamespace = function(info) {\n};\n\nSlicer.prototype.onOpenTag = function(node) {\n\tvar actions = this.getMatchingSlicerRuleActions(node.name);\n\t// Create an anchor if we encounter an ID\n\tif(node.attributes.id) {\n\t\tthis.insertPrecedingChunk({\n\t\t\t\"toc-type\": \"anchor\",\n\t\t\t\"title\": this.baseTiddlerTitle + \"-anchor-\" + node.attributes.id.value\n\t\t});\n\t}\n\t// Check for an element that should start a new chunk\n\tif(actions.startNewChunk) {\n\t\t// If this is a heading, pop off any higher or equal level headings first\n\t\tif(actions.isParent && actions.headingLevel) {\n\t\t\tvar parentActions = this.getImmediateParent().actions;\n\t\t\twhile(parentActions.isParent && parentActions.headingLevel && parentActions.headingLevel >= actions.headingLevel) {\n\t\t\t\tthis.parentStack.pop();\n\t\t\t\tparentActions = this.getImmediateParent().actions;\n\t\t\t}\n\t\t}\n\t\t// Start the new chunk\n\t\tthis.startNewChunk(actions.startNewChunk);\n\t\t// If this is a parent then also add it to the parent stack\n\t\tif(actions.isParent) {\n\t\t\tthis.parentStack.push({chunk: this.currentChunk, actions: actions});\n\t\t}\n\t}\n\t// Render the tag inline in the current chunk unless we should ignore it\n\tif(!actions.dontRenderTag) {\n\t\tif(actions.isImage) {\n\t\t\tthis.onOpenImage(node);\n\t\t} else if(actions.isAnchor) {\n\t\t\tthis.onOpenAnchor(node);\n\t\t} else {\n\t\t\tvar markupInfo = actions.markup && actions.markup[this.outputMode];\n\t\t\tif(markupInfo) {\n\t\t\t\tthis.addTextToCurrentChunk(markupInfo.prefix);\n\t\t\t} else {\n\t\t\t\tthis.addTextToCurrentChunk(\"<\" + node.name + (node.isSelfClosing ? \"/\" : \"\") + \">\");\n\t\t\t}\n\t\t}\n\t}\n\t// Remember whether this tag is self closing\n\tthis.elementStack.push({tag: node.name,isSelfClosing: node.isSelfClosing, actions: actions, node: node});\n};\n\nSlicer.prototype.onOpenAnchor = function(node) {\n\tif(node.attributes.href) {\n\t\tvar value = node.attributes.href.value;\n\t\tif(value.indexOf(\"https://\") === 0 || value.indexOf(\"http://\") === 0) {\n\t\t\t// External link\n\t\t\tthis.addTextToCurrentChunk(\"<a href=\\\"\" + value + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">\");\n\t\t} else {\n\t\t\t// Internal link\n\t\t\tvar parts = value.split(\"#\"),\n\t\t\t\tbase = parts[0],\n\t\t\t\thash = parts[1] || \"\",\n\t\t\t\ttitle = $tw.utils.resolvePath(base,this.baseTiddlerTitle) + \"-anchor-\" + hash;\n\t\t\tthis.addTextToCurrentChunk(\"<$link to=\\\"\" + title + \"\\\">\");\t\t\t\n\t\t}\n\t}\n};\n\nSlicer.prototype.onCloseAnchor = function(elementInfo) {\n\tif(elementInfo.node.attributes.href) {\n\t\tvar value = elementInfo.node.attributes.href.value;\n\t\tif(value.indexOf(\"https://\") === 0 || value.indexOf(\"http://\") === 0) {\n\t\t\t// External link\n\t\t\tthis.addTextToCurrentChunk(\"</a>\");\n\t\t} else {\n\t\t\t// Internal link\n\t\t\tthis.addTextToCurrentChunk(\"</$link>\");\n\t\t}\n\t}\n};\n\nSlicer.prototype.onOpenImage = function(node) {\n\tvar url = node.attributes.src.value;\n\tif(url.slice(0,5) === \"data:\") {\n\t\t// var parts = url.slice(5).split(\",\");\n\t\t// this.chunks.push({\n\t\t// \ttitle: ,\n\t\t// \ttext: parts[1],\n\t\t// \ttype: parts[0].split[\";\"][0],\n\t\t// \trole: this.role\n\t\t// });\n\t}\n\tthis.addTextToCurrentChunk(\"[img[\" + $tw.utils.resolvePath(url,this.baseTiddlerTitle) + \"]]\");\n};\n\nSlicer.prototype.onCloseTag = function(name) {\n\tvar e = this.elementStack.pop(),\n\t\tactions = e.actions,\n\t\tselfClosing = e.isSelfClosing;\n\t// Set the caption if required\n// TODO\n// \tif(actions.setCaption) {\n// \t\tthis.chunks[this.currentChunk].caption = this.chunks[this.currentChunk].title;\n// \t}\n\t// Render the tag\n\tif(actions.isAnchor) {\n\t\tthis.onCloseAnchor(e);\n\t} else if (!actions.dontRenderTag && !selfClosing) {\n\t\tvar markupInfo = actions.markup && actions.markup[this.outputMode];\n\t\tif(markupInfo) {\n\t\t\tthis.addTextToCurrentChunk(markupInfo.suffix);\n\t\t} else {\n\t\t\tthis.addTextToCurrentChunk(\"</\" + name + \">\");\t\t\t\n\t\t}\n\t}\n\t// Check for an element that started a new chunk\n\tif(actions.startNewChunk) {\n\t\tif(!actions.mergeNext) {\n\t\t\tthis.currentChunk = null;\t\t\t\n\t\t}\n\t\t// If this is a parent and not a heading then also pop it from the parent stack\n\t\tif(actions.isParent && !actions.headingLevel) {\n\t\t\tthis.parentStack.pop();\n\t\t}\n\t}\n};\n\nSlicer.prototype.onText = function(text) {\n\tvar self = this;\n\t// Discard the text if we're inside an element with actions.discard set true\n\tif(this.elementStack.some(function(e) {return e.actions.discard;})) {\n\t\treturn;\n\t}\n\t// Optionally escape common character sequences that might be parsed as wikitext\n\ttext = $tw.utils.htmlEncode(text);\n\tif(this.escapeWikiText) {\n\t\t$tw.utils.each([\"[[\",\"{{\",\"__\",\"''\",\"//\",\",,\",\"^^\",\"~~\",\"`\",\"--\",\"\\\"\\\"\",\"@@\"],function(str) {\n\t\t\tvar replace = str.split(\"\").map(function(c) {\n\t\t\t\treturn \"&#\" + c.charCodeAt(0) + \";\";\n\t\t\t}).join(\"\");\n\t\t\ttext = text.replace(new RegExp($tw.utils.escapeRegExp(str),\"mg\"),replace);\n\t\t});\n\t}\n\tthis.addTextToCurrentChunk(text);\n\tthis.addTextToCurrentChunk(text,\"caption\");\n};\n\nSlicer.prototype.onEnd = function() {\n\tthis.callback(null,this.chunks);\n};\n\nSlicer.prototype.addTextToCurrentChunk = function(str,field) {\n\tfield = field || \"text\";\n\tif(this.currentChunk === null && str.trim() !== \"\") {\n\t\tthis.startNewChunk({\n\t\t\ttitle: this.makeTitle(\"paragraph\"),\n\t\t\t\"toc-type\": \"paragraph\"\n\t\t});\n\t}\n\tif(this.currentChunk !== null) {\n\t\tthis.chunks[this.currentChunk][field] += str;\n\t}\n};\n\nSlicer.prototype.startNewChunk = function(fields) {\n\tvar title = fields.title || this.makeTitle(fields[\"toc-type\"]);\n\tvar parentChunk = this.chunks[this.getImmediateParent().chunk];\n\tthis.chunks.push($tw.utils.extend({},{\n\t\ttitle: title,\n\t\ttext: \"\",\n\t\tcaption: \"\",\n\t\ttags: [parentChunk.title],\n\t\tlist: [],\n\t\trole: this.role\n\t},fields));\n\tthis.currentChunk = this.chunks.length - 1;\n\tparentChunk.list.push(title);\n};\n\nSlicer.prototype.insertPrecedingChunk = function(fields) {\n\tif(!fields.title) {\n\t\tthrow \"Chunks need a title\"\n\t}\n\tif(!this.currentChunk) {\n\t\tthis.startNewChunk(fields);\n\t\tthis.currentChunk = null;\n\t} else {\n\t\tvar parentChunk = this.chunks[this.getImmediateParent().chunk],\n\t\t\tindex = this.chunks.length - 1;\n\t\t// Insert the new chunk\n\t\tthis.chunks.splice(index,0,$tw.utils.extend({},{\n\t\t\ttext: \"\",\n\t\t\tcaption: \"\",\n\t\t\ttags: [parentChunk.title],\n\t\t\tlist: [],\n\t\t\trole: this.role\n\t\t},fields));\n\t\t// Adjust the current chunk pointer\n\t\tthis.currentChunk += 1;\n\t\t// Insert a pointer to the new chunk in the parent\n\t\tparentChunk.list.splice(parentChunk.list.length - 1,0,fields.title);\t\t\n\t}\n};\n\nSlicer.prototype.isBlank = function(s) {\n\treturn (/^[\\s\\xA0]*$/g).test(s);\n};\n\nSlicer.prototype.makeTitle = function(prefix) {\n\tprefix = prefix || \"\";\n\tvar count = (this.titleCounts[prefix] || 0) + 1;\n\tthis.titleCounts[prefix] = count;\n\treturn this.baseTiddlerTitle + \"-\" + prefix + \"-\" + count;\n};\n\nexports.Slicer = Slicer;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/tiddlywiki/text-slicer/modules/startup/slicer-startup.js": {
"title": "$:/plugins/tiddlywiki/text-slicer/modules/startup/slicer-startup.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/text-slicer/modules/startup/slicer-startup.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget event handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar textSlicer = require(\"$:/plugins/tiddlywiki/text-slicer/modules/slicer.js\");\n\n// Export name and synchronous status\nexports.name = \"slicer\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Install the root widget event handlers\nexports.startup = function() {\n\t// Check sax is installed\n\tif(!$tw.utils.hop($tw.modules.titles,\"$:/plugins/tiddlywiki/sax/sax.js\")) {\n\t\t// Make a logger\n\t\tvar logger = new $tw.utils.Logger(\"text-slicer\");\n\t\tlogger.alert(\"The plugin 'text-slicer' requires the 'sax' plugin to be installed\");\n\t}\n\t// Add tm-slice-tiddler event handler\n\t$tw.rootWidget.addEventListener(\"tm-slice-tiddler\",function(event) {\n\t\tvar slicer = new textSlicer.Slicer({\n\t\t\tsourceTiddlerTitle: event.param,\n\t\t\tslicerRules: event.paramObject && event.paramObject.slicerRules,\n\t\t\toutputMode: event.paramObject && event.paramObject.outputMode,\n\t\t\tbaseTiddlerTitle: event.paramObject && event.paramObject.destTitle,\n\t\t\trole: event.paramObject && event.paramObject.role,\n\t\t\twiki: $tw.wiki,\n\t\t\tcallback: function(err,tiddlers) {\n\t\t\t\tif(err) {\n\t\t\t\t\tlogger.alert(\"Slicer error: \" + err);\n\t\t\t\t} else {\n\t\t\t\t\t$tw.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/tiddlywiki/text-slicer/styles": {
"title": "$:/plugins/tiddlywiki/text-slicer/styles",
"tags": "$:/tags/Stylesheet",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n.tc-document-preview-column {\n\tposition: fixed;\n\toverflow-y: auto;\n\toverflow-x: visible;\n\t-webkit-overflow-scrolling: touch;\n background-color: <<colour page-background>>;\n\tright: auto;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\tfont-size: 0.9em;\n}\n\n.tc-sliced-document-title {\n\tfont-size: 1.7em;\n}\n\n.tc-slice-note {\n color: #800;\n padding: 4px 4px 4px 4px;\n border: 1px solid #feed77;\n background: #feed77;\n background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#dede80),color-stop(7%,#feed77),color-stop(92%,#feed77),color-stop(100%,#dede80));\n background: -webkit-linear-gradient(72deg,rgba(255, 255, 255, 0.5) 8%,rgba(255, 255, 255, 0.1) 80%), -webkit-linear-gradient(top,#dede80 0,#feed77 7%,#feed77 92%,#dede80 100%);\n background: -moz-linear-gradient(72deg,rgba(255, 255, 255, 0.5) 8%,rgba(255, 255, 255, 0.1) 80%), -moz-linear-gradient(top,#dede80 0,#feed77 7%,#feed77 92%,#dede80 100%);\n background: -o-linear-gradient(72deg,rgba(255, 255, 255, 0.5) 8%,rgba(255, 255, 255, 0.1) 80%), -o-linear-gradient(top,#dede80 0,#feed77 7%,#feed77 92%,#dede80 100%);\n background: -ms-linear-gradient(72deg,rgba(255, 255, 255, 0.5) 8%,rgba(255, 255, 255, 0.1) 80%), -ms-linear-gradient(top,#dede80 0,#feed77 7%,#feed77 92%,#dede80 100%);\n background: linear-gradient(72deg,rgba(255, 255, 255, 0.5) 8%,rgba(255, 255, 255, 0.1) 80%), linear-gradient(top,#dede80 0,#feed77 7%,#feed77 92%,#dede80 100%);\n\t<<box-shadow \"1px 1px 6px rgba(0,0,0,0.4)\">>\n}\n\n.tc-document-preview-column .tc-sliced-document-header {\n\tmargin-left: 24px;\n}\n\n.tc-document-preview-column .tc-sliced-document {\n\tmargin-bottom: 3px;\n}\n\n.tc-view-template-document-tiddler-wrapper,\n.tc-edit-template-document-tiddler-wrapper {\n border-top: 2px solid #D6A2A2;\n margin-left: -42px;\n margin-right: -42px;\n margin-bottom: -42px;\n padding-left: 42px;\n padding-right: 42px;\n background: #FFE3E3;\n padding-bottom: 10px;\n}\n\n.tc-edit-template-document-tiddler-wrapper {\n\tbackground: #A3A3D7;\n}\n\ndiv.tc-view-template-document-tiddler-heading a,\ndiv.tc-edit-template-document-tiddler-heading a {\n\tborder: 1px solid #D6A2A2;\n\tbackground: #fff;\n\tborder-radius: 16px;\n padding: 0px 4px 0px 4px;\n margin: 2px 4px 2px 4px;\n white-space: nowrap;\n display: inline-block;\n}\n\ndiv.tc-view-template-document-tiddler-heading a:hover,\ndiv.tc-edit-template-document-tiddler-heading a:hover {\n\tborder: 1px solid <<colour background>>;\n\ttext-decoration: none;\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n}\n\n.tc-view-template-document-tiddler-heading-icon,\n.tc-edit-template-document-tiddler-heading-icon {\n\twidth: 42px;\n\ttext-align: center;\n margin-left: -42px;\n margin-right: -42px;\n position: absolute;\n}\n\n.tc-view-template-document-tiddler-subheading,\n.tc-edit-template-document-tiddler-subheading {\n\tfont-size: 0.7em;\n\tfont-weight: bold;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-view-template-document-tiddler-heading-icon svg,\n.tc-edit-template-document-tiddler-heading-icon svg {\n\tfill: <<colour background>>;\t\n}\n\n.tc-view-template-document-tiddler {\n\tfont-size: 0.9em;\n}\n\n.tc-document-tiddler {\n\tfont-family: Georgia, Times, 'Times New Roman', serif;\n}\n\n.tc-text-slicer-rename input {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n.tc-document-tiddler-link {\n\tcursor: pointer;\n}\n\n.tc-document-tiddler-link:hover {\n background: <<color background>>;\n}\n\n.tc-document-tiddler-toolbar {\n\tposition: absolute;\n\twidth: 24px;\n\ttext-align: center;\n}\n\n.tc-document-preview-column .tc-sliced-document-body {\n\tmargin-left: 24px;\n}\n\n.tc-document-preview-column .tc-document-tiddler-toolbar {\n\tmargin-left: -24px;\n}\n\n.tc-table-of-contents .tc-slice-toolbar button {\n\tcolor: inherit;\n\tbackground-color: inherit;\n}\n\n.tc-tiddler-frame .tc-document-tiddler-toolbar {\n left: 0;\n width: 42px;\n}\n\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/def-list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/def-list",
"text": "\\define body()\n<dl>\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler\"/>\n</$list>\n</dl>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/definition": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/definition",
"text": "\\define body()\n<$link tag=\"dd\" class=\"tc-document-tiddler-link\">\n\n<$transclude/>\n\n</$link>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/document": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/document",
"text": "\\define config-document-status()\n$:/state/plugins/tiddlywiki/text-slicer/show-preview-document/$(tv-heading-status-config-prefix)$/$(currentTiddler)$\n\\end\n\n\\define config-show-toolbar()\n$:/state/plugins/tiddlywiki/text-slicer/show-toolbar/$(currentTiddler)$\n\\end\n\n\\define config-show-metadata()\n$:/state/plugins/tiddlywiki/text-slicer/show-metadata/$(currentTiddler)$\n\\end\n\n\\define config-heading-status()\n$:/state/plugins/tiddlywiki/text-slicer/heading-status/$(currentTiddler)$\n\\end\n\n\\define body()\n<$set name=\"tv-heading-status-config-title\" value=<<config-heading-status>>>\n<$set name=\"tv-show-toolbar\" value={{$(config-show-toolbar)$}}>\n<div class=\"tc-sliced-document\">\n<div class=\"tc-sliced-document-header\">\n<div class=\"tc-document-tiddler-toolbar\">\n<$reveal type=\"nomatch\" state=<<config-document-status>> text=\"close\" default=\"open\" tag=\"div\">\n<$button set=<<config-document-status>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<config-document-status>> text=\"close\" default=\"open\" tag=\"div\">\n<$button set=<<config-document-status>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n</div>\n<h1 class=\"tc-sliced-document-title\">''Document'': <$link><$view field=\"title\"/></$link></h1>\n</div>\n<$reveal type=\"nomatch\" state=<<config-document-status>> text=\"close\" default=\"open\" tag=\"div\">\n{{||$:/plugins/tiddlywiki/text-slicer/ui/document/header}}\n<div class='tc-sliced-document-body'>\n<$set name=\"tv-show-toolbar\" value={{$(config-show-toolbar)$}}>\n<$set name=\"tv-exclude-filter\" value={{!!toc-exclude-filter}}>\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler\"/>\n</$set>\n</$set>\n</div>\n</$reveal>\n</div>\n</$set>\n</$set>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/heading": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/heading",
"text": "\\define config-heading-status()\n$(tv-heading-status-config-title)$/$(tv-heading-status-config-prefix)$/$(currentTiddler)$\n\\end\n\n\\define body(level:\"h1\")\n<$set name=\"tv-heading-status-config-title\" value=<<config-heading-status>>>\n<div class=\"tc-document-tiddler\">\n<div class=\"tc-document-tiddler-toolbar\">\n<$reveal type=\"nomatch\" state=<<tv-heading-status-config-title>> text=\"close\" default=<<tv-default-heading-state>> tag=\"div\">\n<$button set=<<tv-heading-status-config-title>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<tv-heading-status-config-title>> text=\"close\" default=<<tv-default-heading-state>> tag=\"div\">\n<$button set=<<tv-heading-status-config-title>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n</div>\n<$link tag=\"$level$\" class=\"tc-document-tiddler-link\">\n<$transclude/>\n</$link>\n<$reveal type=\"nomatch\" state=<<tv-heading-status-config-title>> text=\"close\" default=<<tv-default-heading-state>> tag=\"div\">\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler\"/>\n</$reveal>\n</div>\n</$set>\n\\end\n\n<$macrocall $name=\"body\" level={{!!toc-heading-level}}/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/image": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/image",
"text": "\\define body()\n<$link tag=\"div\" class=\"tc-document-tiddler-link tc-document-tiddler\">\n\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n<$transclude/>\n\n</$list>\n\n</$link>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/item": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/item",
"text": "\\define body()\n<$link tag=\"li\" class=\"tc-document-tiddler-link\">\n\n<$transclude/>\n\n</$link>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/list",
"text": "\\define body(type:\"ul\")\n<$type$>\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler\"/>\n</$list>\n</$type$>\n\\end\n\n<$macrocall $name=\"body\" type={{!!toc-list-type}}/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/note": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/note",
"text": "\\define body()\n<div class=\"tc-slice-note\">\n\n<$link tag=\"div\" class=\"tc-document-tiddler-link tc-document-tiddler\">\n\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n<$transclude/>\n\n</$list>\n\n</$link>\n\n</div>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/paragraph": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/paragraph",
"text": "\\define body()\n<$link tag=\"div\" class=\"tc-document-tiddler-link tc-document-tiddler\">\n\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n<$transclude/>\n\n</$list>\n\n</$link>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/term": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/term",
"text": "\\define body()\n<$link tag=\"dt\" class=\"tc-document-tiddler-link\">\n\n<$transclude/>\n\n</$link>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler",
"text": "\\define if(condition,then,else)\n<$list filter=\"\"\"$condition$ +[limit[1]]\"\"\" emptyMessage=\"\"\"$else$\"\"\" variable=\"ignore\">\n$then$\n</$list>\n\\end\n\n\\define include-component(type)\n<<if \"[{!!toc-type}match[$type$]]\" \"\"\"\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/$type$\" mode=\"block\"/>\n\"\"\">>\n\\end\n\n<$list filter=\"[<tv-show-toolbar>match[yes]]\" variable=\"hasToolbar\">\n{{||$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar}}\n</$list>\n\n<<include-component \"document\">>\n<<include-component \"heading\">>\n<<include-component \"paragraph\">>\n<<include-component \"note\">>\n<<include-component \"list\">>\n<<include-component \"item\">>\n<<include-component \"image\">>\n<<include-component \"def-list\">>\n<<include-component \"term\">>\n<<include-component \"definition\">>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/def-list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/def-list",
"text": "\\define body()\n<dl>\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler\"/>\n</$list>\n</dl>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/definition": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/definition",
"text": "\\define body()\n<dd>\n\n<$transclude/>\n\n</dd>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/document": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/document",
"text": "<$set name=\"tv-exclude-filter\" value={{!!toc-exclude-filter}}>\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler\"/>\n\n</$set>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/heading": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/heading",
"text": "\\define body(level:\"h1\")\n<$level$>\n<$transclude/>\n</$level$>\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler\"/>\n\\end\n\n<$macrocall $name=\"body\" level={{!!toc-heading-level}}/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/image": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/image",
"text": "<$transclude/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/item": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/item",
"text": "\\define body()\n<li>\n\n<$transclude/>\n\n</li>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/list",
"text": "\\define body(type:\"ul\")\n<$type$>\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler\"/>\n</$list>\n</$type$>\n\\end\n\n<$macrocall $name=\"body\" type={{!!toc-list-type}}/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/note": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/note",
"text": "<!-- Don't display notes in plain mode -->\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/paragraph": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/paragraph",
"text": "\\define body()\n<div>\n\n<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n<$transclude/>\n\n</$list>\n\n</div>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/term": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/term",
"text": "\\define body()\n<dt>\n\n<$transclude/>\n\n</dt>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler",
"text": "<$vars toc-type={{!!toc-type}}>\n\n<$list filter=\"[<toc-type>match[document]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/document\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[heading]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/heading\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[paragraph]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/paragraph\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[note]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/note\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[list]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/list\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[item]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/item\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[image]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/image\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[def-list]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/def-list\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[term]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/term\" mode=\"block\"/>\n</$list>\n\n<$list filter=\"[<toc-type>match[definition]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/definition\" mode=\"block\"/>\n</$list>\n\n</$vars>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/def-list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/def-list",
"text": "<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n`<dl class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n\n`</dl>`\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/definition": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/definition",
"text": "`<dd class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$transclude/>\n\n`</dd>`\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/document": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/document",
"text": "<$set name=\"tv-exclude-filter\" value={{!!toc-exclude-filter}}>\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n\n</$set>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/heading": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/heading",
"text": "`<`<$text text={{!!toc-heading-level}}/>` class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$view field=\"text\" format=\"htmlencodedplainwikified\"/>\n\n`</`<$text text={{!!toc-heading-level}}/>`>`\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes",
"text": "<$list filter=\"[all[current]tags[]addprefix[$:/_DocumentTags/]has[title]]\"><$view field=\"css-class\"/> </$list>"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/image": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/image",
"text": "<$reveal state=\"!!_canonical_uri\" type=\"match\" text=\"\">\n\n`<img src=\"data:`<$view format=\"text\" field=\"type\"/>`;base64,`<$view format=\"text\" field=\"text\"/>`\" class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n</$reveal>\n\n<$reveal state=\"!!_canonical_uri\" type=\"nomatch\" text=\"\">\n\n`<img src=\"`<$text text=<<tv-external-image-path>>/><$view field=\"title\" format=\"doubleurlencoded\"/>`\" class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n</$reveal>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/item": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/item",
"text": "`<li class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$transclude/>\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n\n`</li>`\n\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/list": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/list",
"text": "<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n`<`<$text text={{!!toc-list-type}}/>` class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$list filter={{!!toc-list-filter}} template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n\n`</`<$text text={{!!toc-list-type}}/>`>`\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/note": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/note",
"text": "<!-- Don't display notes in static mode -->\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/paragraph": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/paragraph",
"text": "<$list filter=\"\"\"[all[current]] $(tv-exclude-filter)$ +[limit[1]]\"\"\" variable=\"item\">\n\n`<p class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$view field=\"text\" format=\"htmlencodedplainwikified\"/>\n\n`</p>`\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/term": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/term",
"text": "`<dt class=\"`{{||$:/plugins/tiddlywiki/text-slicer/templates/static/helpers/classes}}`\">`\n\n<$transclude/>\n\n`</dt>`\n\n<$list filter=\"[list<currentTiddler>!has[draft.of]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler\"/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler": {
"title": "$:/plugins/tiddlywiki/text-slicer/templates/static/tiddler",
"text": "<$vars toc-type={{!!toc-type}}>\n\n<$list filter=\"[<toc-type>match[document]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/document\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[heading]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/heading\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[paragraph]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/paragraph\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[note]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/note\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[list]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/list\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[item]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/item\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[image]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/image\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[def-list]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/def-list\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[term]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/term\" mode=\"block\"/>\n\n</$list>\n\n<$list filter=\"[<toc-type>match[definition]]\" variable=\"item\">\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/static/definition\" mode=\"block\"/>\n\n</$list>\n\n</$vars>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/document/header": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/document/header",
"text": "\\define metadatafield()\n<tr>\n<td>\n''<$transclude tiddler=<<listItem>> field=\"caption\"/>''\n</td>\n<td>\n<$reveal type=\"match\" state=\"\"\"$(listItem)$!!field-type\"\"\" text=\"string\">\n<$edit-text field={{$(listItem)$!!field}}/>\n</$reveal>\n<$reveal type=\"match\" state=\"\"\"$(listItem)$!!field-type\"\"\" text=\"list\">\n<$edit-text tag=\"textarea\" field={{$(listItem)$!!field}}/>\n</$reveal>\n</td>\n</tr>\n\\end\n\n<div class=\"tc-sliced-document-header\">\n\n''Exclude filter'': <$edit-text field=\"toc-exclude-filter\"/>\n\n<$checkbox tiddler=<<config-show-toolbar>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> Show toolbar </$checkbox> <$checkbox tiddler=<<config-show-metadata>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> Show metadata</$checkbox> <$button>\n<$action-sendmessage $message=\"tm-open-window\" $param=<<currentTiddler>> template=\"$:/plugins/tiddlywiki/text-slicer/templates/plain/document\"/>\nView document\n</$button>\n\n<$reveal state=<<config-show-metadata>> default=\"no\" type=\"match\" text=\"yes\">\n<table>\n<tbody>\n<$list filter=\"[all[system+tiddlers]tag[$:/tags/DocumentMetaData]]\" variable=\"listItem\">\n<<metadatafield>>\n</$list>\n</tbody>\n</table>\n</$reveal>\n\n\n</div>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/edit-template-segment": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/edit-template-segment",
"tags": "$:/tags/EditTemplate",
"text": "\\define edit-field(name,tag:\"input\")\n$name$:\n\n<$edit-text field=\"\"\"$name$\"\"\" tag=\"$tag$\" class=\"tc-edit-texteditor\"/>\n\\end\n\n<$reveal type=\"nomatch\" state=\"!!toc-type\" text=\"\">\n\n<div class=\"tc-edit-template-document-tiddler-wrapper\">\n\n<div class=\"tc-edit-template-document-tiddler-heading\">\n\n<div class=\"tc-edit-template-document-tiddler-heading-icon\">\n\n{{$:/core/images/file}}\n\n</div>\n\n<div class=\"tc-edit-template-document-tiddler-subheading\">\n\n<$view field=\"toc-type\"/>\n\n</div>\n\n<<edit-field \"list\" tag:\"textarea\">>\n\n</div>\n\n</div>\n\n</$reveal>\n\n"
},
"$:/plugins/tiddlywiki/text-slicer/filters/Orphans": {
"title": "$:/plugins/tiddlywiki/text-slicer/filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[has[toc-type]] -[toc-type[document]list-children[]]",
"description": "[Text-slicer] Tiddlers that are not part of any document",
"text": ""
},
"$:/plugins/tiddlywiki/text-slicer/ui/preview-column/empty": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/preview-column/empty",
"text": "<div class=\"tc-sliced-document-header\">\n\nCreate a document by slicing an existing tiddler\n\n---\n\n[[Help|$:/plugins/tiddlywiki/text-slicer/docs]]\n\n</div>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/preview-column/multiple": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/preview-column/multiple",
"text": "Show document: <$select tiddler=\"$:/plugins/tiddlywiki/text-slicer/config/currentDocument\">\n<$list filter=\"[toc-type[document]!has[draft.of]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"title\"/></option>\n</$list>\n</$select>\n\n<$tiddler tiddler={{$:/plugins/tiddlywiki/text-slicer/config/currentDocument}}>\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/document\"/>\n\n</$tiddler>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/preview-column/single": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/preview-column/single",
"text": "<$list filter=\"[toc-type[document]!has[draft.of]sort[title]limit[1]]\" template=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/document\"/>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/preview-column": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/preview-column",
"tags": "$:/tags/AboveStory",
"text": "<$scrollable fallthrough=\"no\" class=\"tc-document-preview-column\">\n\n<$vars\n\ttv-default-heading-state=\"open\"\n>\n\n<$list filter=\"[toc-type[document]!has[draft.of]sort[title]limit[1]]\" emptyMessage={{$:/plugins/tiddlywiki/text-slicer/ui/preview-column/empty}}>\n\n<$list filter=\"[toc-type[document]!has[draft.of]sort[title]butfirst[1]limit[1]]\" emptyMessage={{$:/plugins/tiddlywiki/text-slicer/ui/preview-column/single}} template=\"$:/plugins/tiddlywiki/text-slicer/ui/preview-column/multiple\"/>\n\n</$list>\n\n</$vars>\n\n</$scrollable>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/slice-modal": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/slice-modal",
"footer": "<$button message=\"tm-close-tiddler\">Cancel</$button> <$button><$action-sendmessage $message=\"tm-close-tiddler\"/><$action-sendmessage $message=\"tm-slice-tiddler\" $param=<<currentTiddler>> slicerRules={{$:/config/plugins/text-slicer/slice-rule}} outputMode={{$:/config/plugins/text-slicer/output-mode}} destTitle={{$:/config/plugins/text-slicer/base-title}}/>Slice</$button>",
"subtitle": "Slicing \"<$text text=<<currentTiddler>>/>\" into chunks",
"text": "''Choose how the tiddler should be sliced''\n\nPrefix for extracted tiddlers: <$edit-text tiddler=\"$:/config/plugins/text-slicer/base-title\" default={{{ [[Sliced up ]addsuffix<currentTiddler>addsuffix[:]] }}} tag=\"input\" size=\"30\"/>\n\n<$select tiddler=\"$:/config/plugins/text-slicer/slice-rule\" default=\"html-by-paragraph\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/text-slicer/slicer-rules]!has[draft.of]]\">\n<option value={{!!name}}><$text text={{!!description}}/></option>\n</$list>\n</$select>\n\nOutput mode: <$select tiddler=\"$:/config/plugins/text-slicer/output-mode\" default=\"html\">\n<option value=\"html\">HTML</option>\n<option value=\"wiki\">Wiki text</option>\n</$select>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button",
"tags": "$:/tags/ViewToolbar",
"list-before": "$:/core/ui/Buttons/edit",
"caption": "{{$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon}} Slice text tiddler",
"description": "Slice this text tiddler by headings and lists",
"text": "\\whitespace trim\n\n\\define hint()\nSlice this text tiddler into chunks\n\\end\n\n<$list filter=\"[<currentTiddler>!is[image]!is[binary]]\" variable=\"ignore\">\n<$button tooltip=<<hint>> aria-label=<<hint>> class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/tiddlywiki/text-slicer/ui/slice-modal\" currentTiddler=<<currentTiddler>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"> Slice tiddler</span>\n</$list>\n</$button>\n</$list>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar/title": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar/title",
"tags": "$:/tags/TextSlicerToolbar",
"text": "\\define renameProxyTitle()\n$:/state/plugins/tiddlywiki/text-slicer/rename-$(currentTiddler)$\n\\end\n\n\\define body()\n<div class=\"tc-text-slicer-rename\">\n<$edit-text tag=\"input\" tiddler=<<renameProxyTitle>> placeholder=\"Rename\" default=<<currentTiddler>>/>\n<$reveal type=\"nomatch\" state=\"\"\"$(renameProxyTitle)$\"\"\" text=<<currentTiddler>> default=<<currentTiddler>>>\n<$button>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\ncancel\n</$button>\n<$button>\n<$action-sendmessage $message=\"tm-rename-tiddler\" from=<<currentTiddler>> to={{$(renameProxyTitle)$}}/>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\nrename\n</$button>\n<$set name=\"proxy-title\" value={{$(renameProxyTitle)$}}>\n<$list filter=\"\"\"[<proxy-title>is[tiddler]]\"\"\">\nWarning: tiddler already exists\n</$list>\n</$set>\n</$reveal>\n</div>\n\\end\n\n<<body>>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar",
"text": "<div class=\"tc-slice-toolbar\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextSlicerToolbar]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n"
},
"$:/plugins/tiddlywiki/text-slicer/ui/view-template-segment": {
"title": "$:/plugins/tiddlywiki/text-slicer/ui/view-template-segment",
"tags": "$:/tags/ViewTemplate",
"text": "\\define config-heading-status()\n$:/state/plugins/tiddlywiki/text-slicer/heading-status/$(currentTiddler)$\n\\end\n\n<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$reveal type=\"nomatch\" state=\"!!toc-type\" text=\"\">\n\n<div class=\"tc-view-template-document-tiddler-wrapper\">\n\n<div class=\"tc-view-template-document-tiddler-heading\">\n\n<div class=\"tc-view-template-document-tiddler-heading-icon\">\n\n{{$:/core/images/file}}\n\n</div>\n\n<div class=\"tc-view-template-document-tiddler-subheading\">\n\n<$view field=\"toc-type\"/>\n\n</div>\n\nParents: <$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=\"None\">\n<$link><$view field=\"title\"/></$link>\n</$list>\n\n</div>\n\n<div class=\"tc-view-template-document-tiddler\">\n\n<$vars\n\ttv-default-heading-state=\"close\"\n\ttv-heading-status-config-prefix=\"view-template\"\n\ttv-heading-status-config-title=<<config-heading-status>>\n>\n\n<$transclude tiddler=\"$:/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler\"/>\n\n</$vars>\n\n</div>\n\n</div>\n\n</$reveal>\n\n</$reveal>\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/xlsx-utils/controls": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/controls",
"caption": "XLSX Utilities",
"tags": "$:/tags/ControlPanel",
"text": "\\define help-button(state)\n<$button popup=\"\"\"$:/state/expand-help/$state$\"\"\" class=\"tc-btn-invisible tc-popup-keep\">\n{{$:/core/images/help}}\n</$button>\n\\end\n\n\\define help-content(type,state)\n<$reveal tag=\"span\" state=\"\"\"$:/state/expand-help/$state$\"\"\" type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down tc-popup-keep\" style=\"padding: 0.5em; max-width: 30em; white-space: normal;\">\n<$transclude tiddler=\"\"\"$:/plugins/tiddlywiki/xlsx-utils/docs/$type$\"\"\" mode=\"block\"/>\n</div>\n</$reveal>\n\\end\n\n\\define renameProxyTitle()\n$:/state/plugins/tiddlywiki/xlsx-utils/rename-$(currentTiddler)$\n\\end\n\n\\define rename-current-tiddler()\n<$edit-text tag=\"input\" tiddler=<<renameProxyTitle>> placeholder=\"Rename\" default=<<currentTiddler>> size=\"50\"/>\n<$reveal type=\"nomatch\" state=\"\"\"$(renameProxyTitle)$\"\"\" text=<<currentTiddler>> default=<<currentTiddler>> tag=\"span\">\n<$button>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\ncancel\n</$button>\n<$button>\n<$action-sendmessage $message=\"tm-rename-tiddler\" from=<<currentTiddler>> to={{$(renameProxyTitle)$}}/>\n<$action-deletetiddler $tiddler=<<renameProxyTitle>>/>\nrename\n</$button>\n<$set name=\"proxy-title\" value={{$(renameProxyTitle)$}}>\n<$list filter=\"\"\"[<proxy-title>is[tiddler]]\"\"\">\nWarning: tiddler already exists\n</$list>\n</$set>\n</$reveal>\n\\end\n\n\\define expand-collapse-button(state)\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"no\"/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"yes\"/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n\\end\n\n\\define expand-collapse-content(state,content,class)\n<$reveal state=\"\"\"$:/state/expand/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"div\" class=\"\"\"$class$\"\"\" animate=\"yes\" retain=\"yes\">\n$content$\n</$reveal>\n\\end\n\n\\define up-down-buttons(parent,child)\n<$list filter=\"[list<$parent$>butfirst[]field:title<$child$>limit[1]]\" variable=\"listItem\">\n<$button class=\"tc-btn-invisible\">\n<$action-listops $tiddler=<<$parent$>> $subfilter=\"+[move:-1<$child$>]\"/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$list>\n<$list filter=\"[list<$parent$>butlast[]field:title<$child$>limit[1]]\" variable=\"listItem\">\n<$button class=\"tc-btn-invisible\">\n<$action-listops $tiddler=<<$parent$>> $subfilter=\"+[move:1<$child$>]\"/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$list>\n\\end\n\n\\define edit-button(state)\n<$reveal state=\"\"\"$:/state/edit/$state$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/edit/$state$\"\"\" $value=\"yes\"/>\n<$action-setfield $tiddler=\"\"\"$:/state/expand/$state$\"\"\" $value=\"yes\"/>\n{{$:/core/images/edit-button}}\n</$button>\n</$reveal>\n<$reveal state=\"\"\"$:/state/edit/$state$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/state/edit/$state$\"\"\" $value=\"no\"/>\n{{$:/core/images/done-button}} Finish editing\n</$button>\n</$reveal>\n\\end\n\n\\define delete-item-button(filter,parent,title,prompt)\n<$button class=\"tc-btn-invisible\">\n<$action-deletetiddler $filter=\"\"\"$filter$\"\"\"/>\n<$action-listops $tiddler=\"\"\"$parent$\"\"\" $subfilter=\"-[[$title$]]\"/>\n{{$:/core/images/delete-button}}$prompt$\n</$button>\n\\end\n\n\\define edit-field()\n<$select tiddler=<<field>> field=\"import-field-list-op\" default=\"none\">\n<option value=\"none\">Set field</option>\n<option value=\"append\">Append to list field</option>\n</$select>\n<$edit-text tiddler=<<field>> field=\"import-field-name\" size=\"10\" tag=\"input\" placeholder=\"field name\"default=\"\"/>\n<$reveal state=\"\"\"$(field)$!!import-field-list-op\"\"\" type=\"match\" text=\"none\" default=\"none\" tag=\"span\">\nto\n</$reveal>\n<$reveal state=\"\"\"$(field)$!!import-field-list-op\"\"\" type=\"match\" text=\"append\" default=\"none\" tag=\"span\">\nthe\n</$reveal>\n<$select tiddler=<<field>> field=\"import-field-type\" default=\"string\">\n<option value=\"date\">date</option>\n<option value=\"string\">string</option>\n</$select>\n<$select tiddler=<<field>> field=\"import-field-source\" default=\"column\">\n<option value=\"column\">from column</option>\n<option value=\"constant\">constant</option>\n</$select>\n<$reveal state=\"\"\"$(field)$!!import-field-source\"\"\" type=\"match\" text=\"column\" default=\"column\" tag=\"span\">\n<$edit-text tiddler=<<field>> field=\"import-field-column\" tag=\"input\" placeholder=\"column\" default=\"\"/>\nprefixed\n<$edit-text tiddler=<<field>> field=\"import-field-prefix\" tag=\"input\" placeholder=\"prefix\" default=\"\"/>,\nsuffixed\n<$edit-text tiddler=<<field>> field=\"import-field-suffix\" tag=\"input\" placeholder=\"suffix\" default=\"\"/>\n</$reveal>\n<$reveal state=\"\"\"$(field)$!!import-field-source\"\"\" type=\"match\" text=\"constant\" default=\"column\" tag=\"span\">\n<$edit-text tiddler=<<field>> field=\"import-field-value\" tag=\"input\" placeholder=\"constant\" default=\"\"/>\n</$reveal>\n<$checkbox tiddler=<<field>> field=\"import-field-skip-tiddler-if-blank\" checked=\"yes\" unchecked=\"no\" default=\"no\">\nSkip this tiddler when field blank\n<br/>\nTitle:\n<$tiddler tiddler=<<field>>>\n<<rename-current-tiddler>>\n</$tiddler>\n\\end\n\n\\define view-field()\n<$link to=<<field>>>\n<$list filter=\"[<field>!has[import-field-list-op]]\" variable=\"listItem\">\nSet field ''<$view tiddler=<<field>> field=\"import-field-name\"/>'' to\n</$list>\n<$list filter=\"[<field>get[import-field-list-op]prefix[append]]\" variable=\"listItem\">\nAppend to list field ''<$view tiddler=<<field>> field=\"import-field-name\"/>''\n</$list>\n<$list filter=\"[<field>has[import-field-prefix]]\" variable=\"listItem\">\n''<code><$view tiddler=<<field>> field=\"import-field-prefix\"/></code>'' +\n</$list>\n<$list filter=\"[<field>get[import-field-type]prefix[date]]\" variable=\"listItem\">\ndate\n</$list>\n<$list filter=\"[<field>get[import-field-source]prefix[column]]\" variable=\"listItem\">\nvalue from column ''<$view tiddler=<<field>> field=\"import-field-column\"/>''\n</$list>\n<$list filter=\"[<field>get[import-field-source]prefix[constant]]\" variable=\"listItem\">\nconstant ''<code><$view tiddler=<<field>> field=\"import-field-value\"/></code>''\n</$list>\n<$list filter=\"[<field>has[import-field-suffix]]\" variable=\"listItem\">\n+ ''<code><$view tiddler=<<field>> field=\"import-field-suffix\"/></code>''\n</$list>\n</$link>\n\\end\n\n\\define list-fields()\n<ul class=\"tc-import-spec-row-list\">\n<$list filter=\"[list<row>]\" variable=\"field\" emptyMessage=\"<div>(No field import specifiers)</div>\">\n<li class=\"tc-import-spec-field-wrapper\">\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"span\">\n<<edit-field>>\n<<up-down-buttons parent:\"row\" child:\"field\">>\n<$macrocall $name=\"delete-item-button\" filter=\"[<field>]\" parent=<<row>> title=<<field>>/>\n</$reveal>\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"nomatch\" text=\"yes\" default=\"no\" tag=\"span\">\n<<view-field>>\n</$reveal>\n</li>\n</$list>\n</ul>\n\\end\n\n\\define view-row-content()\n<$reveal state=\"\"\"$:/state/edit/$(row)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-row-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<row>] [<row>getlist[]]\" parent=<<sheet>> title=<<row>> prompt=\" Delete this row\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<row>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nRow type:\n<$select tiddler=<<row>> field=\"import-row-type\" default=\"by-field\">\n<option value=\"by-field\">By field</option>\n<option value=\"by-column\">By column</option>\n</$select>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Field\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"field\" import-field-name=\"fieldname\" import-field-type=\"string\" import-field-source=\"column\" import-field-column=\"Column Name\" />\n<$action-listops $tiddler=<<row>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n{{$:/core/images/new-button}} Add new field\n</$button>\n</li>\n</$reveal>\n<<list-fields>>\n\\end\n\n\\define view-row()\n<div class=\"tc-import-spec-row-wrapper\">\n<h5>\n<$macrocall $name=\"expand-collapse-button\" state=<<row>>/>\nEach row: <$list filter=\"[list<row>import-field-name[title]]\" variable=\"field\" emptyMessage=\"\n<$link to=<<field>>>(title field not set)</$link>\"><<view-field>></$list>\n<$macrocall $name=\"edit-button\" state=<<row>>/>\n<<up-down-buttons parent:\"sheet\" child:\"row\">>\n<$macrocall $name=\"help-button\" state=<<row>>/>\n</h5>\n<$macrocall $name=\"help-content\" type=\"row\" state=<<row>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<row>> content=<<view-row-content>> class=\"tc-import-spec-row\"/>\n</div>\n\\end\n\n\\define list-rows()\n<div class=\"tc-import-spec-sheet-list\">\n<$list filter=\"[list<sheet>]\" variable=\"row\" emptyMessage=\"<div>(No row import specifiers)</div>\">\n<<view-row>>\n</$list>\n\\end\n\n\\define view-sheet-content()\n<$reveal state=\"\"\"$:/state/edit/$(sheet)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-sheet-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<sheet>] [<sheet>getlist[]] [<sheet>getlist[]getlist[]]\" parent=<<workbook>> title=<<sheet>> prompt=\" Delete this sheet\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<sheet>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nImport sheet name:\n<$edit-text tiddler=<<sheet>> field=\"import-sheet-name\" size=\"50\"/>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Row\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"row\"/>\n<$action-listops $tiddler=<<sheet>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new row\n</$button>\n</li>\n</$reveal>\n<<list-rows>>\n\\end\n\n\\define view-sheet()\n<div class=\"tc-import-spec-sheet-wrapper\">\n<h4>\n<$macrocall $name=\"expand-collapse-button\" state=<<sheet>>/>\nSheet: <$link to=<<sheet>>><$view tiddler=<<sheet>> field=\"import-sheet-name\"/></$link>\n<$macrocall $name=\"edit-button\" state=<<sheet>>/>\n<<up-down-buttons parent:\"workbook\" child:\"sheet\">>\n<$macrocall $name=\"help-button\" state=<<sheet>>/>\n</h4>\n<$macrocall $name=\"help-content\" type=\"sheet\" state=<<sheet>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<sheet>> content=<<view-sheet-content>> class=\"tc-import-spec-sheet\"/>\n</div>\n\\end\n\n\\define list-sheets()\n<div class=\"tc-import-spec-workbook-list\">\n<$list filter=\"[list<workbook>]\" variable=\"sheet\" emptyMessage=\"<div>(No sheet import specifiers)</div>\">\n<<view-sheet>>\n</$list>\n</div>\n\\end\n\n\\define view-workbook-content()\n<$reveal state=\"\"\"$:/state/edit/$(workbook)$\"\"\" type=\"match\" text=\"yes\" default=\"no\" tag=\"ul\" class=\"tc-import-spec-workbook-controls\" animate=\"yes\" retain=\"yes\">\n<li>\n<$macrocall $name=\"delete-item-button\" filter=\"[<workbook>] [<workbook>getlist[]] [<workbook>getlist[]getlist[]] [<workbook>getlist[]getlist[]getlist[]]\" prompt=\" Delete this workbook\"/>\n</li>\n<li>\nTitle:\n<$tiddler tiddler=<<workbook>>>\n<<rename-current-tiddler>>\n</$tiddler>\n</li>\n<li>\nCaption:\n<$edit-text tiddler=<<workbook>> field=\"caption\" size=\"50\"/>\n</li>\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Sheet\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"sheet\" import-sheet-name=\"Sheet name\"/>\n<$action-listops $tiddler=<<workbook>> $subfilter=\"[{$:/temp/newtiddler}] +[putfirst[]]\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new sheet\n</$button>\n</li>\n</$reveal>\n<<list-sheets>>\n\\end\n\n\\define view-workbook()\n<div class=\"tc-import-spec-workbook-wrapper\">\n<h3>\n<$macrocall $name=\"expand-collapse-button\" state=<<workbook>>/>\nWorkbook: <$link to=<<workbook>>><$view tiddler=<<workbook>> field=\"caption\"/></$link>\n<$macrocall $name=\"edit-button\" state=<<workbook>>/>\n<$macrocall $name=\"help-button\" state=<<workbook>>/>\n</h3>\n<$macrocall $name=\"help-content\" type=\"workbook\" state=<<workbook>>/>\n<$macrocall $name=\"expand-collapse-content\" state=<<workbook>> content=<<view-workbook-content>> class=\"tc-import-spec-workbook\"/>\n</div>\n\\end\n\n\\define list-workbooks()\n<ul class=\"tc-import-spec-editor-controls\">\n<li>\n<$button class=\"tc-btn-invisible\">\n<$action-createtiddler $basetitle=\"$:/_ExcelImporter/ImportSpecifiers/Workbook\" $savetitle=\"$:/temp/newtiddler\" import-spec-role=\"workbook\" caption=\"New workbook\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/edit/]] }}} $value=\"yes\"/>\n<$action-setfield $tiddler={{{ [{$:/temp/newtiddler}addprefix[$:/state/expand/]] }}} $value=\"yes\"/>\n{{$:/core/images/new-button}} Add new workbook\n</$button>\n</li>\n</ul>\n<div class=\"tc-import-spec-editor-list\">\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]sort[caption]]\" variable=\"workbook\">\n<<view-workbook>>\n</$list>\n</div>\n\\end\n\n<h1>\nControls for XLSX Spreadsheet Utilities\n</h1>\n\n<div class=\"tc-import-spec-selector\">\n<h2>\nCurrent Import Specification\n</h2>\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]limit[1]]\" emptyMessage=\"\"\"\nThere are no import specifications available. Use the controls below to create one\n\"\"\">\nThis is the import specification that will be used for the next import of an `.XLSX` file\n<$select tiddler=\"$:/config/plugins/tiddlywiki/xlsx-utils/default-import-spec\">\n<$list filter=\"[all[shadows+tiddlers]import-spec-role[workbook]sort[caption]]\">\n<option value=<<currentTiddler>>><$text text={{!!caption}}/></option>\n</$list>\n</$select>\n</$list>\n</div>\n\n<div class=\"tc-import-spec-editor-wrapper\">\n<h2>\n Import Specifications\n<$macrocall $name=\"help-button\" state=\"\"/>\n</h2>\n<$macrocall $name=\"help-content\" type=\"editor\" state=\"\"/>\n<div class=\"tc-import-spec-editor\">\n<<list-workbooks>>\n</div>\n</div>\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/deserializer.js": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/deserializer.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/xlsx-utils/deserializer.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nXLSX file deserializer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse an XLSX file into tiddlers\n*/\nexports[\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"] = function(text,fields) {\n\t// Collect output tiddlers in an array\n\tvar results = [],\n\t\tXLSXImporter = require(\"$:/plugins/tiddlywiki/xlsx-utils/importer.js\").XLSXImporter,\n\t\timporter = new XLSXImporter({\n\t\t\ttext: text\n\t\t});\n\t// Return the output tiddlers\n\treturn importer.getResults();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/editor": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/editor",
"text": "!!! Import Specifications\n\nImport specifications govern how spreadsheets are converted into individual tiddlers.\n\nEach \"workbook\" describes how spreadsheets of a particular format should be converted.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/row": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/row",
"text": "!!! Row Import Specifications\n\nEach row import specification describes how one tiddler should be extracted from each row of the current sheet.\n\nNote that using multiple row import specifications within a sheet enables multiple tiddlers to be created from each row of the sheet.\n\nRows contain a list of field import specifications that describe how each field of the tiddler should be created.\n\n!!! Field Import Specifications\n\nField import specifications describe the value given to a particular field of a tiddler.\n\nThey follow a rich syntax for describing how each field of the tiddler is created. For example:\n\n* Set field `title` to string from column `Organization`\n* Set field `role` to string constant `organization`\n* Append to list field `list` the string from column `Country` prefixed with `Map:`\n\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/sheet": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/sheet",
"text": "!!! Sheet Import Specifications\n\nEach sheet import specification describes how a named sheet within a workbook should be converted into individual tiddlers.\n\nSheets contain a list of row import specifications that describe how individual rows of the sheet should be handled.\n\nEach sheet has the name of the sheet that it handles.\n\nNote that the first row of each sheet is interpreted as the title of each column.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/docs/workbook": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/docs/workbook",
"text": "!!! Workbook Import Specifications\n\nEach workbook import specification describes how spreadsheets of a particular format should be converted into individual tiddlers.\n\nCreate a new workbook for each type of spreadsheet that you will be working with.\n\nWorkbooks contain a list of sheet import specifications that describe how individual sheets of the workbook should be handled.\n\nEach workbook has a caption that you can use to describe its purpose.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/xlsx.js": {
"text": "var old_exports = exports,JSZip = require(\"$:/plugins/tiddlywiki/jszip/jszip.js\");exports = {};if($tw.browser){module.exports=undefined;};/* xlsx.js (C) 2013-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint -W041 */\n/*jshint funcscope:true, eqnull:true */\nvar XLSX = {};\n(function make_xlsx(XLSX){\nXLSX.version = '0.8.0';\nvar current_codepage = 1200, current_cptable;\nif(typeof module !== \"undefined\" && typeof require !== 'undefined') {\n\tif(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');\n\tcurrent_cptable = cptable[current_codepage];\n}\nfunction reset_cp() { set_cp(1200); }\nvar set_cp = function(cp) { current_codepage = cp; };\n\nfunction char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\nvar debom_xml = function(data) { return data; };\n\nvar _getchar = function _gc1(x) { return String.fromCharCode(x); };\nif(typeof cptable !== 'undefined') {\n\tset_cp = function(cp) { current_codepage = cp; current_cptable = cptable[cp]; };\n\tdebom_xml = function(data) {\n\t\tif(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); }\n\t\treturn data;\n\t};\n\t_getchar = function _gc2(x) {\n\t\tif(current_codepage === 1200) return String.fromCharCode(x);\n\t\treturn cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n\t};\n}\nvar Base64 = (function make_b64(){\n\tvar map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\treturn {\n\t\tencode: function(input, utf8) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1, c2, c3, e1, e2, e3, e4;\n\t\t\tfor(var i = 0; i < input.length; ) {\n\t\t\t\tc1 = input.charCodeAt(i++);\n\t\t\t\tc2 = input.charCodeAt(i++);\n\t\t\t\tc3 = input.charCodeAt(i++);\n\t\t\t\te1 = c1 >> 2;\n\t\t\t\te2 = (c1 & 3) << 4 | c2 >> 4;\n\t\t\t\te3 = (c2 & 15) << 2 | c3 >> 6;\n\t\t\t\te4 = c3 & 63;\n\t\t\t\tif (isNaN(c2)) { e3 = e4 = 64; }\n\t\t\t\telse if (isNaN(c3)) { e4 = 64; }\n\t\t\t\to += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);\n\t\t\t}\n\t\t\treturn o;\n\t\t},\n\t\tdecode: function b64_decode(input, utf8) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1, c2, c3;\n\t\t\tvar e1, e2, e3, e4;\n\t\t\tinput = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\t\t\tfor(var i = 0; i < input.length;) {\n\t\t\t\te1 = map.indexOf(input.charAt(i++));\n\t\t\t\te2 = map.indexOf(input.charAt(i++));\n\t\t\t\te3 = map.indexOf(input.charAt(i++));\n\t\t\t\te4 = map.indexOf(input.charAt(i++));\n\t\t\t\tc1 = e1 << 2 | e2 >> 4;\n\t\t\t\tc2 = (e2 & 15) << 4 | e3 >> 2;\n\t\t\t\tc3 = (e3 & 3) << 6 | e4;\n\t\t\t\to += String.fromCharCode(c1);\n\t\t\t\tif (e3 != 64) { o += String.fromCharCode(c2); }\n\t\t\t\tif (e4 != 64) { o += String.fromCharCode(c3); }\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t};\n})();\nvar has_buf = (typeof Buffer !== 'undefined');\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\treturn new (has_buf ? Buffer : Array)(len);\n\t/* jshint +W056 */\n}\n\nfunction s2a(s) {\n\tif(has_buf) return new Buffer(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n}\n\nvar bconcat = function(bufs) { return [].concat.apply([], bufs); };\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/;\n/* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nvar SSF = {};\nvar make_ssf = function make_ssf(SSF){\nSSF.version = '0.8.1';\nfunction _strrev(x) { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\nfunction pad0(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v,d){var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v,d){var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = Math.pow(2,32);\nfunction pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\nfunction isgeneral(s, i) { return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }\n/* Options */\nvar opts_fmt = [\n\t[\"date1904\", 0],\n\t[\"output\", \"\"],\n\t[\"WTF\", false]\n];\nfunction fixopts(o){\n\tfor(var y = 0; y != opts_fmt.length; ++y) if(o[opts_fmt[y][0]]===undefined) o[opts_fmt[y][0]]=opts_fmt[y][1];\n}\nSSF.opts = opts_fmt;\nvar table_fmt = {\n\t0: 'General',\n\t1: '0',\n\t2: '0.00',\n\t3: '#,##0',\n\t4: '#,##0.00',\n\t9: '0%',\n\t10: '0.00%',\n\t11: '0.00E+00',\n\t12: '# ?/?',\n\t13: '# ??/??',\n\t14: 'm/d/yy',\n\t15: 'd-mmm-yy',\n\t16: 'd-mmm',\n\t17: 'mmm-yy',\n\t18: 'h:mm AM/PM',\n\t19: 'h:mm:ss AM/PM',\n\t20: 'h:mm',\n\t21: 'h:mm:ss',\n\t22: 'm/d/yy h:mm',\n\t37: '#,##0 ;(#,##0)',\n\t38: '#,##0 ;[Red](#,##0)',\n\t39: '#,##0.00;(#,##0.00)',\n\t40: '#,##0.00;[Red](#,##0.00)',\n\t45: 'mm:ss',\n\t46: '[h]:mm:ss',\n\t47: 'mmss.0',\n\t48: '##0.0E+0',\n\t49: '@',\n\t56: '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"',\n\t65535: 'General'\n};\nvar days = [\n\t['Sun', 'Sunday'],\n\t['Mon', 'Monday'],\n\t['Tue', 'Tuesday'],\n\t['Wed', 'Wednesday'],\n\t['Thu', 'Thursday'],\n\t['Fri', 'Friday'],\n\t['Sat', 'Saturday']\n];\nvar months = [\n\t['J', 'Jan', 'January'],\n\t['F', 'Feb', 'February'],\n\t['M', 'Mar', 'March'],\n\t['A', 'Apr', 'April'],\n\t['M', 'May', 'May'],\n\t['J', 'Jun', 'June'],\n\t['J', 'Jul', 'July'],\n\t['A', 'Aug', 'August'],\n\t['S', 'Sep', 'September'],\n\t['O', 'Oct', 'October'],\n\t['N', 'Nov', 'November'],\n\t['D', 'Dec', 'December']\n];\nfunction frac(x, D, mixed) {\n\tvar sgn = x < 0 ? -1 : 1;\n\tvar B = x * sgn;\n\tvar P_2 = 0, P_1 = 1, P = 0;\n\tvar Q_2 = 1, Q_1 = 0, Q = 0;\n\tvar A = Math.floor(B);\n\twhile(Q_1 < D) {\n\t\tA = Math.floor(B);\n\t\tP = A * P_1 + P_2;\n\t\tQ = A * Q_1 + Q_2;\n\t\tif((B - A) < 0.0000000005) break;\n\t\tB = 1 / (B - A);\n\t\tP_2 = P_1; P_1 = P;\n\t\tQ_2 = Q_1; Q_1 = Q;\n\t}\n\tif(Q > D) { Q = Q_1; P = P_1; }\n\tif(Q > D) { Q = Q_2; P = P_2; }\n\tif(!mixed) return [0, sgn * P, Q];\n\tif(Q===0) throw \"Unexpected state: \"+P+\" \"+P_1+\" \"+P_2+\" \"+Q+\" \"+Q_1+\" \"+Q_2;\n\tvar q = Math.floor(sgn * P/Q);\n\treturn [q, sgn*P - q*Q, Q];\n}\nfunction general_fmt_int(v, opts) { return \"\"+v; }\nSSF._general_int = general_fmt_int;\nvar general_fmt_num = (function make_general_fmt_num() {\nvar gnr1 = /\\.(\\d*[1-9])0+$/, gnr2 = /\\.0*$/, gnr4 = /\\.(\\d*[1-9])0+/, gnr5 = /\\.0*[Ee]/, gnr6 = /(E[+-])(\\d)$/;\nfunction gfn2(v) {\n\tvar w = (v<0?12:11);\n\tvar o = gfn5(v.toFixed(12)); if(o.length <= w) return o;\n\to = v.toPrecision(10); if(o.length <= w) return o;\n\treturn v.toExponential(5);\n}\nfunction gfn3(v) {\n\tvar o = v.toFixed(11).replace(gnr1,\".$1\");\n\tif(o.length > (v<0?12:11)) o = v.toPrecision(6);\n\treturn o;\n}\nfunction gfn4(o) {\n\tfor(var i = 0; i != o.length; ++i) if((o.charCodeAt(i) | 0x20) === 101) return o.replace(gnr4,\".$1\").replace(gnr5,\"E\").replace(\"e\",\"E\").replace(gnr6,\"$10$2\");\n\treturn o;\n}\nfunction gfn5(o) {\n\t//for(var i = 0; i != o.length; ++i) if(o.charCodeAt(i) === 46) return o.replace(gnr2,\"\").replace(gnr1,\".$1\");\n\t//return o;\n\treturn o.indexOf(\".\") > -1 ? o.replace(gnr2,\"\").replace(gnr1,\".$1\") : o;\n}\nreturn function general_fmt_num(v, opts) {\n\tvar V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n\tif(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n\telse if(Math.abs(V) <= 9) o = gfn2(v);\n\telse if(V === 10) o = v.toFixed(10).substr(0,12);\n\telse o = gfn3(v);\n\treturn gfn5(gfn4(o));\n};})();\nSSF._general_num = general_fmt_num;\nfunction general_fmt(v, opts) {\n\tswitch(typeof v) {\n\t\tcase 'string': return v;\n\t\tcase 'boolean': return v ? \"TRUE\" : \"FALSE\";\n\t\tcase 'number': return (v|0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts);\n\t}\n\tthrow new Error(\"unsupported value in General format: \" + v);\n}\nSSF._general = general_fmt;\nfunction fix_hijri(date, o) { return 0; }\nfunction parse_date_code(v,opts,b2) {\n\tif(v > 2958465 || v < 0) return null;\n\tvar date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n\tvar dout=[];\n\tvar out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n\tif(Math.abs(out.u) < 1e-6) out.u = 0;\n\tfixopts(opts != null ? opts : (opts=[]));\n\tif(opts.date1904) date += 1462;\n\tif(out.u > 0.999) {\n\t\tout.u = 0;\n\t\tif(++time == 86400) { time = 0; ++date; }\n\t}\n\tif(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n\telse if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n\telse {\n\t\tif(date > 60) --date;\n\t\t/* 1 = Jan 1 1900 */\n\t\tvar d = new Date(1900,0,1);\n\t\td.setDate(d.getDate() + date - 1);\n\t\tdout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n\t\tdow = d.getDay();\n\t\tif(date < 60) dow = (dow + 6) % 7;\n\t\tif(b2) dow = fix_hijri(d, dout);\n\t}\n\tout.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n\tout.S = time % 60; time = Math.floor(time / 60);\n\tout.M = time % 60; time = Math.floor(time / 60);\n\tout.H = time;\n\tout.q = dow;\n\treturn out;\n}\nSSF.parse_date_code = parse_date_code;\n/*jshint -W086 */\nfunction write_date(type, fmt, val, ss0) {\n\tvar o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n\tswitch(type) {\n\t\tcase 98: /* 'b' buddhist year */\n\t\t\ty = val.y + 543;\n\t\t\t/* falls through */\n\t\tcase 121: /* 'y' year */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = y % 100; outl = 2; break;\n\t\t\tdefault: out = y % 10000; outl = 4; break;\n\t\t} break;\n\t\tcase 109: /* 'm' month */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.m; outl = fmt.length; break;\n\t\t\tcase 3: return months[val.m-1][1];\n\t\t\tcase 5: return months[val.m-1][0];\n\t\t\tdefault: return months[val.m-1][2];\n\t\t} break;\n\t\tcase 100: /* 'd' day */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.d; outl = fmt.length; break;\n\t\t\tcase 3: return days[val.q][0];\n\t\t\tdefault: return days[val.q][1];\n\t\t} break;\n\t\tcase 104: /* 'h' 12-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 72: /* 'H' 24-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.H; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 77: /* 'M' minutes */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.M; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad minute format: ' + fmt;\n\t\t} break;\n\t\tcase 115: /* 's' seconds */\n\t\tif(val.u === 0) switch(fmt) {\n\t\t\tcase 's': case 'ss': return pad0(val.S, fmt.length);\n\t\t\tcase '.0': case '.00': case '.000':\n\t\t}\n\t\tswitch(fmt) {\n\t\t\tcase 's': case 'ss': case '.0': case '.00': case '.000':\n\t\t\t\tif(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n\t\t\t\telse tt = ss0 === 1 ? 10 : 1;\n\t\t\t\tss = Math.round((tt)*(val.S + val.u));\n\t\t\t\tif(ss >= 60*tt) ss = 0;\n\t\t\t\tif(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n\t\t\t\to = pad0(ss,2 + ss0);\n\t\t\t\tif(fmt === 'ss') return o.substr(0,2);\n\t\t\t\treturn \".\" + o.substr(2,fmt.length-1);\n\t\t\tdefault: throw 'bad second format: ' + fmt;\n\t\t}\n\t\tcase 90: /* 'Z' absolute time */\n\t\tswitch(fmt) {\n\t\t\tcase '[h]': case '[hh]': out = val.D*24+val.H; break;\n\t\t\tcase '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n\t\t\tcase '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n\t\t\tdefault: throw 'bad abstime format: ' + fmt;\n\t\t} outl = fmt.length === 3 ? 1 : 2; break;\n\t\tcase 101: /* 'e' era */\n\t\t\tout = y; outl = 1;\n\t}\n\tif(outl > 0) return pad0(out, outl); else return \"\";\n}\n/*jshint +W086 */\nfunction commaify(s) {\n\tif(s.length <= 3) return s;\n\tvar j = (s.length % 3), o = s.substr(0,j);\n\tfor(; j!=s.length; j+=3) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,3);\n\treturn o;\n}\nvar write_num = (function make_write_num(){\nvar pct1 = /%/g;\nfunction write_num_pct(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_cm(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_exp(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(o.indexOf(\"e\") === -1) {\n\t\t\tvar fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\twhile(o.substr(0,2) === \"0.\") {\n\t\t\t\to = o[0] + o.substr(2,period) + \".\" + o.substr(2+period);\n\t\t\t\to = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r, aval, sign) {\n\tvar den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr/den);\n\tvar myn = (rr - base*den), myd = den;\n\treturn sign + (base === 0 ? \"\" : \"\"+base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + \"/\" + r[3] + pad0(myd,r[4].length));\n}\nfunction write_num_f2(r, aval, sign) {\n\treturn sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.(0+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str) {\n\tvar o = \"\", cc;\n\tfor(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n\t\tcase 35: break;\n\t\tcase 63: o+= \" \"; break;\n\t\tcase 48: o+= \"0\"; break;\n\t\tdefault: o+= String.fromCharCode(cc);\n\t}\n\treturn o;\n}\nfunction rnd(val, d) { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val, d) { return Math.round((val-Math.floor(val))*Math.pow(10,d)); }\nfunction flr(val) { if(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0)); return \"\"+Math.floor(val); }\nfunction write_num_flt(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_flt('n', ffmt, val);\n\t\treturn '(' + write_num_flt('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt[1]==' '?2:1),val);\n\tvar o, oo;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = pad0r(val,0); if(o === \"0\") o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign);\n\tif(fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1)) !== null) {\n\t\to = rnd(val, r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", r[1].length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n\t\treturn sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify(pad0r(aval,0));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n\t\to = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n\t}\n\tif(fmt.match(phone) !== null) {\n\t\to = write_num_flt(type, \"##########\", val);\n\t\treturn \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n\t}\n\tvar oa = \"\";\n\tif((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(r[4].length,7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, false);\n\t\to = \"\" + sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rpad_(ff[2],ri);\n\t\tif(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n\t\to += oa;\n\t\treturn o;\n\t}\n\tif((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length),7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, true);\n\t\treturn sign + (ff[0]||(ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1],ri) + r[2] + \"/\" + r[3] + rpad_(ff[2],ri): fill(\" \", 2*ri+1 + r[2].length + r[3].length));\n\t}\n\tif((r = fmt.match(/^[#0?]+$/)) !== null) {\n\t\to = pad0r(val, 0);\n\t\tif(fmt.length <= o.length) return o;\n\t\treturn hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n if((r = fmt.match(/^([#0?]+)\\.([#0]+)$/)) !== null) {\n\t\to = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tvar lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n\t}\n\tif((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n\t\tri = dec(val, r[1].length);\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$) { return \"00,\" + ($$.length < 3 ? pad0(0,3-$$.length) : \"\") + $$; }) + \".\" + pad0(ri,r[1].length);\n\t}\n\tswitch(fmt) {\n\t\tcase \"#,###\": var x = commaify(pad0r(aval,0)); return x !== \"0\" ? sign + x : \"\";\n\t\tdefault:\n\t}\n\tthrow new Error(\"unsupported format |\" + fmt + \"|\");\n}\nfunction write_num_cm2(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_pct2(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_exp2(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(!o.match(/[Ee]/)) {\n\t\t\tvar fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o[0] + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o[o.length-1];\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nfunction write_num_int(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_int('n', ffmt, val);\n\t\treturn '(' + write_num_int('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt[1]==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = (\"\"+val); if(val === 0) o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign);\n\tif(fmt.match(/^#+0+$/) !== null) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1)) !== null) {\n\t\to = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+r[1]).replace(/\\.$/,\".\"+r[1]).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", r[1].length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/)) !== null) {\n\t\treturn sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#,##0(\\.?)$/)) !== null) return sign + commaify((\"\"+aval));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/)) !== null) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/)) !== null) {\n\t\to = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':\"\";}));\n\t}\n\tif(fmt.match(phone) !== null) {\n\t\to = write_num_int(type, \"##########\", val);\n\t\treturn \"(\" + o.substr(0,3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\n\t}\n\tvar oa = \"\";\n\tif((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(r[4].length,7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, false);\n\t\to = \"\" + sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif(oa[oa.length-1] == \" \") oa = oa.substr(0,oa.length-1) + \"0\";\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rpad_(ff[2],ri);\n\t\tif(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;\n\t\to += oa;\n\t\treturn o;\n\t}\n\tif((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/)) !== null) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length),7);\n\t\tff = frac(aval, Math.pow(10,ri)-1, true);\n\t\treturn sign + (ff[0]||(ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1],ri) + r[2] + \"/\" + r[3] + rpad_(ff[2],ri): fill(\" \", 2*ri+1 + r[2].length + r[3].length));\n\t}\n\tif((r = fmt.match(/^[#0?]+$/)) !== null) {\n\t\to = \"\" + val;\n\t\tif(fmt.length <= o.length) return o;\n\t\treturn hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(/^([#0]+)\\.([#0]+)$/)) !== null) {\n\t\to = \"\" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,\"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tvar lres = fmt.indexOf(\".\") - ri, rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));\n\t}\n\tif((r = fmt.match(/^00,000\\.([#0]*0)$/)) !== null) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify(\"\"+val).replace(/^\\d,\\d{3}$/,\"0$&\").replace(/^\\d*$/,function($$) { return \"00,\" + ($$.length < 3 ? pad0(0,3-$$.length) : \"\") + $$; }) + \".\" + pad0(0,r[1].length);\n\t}\n\tswitch(fmt) {\n\t\tcase \"#,###\": var x = commaify(\"\"+aval); return x !== \"0\" ? sign + x : \"\";\n\t\tdefault:\n\t}\n\tthrow new Error(\"unsupported format |\" + fmt + \"|\");\n}\nreturn function write_num(type, fmt, val) {\n\treturn (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\n};})();\nfunction split_fmt(fmt) {\n\tvar out = [];\n\tvar in_str = false, cc;\n\tfor(var i = 0, j = 0; i < fmt.length; ++i) switch((cc=fmt.charCodeAt(i))) {\n\t\tcase 34: /* '\"' */\n\t\t\tin_str = !in_str; break;\n\t\tcase 95: case 42: case 92: /* '_' '*' '\\\\' */\n\t\t\t++i; break;\n\t\tcase 59: /* ';' */\n\t\t\tout[out.length] = fmt.substr(j,i-j);\n\t\t\tj = i+1;\n\t}\n\tout[out.length] = fmt.substr(j);\n\tif(in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\n\treturn out;\n}\nSSF._split = split_fmt;\nvar abstime = /\\[[HhMmSs]*\\]/;\nfunction eval_fmt(fmt, v, opts, flen) {\n\tvar out = [], o = \"\", i = 0, c = \"\", lst='t', q, dt, j, cc;\n\tvar hr='H';\n\t/* Tokenize */\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt[i])) {\n\t\t\tcase 'G': /* General */\n\t\t\t\tif(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n\t\t\t\tout[out.length] = {t:'G', v:'General'}; i+=7; break;\n\t\t\tcase '\"': /* Literal text */\n\t\t\t\tfor(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n\t\t\t\tout[out.length] = {t:'t', v:o}; ++i; break;\n\t\t\tcase '\\\\': var w = fmt[++i], t = (w === \"(\" || w === \")\") ? w : 't';\n\t\t\t\tout[out.length] = {t:t, v:w}; ++i; break;\n\t\t\tcase '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n\t\t\tcase '@': /* Text Placeholder */\n\t\t\t\tout[out.length] = {t:'T', v:v}; ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt[i+1] === \"1\" || fmt[i+1] === \"2\") {\n if(dt==null) { dt=parse_date_code(v, opts, fmt[i+1] === \"2\"); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\tc = c.toLowerCase();\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n\t\t\t\tif(v < 0) return \"\";\n\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\to = c; while(++i<fmt.length && fmt[i].toLowerCase() === c) o+=c;\n\t\t\t\tif(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */\n\t\t\t\tif(c === 'h') c = hr;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase 'A':\n\t\t\t\tq={t:c, v:\"A\"};\n\t\t\t\tif(dt==null) dt=parse_date_code(v, opts);\n if(fmt.substr(i, 3) === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n else if(fmt.substr(i,5) === \"AM/PM\") { if(dt!=null) q.v = dt.H >= 12 ? \"PM\" : \"AM\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse { q.t = \"t\"; ++i; }\n\t\t\t\tif(dt==null && q.t === 'T') return \"\";\n\t\t\t\tout[out.length] = q; lst = c; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt[i++] !== ']' && i < fmt.length) o += fmt[i];\n\t\t\t\tif(o.substr(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n\t\t\t\tif(o.match(abstime)) {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'Z', v:o.toLowerCase()};\n\t\t\t\t} else { o=\"\"; }\n\t\t\t\tbreak;\n\t\t\t/* Numbers */\n\t\t\tcase '.':\n\t\t\t\tif(dt != null) {\n\t\t\t\t\to = c; while((c=fmt[++i]) === \"0\") o += c;\n\t\t\t\t\tout[out.length] = {t:'s', v:o}; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\to = c; while(\"0#?.,E+-%\".indexOf(c=fmt[++i]) > -1 || c=='\\\\' && fmt[i+1] == \"-\" && \"0#\".indexOf(fmt[i+2])>-1) o += c;\n\t\t\t\tout[out.length] = {t:'n', v:o}; break;\n\t\t\tcase '?':\n\t\t\t\to = c; while(fmt[++i] === c) o+=c;\n\t\t\t\tq={t:c, v:o}; out[out.length] = q; lst = c; break;\n\t\t\tcase '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // **\n\t\t\tcase '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\to = c; while(\"0123456789\".indexOf(fmt[++i]) > -1) o+=fmt[i];\n\t\t\t\tout[out.length] = {t:'D', v:o}; break;\n\t\t\tcase ' ': out[out.length] = {t:c, v:c}; ++i; break;\n\t\t\tdefault:\n\t\t\t\tif(\",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n\t\t\t\tout[out.length] = {t:'t', v:c}; ++i; break;\n\t\t}\n\t}\n\tvar bt = 0, ss0 = 0, ssm;\n\tfor(i=out.length-1, lst='t'; i >= 0; --i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n\t\t\tcase 's':\n\t\t\t\tif((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n\t\t\t\tif(bt < 3) bt = 3;\n\t\t\t/* falls through */\n\t\t\tcase 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n\t\t\tcase 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n\t\t\tcase 'X': if(out[i].v === \"B2\");\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tif(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n\t\t\t\tif(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n\t\t\t\tif(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n\t\t}\n\t}\n\tswitch(bt) {\n\t\tcase 0: break;\n\t\tcase 1:\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tif(dt.M >= 60) { dt.M = 0; ++dt.H; }\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tbreak;\n\t}\n\t/* replace fields */\n\tvar nstr = \"\", jj;\n\tfor(i=0; i < out.length; ++i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 't': case 'T': case ' ': case 'D': break;\n\t\t\tcase 'X': out[i] = undefined; break;\n\t\t\tcase 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\n\t\t\t\tout[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n\t\t\t\tout[i].t = 't'; break;\n\t\t\tcase 'n': case '(': case '?':\n\t\t\t\tjj = i+1;\n\t\t\t\twhile(out[jj] != null && (\n\t\t\t\t\t(c=out[jj].t) === \"?\" || c === \"D\" ||\n\t\t\t\t\t(c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/') ||\n\t\t\t\t\tout[i].t === '(' && (c === ' ' || c === 'n' || c === ')') ||\n\t\t\t\t\tc === 't' && (out[jj].v === '/' || '$€'.indexOf(out[jj].v) > -1 || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')\n\t\t\t\t)) {\n\t\t\t\t\tout[i].v += out[jj].v;\n\t\t\t\t\tout[jj] = undefined; ++jj;\n\t\t\t\t}\n\t\t\t\tnstr += out[i].v;\n\t\t\t\ti = jj-1; break;\n\t\t\tcase 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;\n\t\t}\n\t}\n\tvar vv = \"\", myv, ostr;\n\tif(nstr.length > 0) {\n\t\tmyv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); /* '-' */\n\t\tostr = write_num(nstr.charCodeAt(0) === 40 ? '(' : 'n', nstr, myv); /* '(' */\n\t\tjj=ostr.length-1;\n\t\tvar decpt = out.length;\n\t\tfor(i=0; i < out.length; ++i) if(out[i] != null && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n\t\tvar lasti=out.length;\n\t\tif(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tfor(i=out.length-1; i>= 0;--i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n\t\t\t\tif(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n\t\t\t\telse if(jj < 0) out[i].v = \"\";\n\t\t\t\telse { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n\t\t}\n\t\telse if(decpt !== out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tjj = ostr.indexOf(\".\")-1;\n\t\t\tfor(i=decpt; i>= 0; --i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n\t\t\t\tvv = out[i].v.substr(j+1);\n\t\t\t\tfor(; j>=0; --j) {\n\t\t\t\t\tif(jj>=0 && (out[i].v[j] === \"0\" || out[i].v[j] === \"#\")) vv = ostr[jj--] + vv;\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;\n\t\t\tjj = ostr.indexOf(\".\")+1;\n\t\t\tfor(i=decpt; i<out.length; ++i) {\n\t\t\t\tif(out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt ) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n\t\t\t\tvv = out[i].v.substr(0,j);\n\t\t\t\tfor(; j<out[i].v.length; ++j) {\n\t\t\t\t\tif(jj<ostr.length) vv += ostr[jj++];\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t}\n\t}\n\tfor(i=0; i<out.length; ++i) if(out[i] != null && 'n(?'.indexOf(out[i].t)>-1) {\n\t\tmyv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n\t\tout[i].v = write_num(out[i].t, out[i].v, myv);\n\t\tout[i].t = 't';\n\t}\n\tvar retval = \"\";\n\tfor(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n\treturn retval;\n}\nSSF._eval = eval_fmt;\nvar cfregex = /\\[[=<>]/;\nvar cfregex2 = /\\[([=<>]*)(-?\\d+\\.?\\d*)\\]/;\nfunction chkcond(v, rr) {\n\tif(rr == null) return false;\n\tvar thresh = parseFloat(rr[2]);\n\tswitch(rr[1]) {\n\t\tcase \"=\": if(v == thresh) return true; break;\n\t\tcase \">\": if(v > thresh) return true; break;\n\t\tcase \"<\": if(v < thresh) return true; break;\n\t\tcase \"<>\": if(v != thresh) return true; break;\n\t\tcase \">=\": if(v >= thresh) return true; break;\n\t\tcase \"<=\": if(v <= thresh) return true; break;\n\t}\n\treturn false;\n}\nfunction choose_fmt(f, v) {\n\tvar fmt = split_fmt(f);\n\tvar l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n\tif(l<4 && lat>-1) --l;\n\tif(fmt.length > 4) throw \"cannot find right format for |\" + fmt + \"|\";\n\tif(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n\tswitch(fmt.length) {\n\t\tcase 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n\t\tcase 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n\t\tcase 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n\t\tcase 4: break;\n\t}\n\tvar ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n\tif(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n\tif(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\n\t\tvar m1 = fmt[0].match(cfregex2);\n\t\tvar m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [l, ff];\n}\nfunction format(fmt,v,o) {\n\tfixopts(o != null ? o : (o=[]));\n\tvar sfmt = \"\";\n\tswitch(typeof fmt) {\n\t\tcase \"string\": sfmt = fmt; break;\n\t\tcase \"number\": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break;\n\t}\n\tif(isgeneral(sfmt,0)) return general_fmt(v, o);\n\tvar f = choose_fmt(sfmt, v);\n\tif(isgeneral(f[1])) return general_fmt(v, o);\n\tif(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n\telse if(v === \"\" || v == null) return \"\";\n\treturn eval_fmt(f[1], v, o, f[0]);\n}\nSSF._table = table_fmt;\nSSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt; };\nSSF.format = format;\nSSF.get_table = function get_table() { return table_fmt; };\nSSF.load_table = function load_table(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF.load(tbl[i], i); };\n};\nmake_ssf(SSF);\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap = {\n\t\"General Number\": \"General\",\n\t\"General Date\": SSF._table[22],\n\t\"Long Date\": \"dddd, mmmm dd, yyyy\",\n\t\"Medium Date\": SSF._table[15],\n\t\"Short Date\": SSF._table[14],\n\t\"Long Time\": SSF._table[19],\n\t\"Medium Time\": SSF._table[18],\n\t\"Short Time\": SSF._table[20],\n\t\"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"Fixed\": SSF._table[2],\n\t\"Standard\": SSF._table[4],\n\t\"Percent\": SSF._table[10],\n\t\"Scientific\": SSF._table[11],\n\t\"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n\t\"True/False\": '\"True\";\"True\";\"False\";@',\n\t\"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n};\n\nvar DO_NOT_EXPORT_CFB = true;\n/* cfb.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n\n/* [MS-CFB] v20130118 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '0.10.2';\nfunction parse(file) {\nvar mver = 3; // major version\nvar ssz = 512; // sector size\nvar nmfs = 0; // number of mini FAT sectors\nvar ndfs = 0; // number of DIFAT sectors\nvar dir_start = 0; // first directory sector location\nvar minifat_start = 0; // first mini FAT sector location\nvar difat_start = 0; // first mini FAT sector location\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tdefault: throw \"Major Version: Expected 3 or 4 saw \" + mver;\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar nds = blob.read_shift(4, 'i');\nif(mver === 3 && nds !== 0) throw '# Directory Sectors: Expected 0 saw ' + nds;\n\n// Number of FAT Sectors\n//var nfs = blob.read_shift(4, 'i');\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\nndfs = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, ndfs, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [], FullPathDir = {};\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);\n\nbuild_full_paths(FileIndex, FullPathDir, FullPaths, Paths);\n\nvar root_name = Paths.shift();\nPaths.root = root_name;\n\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nvar find_path = make_find_path(FullPaths, Paths, FileIndex, files, root_name);\n\nreturn {\n\traw: {header: header, sectors: sectors},\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths,\n\tFullPathDir: FullPathDir,\n\tfind: find_path\n};\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\tblob.chk(HEADER_CLSID, 'CLSID: ');\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\tblob.chk('feff', 'Byte Order: ');\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver !== 3) throw 'MajorVersion/SectorShift Mismatch'; break;\n\t\tcase 0x0c: if(mver !== 4) throw 'MajorVersion/SectorShift Mismatch'; break;\n\t\tdefault: throw 'Sector Shift: Expected 9 or 12 saw ' + shift;\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = new Array(nsectors);\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FPD, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = new Array(pl), q = new Array(pl);\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1) { dad[L] = dad[i]; q.push(L); }\n\t\tif(R !== -1) { dad[R] = dad[i]; q.push(R); }\n\t}\n\tfor(i=1; i !== pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = dad[i];\n\t\tif(j === 0) FP[i] = FP[0] + \"/\" + FP[i];\n\t\telse while(j !== 0) {\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t\tj = dad[j];\n\t\t}\n\t\tdad[i] = 0;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t\tFPD[FP[i]] = FI[i];\n\t}\n}\n\n/* [MS-CFB] 2.6.4 */\nfunction make_find_path(FullPaths, Paths, FileIndex, files, root_name) {\n\tvar UCFullPaths = new Array(FullPaths.length);\n\tvar UCPaths = new Array(Paths.length), i;\n\tfor(i = 0; i < FullPaths.length; ++i) UCFullPaths[i] = FullPaths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n\tfor(i = 0; i < Paths.length; ++i) UCPaths[i] = Paths[i].toUpperCase().replace(chr0,'').replace(chr1,'!');\n\treturn function find_path(path) {\n\t\tvar k;\n\t\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k=true; path = root_name + path; }\n\t\telse k = path.indexOf(\"/\") !== -1;\n\t\tvar UCPath = path.toUpperCase().replace(chr0,'').replace(chr1,'!');\n\t\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\t\tif(w === -1) return null;\n\t\treturn k === true ? FileIndex[w] : files[Paths[w]];\n\t};\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bytes */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw \"DIFAT chain shorter than expected\";\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tsleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar sl = sectors.length;\n\tvar buf, buf_chain;\n\tif(!chkd) chkd = new Array(sl);\n\tvar modulus = ssz - 1, j, jj;\n\tbuf = [];\n\tbuf_chain = [];\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = new Array(sl);\n\tvar chkd = new Array(sl), buf, buf_chain;\n\tvar modulus = ssz - 1, i, j, k, jj;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = [];\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k] === true) continue;\n\t\tbuf_chain = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw \"FAT boundary crossed: \" + j + \" 4 \"+ssz;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t}\n\t\tsector_list[k] = {nodes: buf, data:__toBuffer([buf_chain])};\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {\n\tvar blob;\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name, o, ctime, mtime;\n\tfor(; i < sector.length; i+= 128) {\n\t\tblob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tif(namelen === 0) continue;\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\to = {\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i')\n\t\t};\n\t\tctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) {\n\t\t\to.ctime = ctime; o.ct = read_date(blob, blob.l-8);\n\t\t}\n\t\tmtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) {\n\t\t\to.mtime = mtime; o.mt = read_date(blob, blob.l-8);\n\t\t}\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = sector_list[o.start].data.slice(0,o.size);\n\t\t\tprep_blob(o.content, 0);\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN) {\n\t\t\t\to.content = sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);\n\t\t\t\tprep_blob(o.content, 0);\n\t\t\t}\n\t\t}\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nvar fs;\nfunction readFileSync(filename, options) {\n\tif(fs === undefined) fs = require('fs');\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction readSync(blob, options) {\n\tswitch(options !== undefined && options.type !== undefined ? options.type : \"base64\") {\n\t\tcase \"file\": return readFileSync(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64.decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob);\n}\n\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nexports.read = readSync;\nexports.parse = parse;\nexports.utils = {\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\nfunction isval(x) { return x !== undefined && x !== null; }\n\nfunction keys(o) { return Object.keys(o); }\n\nfunction evert_key(obj, key) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i];\n\treturn o;\n}\n\nfunction evert(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n\treturn o;\n}\n\nfunction evert_num(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n\treturn o;\n}\n\nfunction evert_arr(obj) {\n\tvar o = [], K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) {\n\t\tif(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n\t\to[obj[K[i]]].push(K[i]);\n\t}\n\treturn o;\n}\n\n/* TODO: date1904 logic */\nfunction datenum(v, date1904) {\n\tif(date1904) v+=1462;\n\tvar epoch = Date.parse(v);\n\treturn (epoch + 2209161600000) / (24 * 60 * 60 * 1000);\n}\n\nfunction cc2str(arr) {\n\tvar o = \"\";\n\tfor(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);\n\treturn o;\n}\n\nfunction getdata(data) {\n\tif(!data) return null;\n\tif(data.name.substr(-4) === \".bin\") {\n\t\tif(data.data) return char_codes(data.data);\n\t\tif(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n\t\tif(data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent());\n\t} else {\n\t\tif(data.data) return data.name.substr(-4) !== \".bin\" ? debom_xml(data.data) : char_codes(data.data);\n\t\tif(data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString('binary'));\n\t\tif(data.asBinary) return debom_xml(data.asBinary());\n\t\tif(data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n\t}\n\treturn null;\n}\n\nfunction safegetzipfile(zip, file) {\n\tvar f = file; if(zip.files[f]) return zip.files[f];\n\tf = file.toLowerCase(); if(zip.files[f]) return zip.files[f];\n\tf = f.replace(/\\//g,'\\\\'); if(zip.files[f]) return zip.files[f];\n\treturn null;\n}\n\nfunction getzipfile(zip, file) {\n\tvar o = safegetzipfile(zip, file);\n\tif(o == null) throw new Error(\"Cannot find file \" + file + \" in zip\");\n\treturn o;\n}\n\nfunction getzipdata(zip, file, safe) {\n\tif(!safe) return getdata(getzipfile(zip, file));\n\tif(!file) return null;\n\ttry { return getzipdata(zip, file); } catch(e) { return null; }\n}\n\nvar _fs, jszip;\nif(typeof JSZip !== 'undefined') jszip = JSZip;\nif (typeof exports !== 'undefined') {\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tif(has_buf && typeof jszip === 'undefined') jszip = require('js'+'zip');\n\t\tif(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip;\n\t\t_fs = require('f'+'s');\n\t}\n}\nvar attregexg=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar tagregex=/<[^>]*>/g;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag, skip_root) {\n\tvar z = [];\n\tvar eq = 0, c = 0;\n\tfor(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n\tif(!skip_root) z[0] = tag.substr(0, eq);\n\tif(eq === tag.length) return z;\n\tvar m = tag.match(attregexg), j=0, w=\"\", v=\"\", i=0, q=\"\", cc=\"\";\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\tcc = m[i];\n\t\tfor(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n\t\tq = cc.substr(0,c); v = cc.substring(c+2, cc.length-1);\n\t\tfor(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n\t\tif(j===q.length) z[q] = v;\n\t\telse z[(j===5 && q.substr(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.substr(j+1)] = v;\n\t}\n\treturn z;\n}\nfunction strip_ns(x) { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n\t'"': '\"',\n\t''': \"'\",\n\t'>': '>',\n\t'<': '<',\n\t'&': '&'\n};\nvar rencoding = evert(encodings);\nvar rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml = (function() {\n\tvar encregex = /&[a-z]*;/g, coderegex = /_x([\\da-fA-F]+)_/g;\n\treturn function unescapexml(text){\n\t\tvar s = text + '';\n\t\treturn s.replace(encregex, function($$) { return encodings[$$]; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n\t};\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).substr(-4) + \"_\";});\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr = (function() {\n\tvar entregex = /&#(\\d+);/g;\n\tfunction entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }\n\treturn function xlml_fixstr(str) { return str.replace(entregex,entrepl); };\n})();\n\nfunction parsexmlbool(value, tag) {\n\tswitch(value) {\n\t\tcase '1': case 'true': case 'TRUE': return true;\n\t\t/* case '0': case 'false': case 'FALSE':*/\n\t\tdefault: return false;\n\t}\n}\n\nvar utf8read = function utf8reada(orig) {\n\tvar out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n\twhile (i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tif (c < 128) { out += String.fromCharCode(c); continue; }\n\t\td = orig.charCodeAt(i++);\n\t\tif (c>191 && c<224) { out += String.fromCharCode(((c & 31) << 6) | (d & 63)); continue; }\n\t\te = orig.charCodeAt(i++);\n\t\tif (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n\t\tf = orig.charCodeAt(i++);\n\t\tw = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n\t\tout += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n\t\tout += String.fromCharCode(0xDC00 + (w&1023));\n\t}\n\treturn out;\n};\n\n\nif(has_buf) {\n\tvar utf8readb = function utf8readb(data) {\n\t\tvar out = new Buffer(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n\t\tfor(i = 0; i < data.length; i+=j) {\n\t\t\tj = 1;\n\t\t\tif((c=data.charCodeAt(i)) < 128) w = c;\n\t\t\telse if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n\t\t\telse if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n\t\t\telse { j = 4;\n\t\t\t\tw = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n\t\t\t\tw -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n\t\t\t}\n\t\t\tif(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n\t\t\tout[k++] = w%256; out[k++] = w>>>8;\n\t\t}\n\t\tout.length = k;\n\t\treturn out.toString('ucs2');\n\t};\n\tvar corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\n\tif(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;\n\tvar utf8readc = function utf8readc(data) { return Buffer(data, 'binary').toString('utf8'); };\n\tif(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;\n}\n\n// matches <foo>...</foo> extracts content\nvar matchtag = (function() {\n\tvar mtcache = {};\n\treturn function matchtag(f,g) {\n\t\tvar t = f+\"|\"+g;\n\t\tif(mtcache[t] !== undefined) return mtcache[t];\n\t\treturn (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([^\\u2603]*)</(?:\\\\w+:)?'+f+'>',(g||\"\")));\n\t};\n})();\n\nvar vtregex = (function(){ var vt_cache = {};\n\treturn function vt_regex(bt) {\n\t\tif(vt_cache[bt] !== undefined) return vt_cache[bt];\n\t\treturn (vt_cache[bt] = new RegExp(\"<vt:\" + bt + \">(.*?)</vt:\" + bt + \">\", 'g') );\n};})();\nvar vtvregex = /<\\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</;\nfunction parseVector(data) {\n\tvar h = parsexmltag(data);\n\n\tvar matches = data.match(vtregex(h.baseType))||[];\n\tif(matches.length != h.size) throw \"unexpected vector length \" + matches.length + \" != \" + h.size;\n\tvar res = [];\n\tmatches.forEach(function(x) {\n\t\tvar v = x.replace(vtvregex,\"\").match(vtmregex);\n\t\tres.push({v:v[2], t:v[1]});\n\t});\n\treturn res;\n}\n\nvar wtregex = /(^\\s|\\s$|\\n)/;\nfunction writetag(f,g) {return '<' + f + (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f + '>';}\n\nfunction wxt_helper(h) { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f,g,h) { return '<' + f + (isval(h) ? wxt_helper(h) : \"\") + (isval(g) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '</' + f : \"/\") + '>';}\n\nfunction write_w3cdtf(d, t) { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } }\n\nfunction write_vt(s) {\n\tswitch(typeof s) {\n\t\tcase 'string': return writextag('vt:lpwstr', s);\n\t\tcase 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', String(s));\n\t\tcase 'boolean': return writextag('vt:bool',s?'true':'false');\n\t}\n\tif(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n\tthrow new Error(\"Unable to serialize \" + s);\n}\n\nvar XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';\nvar XMLNS = {\n\t'dc': 'http://purl.org/dc/elements/1.1/',\n\t'dcterms': 'http://purl.org/dc/terms/',\n\t'dcmitype': 'http://purl.org/dc/dcmitype/',\n\t'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n\t'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n\t'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n\t'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n\t'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n\t'xsd': 'http://www.w3.org/2001/XMLSchema'\n};\n\nXMLNS.main = [\n\t'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n\t'http://purl.oclc.org/ooxml/spreadsheetml/main',\n\t'http://schemas.microsoft.com/office/excel/2006/main',\n\t'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nfunction readIEEE754(buf, idx, isLE, nl, ml) {\n\tif(isLE === undefined) isLE = true;\n\tif(!nl) nl = 8;\n\tif(!ml && nl === 8) ml = 52;\n\tvar e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1;\n\tvar bits = -7, d = isLE ? -1 : 1, i = isLE ? (nl - 1) : 0, s = buf[idx + i];\n\n\ti += d;\n\te = s & ((1 << (-bits)) - 1); s >>>= (-bits); bits += el;\n\tfor (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8);\n\tm = e & ((1 << (-bits)) - 1); e >>>= (-bits); bits += ml;\n\tfor (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8);\n\tif (e === eMax) return m ? NaN : ((s ? -1 : 1) * Infinity);\n\telse if (e === 0) e = 1 - eBias;\n\telse { m = m + Math.pow(2, ml); e = e - eBias; }\n\treturn (s ? -1 : 1) * m * Math.pow(2, e - ml);\n}\n\nvar __toBuffer, ___toBuffer;\n__toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };\nvar __utf16le, ___utf16le;\n__utf16le = ___utf16le = function utf16le_(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join(\"\"); };\nvar __hexlify, ___hexlify;\n__hexlify = ___hexlify = function hexlify_(b,s,l) { return b.slice(s,(s+l)).map(function(x){return (x<16?\"0\":\"\") + x.toString(16);}).join(\"\"); };\nvar __utf8, ___utf8;\n__utf8 = ___utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(\"\"); };\nvar __lpstr, ___lpstr;\n__lpstr = ___lpstr = function lpstr_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __lpwstr, ___lpwstr;\n__lpwstr = ___lpwstr = function lpwstr_(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __double, ___double;\n__double = ___double = function(b, idx) { return readIEEE754(b, idx);};\n\nvar is_buf = function is_buf_a(a) { return Array.isArray(a); };\nif(has_buf) {\n\t__utf16le = function utf16le_b(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e); };\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__lpstr = function lpstr_b(b,i) { if(!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__lpwstr = function lpwstr_b(b,i) { if(!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};\n\t__utf8 = function utf8_b(s,e) { return this.toString('utf8',s,e); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };\n\t__double = function double_(b,i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };\n\tis_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };\n}\n\n/* from js-xls */\nif(typeof cptable !== 'undefined') {\n\t__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)); };\n\t__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };\n\t__lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : \"\";};\n}\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\n\nvar ___unhexlify = function(s) { return s.match(/../g).map(function(x) { return parseInt(x,16);}); };\nvar __unhexlify = typeof Buffer !== \"undefined\" ? function(s) { return Buffer.isBuffer(s) ? new Buffer(s, 'hex') : ___unhexlify(s); } : ___unhexlify;\n\nfunction ReadShift(size, t) {\n\tvar o=\"\", oI, oR, oo=[], w, vv, i, loc;\n\tswitch(t) {\n\t\tcase 'dbcs':\n\t\t\tloc = this.l;\n\t\t\tif(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n\t\t\telse for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n\t\t\tsize *= 2;\n\t\t\tbreak;\n\n\t\tcase 'utf8': o = __utf8(this, this.l, this.l + size); break;\n\t\tcase 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n\t\t/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n\t\tcase 'lpstr': o = __lpstr(this, this.l); size = 5 + o.length; break;\n\t\t/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n\t\tcase 'lpwstr': o = __lpwstr(this, this.l); size = 5 + o.length; if(o[o.length-1] == '\\u0000') size += 2; break;\n\n\t\tcase 'cstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n\t\t\to = oo.join(\"\"); break;\n\t\tcase 'wstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n\t\t\tsize+=2; o = oo.join(\"\"); break;\n\n\t\t/* sbcs and dbcs support continue records in the SST way TODO codepages */\n\t\tcase 'dbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt16LE(this, loc)));\n\t\t\t\tloc+=2;\n\t\t\t} o = oo.join(\"\"); size *= 2; break;\n\n\t\tcase 'sbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt8(this, loc)));\n\t\t\t\tloc+=1;\n\t\t\t} o = oo.join(\"\"); break;\n\n\t\tdefault:\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n\t\tcase 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n\t\tcase 4:\n\t\t\tif(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = __readInt32LE(this, this.l); this.l += 4; return oI; }\n\t\t\telse { oR = __readUInt32LE(this, this.l); this.l += 4; return oR; } break;\n\t\tcase 8: if(t === 'f') { oR = __double(this, this.l); this.l += 8; return oR; }\n\t\t/* falls through */\n\t\tcase 16: o = __hexlify(this, this.l, size); break;\n\t}}\n\tthis.l+=size; return o;\n}\n\nfunction WriteShift(t, val, f) {\n\tvar size, i;\n\tif(f === 'dbcs') {\n\t\tfor(i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i);\n\t\tsize = 2 * val.length;\n\t} else switch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&255; break;\n\t\tcase 3: size = 3; this[this.l+2] = val & 255; val >>>= 8; this[this.l+1] = val&255; val >>>= 8; this[this.l] = val&255; break;\n\t\tcase 4: size = 4; this.writeUInt32LE(val, this.l); break;\n\t\tcase 8: size = 8; if(f === 'f') { this.writeDoubleLE(val, this.l); break; }\n\t\t/* falls through */\n\t\tcase 16: break;\n\t\tcase -4: size = 4; this.writeInt32LE(val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw fld + 'Expected ' + hexstr + ' saw ' + m;\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length) { blob.l += length; }\n\nfunction writenoop(blob, length) { blob.l += length; }\n\nfunction new_buf(sz) {\n\tvar o = new_raw_buf(sz);\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb, opts) {\n\tvar tmpbyte, cntbyte, length;\n\tprep_blob(data, data.l || 0);\n\twhile(data.l < data.length) {\n\t\tvar RT = data.read_shift(1);\n\t\tif(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n\t\tvar R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n\t\ttmpbyte = data.read_shift(1);\n\t\tlength = tmpbyte & 0x7F;\n\t\tfor(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n\t\tvar d = R.f(data, length, opts);\n\t\tif(cb(d, R, RT)) return;\n\t}\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array() {\n\tvar bufs = [], blksz = 2048;\n\tvar newblk = function ba_newblk(sz) {\n\t\tvar o = new_buf(sz);\n\t\tprep_blob(o, 0);\n\t\treturn o;\n\t};\n\n\tvar curbuf = newblk(blksz);\n\n\tvar endbuf = function ba_endbuf() {\n\t\tcurbuf.length = curbuf.l;\n\t\tif(curbuf.length > 0) bufs.push(curbuf);\n\t\tcurbuf = null;\n\t};\n\n\tvar next = function ba_next(sz) {\n\t\tif(sz < curbuf.length - curbuf.l) return curbuf;\n\t\tendbuf();\n\t\treturn (curbuf = newblk(Math.max(sz+1, blksz)));\n\t};\n\n\tvar end = function ba_end() {\n\t\tendbuf();\n\t\treturn __toBuffer([bufs]);\n\t};\n\n\tvar push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); };\n\n\treturn { next:next, push:push, end:end, _bufs:bufs };\n}\n\nfunction write_record(ba, type, payload, length) {\n\tvar t = evert_RE[type], l;\n\tif(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n\tl = 1 + (t >= 0x80 ? 1 : 0) + 1 + length;\n\tif(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n\tvar o = ba.next(l);\n\tif(t <= 0x7F) o.write_shift(1, t);\n\telse {\n\t\to.write_shift(1, (t & 0x7F) + 0x80);\n\t\to.write_shift(1, (t >> 7));\n\t}\n\tfor(var i = 0; i != 4; ++i) {\n\t\tif(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n\t\telse { o.write_shift(1, length); break; }\n\t}\n\tif(length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell, tgt) {\n\tif(tgt.s) {\n\t\tif(cell.cRel) cell.c += tgt.s.c;\n\t\tif(cell.rRel) cell.r += tgt.s.r;\n\t} else {\n\t\tcell.c += tgt.c;\n\t\tcell.r += tgt.r;\n\t}\n\tcell.cRel = cell.rRel = 0;\n\twhile(cell.c >= 0x100) cell.c -= 0x100;\n\twhile(cell.r >= 0x10000) cell.r -= 0x10000;\n\treturn cell;\n}\n\nfunction shift_range_xls(cell, range) {\n\tcell.s = shift_cell_xls(cell.s, range.s);\n\tcell.e = shift_cell_xls(cell.e, range.s);\n\treturn cell;\n}\n\nvar OFFCRYPTO = {};\nvar make_offcrypto = function(O, _crypto) {\n\tvar crypto;\n\tif(typeof _crypto !== 'undefined') crypto = _crypto;\n\telse if(typeof require !== 'undefined') {\n\t\ttry { crypto = require('cry'+'pto'); }\n\t\tcatch(e) { crypto = null; }\n\t}\n\n\tO.rc4 = function(key, data) {\n\t\tvar S = new Array(256);\n\t\tvar c = 0, i = 0, j = 0, t = 0;\n\t\tfor(i = 0; i != 256; ++i) S[i] = i;\n\t\tfor(i = 0; i != 256; ++i) {\n\t\t\tj = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t}\n\t\ti = j = 0; out = Buffer(data.length);\n\t\tfor(c = 0; c != data.length; ++c) {\n\t\t\ti = (i + 1)&255;\n\t\t\tj = (j + S[i])%256;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t\tout[c] = (data[c] ^ S[(S[i]+S[j])&255]);\n\t\t}\n\t\treturn out;\n\t};\n\n\tif(crypto) {\n\t\tO.md5 = function(hex) { return crypto.createHash('md5').update(hex).digest('hex'); };\n\t} else {\n\t\tO.md5 = function(hex) { throw \"unimplemented\"; };\n\t}\n};\nmake_offcrypto(OFFCRYPTO, typeof crypto !== \"undefined\" ? crypto : undefined);\n\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data, length) {\n\treturn { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\n\n/* [MS-XLSB] 2.1.7.121 */\nfunction parse_RichStr(data, length) {\n\tvar start = data.l;\n\tvar flags = data.read_shift(1);\n\tvar str = parse_XLWideString(data);\n\tvar rgsStrRun = [];\n\tvar z = { t: str, h: str };\n\tif((flags & 1) !== 0) { /* fRichStr */\n\t\t/* TODO: formatted string */\n\t\tvar dwSizeStrRun = data.read_shift(4);\n\t\tfor(var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n\t\tz.r = rgsStrRun;\n\t}\n\telse z.r = \"<t>\" + escapexml(str) + \"</t>\";\n\tif((flags & 2) !== 0) { /* fExtStr */\n\t\t/* TODO: phonetic string */\n\t}\n\tdata.l = start + length;\n\treturn z;\n}\nfunction write_RichStr(str, o) {\n\t/* TODO: formatted string */\n\tif(o == null) o = new_buf(5+2*str.t.length);\n\to.write_shift(1,0);\n\twrite_XLWideString(str.t, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data) {\n\tvar col = data.read_shift(4);\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) <<16;\n\tvar fPhShow = data.read_shift(1);\n\treturn { c:col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell, o) {\n\tif(o == null) o = new_buf(8);\n\to.write_shift(-4, cell.c);\n\to.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.5.21 */\nfunction parse_XLSBCodeName (data, length) { return parse_XLWideString(data, length); }\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n\tif(data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data, o) {\n\tif(o == null) o = new_buf(4+2*data.length);\n\to.write_shift(4, data.length);\n\tif(data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLSB] 2.5.122 */\n/* [MS-XLS] 2.5.217 */\nfunction parse_RkNumber(data) {\n\tvar b = data.slice(data.l, data.l+4);\n\tvar fX100 = b[0] & 1, fInt = b[0] & 2;\n\tdata.l+=4;\n\tb[0] &= 0xFC; // b[0] &= ~3;\n\tvar RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2;\n\treturn fX100 ? RK/100 : RK;\n}\n\n/* [MS-XLSB] 2.5.153 */\nfunction parse_UncheckedRfX(data) {\n\tvar cell = {s: {}, e: {}};\n\tcell.s.r = data.read_shift(4);\n\tcell.e.r = data.read_shift(4);\n\tcell.s.c = data.read_shift(4);\n\tcell.e.c = data.read_shift(4);\n\treturn cell;\n}\n\nfunction write_UncheckedRfX(r, o) {\n\tif(!o) o = new_buf(16);\n\to.write_shift(4, r.s.r);\n\to.write_shift(4, r.e.r);\n\to.write_shift(4, r.s.c);\n\to.write_shift(4, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.171 */\n/* [MS-XLS] 2.5.342 */\nfunction parse_Xnum(data, length) { return data.read_shift(8, 'f'); }\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, 'f', data); }\n\n/* [MS-XLSB] 2.5.198.2 */\nvar BErr = {\n\t0x00: \"#NULL!\",\n\t0x07: \"#DIV/0!\",\n\t0x0F: \"#VALUE!\",\n\t0x17: \"#REF!\",\n\t0x1D: \"#NAME?\",\n\t0x24: \"#NUM!\",\n\t0x2A: \"#N/A\",\n\t0x2B: \"#GETTING_DATA\",\n\t0xFF: \"#WTF?\"\n};\nvar RBErr = evert_num(BErr);\n\n/* [MS-XLSB] 2.4.321 BrtColor */\nfunction parse_BrtColor(data, length) {\n\tvar out = {};\n\tvar d = data.read_shift(1);\n\tout.fValidRGB = d & 1;\n\tout.xColorType = d >>> 1;\n\tout.index = data.read_shift(1);\n\tout.nTintAndShade = data.read_shift(2, 'i');\n\tout.bRed = data.read_shift(1);\n\tout.bGreen = data.read_shift(1);\n\tout.bBlue = data.read_shift(1);\n\tout.bAlpha = data.read_shift(1);\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data, length) {\n\tvar d = data.read_shift(1);\n\tdata.l++;\n\tvar out = {\n\t\tfItalic: d & 0x2,\n\t\tfStrikeout: d & 0x8,\n\t\tfOutline: d & 0x10,\n\t\tfShadow: d & 0x20,\n\t\tfCondense: d & 0x40,\n\t\tfExtend: d & 0x80\n\t};\n\treturn out;\n}\n/* [MS-OLEPS] 2.2 PropertyType */\n{\n\tvar VT_EMPTY = 0x0000;\n\tvar VT_NULL = 0x0001;\n\tvar VT_I2 = 0x0002;\n\tvar VT_I4 = 0x0003;\n\tvar VT_R4 = 0x0004;\n\tvar VT_R8 = 0x0005;\n\tvar VT_CY = 0x0006;\n\tvar VT_DATE = 0x0007;\n\tvar VT_BSTR = 0x0008;\n\tvar VT_ERROR = 0x000A;\n\tvar VT_BOOL = 0x000B;\n\tvar VT_VARIANT = 0x000C;\n\tvar VT_DECIMAL = 0x000E;\n\tvar VT_I1 = 0x0010;\n\tvar VT_UI1 = 0x0011;\n\tvar VT_UI2 = 0x0012;\n\tvar VT_UI4 = 0x0013;\n\tvar VT_I8 = 0x0014;\n\tvar VT_UI8 = 0x0015;\n\tvar VT_INT = 0x0016;\n\tvar VT_UINT = 0x0017;\n\tvar VT_LPSTR = 0x001E;\n\tvar VT_LPWSTR = 0x001F;\n\tvar VT_FILETIME = 0x0040;\n\tvar VT_BLOB = 0x0041;\n\tvar VT_STREAM = 0x0042;\n\tvar VT_STORAGE = 0x0043;\n\tvar VT_STREAMED_Object = 0x0044;\n\tvar VT_STORED_Object = 0x0045;\n\tvar VT_BLOB_Object = 0x0046;\n\tvar VT_CF = 0x0047;\n\tvar VT_CLSID = 0x0048;\n\tvar VT_VERSIONED_STREAM = 0x0049;\n\tvar VT_VECTOR = 0x1000;\n\tvar VT_ARRAY = 0x2000;\n\n\tvar VT_STRING = 0x0050; // 2.3.3.1.11 VtString\n\tvar VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString\n\tvar VT_CUSTOM = [VT_STRING, VT_USTR];\n}\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n\t0x01: { n: 'CodePage', t: VT_I2 },\n\t0x02: { n: 'Category', t: VT_STRING },\n\t0x03: { n: 'PresentationFormat', t: VT_STRING },\n\t0x04: { n: 'ByteCount', t: VT_I4 },\n\t0x05: { n: 'LineCount', t: VT_I4 },\n\t0x06: { n: 'ParagraphCount', t: VT_I4 },\n\t0x07: { n: 'SlideCount', t: VT_I4 },\n\t0x08: { n: 'NoteCount', t: VT_I4 },\n\t0x09: { n: 'HiddenCount', t: VT_I4 },\n\t0x0a: { n: 'MultimediaClipCount', t: VT_I4 },\n\t0x0b: { n: 'Scale', t: VT_BOOL },\n\t0x0c: { n: 'HeadingPair', t: VT_VECTOR | VT_VARIANT },\n\t0x0d: { n: 'DocParts', t: VT_VECTOR | VT_LPSTR },\n\t0x0e: { n: 'Manager', t: VT_STRING },\n\t0x0f: { n: 'Company', t: VT_STRING },\n\t0x10: { n: 'LinksDirty', t: VT_BOOL },\n\t0x11: { n: 'CharacterCount', t: VT_I4 },\n\t0x13: { n: 'SharedDoc', t: VT_BOOL },\n\t0x16: { n: 'HLinksChanged', t: VT_BOOL },\n\t0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },\n\t0x1A: { n: 'ContentType', t: VT_STRING },\n\t0x1B: { n: 'ContentStatus', t: VT_STRING },\n\t0x1C: { n: 'Language', t: VT_STRING },\n\t0x1D: { n: 'Version', t: VT_STRING },\n\t0xFF: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n\t0x01: { n: 'CodePage', t: VT_I2 },\n\t0x02: { n: 'Title', t: VT_STRING },\n\t0x03: { n: 'Subject', t: VT_STRING },\n\t0x04: { n: 'Author', t: VT_STRING },\n\t0x05: { n: 'Keywords', t: VT_STRING },\n\t0x06: { n: 'Comments', t: VT_STRING },\n\t0x07: { n: 'Template', t: VT_STRING },\n\t0x08: { n: 'LastAuthor', t: VT_STRING },\n\t0x09: { n: 'RevNumber', t: VT_STRING },\n\t0x0A: { n: 'EditTime', t: VT_FILETIME },\n\t0x0B: { n: 'LastPrinted', t: VT_FILETIME },\n\t0x0C: { n: 'CreatedDate', t: VT_FILETIME },\n\t0x0D: { n: 'ModifiedDate', t: VT_FILETIME },\n\t0x0E: { n: 'PageCount', t: VT_I4 },\n\t0x0F: { n: 'WordCount', t: VT_I4 },\n\t0x10: { n: 'CharCount', t: VT_I4 },\n\t0x11: { n: 'Thumbnail', t: VT_CF },\n\t0x12: { n: 'ApplicationName', t: VT_LPSTR },\n\t0x13: { n: 'DocumentSecurity', t: VT_I4 },\n\t0xFF: {}\n};\n\n/* [MS-OLEPS] 2.18 */\nvar SpecialProperties = {\n\t0x80000000: { n: 'Locale', t: VT_UI4 },\n\t0x80000003: { n: 'Behavior', t: VT_UI4 },\n\t0x72627262: {}\n};\n\n(function() {\n\tfor(var y in SpecialProperties) if(SpecialProperties.hasOwnProperty(y))\n\tDocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];\n})();\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n\t0x0001: \"US\", // United States\n\t0x0002: \"CA\", // Canada\n\t0x0003: \"\", // Latin America (except Brazil)\n\t0x0007: \"RU\", // Russia\n\t0x0014: \"EG\", // Egypt\n\t0x001E: \"GR\", // Greece\n\t0x001F: \"NL\", // Netherlands\n\t0x0020: \"BE\", // Belgium\n\t0x0021: \"FR\", // France\n\t0x0022: \"ES\", // Spain\n\t0x0024: \"HU\", // Hungary\n\t0x0027: \"IT\", // Italy\n\t0x0029: \"CH\", // Switzerland\n\t0x002B: \"AT\", // Austria\n\t0x002C: \"GB\", // United Kingdom\n\t0x002D: \"DK\", // Denmark\n\t0x002E: \"SE\", // Sweden\n\t0x002F: \"NO\", // Norway\n\t0x0030: \"PL\", // Poland\n\t0x0031: \"DE\", // Germany\n\t0x0034: \"MX\", // Mexico\n\t0x0037: \"BR\", // Brazil\n\t0x003d: \"AU\", // Australia\n\t0x0040: \"NZ\", // New Zealand\n\t0x0042: \"TH\", // Thailand\n\t0x0051: \"JP\", // Japan\n\t0x0052: \"KR\", // Korea\n\t0x0054: \"VN\", // Viet Nam\n\t0x0056: \"CN\", // China\n\t0x005A: \"TR\", // Turkey\n\t0x0069: \"JS\", // Ramastan\n\t0x00D5: \"DZ\", // Algeria\n\t0x00D8: \"MA\", // Morocco\n\t0x00DA: \"LY\", // Libya\n\t0x015F: \"PT\", // Portugal\n\t0x0162: \"IS\", // Iceland\n\t0x0166: \"FI\", // Finland\n\t0x01A4: \"CZ\", // Czech Republic\n\t0x0376: \"TW\", // Taiwan\n\t0x03C1: \"LB\", // Lebanon\n\t0x03C2: \"JO\", // Jordan\n\t0x03C3: \"SY\", // Syria\n\t0x03C4: \"IQ\", // Iraq\n\t0x03C5: \"KW\", // Kuwait\n\t0x03C6: \"SA\", // Saudi Arabia\n\t0x03CB: \"AE\", // United Arab Emirates\n\t0x03CC: \"IL\", // Israel\n\t0x03CE: \"QA\", // Qatar\n\t0x03D5: \"IR\", // Iran\n\t0xFFFF: \"US\" // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n\tnull,\n\t'solid',\n\t'mediumGray',\n\t'darkGray',\n\t'lightGray',\n\t'darkHorizontal',\n\t'darkVertical',\n\t'darkDown',\n\t'darkUp',\n\t'darkGrid',\n\t'darkTrellis',\n\t'lightHorizontal',\n\t'lightVertical',\n\t'lightDown',\n\t'lightUp',\n\t'lightGrid',\n\t'lightTrellis',\n\t'gray125',\n\t'gray0625'\n];\n\nfunction rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\nvar XLSIcv = rgbify([\n\t/* Color Constants */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t/* Defaults */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t0x800000,\n\t0x008000,\n\t0x000080,\n\t0x808000,\n\t0x800080,\n\t0x008080,\n\t0xC0C0C0,\n\t0x808080,\n\t0x9999FF,\n\t0x993366,\n\t0xFFFFCC,\n\t0xCCFFFF,\n\t0x660066,\n\t0xFF8080,\n\t0x0066CC,\n\t0xCCCCFF,\n\n\t0x000080,\n\t0xFF00FF,\n\t0xFFFF00,\n\t0x00FFFF,\n\t0x800080,\n\t0x800000,\n\t0x008080,\n\t0x0000FF,\n\t0x00CCFF,\n\t0xCCFFFF,\n\t0xCCFFCC,\n\t0xFFFF99,\n\t0x99CCFF,\n\t0xFF99CC,\n\t0xCC99FF,\n\t0xFFCC99,\n\n\t0x3366FF,\n\t0x33CCCC,\n\t0x99CC00,\n\t0xFFCC00,\n\t0xFF9900,\n\t0xFF6600,\n\t0x666699,\n\t0x969696,\n\t0x003366,\n\t0x339966,\n\t0x003300,\n\t0x333300,\n\t0x993300,\n\t0x993366,\n\t0x333399,\n\t0x333333,\n\n\t/* Sheet */\n\t0xFFFFFF,\n\t0x000000\n]);\n\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary <SpreadsheetML> */\n/* 14.2 Part Summary <DrawingML> */\n/* [MS-XLSX] 2.1 Part Enumerations */\n/* [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type = {\n\t/* Workbook */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\n\t/* Worksheet */\n\t\"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n\t/* Chartsheet */\n\t\"application/vnd.ms-excel.chartsheet\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": \"TODO\",\n\n\t/* Dialogsheet */\n\t\"application/vnd.ms-excel.dialogsheet\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": \"TODO\",\n\n\t/* Macrosheet */\n\t\"application/vnd.ms-excel.macrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.macrosheet+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n\t/* File Properties */\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n\t/* Custom Data Properties */\n\t\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\n\t/* Comments */\n\t\"application/vnd.ms-excel.comments\": \"comments\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": \"comments\",\n\n\t/* PivotTable */\n\t\"application/vnd.ms-excel.pivotTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n\t/* Calculation Chain */\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n\t/* Printer Settings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n\t/* ActiveX */\n\t\"application/vnd.ms-office.activeX\": \"TODO\",\n\t\"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n\t/* Custom Toolbars */\n\t\"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n\t/* External Data Connections */\n\t\"application/vnd.ms-excel.connections\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n\t/* External Links */\n\t\"application/vnd.ms-excel.externalLink\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"TODO\",\n\n\t/* Metadata */\n\t\"application/vnd.ms-excel.sheetMetadata\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"TODO\",\n\n\t/* PivotCache */\n\t\"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n\t\"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n\t/* Query Table */\n\t\"application/vnd.ms-excel.queryTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n\t/* Shared Workbook */\n\t\"application/vnd.ms-excel.userNames\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionLog\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n\t/* Single Cell Table */\n\t\"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n\t/* Slicer */\n\t\"application/vnd.ms-excel.slicer\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache\": \"TODO\",\n\t\"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n\t/* Sort Map */\n\t\"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n\t/* Table */\n\t\"application/vnd.ms-excel.table\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n\t/* Themes */\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n\t/* Timeline */\n\t\"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n\t\"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n\t/* VBA */\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.ms-office.vbaProjectSignature\": \"vba\",\n\n\t/* Volatile Dependencies */\n\t\"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n\t/* Control Properties */\n\t\"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n\t/* Data Model */\n\t\"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n\t/* Survey */\n\t\"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n\t/* Drawing */\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n\t/* VML */\n\t\"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n\t\"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n\t\"sheet\": \"js\"\n};\n\nvar CT_LIST = (function(){\n\tvar o = {\n\t\tworkbooks: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n\t\t\txltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n\t\t},\n\t\tstrs: { /* Shared Strings */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sharedStrings\"\n\t\t},\n\t\tsheets: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.worksheet\"\n\t\t},\n\t\tstyles: {/* Styles */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.styles\"\n\t\t}\n\t};\n\tkeys(o).forEach(function(k) { if(!o[k].xlsm) o[k].xlsm = o[k].xlsx; });\n\tkeys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });\n\treturn o;\n})();\n\nvar type2ct = evert_arr(ct2type);\n\nXMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\nfunction parse_ct(data, opts) {\n\tvar ctext = {};\n\tif(!data || !data.match) return data;\n\tvar ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n\t\tcoreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n\t\tTODO:[], rels:[], xmlns: \"\" };\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0].replace(nsregex,\"<\")) {\n\t\t\tcase '<?xml': break;\n\t\t\tcase '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\\w+):/)||[\"\",\"\"])[1] ]; break;\n\t\t\tcase '<Default': ctext[y.Extension] = y.ContentType; break;\n\t\t\tcase '<Override':\n\t\t\t\tif(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);\n\t\t\t\telse if(opts.WTF) console.error(y);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\tif(ct.xmlns !== XMLNS.CT) throw new Error(\"Unknown Namespace: \" + ct.xmlns);\n\tct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\tdelete ct.calcchains;\n\treturn ct;\n}\n\nvar CTYPE_XML_ROOT = writextag('Types', null, {\n\t'xmlns': XMLNS.CT,\n\t'xmlns:xsd': XMLNS.xsd,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nvar CTYPE_DEFAULTS = [\n\t['xml', 'application/xml'],\n\t['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n\t['rels', type2ct.rels[0]]\n].map(function(x) {\n\treturn writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n});\n\nfunction write_ct(ct, opts) {\n\tvar o = [], v;\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (CTYPE_XML_ROOT);\n\to = o.concat(CTYPE_DEFAULTS);\n\tvar f1 = function(w) {\n\t\tif(ct[w] && ct[w].length > 0) {\n\t\t\tv = ct[w][0];\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t}\n\t};\n\tvar f2 = function(w) {\n\t\tct[w].forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t});\n\t};\n\tvar f3 = function(t) {\n\t\t(ct[t]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': type2ct[t][0]\n\t\t\t}));\n\t\t});\n\t};\n\tf1('workbooks');\n\tf2('sheets');\n\tf3('themes');\n\t['strs', 'styles'].forEach(f1);\n\t['coreprops', 'extprops', 'custprops'].forEach(f3);\n\tif(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 9.3.2 OPC Relationships Markup */\nvar RELS = {\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\n};\n\nfunction parse_rels(data, currentFilePath) {\n\tif (!data) return data;\n\tif (currentFilePath.charAt(0) !== '/') {\n\t\tcurrentFilePath = '/'+currentFilePath;\n\t}\n\tvar rels = {};\n\tvar hash = {};\n\tvar resolveRelativePathIntoAbsolute = function (to) {\n\t\tvar toksFrom = currentFilePath.split('/');\n\t\ttoksFrom.pop(); // folder path\n\t\tvar toksTo = to.split('/');\n\t\tvar reversed = [];\n\t\twhile (toksTo.length !== 0) {\n\t\t\tvar tokTo = toksTo.shift();\n\t\t\tif (tokTo === '..') {\n\t\t\t\ttoksFrom.pop();\n\t\t\t} else if (tokTo !== '.') {\n\t\t\t\ttoksFrom.push(tokTo);\n\t\t\t}\n\t\t}\n\t\treturn toksFrom.join('/');\n\t};\n\n\tdata.match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\t/* 9.3.2.2 OPC_Relationships */\n\t\tif (y[0] === '<Relationship') {\n\t\t\tvar rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;\n\t\t\tvar canonictarget = y.TargetMode === 'External' ? y.Target : resolveRelativePathIntoAbsolute(y.Target);\n\t\t\trels[canonictarget] = rel;\n\t\t\thash[y.Id] = rel;\n\t\t}\n\t});\n\trels[\"!id\"] = hash;\n\treturn rels;\n}\n\nXMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';\n\nvar RELS_ROOT = writextag('Relationships', null, {\n\t//'xmlns:ns0': XMLNS.RELS,\n\t'xmlns': XMLNS.RELS\n});\n\n/* TODO */\nfunction write_rels(rels) {\n\tvar o = [];\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (RELS_ROOT);\n\tkeys(rels['!id']).forEach(function(rid) { var rel = rels['!id'][rid];\n\t\to[o.length] = (writextag('Relationship', null, rel));\n\t});\n\tif(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"RevNumber\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", 'date'],\n\t[\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nXMLNS.CORE_PROPS = \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";\nRELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\nvar CORE_PROPS_REGEX = (function() {\n\tvar r = new Array(CORE_PROPS.length);\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar g = \"(?:\"+ f[0].substr(0,f[0].indexOf(\":\")) +\":)\"+ f[0].substr(f[0].indexOf(\":\")+1);\n\t\tr[i] = new RegExp(\"<\" + g + \"[^>]*>(.*)<\\/\" + g + \">\");\n\t}\n\treturn r;\n})();\n\nfunction parse_core_props(data) {\n\tvar p = {};\n\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n\t\tif(cur != null && cur.length > 0) p[f[1]] = cur[1];\n\t\tif(f[2] === 'date' && p[f[1]]) p[f[1]] = new Date(p[f[1]]);\n\t}\n\n\treturn p;\n}\n\nvar CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {\n\t//'xmlns': XMLNS.CORE_PROPS,\n\t'xmlns:cp': XMLNS.CORE_PROPS,\n\t'xmlns:dc': XMLNS.dc,\n\t'xmlns:dcterms': XMLNS.dcterms,\n\t'xmlns:dcmitype': XMLNS.dcmitype,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nfunction cp_doit(f, g, h, o, p) {\n\tif(p[f] != null || g == null || g === \"\") return;\n\tp[f] = g;\n\to[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, opts) {\n\tvar o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};\n\tif(!cp) return o.join(\"\");\n\n\n\tif(cp.CreatedDate != null) cp_doit(\"dcterms:created\", typeof cp.CreatedDate === \"string\" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\tif(cp.ModifiedDate != null) cp_doit(\"dcterms:modified\", typeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\n\tfor(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p); }\n\tif(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n\t[\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n\t[\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nXMLNS.EXT_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";\nRELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\nfunction parse_ext_props(data, p) {\n\tvar q = {}; if(!p) p = {};\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tswitch(f[2]) {\n\t\t\tcase \"string\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break;\n\t\t\tcase \"bool\": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === \"true\"; break;\n\t\t\tcase \"raw\":\n\t\t\t\tvar cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>(.*)<\\/\" + f[0] + \">\"));\n\t\t\t\tif(cur && cur.length > 0) q[f[1]] = cur[1];\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(q.HeadingPairs && q.TitlesOfParts) {\n\t\tvar v = parseVector(q.HeadingPairs);\n\t\tvar j = 0, widx = 0;\n\t\tfor(var i = 0; i !== v.length; ++i) {\n\t\t\tswitch(v[i].v) {\n\t\t\t\tcase \"Worksheets\": widx = j; p.Worksheets = +(v[++i].v); break;\n\t\t\t\tcase \"Named Ranges\": ++i; break; // TODO: Handle Named Ranges\n\t\t\t}\n\t\t}\n\t\tvar parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); });\n\t\tp.SheetNames = parts.slice(widx, widx + p.Worksheets);\n\t}\n\treturn p;\n}\n\nvar EXT_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.EXT_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_ext_props(cp, opts) {\n\tvar o = [], p = {}, W = writextag;\n\tif(!cp) cp = {};\n\tcp.Application = \"SheetJS\";\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (EXT_PROPS_XML_ROOT);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tif(cp[f[1]] === undefined) return;\n\t\tvar v;\n\t\tswitch(f[2]) {\n\t\t\tcase 'string': v = cp[f[1]]; break;\n\t\t\tcase 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n\t\t}\n\t\tif(v !== undefined) o[o.length] = (W(f[0], v));\n\t});\n\n\t/* TODO: HeadingPairs, TitlesOfParts */\n\to[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:\"variant\"})));\n\to[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"<vt:lpstr>\" + s + \"</vt:lpstr>\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n\tif(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nXMLNS.CUST_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";\nRELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';\n\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data, opts) {\n\tvar p = {}, name;\n\tvar m = data.match(custregex);\n\tif(m) for(var i = 0; i != m.length; ++i) {\n\t\tvar x = m[i], y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<?xml': break;\n\t\t\tcase '<Properties':\n\t\t\t\tif(y.xmlns !== XMLNS.CUST_PROPS) throw \"unrecognized xmlns \" + y.xmlns;\n\t\t\t\tif(y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw \"unrecognized vt \" + y.xmlnsvt;\n\t\t\t\tbreak;\n\t\t\tcase '<property': name = y.name; break;\n\t\t\tcase '</property>': name = null; break;\n\t\t\tdefault: if (x.indexOf('<vt:') === 0) {\n\t\t\t\tvar toks = x.split('>');\n\t\t\t\tvar type = toks[0].substring(4), text = toks[1];\n\t\t\t\t/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase 'lpstr': case 'lpwstr': case 'bstr': case 'lpwstr':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bool':\n\t\t\t\t\t\tp[name] = parsexmlbool(text, '<vt:bool>');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r4': case 'r8': case 'decimal':\n\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'filetime': case 'date':\n\t\t\t\t\t\tp[name] = new Date(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cy': case 'error':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n\t\t\t\t}\n\t\t\t} else if(x.substr(0,2) === \"</\") {\n\t\t\t} else if(opts.WTF) throw new Error(x);\n\t\t}\n\t}\n\treturn p;\n}\n\nvar CUST_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.CUST_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_cust_props(cp, opts) {\n\tvar o = [XML_HEADER, CUST_PROPS_XML_ROOT];\n\tif(!cp) return o.join(\"\");\n\tvar pid = 1;\n\tkeys(cp).forEach(function custprop(k) { ++pid;\n\t\to[o.length] = (writextag('property', write_vt(cp[k]), {\n\t\t\t'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',\n\t\t\t'pid': pid,\n\t\t\t'name': k\n\t\t}));\n\t});\n\tif(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\nfunction xlml_set_prop(Props, tag, val) {\n\t/* TODO: Normalize the properties */\n\tswitch(tag) {\n\t\tcase 'Description': tag = 'Comments'; break;\n\t}\n\tProps[tag] = val;\n}\n\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n\tvar dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n\treturn new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpwstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n\tif(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n\treturn parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t) { if(!t) throw new Error(\"dafuq?\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr');\n\treturn ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */\nfunction parse_VtVecUnalignedLpstr(blob) {\n\treturn parse_VtVecUnalignedLpstrValue(blob);\n}\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n\tvar headingString = parse_TypedPropertyValue(blob, VT_USTR);\n\tvar headerParts = parse_TypedPropertyValue(blob, VT_I4);\n\treturn [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n\tvar cElements = blob.read_shift(4);\n\tvar out = [];\n\tfor(var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n\treturn out;\n}\n\n/* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */\nfunction parse_VtVecHeadingPair(blob) {\n\t// NOTE: When invoked, wType & padding were already consumed\n\treturn parse_VtVecHeadingPairValue(blob);\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n\tvar cnt = blob.read_shift(4);\n\tvar dict = {};\n\tfor(var j = 0; j != cnt; ++j) {\n\t\tvar pid = blob.read_shift(4);\n\t\tvar len = blob.read_shift(4);\n\t\tdict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n\t}\n\tif(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n\treturn dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n\tvar size = blob.read_shift(4);\n\tvar bytes = blob.slice(blob.l,blob.l+size);\n\tif(size & 3 > 0) blob.l += (4 - (size & 3)) & 3;\n\treturn bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n\t// TODO\n\tvar o = {};\n\to.Size = blob.read_shift(4);\n\t//o.Format = blob.read_shift(4);\n\tblob.l += o.Size;\n\treturn o;\n}\n\n/* [MS-OLEPS] 2.14 Vector and Array Property Types */\nfunction parse_VtVector(blob, cb) {\n\t/* [MS-OLEPS] 2.14.2 VectorHeader */\n/*\tvar Length = blob.read_shift(4);\n\tvar o = [];\n\tfor(var i = 0; i != Length; ++i) {\n\t\to.push(cb(blob));\n\t}\n\treturn o;*/\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type, _opts) {\n\tvar t = blob.read_shift(2), ret, opts = _opts||{};\n\tblob.l += 2;\n\tif(type !== VT_VARIANT)\n\tif(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);\n\tswitch(type === VT_VARIANT ? t : type) {\n\t\tcase 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n\t\tcase 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n\t\tcase 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n\t\tcase 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n\t\tcase 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n\t\tcase 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n\t\tcase 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n\t\tcase 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n\t\tcase 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n\t\tcase 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0,'');\n\t\tcase 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t, 4).replace(chr0,'');\n\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);\n\t\tcase 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n\t}\n}\n/* [MS-OLEPS] 2.14.2 VectorHeader */\n/*function parse_VTVectorVariant(blob) {\n\tvar Length = blob.read_shift(4);\n\n\tif(Length & 1 !== 0) throw new Error(\"VectorHeader Length=\" + Length + \" must be even\");\n\tvar o = [];\n\tfor(var i = 0; i != Length; ++i) {\n\t\to.push(parse_TypedPropertyValue(blob, VT_VARIANT));\n\t}\n\treturn o;\n}*/\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n\tvar start_addr = blob.l;\n\tvar size = blob.read_shift(4);\n\tvar NumProps = blob.read_shift(4);\n\tvar Props = [], i = 0;\n\tvar CodePage = 0;\n\tvar Dictionary = -1, DictObj;\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tvar PropID = blob.read_shift(4);\n\t\tvar Offset = blob.read_shift(4);\n\t\tProps[i] = [PropID, Offset + start_addr];\n\t}\n\tvar PropH = {};\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tif(blob.l !== Props[i][1]) {\n\t\t\tvar fail = true;\n\t\t\tif(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n\t\t\t\tcase 0x02 /*VT_I2*/: if(blob.l +2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n\t\t\t\tcase 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t}\n\t\t\tif(!PIDSI && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n\t\t\tif(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n\t\t}\n\t\tif(PIDSI) {\n\t\t\tvar piddsi = PIDSI[Props[i][0]];\n\t\t\tPropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n\t\t\tif(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + String(PropH[piddsi.n] & 0xFFFF);\n\t\t\tif(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n\t\t\t\tcase 0: PropH[piddsi.n] = 1252;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 10000: // OSX Roman\n\t\t\t\tcase 1252: // Windows Latin\n\n\t\t\t\tcase 874: // SB Windows Thai\n\t\t\t\tcase 1250: // SB Windows Central Europe\n\t\t\t\tcase 1251: // SB Windows Cyrillic\n\t\t\t\tcase 1253: // SB Windows Greek\n\t\t\t\tcase 1254: // SB Windows Turkish\n\t\t\t\tcase 1255: // SB Windows Hebrew\n\t\t\t\tcase 1256: // SB Windows Arabic\n\t\t\t\tcase 1257: // SB Windows Baltic\n\t\t\t\tcase 1258: // SB Windows Vietnam\n\n\t\t\t\tcase 932: // DB Windows Japanese Shift-JIS\n\t\t\t\tcase 936: // DB Windows Simplified Chinese GBK\n\t\t\t\tcase 949: // DB Windows Korean\n\t\t\t\tcase 950: // DB Windows Traditional Chinese Big5\n\n\t\t\t\tcase 1200: // UTF16LE\n\t\t\t\tcase 1201: // UTF16BE\n\t\t\t\tcase 65000: case -536: // UTF-7\n\t\t\t\tcase 65001: case -535: // UTF-8\n\t\t\t\t\tset_cp(CodePage = PropH[piddsi.n]); break;\n\t\t\t\tdefault: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n\t\t\t}\n\t\t} else {\n\t\t\tif(Props[i][0] === 0x1) {\n\t\t\t\tCodePage = PropH.CodePage = parse_TypedPropertyValue(blob, VT_I2);\n\t\t\t\tset_cp(CodePage);\n\t\t\t\tif(Dictionary !== -1) {\n\t\t\t\t\tvar oldpos = blob.l;\n\t\t\t\t\tblob.l = Props[Dictionary][1];\n\t\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t\t\tblob.l = oldpos;\n\t\t\t\t}\n\t\t\t} else if(Props[i][0] === 0) {\n\t\t\t\tif(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t} else {\n\t\t\t\tvar name = DictObj[Props[i][0]];\n\t\t\t\tvar val;\n\t\t\t\t/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n\t\t\t\tswitch(blob[blob.l]) {\n\t\t\t\t\tcase 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n\t\t\t\t\tcase 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n\t\t\t\t\tcase 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]); break;\n\t\t\t\t\tcase 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n\t\t\t\t\tcase 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n\t\t\t\t\tcase 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n\t\t\t\t\tcase 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n\t\t\t\t\tcase 0x40 /*VT_FILETIME*/: blob.l += 4; val = new Date(parse_FILETIME(blob)); break;\n\t\t\t\t\tdefault: throw new Error(\"unparsed value: \" + blob[blob.l]);\n\t\t\t\t}\n\t\t\t\tPropH[name] = val;\n\t\t\t}\n\t\t}\n\t}\n\tblob.l = start_addr + size; /* step ahead to skip padding */\n\treturn PropH;\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI) {\n\tvar blob = file.content;\n\tprep_blob(blob, 0);\n\n\tvar NumSets, FMTID0, FMTID1, Offset0, Offset1;\n\tblob.chk('feff', 'Byte Order: ');\n\n\tvar vers = blob.read_shift(2); // TODO: check version\n\tvar SystemIdentifier = blob.read_shift(4);\n\tblob.chk(CFB.utils.consts.HEADER_CLSID, 'CLSID: ');\n\tNumSets = blob.read_shift(4);\n\tif(NumSets !== 1 && NumSets !== 2) throw \"Unrecognized #Sets: \" + NumSets;\n\tFMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n\tif(NumSets === 1 && Offset0 !== blob.l) throw \"Length mismatch\";\n\telse if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n\tvar PSet0 = parse_PropertySet(blob, PIDSI);\n\n\tvar rval = { SystemIdentifier: SystemIdentifier };\n\tfor(var y in PSet0) rval[y] = PSet0[y];\n\t//rval.blob = blob;\n\trval.FMTID = FMTID0;\n\t//rval.PSet0 = PSet0;\n\tif(NumSets === 1) return rval;\n\tif(blob.l !== Offset1) throw \"Length mismatch 2: \" + blob.l + \" !== \" + Offset1;\n\tvar PSet1;\n\ttry { PSet1 = parse_PropertySet(blob, null); } catch(e) { }\n\tfor(y in PSet1) rval[y] = PSet1[y];\n\trval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n\treturn rval;\n}\n\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\n\nfunction parslurp(blob, length, cb) {\n\tvar arr = [], target = blob.l + length;\n\twhile(blob.l < target) arr.push(cb(blob, target - blob.l));\n\tif(target !== blob.l) throw new Error(\"Slurp error\");\n\treturn arr;\n}\n\nfunction parslurp2(blob, length, cb) {\n\tvar arr = [], target = blob.l + length, len = blob.read_shift(2);\n\twhile(len-- !== 0) arr.push(cb(blob, target - blob.l));\n\tif(target !== blob.l) throw new Error(\"Slurp error\");\n\treturn arr;\n}\n\nfunction parsebool(blob, length) { return blob.read_shift(length) === 0x1; }\n\nfunction parseuint16(blob) { return blob.read_shift(2, 'u'); }\nfunction parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}\n\n/* --- 2.5 Structures --- */\n\n/* [MS-XLS] 2.5.14 Boolean */\nvar parse_Boolean = parsebool;\n\n/* [MS-XLS] 2.5.10 Bes (boolean or error) */\nfunction parse_Bes(blob) {\n\tvar v = blob.read_shift(1), t = blob.read_shift(1);\n\treturn t === 0x01 ? v : v === 0x01;\n}\n\n/* [MS-XLS] 2.5.240 ShortXLUnicodeString */\nfunction parse_ShortXLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(1);\n\tvar width = 1, encoding = 'sbcs-cont';\n\tvar cp = current_codepage;\n\tif(opts && opts.biff >= 8) current_codepage = 1200;\n\tif(opts === undefined || opts.biff !== 5) {\n\t\tvar fHighByte = blob.read_shift(1);\n\t\tif(fHighByte) { width = 2; encoding = 'dbcs-cont'; }\n\t}\n\tvar o = cch ? blob.read_shift(cch, encoding) : \"\";\n\tcurrent_codepage = cp;\n\treturn o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n\tvar cp = current_codepage;\n\tcurrent_codepage = 1200;\n\tvar cch = blob.read_shift(2), flags = blob.read_shift(1);\n\tvar fHighByte = flags & 0x1, fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n\tvar width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n\tvar cRun, cbExtRst;\n\tvar z = {};\n\tif(fRichSt) cRun = blob.read_shift(2);\n\tif(fExtSt) cbExtRst = blob.read_shift(4);\n\tvar encoding = (flags & 0x1) ? 'dbcs-cont' : 'sbcs-cont';\n\tvar msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n\tif(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n\tif(fExtSt) blob.l += cbExtRst; //TODO: parse this\n\tz.t = msg;\n\tif(!fRichSt) { z.raw = \"<t>\" + z.t + \"</t>\"; z.r = z.t; }\n\tcurrent_codepage = cp;\n\treturn z;\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n\tvar retval;\n\tvar fHighByte = blob.read_shift(1);\n\tif(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n\telse { retval = blob.read_shift(cch, 'dbcs-cont'); }\n\treturn retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(opts !== undefined && opts.biff > 0 && opts.biff < 8 ? 1 : 2);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n\tif(opts.biff !== 5 && opts.biff !== 2) return parse_XLUnicodeString(blob, length, opts);\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nvar parse_ControlInfo = parsenoop;\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nvar parse_URLMoniker = function(blob, length) {\n\tvar len = blob.read_shift(4), start = blob.l;\n\tvar extra = false;\n\tif(len > 24) {\n\t\t/* look ahead */\n\t\tblob.l += len - 24;\n\t\tif(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n\t\tblob.l = start;\n\t}\n\tvar url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n\tif(extra) blob.l += 24;\n\treturn url;\n};\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nvar parse_FileMoniker = function(blob, length) {\n\tvar cAnti = blob.read_shift(2);\n\tvar ansiLength = blob.read_shift(4);\n\tvar ansiPath = blob.read_shift(ansiLength, 'cstr');\n\tvar endServer = blob.read_shift(2);\n\tvar versionNumber = blob.read_shift(2);\n\tvar cbUnicodePathSize = blob.read_shift(4);\n\tif(cbUnicodePathSize === 0) return ansiPath.replace(/\\\\/g,\"/\");\n\tvar cbUnicodePathBytes = blob.read_shift(4);\n\tvar usKeyValue = blob.read_shift(2);\n\tvar unicodePath = blob.read_shift(cbUnicodePathBytes>>1, 'utf16le').replace(chr0,\"\");\n\treturn unicodePath;\n};\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nvar parse_HyperlinkMoniker = function(blob, length) {\n\tvar clsid = blob.read_shift(16); length -= 16;\n\tswitch(clsid) {\n\t\tcase \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n\t\tcase \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n\t\tdefault: throw \"unsupported moniker \" + clsid;\n\t}\n};\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nvar parse_HyperlinkString = function(blob, length) {\n\tvar len = blob.read_shift(4);\n\tvar o = blob.read_shift(len, 'utf16le').replace(chr0, \"\");\n\treturn o;\n};\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object TODO: unify params with XLSX */\nvar parse_Hyperlink = function(blob, length) {\n\tvar end = blob.l + length;\n\tvar sVer = blob.read_shift(4);\n\tif(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n\tvar flags = blob.read_shift(2);\n\tblob.l += 2;\n\tvar displayName, targetFrameName, moniker, oleMoniker, location, guid, fileTime;\n\tif(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n\tif(flags & 0x0008) location = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0020) guid = blob.read_shift(16);\n\tif(flags & 0x0040) fileTime = parse_FILETIME(blob, 8);\n\tblob.l = end;\n\tvar target = (targetFrameName||moniker||oleMoniker);\n\tif(location) target+=\"#\"+location;\n\treturn {Target: target};\n};\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob, length) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* --- MS-XLS --- */\n\n/* 2.5.19 */\nfunction parse_XLSCell(blob, length) {\n\tvar rw = blob.read_shift(2); // 0-indexed\n\tvar col = blob.read_shift(2);\n\tvar ixfe = blob.read_shift(2);\n\treturn {r:rw, c:col, ixfe:ixfe};\n}\n\n/* 2.5.134 */\nfunction parse_frtHeader(blob) {\n\tvar rt = blob.read_shift(2);\n\tvar flags = blob.read_shift(2); // TODO: parse these flags\n\tblob.l += 8;\n\treturn {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* 2.5.158 */\nvar HIDEOBJENUM = ['SHOWALL', 'SHOWPLACEHOLDER', 'HIDEALL'];\nvar parse_HideObjEnum = parseuint16;\n\n/* 2.5.344 */\nfunction parse_XTI(blob, length) {\n\tvar iSupBook = blob.read_shift(2), itabFirst = blob.read_shift(2,'i'), itabLast = blob.read_shift(2,'i');\n\treturn [iSupBook, itabFirst, itabLast];\n}\n\n/* 2.5.218 */\nfunction parse_RkRec(blob, length) {\n\tvar ixfe = blob.read_shift(2);\n\tvar RK = parse_RkNumber(blob);\n\t//console.log(\"::\", ixfe, RK,\";;\");\n\treturn [ixfe, RK];\n}\n\n/* 2.5.1 */\nfunction parse_AddinUdf(blob, length) {\n\tblob.l += 4; length -= 4;\n\tvar l = blob.l + length;\n\tvar udfName = parse_ShortXLUnicodeString(blob, length);\n\tvar cb = blob.read_shift(2);\n\tl -= blob.l;\n\tif(cb !== l) throw \"Malformed AddinUdf: padding = \" + l + \" != \" + cb;\n\tblob.l += cb;\n\treturn udfName;\n}\n\n/* 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob, length) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(2);\n\tvar colLast = blob.read_shift(2);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.211 */\nfunction parse_RefU(blob, length) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(1);\n\tvar colLast = blob.read_shift(1);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* 2.5.143 */\nfunction parse_FtCmo(blob, length) {\n\tblob.l += 4;\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tblob.l+=12;\n\treturn [id, ot, flags];\n}\n\n/* 2.5.149 */\nfunction parse_FtNts(blob, length) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.l += 16; // GUID TODO\n\tout.fSharedNote = blob.read_shift(2);\n\tblob.l += 4;\n\treturn out;\n}\n\n/* 2.5.142 */\nfunction parse_FtCf(blob, length) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.cf = blob.read_shift(2);\n\treturn out;\n}\n\n/* 2.5.140 - 2.5.154 and friends */\nvar FtTab = {\n\t0x15: parse_FtCmo,\n\t0x13: parsenoop, /* FtLbsData */\n\t0x12: function(blob, length) { blob.l += 12; }, /* FtCblsData */\n\t0x11: function(blob, length) { blob.l += 8; }, /* FtRboData */\n\t0x10: parsenoop, /* FtEdoData */\n\t0x0F: parsenoop, /* FtGboData */\n\t0x0D: parse_FtNts, /* FtNts */\n\t0x0C: function(blob, length) { blob.l += 24; }, /* FtSbs */\n\t0x0B: function(blob, length) { blob.l += 10; }, /* FtRbo */\n\t0x0A: function(blob, length) { blob.l += 16; }, /* FtCbls */\n\t0x09: parsenoop, /* FtPictFmla */\n\t0x08: function(blob, length) { blob.l += 6; }, /* FtPioGrbit */\n\t0x07: parse_FtCf, /* FtCf */\n\t0x06: function(blob, length) { blob.l += 6; }, /* FtGmo */\n\t0x04: parsenoop, /* FtMacro */\n\t0x00: function(blob, length) { blob.l += 4; } /* FtEnding */\n};\nfunction parse_FtArray(blob, length, ot) {\n\tvar s = blob.l;\n\tvar fts = [];\n\twhile(blob.l < s + length) {\n\t\tvar ft = blob.read_shift(2);\n\t\tblob.l-=2;\n\t\ttry {\n\t\t\tfts.push(FtTab[ft](blob, s + length - blob.l));\n\t\t} catch(e) { blob.l = s + length; return fts; }\n\t}\n\tif(blob.l != s + length) blob.l = s + length; //throw \"bad Object Ft-sequence\";\n\treturn fts;\n}\n\n/* 2.5.129 */\nvar parse_FontIndex = parseuint16;\n\n/* --- 2.4 Records --- */\n\n/* 2.4.21 */\nfunction parse_BOF(blob, length) {\n\tvar o = {};\n\to.BIFFVer = blob.read_shift(2); length -= 2;\n\tswitch(o.BIFFVer) {\n\t\tcase 0x0600: /* BIFF8 */\n\t\tcase 0x0500: /* BIFF5 */\n\t\tcase 0x0002: case 0x0007: /* BIFF2 */\n\t\t\tbreak;\n\t\tdefault: throw \"Unexpected BIFF Ver \" + o.BIFFVer;\n\t}\n\tblob.read_shift(length);\n\treturn o;\n}\n\n\n/* 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n\tif(length === 0) return 0x04b0;\n\tvar q;\n\tif((q=blob.read_shift(2))!==0x04b0) throw 'InterfaceHdr codePage ' + q;\n\treturn 0x04b0;\n}\n\n\n/* 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n\tif(opts.enc) { blob.l += length; return \"\"; }\n\tvar l = blob.l;\n\t// TODO: make sure XLUnicodeString doesnt overrun\n\tvar UserName = parse_XLUnicodeString(blob, 0, opts);\n\tblob.read_shift(length + l - blob.l);\n\treturn UserName;\n}\n\n/* 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n\tvar pos = blob.read_shift(4);\n\tvar hidden = blob.read_shift(1) >> 6;\n\tvar dt = blob.read_shift(1);\n\tswitch(dt) {\n\t\tcase 0: dt = 'Worksheet'; break;\n\t\tcase 1: dt = 'Macrosheet'; break;\n\t\tcase 2: dt = 'Chartsheet'; break;\n\t\tcase 6: dt = 'VBAModule'; break;\n\t}\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\tif(name.length === 0) name = \"Sheet1\";\n\treturn { pos:pos, hs:hidden, dt:dt, name:name };\n}\n\n/* 2.4.265 TODO */\nfunction parse_SST(blob, length) {\n\tvar cnt = blob.read_shift(4);\n\tvar ucnt = blob.read_shift(4);\n\tvar strs = [];\n\tfor(var i = 0; i != ucnt; ++i) {\n\t\tstrs.push(parse_XLUnicodeRichExtendedString(blob));\n\t}\n\tstrs.Count = cnt; strs.Unique = ucnt;\n\treturn strs;\n}\n\n/* 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n\tvar extsst = {};\n\textsst.dsst = blob.read_shift(2);\n\tblob.l += length-2;\n\treturn extsst;\n}\n\n\n/* 2.4.221 TODO*/\nfunction parse_Row(blob, length) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2), Col = blob.read_shift(2), rht = blob.read_shift(2);\n\tblob.read_shift(4); // reserved(2), unused(2)\n\tvar flags = blob.read_shift(1); // various flags\n\tblob.read_shift(1); // reserved\n\tblob.read_shift(2); //ixfe, other flags\n\treturn {r:rw, c:col, cnt:Col-col};\n}\n\n\n/* 2.4.125 */\nfunction parse_ForceFullCalculation(blob, length) {\n\tvar header = parse_frtHeader(blob);\n\tif(header.type != 0x08A3) throw \"Invalid Future Record \" + header.type;\n\tvar fullcalc = blob.read_shift(4);\n\treturn fullcalc !== 0x0;\n}\n\n\nvar parse_CompressPictures = parsenoop2; /* 2.4.55 Not interesting */\n\n\n\n/* 2.4.215 rt */\nfunction parse_RecalcId(blob, length) {\n\tblob.read_shift(2);\n\treturn blob.read_shift(4);\n}\n\n/* 2.4.87 */\nfunction parse_DefaultRowHeight (blob, length) {\n\tvar f = blob.read_shift(2), miyRw;\n\tmiyRw = blob.read_shift(2); // flags & 0x02 -> hidden, else empty\n\tvar fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n\treturn [fl, miyRw];\n}\n\n/* 2.4.345 TODO */\nfunction parse_Window1(blob, length) {\n\tvar xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n\tvar ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n\treturn { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n\t\tFirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\n\n/* 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n\tblob.l += 14;\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\treturn name;\n}\n\n/* 2.4.149 */\nfunction parse_LabelSst(blob, length) {\n\tvar cell = parse_XLSCell(blob);\n\tcell.isst = blob.read_shift(4);\n\treturn cell;\n}\n\n/* 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar str = parse_XLUnicodeString(blob, length-6, opts);\n\tcell.val = str;\n\treturn cell;\n}\n\n/* 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n\tvar ifmt = blob.read_shift(2);\n\tvar fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n\treturn [ifmt, fmtstr];\n}\n\n/* 2.4.90 */\nfunction parse_Dimensions(blob, length) {\n\tvar w = length === 10 ? 2 : 4;\n\tvar r = blob.read_shift(w), R = blob.read_shift(w),\n\t c = blob.read_shift(2), C = blob.read_shift(2);\n\tblob.l += 2;\n\treturn {s: {r:r, c:c}, e: {r:R, c:C}};\n}\n\n/* 2.4.220 */\nfunction parse_RK(blob, length) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrec = parse_RkRec(blob);\n\treturn {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* 2.4.175 */\nfunction parse_MulRk(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrecs = [];\n\twhile(blob.l < target) rkrecs.push(parse_RkRec(blob));\n\tif(blob.l !== target) throw \"MulRK read error\";\n\tvar lastcol = blob.read_shift(2);\n\tif(rkrecs.length != lastcol - col + 1) throw \"MulRK length mismatch\";\n\treturn {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n\n/* 2.5.20 2.5.249 TODO */\nfunction parse_CellStyleXF(blob, length, style) {\n\tvar o = {};\n\tvar a = blob.read_shift(4), b = blob.read_shift(4);\n\tvar c = blob.read_shift(4), d = blob.read_shift(2);\n\to.patternType = XLSFillPattern[c >> 26];\n\to.icvFore = d & 0x7F;\n\to.icvBack = (d >> 7) & 0x7F;\n\treturn o;\n}\nfunction parse_CellXF(blob, length) {return parse_CellStyleXF(blob,length,0);}\nfunction parse_StyleXF(blob, length) {return parse_CellStyleXF(blob,length,1);}\n\n/* 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length) {\n\tvar o = {};\n\to.ifnt = blob.read_shift(2); o.ifmt = blob.read_shift(2); o.flags = blob.read_shift(2);\n\to.fStyle = (o.flags >> 2) & 0x01;\n\tlength -= 6;\n\to.data = parse_CellStyleXF(blob, length, o.fStyle);\n\treturn o;\n}\n\n/* 2.4.134 */\nfunction parse_Guts(blob, length) {\n\tblob.l += 4;\n\tvar out = [blob.read_shift(2), blob.read_shift(2)];\n\tif(out[0] !== 0) out[0]--;\n\tif(out[1] !== 0) out[1]--;\n\tif(out[0] > 7 || out[1] > 7) throw \"Bad Gutters: \" + out;\n\treturn out;\n}\n\n/* 2.4.24 */\nfunction parse_BoolErr(blob, length) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar val = parse_Bes(blob, 2);\n\tcell.val = val;\n\tcell.t = (val === true || val === false) ? 'b' : 'e';\n\treturn cell;\n}\n\n/* 2.4.180 Number */\nfunction parse_Number(blob, length) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar xnum = parse_Xnum(blob, 8);\n\tcell.val = xnum;\n\treturn cell;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar ctab = blob.read_shift(2);\n\tvar cch = blob.read_shift(2);\n\tvar virtPath;\n\tif(cch >=0x01 && cch <=0xff) virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n\tvar rgst = blob.read_shift(end - blob.l);\n\topts.sbcch = cch;\n\treturn [cch, ctab, virtPath, rgst];\n}\n\n/* 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n\tvar flags = blob.read_shift(2);\n\tvar body;\n\tvar o = {\n\t\tfBuiltIn: flags & 0x01,\n\t\tfWantAdvise: (flags >>> 1) & 0x01,\n\t\tfWantPict: (flags >>> 2) & 0x01,\n\t\tfOle: (flags >>> 3) & 0x01,\n\t\tfOleLink: (flags >>> 4) & 0x01,\n\t\tcf: (flags >>> 5) & 0x3FF,\n\t\tfIcon: flags >>> 15 & 0x01\n\t};\n\tif(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2);\n\t//else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n\to.body = body || blob.read_shift(length-2);\n\treturn o;\n}\n\n/* 2.4.150 TODO */\nfunction parse_Lbl(blob, length, opts) {\n\tif(opts.biff < 8) return parse_Label(blob, length, opts);\n\tvar target = blob.l + length;\n\tvar flags = blob.read_shift(2);\n\tvar chKey = blob.read_shift(1);\n\tvar cch = blob.read_shift(1);\n\tvar cce = blob.read_shift(2);\n\tblob.l += 2;\n\tvar itab = blob.read_shift(2);\n\tblob.l += 4;\n\tvar name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tvar rgce = parse_NameParsedFormula(blob, target - blob.l, opts, cce);\n\treturn {\n\t\tchKey: chKey,\n\t\tName: name,\n\t\trgce: rgce\n\t};\n}\n\n/* 2.4.106 TODO: verify supbook manipulation */\nfunction parse_ExternSheet(blob, length, opts) {\n\tif(opts.biff < 8) return parse_ShortXLUnicodeString(blob, length, opts);\n\tvar o = parslurp2(blob,length,parse_XTI);\n\tvar oo = [];\n\tif(opts.sbcch === 0x0401) {\n\t\tfor(var i = 0; i != o.length; ++i) oo.push(opts.snames[o[i][1]]);\n\t\treturn oo;\n\t}\n\telse return o;\n}\n\n/* 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n\tvar ref = parse_RefU(blob, 6);\n\tblob.l++;\n\tvar cUse = blob.read_shift(1);\n\tlength -= 8;\n\treturn [parse_SharedParsedFormula(blob, length, opts), cUse];\n}\n\n/* 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n\tvar ref = parse_Ref(blob, 6);\n\tblob.l += 6; length -= 12; /* TODO: fAlwaysCalc */\n\treturn [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* 2.4.173 */\nfunction parse_MTRSettings(blob, length) {\n\tvar fMTREnabled = blob.read_shift(4) !== 0x00;\n\tvar fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n\tvar cUserThreadCount = blob.read_shift(4);\n\treturn [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n\tif(opts.biff < 8) return;\n\tvar row = blob.read_shift(2), col = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), idObj = blob.read_shift(2);\n\tvar stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n\tif(opts.biff < 8) blob.read_shift(1);\n\treturn [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n\t/* TODO: Support revisions */\n\treturn parse_NoteSh(blob, length, opts);\n}\n\n/* 2.4.168 */\nfunction parse_MergeCells(blob, length) {\n\tvar merges = [];\n\tvar cmcs = blob.read_shift(2);\n\twhile (cmcs--) merges.push(parse_Ref8U(blob,length));\n\treturn merges;\n}\n\n/* 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length) {\n\tvar cmo = parse_FtCmo(blob, 22); // id, ot, flags\n\tvar fts = parse_FtArray(blob, length-22, cmo[1]);\n\treturn { cmo: cmo, ft:fts };\n}\n\n/* 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n\tvar s = blob.l;\ntry {\n\tblob.l += 4;\n\tvar ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n\tvar controlInfo;\n\tif([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n\telse controlInfo = parse_ControlInfo(blob, 6, opts);\n\tvar cchText = blob.read_shift(2);\n\tvar cbRuns = blob.read_shift(2);\n\tvar ifntEmpty = parse_FontIndex(blob, 2);\n\tvar len = blob.read_shift(2);\n\tblob.l += len;\n\t//var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n\tvar texts = \"\";\n\tfor(var i = 1; i < blob.lens.length-1; ++i) {\n\t\tif(blob.l-s != blob.lens[i]) throw \"TxO: bad continue record\";\n\t\tvar hdr = blob[blob.l];\n\t\tvar t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n\t\ttexts += t;\n\t\tif(texts.length >= (hdr ? cchText : 2*cchText)) break;\n\t}\n\tif(texts.length !== cchText && texts.length !== cchText*2) {\n\t\tthrow \"cchText: \" + cchText + \" != \" + texts.length;\n\t}\n\n\tblob.l = s + length;\n\t/* 2.5.272 TxORuns */\n//\tvar rgTxoRuns = [];\n//\tfor(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//\tvar cchText2 = blob.read_shift(2);\n//\tif(cchText2 !== cchText) throw \"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText;\n//\tblob.l += 6;\n//\tif(s + length != blob.l) throw \"TxO \" + (s + length) + \", at \" + blob.l;\n\treturn { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts||\"\" }; }\n}\n\n/* 2.4.140 */\nvar parse_HLink = function(blob, length) {\n\tvar ref = parse_Ref8U(blob, 8);\n\tblob.l += 16; /* CLSID */\n\tvar hlink = parse_Hyperlink(blob, length-24);\n\treturn [ref, hlink];\n};\n\n/* 2.4.141 */\nvar parse_HLinkTooltip = function(blob, length) {\n\tvar end = blob.l + length;\n\tblob.read_shift(2);\n\tvar ref = parse_Ref8U(blob, 8);\n\tvar wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n\twzTooltip = wzTooltip.replace(chr0,\"\");\n\treturn [ref, wzTooltip];\n};\n\n/* 2.4.63 */\nfunction parse_Country(blob, length) {\n\tvar o = [], d;\n\td = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n\td = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n\treturn o;\n}\n\n/* 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob, length) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* 2.4.188 */\nfunction parse_Palette(blob, length) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* 2.4.354 */\nfunction parse_XFCRC(blob, length) {\n\tblob.l += 2;\n\tvar o = {cxfs:0, crc:0};\n\to.cxfs = blob.read_shift(2);\n\to.crc = blob.read_shift(4);\n\treturn o;\n}\n\n\nvar parse_Style = parsenoop;\nvar parse_StyleExt = parsenoop;\n\nvar parse_ColInfo = parsenoop;\n\nvar parse_Window2 = parsenoop;\n\n\nvar parse_Backup = parsebool; /* 2.4.14 */\nvar parse_Blank = parse_XLSCell; /* 2.4.20 Just the cell */\nvar parse_BottomMargin = parse_Xnum; /* 2.4.27 */\nvar parse_BuiltInFnGroupCount = parseuint16; /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */\nvar parse_CalcCount = parseuint16; /* 2.4.31 #Iterations */\nvar parse_CalcDelta = parse_Xnum; /* 2.4.32 */\nvar parse_CalcIter = parsebool; /* 2.4.33 1=iterative calc */\nvar parse_CalcMode = parseuint16; /* 2.4.34 0=manual, 1=auto (def), 2=table */\nvar parse_CalcPrecision = parsebool; /* 2.4.35 */\nvar parse_CalcRefMode = parsenoop2; /* 2.4.36 */\nvar parse_CalcSaveRecalc = parsebool; /* 2.4.37 */\nvar parse_CodePage = parseuint16; /* 2.4.52 */\nvar parse_Compat12 = parsebool; /* 2.4.54 true = no compatibility check */\nvar parse_Date1904 = parsebool; /* 2.4.77 - 1=1904,0=1900 */\nvar parse_DefColWidth = parseuint16; /* 2.4.89 */\nvar parse_DSF = parsenoop2; /* 2.4.94 -- MUST be ignored */\nvar parse_EntExU2 = parsenoop2; /* 2.4.102 -- Explicitly says to ignore */\nvar parse_EOF = parsenoop2; /* 2.4.103 */\nvar parse_Excel9File = parsenoop2; /* 2.4.104 -- Optional and unused */\nvar parse_FeatHdr = parsenoop2; /* 2.4.112 */\nvar parse_FontX = parseuint16; /* 2.4.123 */\nvar parse_Footer = parse_XLHeaderFooter; /* 2.4.124 */\nvar parse_GridSet = parseuint16; /* 2.4.132, =1 */\nvar parse_HCenter = parsebool; /* 2.4.135 sheet centered horizontal on print */\nvar parse_Header = parse_XLHeaderFooter; /* 2.4.136 */\nvar parse_HideObj = parse_HideObjEnum; /* 2.4.139 */\nvar parse_InterfaceEnd = parsenoop2; /* 2.4.145 -- noop */\nvar parse_LeftMargin = parse_Xnum; /* 2.4.151 */\nvar parse_Mms = parsenoop2; /* 2.4.169 -- Explicitly says to ignore */\nvar parse_ObjProtect = parsebool; /* 2.4.183 -- must be 1 if present */\nvar parse_Password = parseuint16; /* 2.4.191 */\nvar parse_PrintGrid = parsebool; /* 2.4.202 */\nvar parse_PrintRowCol = parsebool; /* 2.4.203 */\nvar parse_PrintSize = parseuint16; /* 2.4.204 0:3 */\nvar parse_Prot4Rev = parsebool; /* 2.4.205 */\nvar parse_Prot4RevPass = parseuint16; /* 2.4.206 */\nvar parse_Protect = parsebool; /* 2.4.207 */\nvar parse_RefreshAll = parsebool; /* 2.4.217 -- must be 0 if not template */\nvar parse_RightMargin = parse_Xnum; /* 2.4.219 */\nvar parse_RRTabId = parseuint16a; /* 2.4.241 */\nvar parse_ScenarioProtect = parsebool; /* 2.4.245 */\nvar parse_Scl = parseuint16a; /* 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* 2.4.268 */\nvar parse_SxBool = parsebool; /* 2.4.274 */\nvar parse_TopMargin = parse_Xnum; /* 2.4.328 */\nvar parse_UsesELFs = parsebool; /* 2.4.337 -- should be 0 */\nvar parse_VCenter = parsebool; /* 2.4.342 */\nvar parse_WinProtect = parsebool; /* 2.4.347 */\nvar parse_WriteProtect = parsenoop; /* 2.4.350 empty record */\n\n\n/* ---- */\nvar parse_VerticalPageBreaks = parsenoop;\nvar parse_HorizontalPageBreaks = parsenoop;\nvar parse_Selection = parsenoop;\nvar parse_Continue = parsenoop;\nvar parse_Pane = parsenoop;\nvar parse_Pls = parsenoop;\nvar parse_DCon = parsenoop;\nvar parse_DConRef = parsenoop;\nvar parse_DConName = parsenoop;\nvar parse_XCT = parsenoop;\nvar parse_CRN = parsenoop;\nvar parse_FileSharing = parsenoop;\nvar parse_Uncalced = parsenoop;\nvar parse_Template = parsenoop;\nvar parse_Intl = parsenoop;\nvar parse_WsBool = parsenoop;\nvar parse_Sort = parsenoop;\nvar parse_Sync = parsenoop;\nvar parse_LPr = parsenoop;\nvar parse_DxGCol = parsenoop;\nvar parse_FnGroupName = parsenoop;\nvar parse_FilterMode = parsenoop;\nvar parse_AutoFilterInfo = parsenoop;\nvar parse_AutoFilter = parsenoop;\nvar parse_Setup = parsenoop;\nvar parse_ScenMan = parsenoop;\nvar parse_SCENARIO = parsenoop;\nvar parse_SxView = parsenoop;\nvar parse_Sxvd = parsenoop;\nvar parse_SXVI = parsenoop;\nvar parse_SxIvd = parsenoop;\nvar parse_SXLI = parsenoop;\nvar parse_SXPI = parsenoop;\nvar parse_DocRoute = parsenoop;\nvar parse_RecipName = parsenoop;\nvar parse_MulBlank = parsenoop;\nvar parse_SXDI = parsenoop;\nvar parse_SXDB = parsenoop;\nvar parse_SXFDB = parsenoop;\nvar parse_SXDBB = parsenoop;\nvar parse_SXNum = parsenoop;\nvar parse_SxErr = parsenoop;\nvar parse_SXInt = parsenoop;\nvar parse_SXString = parsenoop;\nvar parse_SXDtr = parsenoop;\nvar parse_SxNil = parsenoop;\nvar parse_SXTbl = parsenoop;\nvar parse_SXTBRGIITM = parsenoop;\nvar parse_SxTbpg = parsenoop;\nvar parse_ObProj = parsenoop;\nvar parse_SXStreamID = parsenoop;\nvar parse_DBCell = parsenoop;\nvar parse_SXRng = parsenoop;\nvar parse_SxIsxoper = parsenoop;\nvar parse_BookBool = parsenoop;\nvar parse_DbOrParamQry = parsenoop;\nvar parse_OleObjectSize = parsenoop;\nvar parse_SXVS = parsenoop;\nvar parse_BkHim = parsenoop;\nvar parse_MsoDrawingGroup = parsenoop;\nvar parse_MsoDrawing = parsenoop;\nvar parse_MsoDrawingSelection = parsenoop;\nvar parse_PhoneticInfo = parsenoop;\nvar parse_SxRule = parsenoop;\nvar parse_SXEx = parsenoop;\nvar parse_SxFilt = parsenoop;\nvar parse_SxDXF = parsenoop;\nvar parse_SxItm = parsenoop;\nvar parse_SxName = parsenoop;\nvar parse_SxSelect = parsenoop;\nvar parse_SXPair = parsenoop;\nvar parse_SxFmla = parsenoop;\nvar parse_SxFormat = parsenoop;\nvar parse_SXVDEx = parsenoop;\nvar parse_SXFormula = parsenoop;\nvar parse_SXDBEx = parsenoop;\nvar parse_RRDInsDel = parsenoop;\nvar parse_RRDHead = parsenoop;\nvar parse_RRDChgCell = parsenoop;\nvar parse_RRDRenSheet = parsenoop;\nvar parse_RRSort = parsenoop;\nvar parse_RRDMove = parsenoop;\nvar parse_RRFormat = parsenoop;\nvar parse_RRAutoFmt = parsenoop;\nvar parse_RRInsertSh = parsenoop;\nvar parse_RRDMoveBegin = parsenoop;\nvar parse_RRDMoveEnd = parsenoop;\nvar parse_RRDInsDelBegin = parsenoop;\nvar parse_RRDInsDelEnd = parsenoop;\nvar parse_RRDConflict = parsenoop;\nvar parse_RRDDefName = parsenoop;\nvar parse_RRDRstEtxp = parsenoop;\nvar parse_LRng = parsenoop;\nvar parse_CUsr = parsenoop;\nvar parse_CbUsr = parsenoop;\nvar parse_UsrInfo = parsenoop;\nvar parse_UsrExcl = parsenoop;\nvar parse_FileLock = parsenoop;\nvar parse_RRDInfo = parsenoop;\nvar parse_BCUsrs = parsenoop;\nvar parse_UsrChk = parsenoop;\nvar parse_UserBView = parsenoop;\nvar parse_UserSViewBegin = parsenoop; // overloaded\nvar parse_UserSViewEnd = parsenoop;\nvar parse_RRDUserView = parsenoop;\nvar parse_Qsi = parsenoop;\nvar parse_CondFmt = parsenoop;\nvar parse_CF = parsenoop;\nvar parse_DVal = parsenoop;\nvar parse_DConBin = parsenoop;\nvar parse_Lel = parsenoop;\nvar parse_XLSCodeName = parse_XLUnicodeString;\nvar parse_SXFDBType = parsenoop;\nvar parse_ObNoMacros = parsenoop;\nvar parse_Dv = parsenoop;\nvar parse_Index = parsenoop;\nvar parse_Table = parsenoop;\nvar parse_BigName = parsenoop;\nvar parse_ContinueBigName = parsenoop;\nvar parse_WebPub = parsenoop;\nvar parse_QsiSXTag = parsenoop;\nvar parse_DBQueryExt = parsenoop;\nvar parse_ExtString = parsenoop;\nvar parse_TxtQry = parsenoop;\nvar parse_Qsir = parsenoop;\nvar parse_Qsif = parsenoop;\nvar parse_RRDTQSIF = parsenoop;\nvar parse_OleDbConn = parsenoop;\nvar parse_WOpt = parsenoop;\nvar parse_SXViewEx = parsenoop;\nvar parse_SXTH = parsenoop;\nvar parse_SXPIEx = parsenoop;\nvar parse_SXVDTEx = parsenoop;\nvar parse_SXViewEx9 = parsenoop;\nvar parse_ContinueFrt = parsenoop;\nvar parse_RealTimeData = parsenoop;\nvar parse_ChartFrtInfo = parsenoop;\nvar parse_FrtWrapper = parsenoop;\nvar parse_StartBlock = parsenoop;\nvar parse_EndBlock = parsenoop;\nvar parse_StartObject = parsenoop;\nvar parse_EndObject = parsenoop;\nvar parse_CatLab = parsenoop;\nvar parse_YMult = parsenoop;\nvar parse_SXViewLink = parsenoop;\nvar parse_PivotChartBits = parsenoop;\nvar parse_FrtFontList = parsenoop;\nvar parse_SheetExt = parsenoop;\nvar parse_BookExt = parsenoop;\nvar parse_SXAddl = parsenoop;\nvar parse_CrErr = parsenoop;\nvar parse_HFPicture = parsenoop;\nvar parse_Feat = parsenoop;\nvar parse_DataLabExt = parsenoop;\nvar parse_DataLabExtContents = parsenoop;\nvar parse_CellWatch = parsenoop;\nvar parse_FeatHdr11 = parsenoop;\nvar parse_Feature11 = parsenoop;\nvar parse_DropDownObjIds = parsenoop;\nvar parse_ContinueFrt11 = parsenoop;\nvar parse_DConn = parsenoop;\nvar parse_List12 = parsenoop;\nvar parse_Feature12 = parsenoop;\nvar parse_CondFmt12 = parsenoop;\nvar parse_CF12 = parsenoop;\nvar parse_CFEx = parsenoop;\nvar parse_AutoFilter12 = parsenoop;\nvar parse_ContinueFrt12 = parsenoop;\nvar parse_MDTInfo = parsenoop;\nvar parse_MDXStr = parsenoop;\nvar parse_MDXTuple = parsenoop;\nvar parse_MDXSet = parsenoop;\nvar parse_MDXProp = parsenoop;\nvar parse_MDXKPI = parsenoop;\nvar parse_MDB = parsenoop;\nvar parse_PLV = parsenoop;\nvar parse_DXF = parsenoop;\nvar parse_TableStyles = parsenoop;\nvar parse_TableStyle = parsenoop;\nvar parse_TableStyleElement = parsenoop;\nvar parse_NamePublish = parsenoop;\nvar parse_NameCmt = parsenoop;\nvar parse_SortData = parsenoop;\nvar parse_GUIDTypeLib = parsenoop;\nvar parse_FnGrp12 = parsenoop;\nvar parse_NameFnGrp12 = parsenoop;\nvar parse_HeaderFooter = parsenoop;\nvar parse_CrtLayout12 = parsenoop;\nvar parse_CrtMlFrt = parsenoop;\nvar parse_CrtMlFrtContinue = parsenoop;\nvar parse_ShapePropsStream = parsenoop;\nvar parse_TextPropsStream = parsenoop;\nvar parse_RichTextStream = parsenoop;\nvar parse_CrtLayout12A = parsenoop;\nvar parse_Units = parsenoop;\nvar parse_Chart = parsenoop;\nvar parse_Series = parsenoop;\nvar parse_DataFormat = parsenoop;\nvar parse_LineFormat = parsenoop;\nvar parse_MarkerFormat = parsenoop;\nvar parse_AreaFormat = parsenoop;\nvar parse_PieFormat = parsenoop;\nvar parse_AttachedLabel = parsenoop;\nvar parse_SeriesText = parsenoop;\nvar parse_ChartFormat = parsenoop;\nvar parse_Legend = parsenoop;\nvar parse_SeriesList = parsenoop;\nvar parse_Bar = parsenoop;\nvar parse_Line = parsenoop;\nvar parse_Pie = parsenoop;\nvar parse_Area = parsenoop;\nvar parse_Scatter = parsenoop;\nvar parse_CrtLine = parsenoop;\nvar parse_Axis = parsenoop;\nvar parse_Tick = parsenoop;\nvar parse_ValueRange = parsenoop;\nvar parse_CatSerRange = parsenoop;\nvar parse_AxisLine = parsenoop;\nvar parse_CrtLink = parsenoop;\nvar parse_DefaultText = parsenoop;\nvar parse_Text = parsenoop;\nvar parse_ObjectLink = parsenoop;\nvar parse_Frame = parsenoop;\nvar parse_Begin = parsenoop;\nvar parse_End = parsenoop;\nvar parse_PlotArea = parsenoop;\nvar parse_Chart3d = parsenoop;\nvar parse_PicF = parsenoop;\nvar parse_DropBar = parsenoop;\nvar parse_Radar = parsenoop;\nvar parse_Surf = parsenoop;\nvar parse_RadarArea = parsenoop;\nvar parse_AxisParent = parsenoop;\nvar parse_LegendException = parsenoop;\nvar parse_ShtProps = parsenoop;\nvar parse_SerToCrt = parsenoop;\nvar parse_AxesUsed = parsenoop;\nvar parse_SBaseRef = parsenoop;\nvar parse_SerParent = parsenoop;\nvar parse_SerAuxTrend = parsenoop;\nvar parse_IFmtRecord = parsenoop;\nvar parse_Pos = parsenoop;\nvar parse_AlRuns = parsenoop;\nvar parse_BRAI = parsenoop;\nvar parse_SerAuxErrBar = parsenoop;\nvar parse_SerFmt = parsenoop;\nvar parse_Chart3DBarShape = parsenoop;\nvar parse_Fbi = parsenoop;\nvar parse_BopPop = parsenoop;\nvar parse_AxcExt = parsenoop;\nvar parse_Dat = parsenoop;\nvar parse_PlotGrowth = parsenoop;\nvar parse_SIIndex = parsenoop;\nvar parse_GelFrame = parsenoop;\nvar parse_BopPopCustom = parsenoop;\nvar parse_Fbi2 = parsenoop;\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_BIFF5String(blob) {\n\tvar len = blob.read_shift(1);\n\treturn blob.read_shift(len, 'sbcs-cont');\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar str = parse_XLUnicodeString2(blob, length-7, opts);\n\tcell.val = str;\n\treturn cell;\n}\n\nfunction parse_BIFF2NUM(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = parse_Xnum(blob, 8);\n\tcell.val = num;\n\treturn cell;\n}\n\n/* 18.4.1 charset to codepage mapping */\nvar CS2CP = {\n\t0: 1252, /* ANSI */\n\t1: 65001, /* DEFAULT */\n\t2: 65001, /* SYMBOL */\n\t77: 10000, /* MAC */\n\t128: 932, /* SHIFTJIS */\n\t129: 949, /* HANGUL */\n\t130: 1361, /* JOHAB */\n\t134: 936, /* GB2312 */\n\t136: 950, /* CHINESEBIG5 */\n\t161: 1253, /* GREEK */\n\t162: 1254, /* TURKISH */\n\t163: 1258, /* VIETNAMESE */\n\t177: 1255, /* HEBREW */\n\t178: 1256, /* ARABIC */\n\t186: 1257, /* BALTIC */\n\t204: 1251, /* RUSSIAN */\n\t222: 874, /* THAI */\n\t238: 1250, /* EASTEUROPE */\n\t255: 1252, /* OEM */\n\t69: 6969 /* MISC */\n};\n\n/* Parse a list of <r> tags */\nvar parse_rs = (function parse_rs_factory() {\n\tvar tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\"), rregex = /<r>/g, rend = /<\\/r>/, nlregex = /\\r\\n/g;\n\t/* 18.4.7 rPr CT_RPrElt */\n\tvar parse_rpr = function parse_rpr(rpr, intro, outro) {\n\t\tvar font = {}, cp = 65001;\n\t\tvar m = rpr.match(tagregex), i = 0;\n\t\tif(m) for(;i!=m.length; ++i) {\n\t\t\tvar y = parsexmltag(m[i]);\n\t\t\tswitch(y[0]) {\n\t\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<condense': break;\n\t\t\t\t/* 18.8.17 extend CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<extend': break;\n\t\t\t\t/* 18.8.36 shadow CT_BooleanProperty */\n\t\t\t\t/* ** not required . */\n\t\t\t\tcase '<shadow':\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<shadow/>': break;\n\n\t\t\t\t/* 18.4.1 charset CT_IntProperty TODO */\n\t\t\t\tcase '<charset':\n\t\t\t\t\tif(y.val == '1') break;\n\t\t\t\t\tcp = CS2CP[parseInt(y.val, 10)];\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* 18.4.2 outline CT_BooleanProperty TODO */\n\t\t\t\tcase '<outline':\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<outline/>': break;\n\n\t\t\t\t/* 18.4.5 rFont CT_FontName */\n\t\t\t\tcase '<rFont': font.name = y.val; break;\n\n\t\t\t\t/* 18.4.11 sz CT_FontSize */\n\t\t\t\tcase '<sz': font.sz = y.val; break;\n\n\t\t\t\t/* 18.4.10 strike CT_BooleanProperty */\n\t\t\t\tcase '<strike':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<strike/>': font.strike = 1; break;\n\t\t\t\tcase '</strike>': break;\n\n\t\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\t\tcase '<u':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<u/>': font.u = 1; break;\n\t\t\t\tcase '</u>': break;\n\n\t\t\t\t/* 18.8.2 b */\n\t\t\t\tcase '<b':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<b/>': font.b = 1; break;\n\t\t\t\tcase '</b>': break;\n\n\t\t\t\t/* 18.8.26 i */\n\t\t\t\tcase '<i':\n\t\t\t\t\tif(!y.val) break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase '<i/>': font.i = 1; break;\n\t\t\t\tcase '</i>': break;\n\n\t\t\t\t/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n\t\t\t\tcase '<color':\n\t\t\t\t\tif(y.rgb) font.color = y.rgb.substr(2,6);\n\t\t\t\t\tbreak;\n\n\t\t\t\t/* 18.8.18 family ST_FontFamily */\n\t\t\t\tcase '<family': font.family = y.val; break;\n\n\t\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */\n\t\t\t\tcase '<vertAlign': break;\n\n\t\t\t\t/* 18.8.35 scheme CT_FontScheme TODO */\n\t\t\t\tcase '<scheme': break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif(y[0].charCodeAt(1) !== 47) throw 'Unrecognized rich format ' + y[0];\n\t\t\t}\n\t\t}\n\t\t/* TODO: These should be generated styles, not inline */\n\t\tvar style = [];\n\t\tif(font.b) style.push(\"font-weight: bold;\");\n\t\tif(font.i) style.push(\"font-style: italic;\");\n\t\tintro.push('<span style=\"' + style.join(\"\") + '\">');\n\t\toutro.push(\"</span>\");\n\t\treturn cp;\n\t};\n\n\t/* 18.4.4 r CT_RElt */\n\tfunction parse_r(r) {\n\t\tvar terms = [[],\"\",[]];\n\t\t/* 18.4.12 t ST_Xstring */\n\t\tvar t = r.match(tregex), cp = 65001;\n\t\tif(!isval(t)) return \"\";\n\t\tterms[1] = t[1];\n\n\t\tvar rpr = r.match(rpregex);\n\t\tif(isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]);\n\n\t\treturn terms[0].join(\"\") + terms[1].replace(nlregex,'<br/>') + terms[2].join(\"\");\n\t}\n\treturn function parse_rs(rs) {\n\t\treturn rs.replace(rregex,\"\").split(rend).map(parse_r).join(\"\");\n\t};\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<t[^>]*>([^<]*)<\\/t>/g, sirregex = /<r>/;\nfunction parse_si(x, opts) {\n\tvar html = opts ? opts.cellHTML : true;\n\tvar z = {};\n\tif(!x) return null;\n\tvar y;\n\t/* 18.4.12 t ST_Xstring (Plaintext String) */\n\tif(x.charCodeAt(1) === 116) {\n\t\tz.t = utf8read(unescapexml(x.substr(x.indexOf(\">\")+1).split(/<\\/t>/)[0]));\n\t\tz.r = x;\n\t\tif(html) z.h = z.t;\n\t}\n\t/* 18.4.4 r CT_RElt (Rich Text Run) */\n\telse if((y = x.match(sirregex))) {\n\t\tz.r = x;\n\t\tz.t = utf8read(unescapexml(x.match(sitregex).join(\"\").replace(tagregex,\"\")));\n\t\tif(html) z.h = parse_rs(x);\n\t}\n\t/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n\t/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n\treturn z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<sst([^>]*)>([\\s\\S]*)<\\/sst>/;\nvar sstr1 = /<(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:si|sstItem)>/;\nfunction parse_sst_xml(data, opts) {\n\tvar s = [], ss;\n\t/* 18.4.9 sst CT_Sst */\n\tvar sst = data.match(sstr0);\n\tif(isval(sst)) {\n\t\tss = sst[2].replace(sstr1,\"\").split(sstr2);\n\t\tfor(var i = 0; i != ss.length; ++i) {\n\t\t\tvar o = parse_si(ss[i], opts);\n\t\t\tif(o != null) s[s.length] = o;\n\t\t}\n\t\tsst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n\t}\n\treturn s;\n}\n\nRELS.SST = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst, opts) {\n\tif(!opts.bookSST) return \"\";\n\tvar o = [XML_HEADER];\n\to[o.length] = (writextag('sst', null, {\n\t\txmlns: XMLNS.main[0],\n\t\tcount: sst.Count,\n\t\tuniqueCount: sst.Unique\n\t}));\n\tfor(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n\t\tvar s = sst[i];\n\t\tvar sitag = \"<si>\";\n\t\tif(s.r) sitag += s.r;\n\t\telse {\n\t\t\tsitag += \"<t\";\n\t\t\tif(s.t.match(straywsregex)) sitag += ' xml:space=\"preserve\"';\n\t\t\tsitag += \">\" + escapexml(s.t) + \"</t>\";\n\t\t}\n\t\tsitag += \"</si>\";\n\t\to[o.length] = (sitag);\n\t}\n\tif(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.219 BrtBeginSst */\nfunction parse_BrtBeginSst(data, length) {\n\treturn [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts) {\n\tvar s = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_sst(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break;\n\t\t\tcase 'BrtSSTItem': s.push(val); break;\n\t\t\tcase 'BrtEndSst': return true;\n\t\t\t/* TODO: produce a test case with a future record */\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, sst.Count);\n\to.write_shift(4, sst.Unique);\n\treturn o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSst\", write_BrtBeginSst(sst));\n\tfor(var i = 0; i < sst.length; ++i) write_record(ba, \"BrtSSTItem\", write_BrtSSTItem(sst[i]));\n\twrite_record(ba, \"BrtEndSst\");\n\treturn ba.end();\n}\nfunction _JS2ANSI(str) { if(typeof cptable !== 'undefined') return cptable.utils.encode(1252, str); return str.split(\"\").map(function(x) { return x.charCodeAt(0); }); }\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_Version(blob, length) {\n\tvar o = {};\n\to.Major = blob.read_shift(2);\n\to.Minor = blob.read_shift(2);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length) {\n\tvar o = {};\n\to.Flags = blob.read_shift(4);\n\n\t// Check if SizeExtra is 0x00000000\n\tvar tmp = blob.read_shift(4);\n\tif(tmp !== 0) throw 'Unrecognized SizeExtra: ' + tmp;\n\n\to.AlgID = blob.read_shift(4);\n\tswitch(o.AlgID) {\n\t\tcase 0: case 0x6801: case 0x660E: case 0x660F: case 0x6610: break;\n\t\tdefault: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n\t}\n\tparsenoop(blob, length-12);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length) {\n\treturn parsenoop(blob, length);\n}\n/* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */\nfunction parse_RC4CryptoHeader(blob, length) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n\tif(vers.Minor != 2) throw 'unrecognized minor version code: ' + vers.Minor;\n\tif(vers.Major > 4 || vers.Major < 2) throw 'unrecognized major version code: ' + vers.Major;\n\to.Flags = blob.read_shift(4); length -= 4;\n\tvar sz = blob.read_shift(4); length -= 4;\n\to.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n\to.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob, length) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4;\n\tif(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n\to.Salt = blob.read_shift(16);\n\to.EncryptedVerifier = blob.read_shift(16);\n\to.EncryptedVerifierHash = blob.read_shift(16);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password) {\n\tvar Verifier = 0x0000, PasswordArray;\n\tvar PasswordDecoded = _JS2ANSI(Password);\n\tvar len = PasswordDecoded.length + 1, i, PasswordByte;\n\tvar Intermediate1, Intermediate2, Intermediate3;\n\tPasswordArray = new_raw_buf(len);\n\tPasswordArray[0] = PasswordDecoded.length;\n\tfor(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n\tfor(i = len-1; i >= 0; --i) {\n\t\tPasswordByte = PasswordArray[i];\n\t\tIntermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n\t\tIntermediate2 = (Verifier << 1) & 0x7FFF;\n\t\tIntermediate3 = Intermediate1 | Intermediate2;\n\t\tVerifier = Intermediate3 ^ PasswordByte;\n\t}\n\treturn Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = (function() {\n\tvar PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n\tvar InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n\tvar XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n\tvar Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n\tvar XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n\tvar CreateXorKey_Method1 = function(Password) {\n\t\tvar XorKey = InitialCode[Password.length - 1];\n\t\tvar CurrentElement = 0x68;\n\t\tfor(var i = Password.length-1; i >= 0; --i) {\n\t\t\tvar Char = Password[i];\n\t\t\tfor(var j = 0; j != 7; ++j) {\n\t\t\t\tif(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n\t\t\t\tChar *= 2; --CurrentElement;\n\t\t\t}\n\t\t}\n\t\treturn XorKey;\n\t};\n\treturn function(password) {\n\t\tvar Password = _JS2ANSI(password);\n\t\tvar XorKey = CreateXorKey_Method1(Password);\n\t\tvar Index = Password.length;\n\t\tvar ObfuscationArray = new_raw_buf(16);\n\t\tfor(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n\t\tvar Temp, PasswordLastChar, PadIndex;\n\t\tif((Index & 1) === 1) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tPasswordLastChar = Password[Password.length - 1];\n\t\t\tObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n\t\t}\n\t\twhile(Index > 0) {\n\t\t\t--Index;\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t}\n\t\tIndex = 15;\n\t\tPadIndex = 15 - Password.length;\n\t\twhile(PadIndex > 0) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t}\n\t\treturn ObfuscationArray;\n\t};\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {\n\t/* If XorArray is set, use it; if O is not set, make changes in-place */\n\tif(!O) O = Data;\n\tif(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n\tvar Index, Value;\n\tfor(Index = 0; Index != Data.length; ++Index) {\n\t\tValue = Data[Index];\n\t\tValue ^= XorArray[XorArrayIndex];\n\t\tValue = ((Value>>5) | (Value<<3)) & 0xFF;\n\t\tO[Index] = Value;\n\t\t++XorArrayIndex;\n\t}\n\treturn [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password) {\n\tvar XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n\treturn function(Data) {\n\t\tvar O = crypto_DecryptData_Method1(null, Data, XorArrayIndex, XorArray);\n\t\tXorArrayIndex = O[1];\n\t\treturn O[0];\n\t};\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n\tvar o = { key: parseuint16(blob), verificationBytes: parseuint16(blob) };\n\tif(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n\tout.valid = o.verificationBytes === o.verifier;\n\tif(out.valid) out.insitu_decrypt = crypto_MakeXorDecryptor(opts.password);\n\treturn o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length, oo) {\n\tvar o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n\tif(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n\telse o.Data = parse_RC4CryptoHeader(blob, length);\n\treturn o;\n}\nfunction parse_FilePass(blob, length, opts) {\n\tvar o = { Type: blob.read_shift(2) }; /* wEncryptionType */\n\tif(o.Type) parse_FilePassHeader(blob, length-2, o);\n\telse parse_XORObfuscation(blob, length-2, opts, o);\n\treturn o;\n}\n\n\nfunction hex2RGB(h) {\n\tvar o = h.substr(h[0]===\"#\"?1:0,6);\n\treturn [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)];\n}\nfunction rgb2Hex(rgb) {\n\tfor(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n\treturn o.toString(16).toUpperCase().substr(1);\n}\n\nfunction rgb2HSL(rgb) {\n\tvar R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n\tvar M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n\tif(C === 0) return [0, 0, R];\n\n\tvar H6 = 0, S = 0, L2 = (M + m);\n\tS = C / (L2 > 1 ? 2 - L2 : L2);\n\tswitch(M){\n\t\tcase R: H6 = ((G - B) / C + 6)%6; break;\n\t\tcase G: H6 = ((B - R) / C + 2); break;\n\t\tcase B: H6 = ((R - G) / C + 4); break;\n\t}\n\treturn [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n\tvar H = hsl[0], S = hsl[1], L = hsl[2];\n\tvar C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n\tvar rgb = [m,m,m], h6 = 6*H;\n\n\tvar X;\n\tif(S !== 0) switch(h6|0) {\n\t\tcase 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n\t\tcase 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;\n\t\tcase 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;\n\t\tcase 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;\n\t\tcase 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;\n\t\tcase 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;\n\t}\n\tfor(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n\treturn rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n\tif(tint === 0) return hex;\n\tvar hsl = rgb2HSL(hex2RGB(hex));\n\tif (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n\telse hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n\treturn rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\nvar DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; }\nfunction px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; }\nfunction char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\nfunction find_mdw(collw, coll) {\n\tif(cycle_width(collw) != collw) {\n\t\tfor(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break;\n\t\tif(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break;\n\t\tif(MDW === MAX_MDW) MDW = DEF_MDW;\n\t}\n}\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n\t\"None\": \"none\",\n\t\"Solid\": \"solid\",\n\t\"Gray50\": \"mediumGray\",\n\t\"Gray75\": \"darkGray\",\n\t\"Gray25\": \"lightGray\",\n\t\"HorzStripe\": \"darkHorizontal\",\n\t\"VertStripe\": \"darkVertical\",\n\t\"ReverseDiagStripe\": \"darkDown\",\n\t\"DiagStripe\": \"darkUp\",\n\t\"DiagCross\": \"darkGrid\",\n\t\"ThickDiagCross\": \"darkTrellis\",\n\t\"ThinHorzStripe\": \"lightHorizontal\",\n\t\"ThinVertStripe\": \"lightVertical\",\n\t\"ThinReverseDiagStripe\": \"lightDown\",\n\t\"ThinHorzCross\": \"lightGrid\"\n};\n\nvar styles = {}; // shared styles\n\nvar themes = {}; // shared themes\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, opts) {\n\tstyles.Fills = [];\n\tvar fill = {};\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<fills': case '<fills>': case '</fills>': break;\n\n\t\t\t/* 18.8.20 fill CT_Fill */\n\t\t\tcase '<fill>': break;\n\t\t\tcase '</fill>': styles.Fills.push(fill); fill = {}; break;\n\n\t\t\t/* 18.8.32 patternFill CT_PatternFill */\n\t\t\tcase '<patternFill':\n\t\t\t\tif(y.patternType) fill.patternType = y.patternType;\n\t\t\t\tbreak;\n\t\t\tcase '<patternFill/>': case '</patternFill>': break;\n\n\t\t\t/* 18.8.3 bgColor CT_Color */\n\t\t\tcase '<bgColor':\n\t\t\t\tif(!fill.bgColor) fill.bgColor = {};\n\t\t\t\tif(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);\n\t\t\t\tif(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);\n\t\t\t\tif(y.tint) fill.bgColor.tint = parseFloat(y.tint);\n\t\t\t\t/* Excel uses ARGB strings */\n\t\t\t\tif(y.rgb) fill.bgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n\t\t\t\tbreak;\n\t\t\tcase '<bgColor/>': case '</bgColor>': break;\n\n\t\t\t/* 18.8.19 fgColor CT_Color */\n\t\t\tcase '<fgColor':\n\t\t\t\tif(!fill.fgColor) fill.fgColor = {};\n\t\t\t\tif(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);\n\t\t\t\tif(y.tint) fill.fgColor.tint = parseFloat(y.tint);\n\t\t\t\t/* Excel uses ARGB strings */\n\t\t\t\tif(y.rgb) fill.fgColor.rgb = y.rgb.substring(y.rgb.length - 6);\n\t\t\t\tbreak;\n\t\t\tcase '<fgColor/>': case '</fgColor>': break;\n\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills';\n\t\t}\n\t});\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, opts) {\n\tstyles.NumberFmt = [];\n\tvar k = keys(SSF._table);\n\tfor(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];\n\tvar m = t[0].match(tagregex);\n\tfor(i=0; i < m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(y[0]) {\n\t\t\tcase '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;\n\t\t\tcase '<numFmt': {\n\t\t\t\tvar f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);\n\t\t\t\tstyles.NumberFmt[j] = f; if(j>0) SSF.load(f,j);\n\t\t\t} break;\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts';\n\t\t}\n\t}\n}\n\nfunction write_numFmts(NF, opts) {\n\tvar o = [\"<numFmts>\"];\n\t[[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) {\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n\t});\n\tif(o.length === 1) return \"\";\n\to[o.length] = (\"</numFmts>\");\n\to[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nfunction parse_cellXfs(t, opts) {\n\tstyles.CellXf = [];\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;\n\n\t\t\t/* 18.8.45 xf CT_Xf */\n\t\t\tcase '<xf': delete y[0];\n\t\t\t\tif(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);\n\t\t\t\tif(y.fillId) y.fillId = parseInt(y.fillId, 10);\n\t\t\t\tstyles.CellXf.push(y); break;\n\t\t\tcase '</xf>': break;\n\n\t\t\t/* 18.8.1 alignment CT_CellAlignment */\n\t\t\tcase '<alignment': case '<alignment/>': break;\n\n\t\t\t/* 18.8.33 protection CT_CellProtection */\n\t\t\tcase '<protection': case '</protection>': case '<protection/>': break;\n\n\t\t\tcase '<extLst': case '</extLst>': break;\n\t\t\tcase '<ext': break;\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs';\n\t\t}\n\t});\n}\n\nfunction write_cellXfs(cellXfs) {\n\tvar o = [];\n\to[o.length] = (writextag('cellXfs',null));\n\tcellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); });\n\to[o.length] = (\"</cellXfs>\");\n\tif(o.length === 2) return \"\";\n\to[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= (function make_pstyx() {\nvar numFmtRegex = /<numFmts([^>]*)>.*<\\/numFmts>/;\nvar cellXfRegex = /<cellXfs([^>]*)>.*<\\/cellXfs>/;\nvar fillsRegex = /<fills([^>]*)>.*<\\/fills>/;\n\nreturn function parse_sty_xml(data, opts) {\n\t/* 18.8.39 styleSheet CT_Stylesheet */\n\tvar t;\n\n\t/* numFmts CT_NumFmts ? */\n\tif((t=data.match(numFmtRegex))) parse_numFmts(t, opts);\n\n\t/* fonts CT_Fonts ? */\n\t/*if((t=data.match(/<fonts([^>]*)>.*<\\/fonts>/))) parse_fonts(t, opts);*/\n\n\t/* fills CT_Fills */\n\tif((t=data.match(fillsRegex))) parse_fills(t, opts);\n\n\t/* borders CT_Borders ? */\n\t/* cellStyleXfs CT_CellStyleXfs ? */\n\n\t/* cellXfs CT_CellXfs ? */\n\tif((t=data.match(cellXfRegex))) parse_cellXfs(t, opts);\n\n\t/* dxfs CT_Dxfs ? */\n\t/* tableStyles CT_TableStyles ? */\n\t/* colors CT_Colors ? */\n\t/* extLst CT_ExtensionList ? */\n\n\treturn styles;\n};\n})();\n\nvar STYLES_XML_ROOT = writextag('styleSheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:vt': XMLNS.vt\n});\n\nRELS.STY = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\n\nfunction write_sty_xml(wb, opts) {\n\tvar o = [XML_HEADER, STYLES_XML_ROOT], w;\n\tif((w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n\to[o.length] = ('<fonts count=\"1\"><font><sz val=\"12\"/><color theme=\"1\"/><name val=\"Calibri\"/><family val=\"2\"/><scheme val=\"minor\"/></font></fonts>');\n\to[o.length] = ('<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>');\n\to[o.length] = ('<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');\n\to[o.length] = ('<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>');\n\tif((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n\to[o.length] = ('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n\to[o.length] = ('<dxfs count=\"0\"/>');\n\to[o.length] = ('<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium9\" defaultPivotStyle=\"PivotStyleMedium4\"/>');\n\n\tif(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.651 BrtFmt */\nfunction parse_BrtFmt(data, length) {\n\tvar ifmt = data.read_shift(2);\n\tvar stFmtCode = parse_XLWideString(data,length-2);\n\treturn [ifmt, stFmtCode];\n}\n\n/* [MS-XLSB] 2.4.653 BrtFont TODO */\nfunction parse_BrtFont(data, length) {\n\tvar out = {flags:{}};\n\tout.dyHeight = data.read_shift(2);\n\tout.grbit = parse_FontFlags(data, 2);\n\tout.bls = data.read_shift(2);\n\tout.sss = data.read_shift(2);\n\tout.uls = data.read_shift(1);\n\tout.bFamily = data.read_shift(1);\n\tout.bCharSet = data.read_shift(1);\n\tdata.l++;\n\tout.brtColor = parse_BrtColor(data, 8);\n\tout.bFontScheme = data.read_shift(1);\n\tout.name = parse_XLWideString(data, length - 21);\n\n\tout.flags.Bold = out.bls === 0x02BC;\n\tout.flags.Italic = out.grbit.fItalic;\n\tout.flags.Strikeout = out.grbit.fStrikeout;\n\tout.flags.Outline = out.grbit.fOutline;\n\tout.flags.Shadow = out.grbit.fShadow;\n\tout.flags.Condense = out.grbit.fCondense;\n\tout.flags.Extend = out.grbit.fExtend;\n\tout.flags.Sub = out.sss & 0x2;\n\tout.flags.Sup = out.sss & 0x1;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.816 BrtXF */\nfunction parse_BrtXF(data, length) {\n\tvar ixfeParent = data.read_shift(2);\n\tvar ifmt = data.read_shift(2);\n\tparsenoop(data, length-4);\n\treturn {ixfe:ixfeParent, ifmt:ifmt };\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, opts) {\n\tstyles.NumberFmt = [];\n\tfor(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];\n\n\tstyles.CellXf = [];\n\tvar state = \"\"; /* TODO: this should be a stack */\n\tvar pass = false;\n\trecordhopper(data, function hopper_sty(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtFmt':\n\t\t\t\tstyles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 'BrtFont': break; /* TODO */\n\t\t\tcase 'BrtKnownFonts': break; /* TODO */\n\t\t\tcase 'BrtFill': break; /* TODO */\n\t\t\tcase 'BrtBorder': break; /* TODO */\n\t\t\tcase 'BrtXF':\n\t\t\t\tif(state === \"CELLXFS\") {\n\t\t\t\t\tstyles.CellXf.push(val);\n\t\t\t\t}\n\t\t\t\tbreak; /* TODO */\n\t\t\tcase 'BrtStyle': break; /* TODO */\n\t\t\tcase 'BrtDXF': break; /* TODO */\n\t\t\tcase 'BrtMRUColor': break; /* TODO */\n\t\t\tcase 'BrtIndexedColor': break; /* TODO */\n\t\t\tcase 'BrtBeginStyleSheet': break;\n\t\t\tcase 'BrtEndStyleSheet': break;\n\t\t\tcase 'BrtBeginTableStyle': break;\n\t\t\tcase 'BrtTableStyleElement': break;\n\t\t\tcase 'BrtEndTableStyle': break;\n\t\t\tcase 'BrtBeginFmts': state = \"FMTS\"; break;\n\t\t\tcase 'BrtEndFmts': state = \"\"; break;\n\t\t\tcase 'BrtBeginFonts': state = \"FONTS\"; break;\n\t\t\tcase 'BrtEndFonts': state = \"\"; break;\n\t\t\tcase 'BrtACBegin': state = \"ACFONTS\"; break;\n\t\t\tcase 'BrtACEnd': state = \"\"; break;\n\t\t\tcase 'BrtBeginFills': state = \"FILLS\"; break;\n\t\t\tcase 'BrtEndFills': state = \"\"; break;\n\t\t\tcase 'BrtBeginBorders': state = \"BORDERS\"; break;\n\t\t\tcase 'BrtEndBorders': state = \"\"; break;\n\t\t\tcase 'BrtBeginCellStyleXFs': state = \"CELLSTYLEXFS\"; break;\n\t\t\tcase 'BrtEndCellStyleXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginCellXFs': state = \"CELLXFS\"; break;\n\t\t\tcase 'BrtEndCellXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginStyles': state = \"STYLES\"; break;\n\t\t\tcase 'BrtEndStyles': state = \"\"; break;\n\t\t\tcase 'BrtBeginDXFs': state = \"DXFS\"; break;\n\t\t\tcase 'BrtEndDXFs': state = \"\"; break;\n\t\t\tcase 'BrtBeginTableStyles': state = \"TABLESTYLES\"; break;\n\t\t\tcase 'BrtEndTableStyles': state = \"\"; break;\n\t\t\tcase 'BrtBeginColorPalette': state = \"COLORPALETTE\"; break;\n\t\t\tcase 'BrtEndColorPalette': state = \"\"; break;\n\t\t\tcase 'BrtBeginIndexedColors': state = \"INDEXEDCOLORS\"; break;\n\t\t\tcase 'BrtEndIndexedColors': state = \"\"; break;\n\t\t\tcase 'BrtBeginMRUColors': state = \"MRUCOLORS\"; break;\n\t\t\tcase 'BrtEndMRUColors': state = \"\"; break;\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtBeginStyleSheetExt14': break;\n\t\t\tcase 'BrtBeginSlicerStyles': break;\n\t\t\tcase 'BrtEndSlicerStyles': break;\n\t\t\tcase 'BrtBeginTimelineStylesheetExt15': break;\n\t\t\tcase 'BrtEndTimelineStylesheetExt15': break;\n\t\t\tcase 'BrtBeginTimelineStyles': break;\n\t\t\tcase 'BrtEndTimelineStyles': break;\n\t\t\tcase 'BrtEndStyleSheetExt14': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn styles;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(data, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginStyleSheet\");\n\t/* [FMTS] */\n\t/* [FONTS] */\n\t/* [FILLS] */\n\t/* [BORDERS] */\n\t/* CELLSTYLEXFS */\n\t/* CELLXFS*/\n\t/* STYLES */\n\t/* DXFS */\n\t/* TABLESTYLES */\n\t/* [COLORPALETTE] */\n\t/* FRTSTYLESHEET*/\n\twrite_record(ba, \"BrtEndStyleSheet\");\n\treturn ba.end();\n}\nRELS.THEME = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";\n\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, opts) {\n\tthemes.themeElements.clrScheme = [];\n\tvar color = {};\n\tt[0].match(tagregex).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<a:clrScheme': case '</a:clrScheme>': break;\n\n\t\t\t/* 20.1.2.3.32 srgbClr CT_SRgbColor */\n\t\t\tcase '<a:srgbClr': color.rgb = y.val; break;\n\n\t\t\t/* 20.1.2.3.33 sysClr CT_SystemColor */\n\t\t\tcase '<a:sysClr': color.rgb = y.lastClr; break;\n\n\t\t\t/* 20.1.4.1.9 dk1 (Dark 1) */\n\t\t\tcase '<a:dk1>':\n\t\t\tcase '</a:dk1>':\n\t\t\t/* 20.1.4.1.10 dk2 (Dark 2) */\n\t\t\tcase '<a:dk2>':\n\t\t\tcase '</a:dk2>':\n\t\t\t/* 20.1.4.1.22 lt1 (Light 1) */\n\t\t\tcase '<a:lt1>':\n\t\t\tcase '</a:lt1>':\n\t\t\t/* 20.1.4.1.23 lt2 (Light 2) */\n\t\t\tcase '<a:lt2>':\n\t\t\tcase '</a:lt2>':\n\t\t\t/* 20.1.4.1.1 accent1 (Accent 1) */\n\t\t\tcase '<a:accent1>':\n\t\t\tcase '</a:accent1>':\n\t\t\t/* 20.1.4.1.2 accent2 (Accent 2) */\n\t\t\tcase '<a:accent2>':\n\t\t\tcase '</a:accent2>':\n\t\t\t/* 20.1.4.1.3 accent3 (Accent 3) */\n\t\t\tcase '<a:accent3>':\n\t\t\tcase '</a:accent3>':\n\t\t\t/* 20.1.4.1.4 accent4 (Accent 4) */\n\t\t\tcase '<a:accent4>':\n\t\t\tcase '</a:accent4>':\n\t\t\t/* 20.1.4.1.5 accent5 (Accent 5) */\n\t\t\tcase '<a:accent5>':\n\t\t\tcase '</a:accent5>':\n\t\t\t/* 20.1.4.1.6 accent6 (Accent 6) */\n\t\t\tcase '<a:accent6>':\n\t\t\tcase '</a:accent6>':\n\t\t\t/* 20.1.4.1.19 hlink (Hyperlink) */\n\t\t\tcase '<a:hlink>':\n\t\t\tcase '</a:hlink>':\n\t\t\t/* 20.1.4.1.15 folHlink (Followed Hyperlink) */\n\t\t\tcase '<a:folHlink>':\n\t\t\tcase '</a:folHlink>':\n\t\t\t\tif (y[0][1] === '/') {\n\t\t\t\t\tthemes.themeElements.clrScheme.push(color);\n\t\t\t\t\tcolor = {};\n\t\t\t\t} else {\n\t\t\t\t\tcolor.name = y[0].substring(3, y[0].length - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in clrScheme';\n\t\t}\n\t});\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme(t, opts) { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme(t, opts) { }\n\nvar clrsregex = /<a:clrScheme([^>]*)>[^\\u2603]*<\\/a:clrScheme>/;\nvar fntsregex = /<a:fontScheme([^>]*)>[^\\u2603]*<\\/a:fontScheme>/;\nvar fmtsregex = /<a:fmtScheme([^>]*)>[^\\u2603]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, opts) {\n\tthemes.themeElements = {};\n\n\tvar t;\n\n\t[\n\t\t/* clrScheme CT_ColorScheme */\n\t\t['clrScheme', clrsregex, parse_clrScheme],\n\t\t/* fontScheme CT_FontScheme */\n\t\t['fontScheme', fntsregex, parse_fontScheme],\n\t\t/* fmtScheme CT_StyleMatrix */\n\t\t['fmtScheme', fmtsregex, parse_fmtScheme]\n\t].forEach(function(m) {\n\t\tif(!(t=data.match(m[1]))) throw m[0] + ' not found in themeElements';\n\t\tm[2](t, opts);\n\t});\n}\n\nvar themeltregex = /<a:themeElements([^>]*)>[^\\u2603]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data, opts) {\n\t/* 20.1.6.9 theme CT_OfficeStyleSheet */\n\tif(!data || data.length === 0) return themes;\n\n\tvar t;\n\n\t/* themeElements CT_BaseStyles */\n\tif(!(t=data.match(themeltregex))) throw 'themeElements not found in theme';\n\tparse_themeElements(t[0], opts);\n\n\treturn themes;\n}\n\nfunction write_theme() { return '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2><a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2><a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1><a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2><a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3><a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4><a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5><a:accent6><a:srgbClr val=\"F79646\"/></a:accent6><a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink><a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Cambria\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"MS Pゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"宋体\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Tahoma\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"35000\"><a:schemeClr val=\"phClr\"><a:tint val=\"37000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"15000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"100000\"/><a:shade val=\"100000\"/><a:satMod val=\"130000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:shade val=\"100000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"95000\"/><a:satMod val=\"105000\"/></a:schemeClr></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"38000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst=\"orthographicFront\"><a:rot lat=\"0\" lon=\"0\" rev=\"0\"/></a:camera><a:lightRig rig=\"threePt\" dir=\"t\"><a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w=\"63500\" h=\"25400\"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"40000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"40000\"><a:schemeClr val=\"phClr\"><a:tint val=\"45000\"/><a:shade val=\"99000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"20000\"/><a:satMod val=\"255000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/></a:path></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"80000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"30000\"/><a:satMod val=\"200000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"3\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"lt1\"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx=\"2\"><a:schemeClr val=\"accent1\"/></a:lnRef><a:fillRef idx=\"0\"><a:schemeClr val=\"accent1\"/></a:fillRef><a:effectRef idx=\"1\"><a:schemeClr val=\"accent1\"/></a:effectRef><a:fontRef idx=\"minor\"><a:schemeClr val=\"tx1\"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>'; }\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length) {\n\tvar dwThemeVersion = blob.read_shift(4);\n\tif(dwThemeVersion === 124226) return;\n\tblob.l += length-4;\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob, length) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob, length) {\n\tvar o = {};\n\to.xclrType = blob.read_shift(2);\n\to.nTintShade = blob.read_shift(2);\n\tswitch(o.xclrType) {\n\t\tcase 0: blob.l += 4; break;\n\t\tcase 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n\t\tcase 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n\t\tcase 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n\t\tcase 4: blob.l += 4; break;\n\t}\n\tblob.l += 8;\n\treturn o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.108 */\nfunction parse_ExtProp(blob, length) {\n\tvar extType = blob.read_shift(2);\n\tvar cb = blob.read_shift(2);\n\tvar o = [extType];\n\tswitch(extType) {\n\t\tcase 0x04: case 0x05: case 0x07: case 0x08:\n\t\tcase 0x09: case 0x0A: case 0x0B: case 0x0D:\n\t\t\to[1] = parse_FullColorExt(blob, cb); break;\n\t\tcase 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n\t\tcase 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 5 ? 1 : 2); break;\n\t\tdefault: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n\t}\n\treturn o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n\tvar end = blob.l + length;\n\tblob.l += 2;\n\tvar ixfe = blob.read_shift(2);\n\tblob.l += 2;\n\tvar cexts = blob.read_shift(2);\n\tvar ext = [];\n\twhile(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n\treturn {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n\txfext.forEach(function(xfe) {\n\t\tswitch(xfe[0]) { /* 2.5.108 extPropData */\n\t\t\tcase 0x04: break; /* foreground color */\n\t\t\tcase 0x05: break; /* background color */\n\t\t\tcase 0x07: case 0x08: case 0x09: case 0x0a: break;\n\t\t\tcase 0x0d: break; /* text color */\n\t\t\tcase 0x0e: break; /* font scheme */\n\t\t\tdefault: throw \"bafuq\" + xfe[0].toString(16);\n\t\t}\n\t});\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data, opts) {\n\tvar d = [];\n\tvar l = 0, i = 1;\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '<?xml': break;\n\t\t\t/* 18.6.2 calcChain CT_CalcChain 1 */\n\t\t\tcase '<calcChain': case '<calcChain>': case '</calcChain>': break;\n\t\t\t/* 18.6.1 c CT_CalcCell 1 */\n\t\t\tcase '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;\n\t\t}\n\t});\n\treturn d;\n}\n\nfunction write_cc_xml(data, opts) { }\n/* [MS-XLSB] 2.6.4.1 */\nfunction parse_BrtCalcChainItem$(data, length) {\n\tvar out = {};\n\tout.i = data.read_shift(4);\n\tvar cell = {};\n\tcell.r = data.read_shift(4);\n\tcell.c = data.read_shift(4);\n\tout.r = encode_cell(cell);\n\tvar flags = data.read_shift(1);\n\tif(flags & 0x2) out.l = '1';\n\tif(flags & 0x8) out.a = '1';\n\treturn out;\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_bin(data, opts) {\n\tvar out = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_cc(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtCalcChainItem$': out.push(val); break;\n\t\t\tcase 'BrtBeginCalcChain$': break;\n\t\t\tcase 'BrtEndCalcChain$': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_cc_bin(data, opts) { }\n\nfunction parse_comments(zip, dirComments, sheets, sheetRels, opts) {\n\tfor(var i = 0; i != dirComments.length; ++i) {\n\t\tvar canonicalpath=dirComments[i];\n\t\tvar comments=parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\\//,''), true), canonicalpath, opts);\n\t\tif(!comments || !comments.length) continue;\n\t\t// find the sheets targeted by these comments\n\t\tvar sheetNames = keys(sheets);\n\t\tfor(var j = 0; j != sheetNames.length; ++j) {\n\t\t\tvar sheetName = sheetNames[j];\n\t\t\tvar rels = sheetRels[sheetName];\n\t\t\tif(rels) {\n\t\t\t\tvar rel = rels[canonicalpath];\n\t\t\t\tif(rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction insertCommentsIntoSheet(sheetName, sheet, comments) {\n\tcomments.forEach(function(comment) {\n\t\tvar cell = sheet[comment.ref];\n\t\tif (!cell) {\n\t\t\tcell = {};\n\t\t\tsheet[comment.ref] = cell;\n\t\t\tvar range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n\t\t\tvar thisCell = decode_cell(comment.ref);\n\t\t\tif(range.s.r > thisCell.r) range.s.r = thisCell.r;\n\t\t\tif(range.e.r < thisCell.r) range.e.r = thisCell.r;\n\t\t\tif(range.s.c > thisCell.c) range.s.c = thisCell.c;\n\t\t\tif(range.e.c < thisCell.c) range.e.c = thisCell.c;\n\t\t\tvar encoded = encode_range(range);\n\t\t\tif (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n\t\t}\n\n\t\tif (!cell.c) cell.c = [];\n\t\tvar o = {a: comment.author, t: comment.t, r: comment.r};\n\t\tif(comment.h) o.h = comment.h;\n\t\tcell.c.push(o);\n\t});\n}\n\n/* 18.7.3 CT_Comment */\nfunction parse_comments_xml(data, opts) {\n\tif(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n\tvar authors = [];\n\tvar commentList = [];\n\tdata.match(/<(?:\\w+:)?authors>([^\\u2603]*)<\\/(?:\\w+:)?authors>/)[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tauthors.push(x.match(/<(?:\\w+:)?author[^>]*>(.*)/)[1]);\n\t});\n\t(data.match(/<(?:\\w+:)?commentList>([^\\u2603]*)<\\/(?:\\w+:)?commentList>/)||[\"\",\"\"])[1].split(/<\\/\\w*:?comment>/).forEach(function(x, index) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar y = parsexmltag(x.match(/<(?:\\w+:)?comment[^>]*>/)[0]);\n\t\tvar comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid };\n\t\tvar cell = decode_cell(y.ref);\n\t\tif(opts.sheetRows && opts.sheetRows <= cell.r) return;\n\t\tvar textMatch = x.match(/<text>([^\\u2603]*)<\\/text>/);\n\t\tif (!textMatch || !textMatch[1]) return; // a comment may contain an empty text tag.\n\t\tvar rt = parse_si(textMatch[1]);\n\t\tcomment.r = rt.r;\n\t\tcomment.t = rt.t;\n\t\tif(opts.cellHTML) comment.h = rt.h;\n\t\tcommentList.push(comment);\n\t});\n\treturn commentList;\n}\n\nfunction write_comments_xml(data, opts) { }\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data, length) {\n\tvar out = {};\n\tout.iauthor = data.read_shift(4);\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tout.rfx = rfx.s;\n\tout.ref = encode_cell(rfx.s);\n\tdata.l += 16; /*var guid = parse_GUID(data); */\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.324 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\n\n/* [MS-XLSB] 2.4.325 BrtCommentText */\nvar parse_BrtCommentText = parse_RichStr;\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts) {\n\tvar out = [];\n\tvar authors = [];\n\tvar c = {};\n\tvar pass = false;\n\trecordhopper(data, function hopper_cmnt(val, R, RT) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtCommentAuthor': authors.push(val); break;\n\t\t\tcase 'BrtBeginComment': c = val; break;\n\t\t\tcase 'BrtCommentText': c.t = val.t; c.h = val.h; c.r = val.r; break;\n\t\t\tcase 'BrtEndComment':\n\t\t\t\tc.author = authors[c.iauthor];\n\t\t\t\tdelete c.iauthor;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= c.rfx.r) break;\n\t\t\t\tdelete c.rfx; out.push(c); break;\n\t\t\tcase 'BrtBeginComments': break;\n\t\t\tcase 'BrtEndComments': break;\n\t\t\tcase 'BrtBeginCommentAuthors': break;\n\t\t\tcase 'BrtEndCommentAuthors': break;\n\t\t\tcase 'BrtBeginCommentList': break;\n\t\t\tcase 'BrtEndCommentList': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R.n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_comments_bin(data, opts) { }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = (function(){\n\tvar rcregex = /(^|[^A-Za-z])R(\\[?)(-?\\d+|)\\]?C(\\[?)(-?\\d+|)\\]?/g;\n\tvar rcbase;\n\tfunction rcfunc($$,$1,$2,$3,$4,$5) {\n\t\tvar R = $3.length>0?parseInt($3,10)|0:0, C = $5.length>0?parseInt($5,10)|0:0;\n\t\tif(C<0 && $4.length === 0) C=0;\n\t\tif($4.length > 0) C += rcbase.c;\n\t\tif($2.length > 0) R += rcbase.r;\n\t\treturn $1 + encode_col(C) + encode_row(R);\n\t}\n\treturn function rc_to_a1(fstr, base) {\n\t\trcbase = base;\n\t\treturn fstr.replace(rcregex, rcfunc);\n\t};\n})();\n\n/* --- formula references point to MS-XLS --- */\n/* Small helpers */\nfunction parseread(l) { return function(blob, length) { blob.l+=l; return; }; }\nfunction parseread1(blob, length) { blob.l+=1; return; }\n\n/* Rgce Helpers */\n\n/* 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n\tvar c = blob.read_shift(2);\n\treturn [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* 2.5.198.105 */\nfunction parse_RgceArea(blob, length) {\n\tvar r=blob.read_shift(2), R=blob.read_shift(2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.105 TODO */\nfunction parse_RgceAreaRel(blob, length) {\n\tvar r=blob.read_shift(2), R=blob.read_shift(2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* 2.5.198.109 */\nfunction parse_RgceLoc(blob, length) {\n\tvar r = blob.read_shift(2);\n\tvar c = parse_ColRelU(blob, 2);\n\treturn {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\n\n/* 2.5.198.111 */\nfunction parse_RgceLocRel(blob, length) {\n\tvar r = blob.read_shift(2);\n\tvar cl = blob.read_shift(2);\n\tvar cRel = (cl & 0x8000) >> 15, rRel = (cl & 0x4000) >> 14;\n\tcl &= 0x3FFF;\n\tif(cRel !== 0) while(cl >= 0x100) cl -= 0x100;\n\treturn {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\n\n/* Ptg Tokens */\n\n/* 2.5.198.27 */\nfunction parse_PtgArea(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceArea(blob, 8);\n\treturn [type, area];\n}\n\n/* 2.5.198.28 */\nfunction parse_PtgArea3d(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar area = parse_RgceArea(blob, 8);\n\treturn [type, ixti, area];\n}\n\n/* 2.5.198.29 */\nfunction parse_PtgAreaErr(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += 8;\n\treturn [type];\n}\n/* 2.5.198.30 */\nfunction parse_PtgAreaErr3d(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tblob.l += 8;\n\treturn [type, ixti];\n}\n\n/* 2.5.198.31 */\nfunction parse_PtgAreaN(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceAreaRel(blob, 8);\n\treturn [type, area];\n}\n\n/* 2.5.198.32 -- ignore this and look in PtgExtraArray for shape + values */\nfunction parse_PtgArray(blob, length) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += 7;\n\treturn [type];\n}\n\n/* 2.5.198.33 */\nfunction parse_PtgAttrBaxcel(blob, length) {\n\tvar bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n\tvar bitBaxcel = 1;\n\tblob.l += 4;\n\treturn [bitSemi, bitBaxcel];\n}\n\n/* 2.5.198.34 */\nfunction parse_PtgAttrChoose(blob, length) {\n\tblob.l +=2;\n\tvar offset = blob.read_shift(2);\n\tvar o = [];\n\t/* offset is 1 less than the number of elements */\n\tfor(var i = 0; i <= offset; ++i) o.push(blob.read_shift(2));\n\treturn o;\n}\n\n/* 2.5.198.35 */\nfunction parse_PtgAttrGoto(blob, length) {\n\tvar bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitGoto, blob.read_shift(2)];\n}\n\n/* 2.5.198.36 */\nfunction parse_PtgAttrIf(blob, length) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(2)];\n}\n\n/* 2.5.198.37 */\nfunction parse_PtgAttrSemi(blob, length) {\n\tvar bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 4;\n\treturn [bitSemi];\n}\n\n/* 2.5.198.40 (used by PtgAttrSpace and PtgAttrSpaceSemi) */\nfunction parse_PtgAttrSpaceType(blob, length) {\n\tvar type = blob.read_shift(1), cch = blob.read_shift(1);\n\treturn [type, cch];\n}\n\n/* 2.5.198.38 */\nfunction parse_PtgAttrSpace(blob, length) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.39 */\nfunction parse_PtgAttrSpaceSemi(blob, length) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* 2.5.198.84 TODO */\nfunction parse_PtgRef(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLoc(blob,4);\n\treturn [type, loc];\n}\n\n/* 2.5.198.88 TODO */\nfunction parse_PtgRefN(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLocRel(blob,4);\n\treturn [type, loc];\n}\n\n/* 2.5.198.85 TODO */\nfunction parse_PtgRef3d(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar loc = parse_RgceLoc(blob,4);\n\treturn [type, ixti, loc];\n}\n\n\n/* 2.5.198.62 TODO */\nfunction parse_PtgFunc(blob, length) {\n\tvar ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar iftab = blob.read_shift(2);\n\treturn [FtabArgc[iftab], Ftab[iftab]];\n}\n/* 2.5.198.63 TODO */\nfunction parse_PtgFuncVar(blob, length) {\n\tblob.l++;\n\tvar cparams = blob.read_shift(1), tab = parsetab(blob);\n\treturn [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob, length) {\n\treturn [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* 2.5.198.41 */\nvar parse_PtgAttrSum = parseread(4);\n/* 2.5.198.43 */\nvar parse_PtgConcat = parseread1;\n\n/* 2.5.198.58 */\nfunction parse_PtgExp(blob, length) {\n\tblob.l++;\n\tvar row = blob.read_shift(2);\n\tvar col = blob.read_shift(2);\n\treturn [row, col];\n}\n\n/* 2.5.198.57 */\nfunction parse_PtgErr(blob, length) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* 2.5.198.66 TODO */\nfunction parse_PtgInt(blob, length) { blob.l++; return blob.read_shift(2); }\n\n/* 2.5.198.42 */\nfunction parse_PtgBool(blob, length) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* 2.5.198.79 */\nfunction parse_PtgNum(blob, length) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* 2.5.198.89 */\nfunction parse_PtgStr(blob, length) { blob.l++; return parse_ShortXLUnicodeString(blob); }\n\n/* 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\nfunction parse_SerAr(blob) {\n\tvar val = [];\n\tswitch((val[0] = blob.read_shift(1))) {\n\t\t/* 2.5.192.113 */\n\t\tcase 0x04: /* SerBool -- boolean */\n\t\t\tval[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n\t\t\tblob.l += 7; break;\n\t\t/* 2.5.192.114 */\n\t\tcase 0x10: /* SerErr -- error */\n\t\t\tval[1] = BErr[blob[blob.l]];\n\t\t\tblob.l += 8; break;\n\t\t/* 2.5.192.115 */\n\t\tcase 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n\t\t\tblob.l += 8; break;\n\t\t/* 2.5.192.116 */\n\t\tcase 0x01: /* SerNum -- Xnum */\n\t\t\tval[1] = parse_Xnum(blob, 8); break;\n\t\t/* 2.5.192.117 */\n\t\tcase 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n\t\t\tval[1] = parse_XLUnicodeString(blob); break;\n\t\t// default: throw \"Bad SerAr: \" + val[0]; /* Unreachable */\n\t}\n\treturn val;\n}\n\n/* 2.5.198.61 */\nfunction parse_PtgExtraMem(blob, cce) {\n\tvar count = blob.read_shift(2);\n\tvar out = [];\n\tfor(var i = 0; i != count; ++i) out.push(parse_Ref8U(blob, 8));\n\treturn out;\n}\n\n/* 2.5.198.59 */\nfunction parse_PtgExtraArray(blob) {\n\tvar cols = 1 + blob.read_shift(1); //DColByteU\n\tvar rows = 1 + blob.read_shift(2); //DRw\n\tfor(var i = 0, o=[]; i != rows && (o[i] = []); ++i)\n\t\tfor(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob);\n\treturn o;\n}\n\n/* 2.5.198.76 */\nfunction parse_PtgName(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, 0, nameindex];\n}\n\n/* 2.5.198.77 */\nfunction parse_PtgNameX(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, ixti, nameindex];\n}\n\n/* 2.5.198.70 */\nfunction parse_PtgMemArea(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\n\n/* 2.5.198.72 */\nfunction parse_PtgMemFunc(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\n\n\n/* 2.5.198.86 */\nfunction parse_PtgRefErr(blob, length) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\treturn [type];\n}\n\n/* 2.5.198.26 */\nvar parse_PtgAdd = parseread1;\n/* 2.5.198.45 */\nvar parse_PtgDiv = parseread1;\n/* 2.5.198.56 */\nvar parse_PtgEq = parseread1;\n/* 2.5.198.64 */\nvar parse_PtgGe = parseread1;\n/* 2.5.198.65 */\nvar parse_PtgGt = parseread1;\n/* 2.5.198.67 */\nvar parse_PtgIsect = parseread1;\n/* 2.5.198.68 */\nvar parse_PtgLe = parseread1;\n/* 2.5.198.69 */\nvar parse_PtgLt = parseread1;\n/* 2.5.198.74 */\nvar parse_PtgMissArg = parseread1;\n/* 2.5.198.75 */\nvar parse_PtgMul = parseread1;\n/* 2.5.198.78 */\nvar parse_PtgNe = parseread1;\n/* 2.5.198.80 */\nvar parse_PtgParen = parseread1;\n/* 2.5.198.81 */\nvar parse_PtgPercent = parseread1;\n/* 2.5.198.82 */\nvar parse_PtgPower = parseread1;\n/* 2.5.198.83 */\nvar parse_PtgRange = parseread1;\n/* 2.5.198.90 */\nvar parse_PtgSub = parseread1;\n/* 2.5.198.93 */\nvar parse_PtgUminus = parseread1;\n/* 2.5.198.94 */\nvar parse_PtgUnion = parseread1;\n/* 2.5.198.95 */\nvar parse_PtgUplus = parseread1;\n\n/* 2.5.198.71 */\nvar parse_PtgMemErr = parsenoop;\n/* 2.5.198.73 */\nvar parse_PtgMemNoMem = parsenoop;\n/* 2.5.198.87 */\nvar parse_PtgRefErr3d = parsenoop;\n/* 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\n/* 2.5.198.25 */\nvar PtgTypes = {\n\t0x01: { n:'PtgExp', f:parse_PtgExp },\n\t0x02: { n:'PtgTbl', f:parse_PtgTbl },\n\t0x03: { n:'PtgAdd', f:parse_PtgAdd },\n\t0x04: { n:'PtgSub', f:parse_PtgSub },\n\t0x05: { n:'PtgMul', f:parse_PtgMul },\n\t0x06: { n:'PtgDiv', f:parse_PtgDiv },\n\t0x07: { n:'PtgPower', f:parse_PtgPower },\n\t0x08: { n:'PtgConcat', f:parse_PtgConcat },\n\t0x09: { n:'PtgLt', f:parse_PtgLt },\n\t0x0A: { n:'PtgLe', f:parse_PtgLe },\n\t0x0B: { n:'PtgEq', f:parse_PtgEq },\n\t0x0C: { n:'PtgGe', f:parse_PtgGe },\n\t0x0D: { n:'PtgGt', f:parse_PtgGt },\n\t0x0E: { n:'PtgNe', f:parse_PtgNe },\n\t0x0F: { n:'PtgIsect', f:parse_PtgIsect },\n\t0x10: { n:'PtgUnion', f:parse_PtgUnion },\n\t0x11: { n:'PtgRange', f:parse_PtgRange },\n\t0x12: { n:'PtgUplus', f:parse_PtgUplus },\n\t0x13: { n:'PtgUminus', f:parse_PtgUminus },\n\t0x14: { n:'PtgPercent', f:parse_PtgPercent },\n\t0x15: { n:'PtgParen', f:parse_PtgParen },\n\t0x16: { n:'PtgMissArg', f:parse_PtgMissArg },\n\t0x17: { n:'PtgStr', f:parse_PtgStr },\n\t0x1C: { n:'PtgErr', f:parse_PtgErr },\n\t0x1D: { n:'PtgBool', f:parse_PtgBool },\n\t0x1E: { n:'PtgInt', f:parse_PtgInt },\n\t0x1F: { n:'PtgNum', f:parse_PtgNum },\n\t0x20: { n:'PtgArray', f:parse_PtgArray },\n\t0x21: { n:'PtgFunc', f:parse_PtgFunc },\n\t0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n\t0x23: { n:'PtgName', f:parse_PtgName },\n\t0x24: { n:'PtgRef', f:parse_PtgRef },\n\t0x25: { n:'PtgArea', f:parse_PtgArea },\n\t0x26: { n:'PtgMemArea', f:parse_PtgMemArea },\n\t0x27: { n:'PtgMemErr', f:parse_PtgMemErr },\n\t0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n\t0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n\t0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },\n\t0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n\t0x2C: { n:'PtgRefN', f:parse_PtgRefN },\n\t0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },\n\t0x39: { n:'PtgNameX', f:parse_PtgNameX },\n\t0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },\n\t0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },\n\t0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n\t0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n\t0xFF: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n\t0x40: 0x20, 0x60: 0x20,\n\t0x41: 0x21, 0x61: 0x21,\n\t0x42: 0x22, 0x62: 0x22,\n\t0x43: 0x23, 0x63: 0x23,\n\t0x44: 0x24, 0x64: 0x24,\n\t0x45: 0x25, 0x65: 0x25,\n\t0x46: 0x26, 0x66: 0x26,\n\t0x47: 0x27, 0x67: 0x27,\n\t0x48: 0x28, 0x68: 0x28,\n\t0x49: 0x29, 0x69: 0x29,\n\t0x4A: 0x2A, 0x6A: 0x2A,\n\t0x4B: 0x2B, 0x6B: 0x2B,\n\t0x4C: 0x2C, 0x6C: 0x2C,\n\t0x4D: 0x2D, 0x6D: 0x2D,\n\t0x59: 0x39, 0x79: 0x39,\n\t0x5A: 0x3A, 0x7A: 0x3A,\n\t0x5B: 0x3B, 0x7B: 0x3B,\n\t0x5C: 0x3C, 0x7C: 0x3C,\n\t0x5D: 0x3D, 0x7D: 0x3D\n};\n(function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();\n\nvar Ptg18 = {};\nvar Ptg19 = {\n\t0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n\t0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n\t0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n\t0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n\t0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n\t0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n\t0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n\t0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n\t0xFF: {}\n};\n\n/* 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar val = parse_FormulaValue(blob,8);\n\tvar flags = blob.read_shift(1);\n\tblob.read_shift(1);\n\tvar chn = blob.read_shift(4);\n\tvar cbf = \"\";\n\tif(opts.biff === 5) blob.l += length-20;\n\telse cbf = parse_XLSCellParsedFormula(blob, length-20, opts);\n\treturn {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\n\n/* 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob) {\n\tvar b;\n\tif(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n\tswitch(blob[blob.l]) {\n\t\tcase 0x00: blob.l += 8; return [\"String\", 's'];\n\t\tcase 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n\t\tcase 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n\t\tcase 0x03: blob.l += 8; return [\"\",'s'];\n\t}\n}\n\n/* 2.5.198.103 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n\tif(opts.biff < 8) return parsenoop(blob, length);\n\tvar target = blob.l + length;\n\tvar o = [];\n\tfor(var i = 0; i !== rgce.length; ++i) {\n\t\tswitch(rgce[i][0]) {\n\t\t\tcase 'PtgArray': /* PtgArray -> PtgExtraArray */\n\t\t\t\trgce[i][1] = parse_PtgExtraArray(blob);\n\t\t\t\to.push(rgce[i][1]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n\t\t\t\trgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1]);\n\t\t\t\to.push(rgce[i][2]);\n\t\t\t\tbreak;\n\t\t\tdefault: break;\n\t\t}\n\t}\n\tlength = target - blob.l;\n\tif(length !== 0) o.push(parsenoop(blob, length));\n\treturn o;\n}\n\n/* 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n\tvar target = blob.l + length;\n\tvar rgce = parse_Rgce(blob, cce);\n\tvar rgcb;\n\tif(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, length - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts, ref) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce);\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* 2.5.198.104 */\nfunction parse_Rgce(blob, length) {\n\tvar target = blob.l + length;\n\tvar R, id, ptgs = [];\n\twhile(target != blob.l) {\n\t\tlength = target - blob.l;\n\t\tid = blob[blob.l];\n\t\tR = PtgTypes[id];\n\t\t//console.log(\"ptg\", id, R)\n\t\tif(id === 0x18 || id === 0x19) {\n\t\t\tid = blob[blob.l + 1];\n\t\t\tR = (id === 0x18 ? Ptg18 : Ptg19)[id];\n\t\t}\n\t\tif(!R || !R.f) { ptgs.push(parsenoop(blob, length)); }\n\t\telse { ptgs.push([R.n, R.f(blob, length)]); }\n\t}\n\treturn ptgs;\n}\n\nfunction mapper(x) { return x.map(function f2(y) { return y[1];}).join(\",\");}\n\n/* 2.2.2 + Magic TODO */\nfunction stringify_formula(formula, range, cell, supbooks, opts) {\n\tif(opts !== undefined && opts.biff === 5) return \"BIFF5??\";\n\tvar _range = range !== undefined ? range : {s:{c:0, r:0}};\n\tvar stack = [], e1, e2, type, c, ixti, nameidx, r;\n\tif(!formula[0] || !formula[0][0]) return \"\";\n\t//console.log(\"--\",cell,formula[0])\n\tfor(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n\t\tvar f = formula[0][ff];\n\t\t//console.log(\"++\",f, stack)\n\t\tswitch(f[0]) {\n\t\t/* 2.2.2.1 Unary Operator Tokens */\n\t\t\t/* 2.5.198.93 */\n\t\t\tcase 'PtgUminus': stack.push(\"-\" + stack.pop()); break;\n\t\t\t/* 2.5.198.95 */\n\t\t\tcase 'PtgUplus': stack.push(\"+\" + stack.pop()); break;\n\t\t\t/* 2.5.198.81 */\n\t\t\tcase 'PtgPercent': stack.push(stack.pop() + \"%\"); break;\n\n\t\t/* 2.2.2.1 Binary Value Operator Token */\n\t\t\t/* 2.5.198.26 */\n\t\t\tcase 'PtgAdd':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"+\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.90 */\n\t\t\tcase 'PtgSub':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"-\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.75 */\n\t\t\tcase 'PtgMul':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"*\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.45 */\n\t\t\tcase 'PtgDiv':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"/\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.82 */\n\t\t\tcase 'PtgPower':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"^\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.43 */\n\t\t\tcase 'PtgConcat':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"&\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.69 */\n\t\t\tcase 'PtgLt':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.68 */\n\t\t\tcase 'PtgLe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.56 */\n\t\t\tcase 'PtgEq':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.64 */\n\t\t\tcase 'PtgGe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\">=\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.65 */\n\t\t\tcase 'PtgGt':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\">\"+e1);\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.78 */\n\t\t\tcase 'PtgNe':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\"<>\"+e1);\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.1 Binary Reference Operator Token */\n\t\t\t/* 2.5.198.67 */\n\t\t\tcase 'PtgIsect':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\" \"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgUnion':\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\",\"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRange': break;\n\n\t\t/* 2.2.2.3 Control Tokens \"can be ignored\" */\n\t\t\t/* 2.5.198.34 */\n\t\t\tcase 'PtgAttrChoose': break;\n\t\t\t/* 2.5.198.35 */\n\t\t\tcase 'PtgAttrGoto': break;\n\t\t\t/* 2.5.198.36 */\n\t\t\tcase 'PtgAttrIf': break;\n\n\n\t\t\t/* 2.5.198.84 */\n\t\t\tcase 'PtgRef':\n\t\t\t\ttype = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), _range);\n\t\t\t\tstack.push(encode_cell(c));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.88 */\n\t\t\tcase 'PtgRefN':\n\t\t\t\ttype = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), cell);\n\t\t\t\tstack.push(encode_cell(c));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRef3d': // TODO: lots of stuff\n\t\t\t\ttype = f[1][0]; ixti = f[1][1]; c = shift_cell_xls(f[1][2], _range);\n\t\t\t\tstack.push(supbooks[1][ixti+1]+\"!\"+encode_cell(c));\n\t\t\t\tbreak;\n\n\t\t/* Function Call */\n\t\t\t/* 2.5.198.62 */\n\t\t\tcase 'PtgFunc':\n\t\t\t/* 2.5.198.63 */\n\t\t\tcase 'PtgFuncVar':\n\t\t\t\t/* f[1] = [argc, func] */\n\t\t\t\tvar argc = f[1][0], func = f[1][1];\n\t\t\t\tif(!argc) argc = 0;\n\t\t\t\tvar args = stack.slice(-argc);\n\t\t\t\tstack.length -= argc;\n\t\t\t\tif(func === 'User') func = args.shift();\n\t\t\t\tstack.push(func + \"(\" + args.join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.42 */\n\t\t\tcase 'PtgBool': stack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n\t\t\t/* 2.5.198.66 */\n\t\t\tcase 'PtgInt': stack.push(f[1]); break;\n\t\t\t/* 2.5.198.79 TODO: precision? */\n\t\t\tcase 'PtgNum': stack.push(String(f[1])); break;\n\t\t\t/* 2.5.198.89 */\n\t\t\tcase 'PtgStr': stack.push('\"' + f[1] + '\"'); break;\n\t\t\t/* 2.5.198.57 */\n\t\t\tcase 'PtgErr': stack.push(f[1]); break;\n\t\t\t/* 2.5.198.27 TODO: fixed points */\n\t\t\tcase 'PtgArea':\n\t\t\t\ttype = f[1][0]; r = shift_range_xls(f[1][1], _range);\n\t\t\t\tstack.push(encode_range(r));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.28 */\n\t\t\tcase 'PtgArea3d': // TODO: lots of stuff\n\t\t\t\ttype = f[1][0]; ixti = f[1][1]; r = f[1][2];\n\t\t\t\tstack.push(supbooks[1][ixti+1]+\"!\"+encode_range(r));\n\t\t\t\tbreak;\n\t\t\t/* 2.5.198.41 */\n\t\t\tcase 'PtgAttrSum':\n\t\t\t\tstack.push(\"SUM(\" + stack.pop() + \")\");\n\t\t\t\tbreak;\n\n\t\t/* Expression Prefixes */\n\t\t\t/* 2.5.198.37 */\n\t\t\tcase 'PtgAttrSemi': break;\n\n\t\t\t/* 2.5.97.60 TODO: do something different for revisions */\n\t\t\tcase 'PtgName':\n\t\t\t\t/* f[1] = type, 0, nameindex */\n\t\t\t\tnameidx = f[1][2];\n\t\t\t\tvar lbl = supbooks[0][nameidx];\n\t\t\t\tvar name = lbl.Name;\n\t\t\t\tif(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];\n\t\t\t\tstack.push(name);\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.97.61 TODO: do something different for revisions */\n\t\t\tcase 'PtgNameX':\n\t\t\t\t/* f[1] = type, ixti, nameindex */\n\t\t\t\tvar bookidx = f[1][1]; nameidx = f[1][2]; var externbook;\n\t\t\t\t/* TODO: Properly handle missing values */\n\t\t\t\tif(supbooks[bookidx+1]) externbook = supbooks[bookidx+1][nameidx];\n\t\t\t\telse if(supbooks[bookidx-1]) externbook = supbooks[bookidx-1][nameidx];\n\t\t\t\tif(!externbook) externbook = {body: \"??NAMEX??\"};\n\t\t\t\tstack.push(externbook.body);\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.4 Display Tokens */\n\t\t\t/* 2.5.198.80 */\n\t\t\tcase 'PtgParen': stack.push('(' + stack.pop() + ')'); break;\n\n\t\t\t/* 2.5.198.86 */\n\t\t\tcase 'PtgRefErr': stack.push('#REF!'); break;\n\n\t\t/* */\n\t\t\t/* 2.5.198.58 TODO */\n\t\t\tcase 'PtgExp':\n\t\t\t\tc = {c:f[1][1],r:f[1][0]};\n\t\t\t\tvar q = {c: cell.c, r:cell.r};\n\t\t\t\tif(supbooks.sharedf[encode_cell(c)]) {\n\t\t\t\t\tvar parsedf = (supbooks.sharedf[encode_cell(c)]);\n\t\t\t\t\tstack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar fnd = false;\n\t\t\t\t\tfor(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n\t\t\t\t\t\t/* TODO: should be something like range_has */\n\t\t\t\t\t\te2 = supbooks.arrayf[e1];\n\t\t\t\t\t\tif(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n\t\t\t\t\t\tif(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n\t\t\t\t\t\tstack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n\t\t\t\t\t}\n\t\t\t\t\tif(!fnd) stack.push(f[1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.32 TODO */\n\t\t\tcase 'PtgArray':\n\t\t\t\tstack.push(\"{\" + f[1].map(mapper).join(\";\") + \"}\");\n\t\t\t\tbreak;\n\n\t\t/* 2.2.2.5 Mem Tokens */\n\t\t\t/* 2.5.198.70 TODO: confirm this is a non-display */\n\t\t\tcase 'PtgMemArea':\n\t\t\t\t//stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.38 TODO */\n\t\t\tcase 'PtgAttrSpace': break;\n\n\t\t\t/* 2.5.198.92 TODO */\n\t\t\tcase 'PtgTbl': break;\n\n\t\t\t/* 2.5.198.71 */\n\t\t\tcase 'PtgMemErr': break;\n\n\t\t\t/* 2.5.198.74 */\n\t\t\tcase 'PtgMissArg':\n\t\t\t\tstack.push(\"\");\n\t\t\t\tbreak;\n\n\t\t\t/* 2.5.198.29 TODO */\n\t\t\tcase 'PtgAreaErr': break;\n\n\t\t\t/* 2.5.198.31 TODO */\n\t\t\tcase 'PtgAreaN': stack.push(\"\"); break;\n\n\t\t\t/* 2.5.198.87 TODO */\n\t\t\tcase 'PtgRefErr3d': break;\n\n\t\t\t/* 2.5.198.72 TODO */\n\t\t\tcase 'PtgMemFunc': break;\n\n\t\t\tdefault: throw 'Unrecognized Formula Token: ' + f;\n\t\t}\n\t\t//console.log(\"::\",f, stack)\n\t}\n\t//console.log(\"--\",stack);\n\treturn stack[0];\n}\n\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */\nfunction parse_XLSBCellParsedFormula(data, length) {\n\tvar cce = data.read_shift(4);\n\treturn parsenoop(data, length-4);\n}\n/* [MS-XLS] 2.5.198.44 */\nvar PtgDataType = {\n\t0x1: \"REFERENCE\", // reference to range\n\t0x2: \"VALUE\", // single value\n\t0x3: \"ARRAY\" // array of values\n};\n\n/* [MS-XLS] 2.5.198.4 */\nvar Cetab = {\n\t0x0000: 'BEEP',\n\t0x0001: 'OPEN',\n\t0x0002: 'OPEN.LINKS',\n\t0x0003: 'CLOSE.ALL',\n\t0x0004: 'SAVE',\n\t0x0005: 'SAVE.AS',\n\t0x0006: 'FILE.DELETE',\n\t0x0007: 'PAGE.SETUP',\n\t0x0008: 'PRINT',\n\t0x0009: 'PRINTER.SETUP',\n\t0x000A: 'QUIT',\n\t0x000B: 'NEW.WINDOW',\n\t0x000C: 'ARRANGE.ALL',\n\t0x000D: 'WINDOW.SIZE',\n\t0x000E: 'WINDOW.MOVE',\n\t0x000F: 'FULL',\n\t0x0010: 'CLOSE',\n\t0x0011: 'RUN',\n\t0x0016: 'SET.PRINT.AREA',\n\t0x0017: 'SET.PRINT.TITLES',\n\t0x0018: 'SET.PAGE.BREAK',\n\t0x0019: 'REMOVE.PAGE.BREAK',\n\t0x001A: 'FONT',\n\t0x001B: 'DISPLAY',\n\t0x001C: 'PROTECT.DOCUMENT',\n\t0x001D: 'PRECISION',\n\t0x001E: 'A1.R1C1',\n\t0x001F: 'CALCULATE.NOW',\n\t0x0020: 'CALCULATION',\n\t0x0022: 'DATA.FIND',\n\t0x0023: 'EXTRACT',\n\t0x0024: 'DATA.DELETE',\n\t0x0025: 'SET.DATABASE',\n\t0x0026: 'SET.CRITERIA',\n\t0x0027: 'SORT',\n\t0x0028: 'DATA.SERIES',\n\t0x0029: 'TABLE',\n\t0x002A: 'FORMAT.NUMBER',\n\t0x002B: 'ALIGNMENT',\n\t0x002C: 'STYLE',\n\t0x002D: 'BORDER',\n\t0x002E: 'CELL.PROTECTION',\n\t0x002F: 'COLUMN.WIDTH',\n\t0x0030: 'UNDO',\n\t0x0031: 'CUT',\n\t0x0032: 'COPY',\n\t0x0033: 'PASTE',\n\t0x0034: 'CLEAR',\n\t0x0035: 'PASTE.SPECIAL',\n\t0x0036: 'EDIT.DELETE',\n\t0x0037: 'INSERT',\n\t0x0038: 'FILL.RIGHT',\n\t0x0039: 'FILL.DOWN',\n\t0x003D: 'DEFINE.NAME',\n\t0x003E: 'CREATE.NAMES',\n\t0x003F: 'FORMULA.GOTO',\n\t0x0040: 'FORMULA.FIND',\n\t0x0041: 'SELECT.LAST.CELL',\n\t0x0042: 'SHOW.ACTIVE.CELL',\n\t0x0043: 'GALLERY.AREA',\n\t0x0044: 'GALLERY.BAR',\n\t0x0045: 'GALLERY.COLUMN',\n\t0x0046: 'GALLERY.LINE',\n\t0x0047: 'GALLERY.PIE',\n\t0x0048: 'GALLERY.SCATTER',\n\t0x0049: 'COMBINATION',\n\t0x004A: 'PREFERRED',\n\t0x004B: 'ADD.OVERLAY',\n\t0x004C: 'GRIDLINES',\n\t0x004D: 'SET.PREFERRED',\n\t0x004E: 'AXES',\n\t0x004F: 'LEGEND',\n\t0x0050: 'ATTACH.TEXT',\n\t0x0051: 'ADD.ARROW',\n\t0x0052: 'SELECT.CHART',\n\t0x0053: 'SELECT.PLOT.AREA',\n\t0x0054: 'PATTERNS',\n\t0x0055: 'MAIN.CHART',\n\t0x0056: 'OVERLAY',\n\t0x0057: 'SCALE',\n\t0x0058: 'FORMAT.LEGEND',\n\t0x0059: 'FORMAT.TEXT',\n\t0x005A: 'EDIT.REPEAT',\n\t0x005B: 'PARSE',\n\t0x005C: 'JUSTIFY',\n\t0x005D: 'HIDE',\n\t0x005E: 'UNHIDE',\n\t0x005F: 'WORKSPACE',\n\t0x0060: 'FORMULA',\n\t0x0061: 'FORMULA.FILL',\n\t0x0062: 'FORMULA.ARRAY',\n\t0x0063: 'DATA.FIND.NEXT',\n\t0x0064: 'DATA.FIND.PREV',\n\t0x0065: 'FORMULA.FIND.NEXT',\n\t0x0066: 'FORMULA.FIND.PREV',\n\t0x0067: 'ACTIVATE',\n\t0x0068: 'ACTIVATE.NEXT',\n\t0x0069: 'ACTIVATE.PREV',\n\t0x006A: 'UNLOCKED.NEXT',\n\t0x006B: 'UNLOCKED.PREV',\n\t0x006C: 'COPY.PICTURE',\n\t0x006D: 'SELECT',\n\t0x006E: 'DELETE.NAME',\n\t0x006F: 'DELETE.FORMAT',\n\t0x0070: 'VLINE',\n\t0x0071: 'HLINE',\n\t0x0072: 'VPAGE',\n\t0x0073: 'HPAGE',\n\t0x0074: 'VSCROLL',\n\t0x0075: 'HSCROLL',\n\t0x0076: 'ALERT',\n\t0x0077: 'NEW',\n\t0x0078: 'CANCEL.COPY',\n\t0x0079: 'SHOW.CLIPBOARD',\n\t0x007A: 'MESSAGE',\n\t0x007C: 'PASTE.LINK',\n\t0x007D: 'APP.ACTIVATE',\n\t0x007E: 'DELETE.ARROW',\n\t0x007F: 'ROW.HEIGHT',\n\t0x0080: 'FORMAT.MOVE',\n\t0x0081: 'FORMAT.SIZE',\n\t0x0082: 'FORMULA.REPLACE',\n\t0x0083: 'SEND.KEYS',\n\t0x0084: 'SELECT.SPECIAL',\n\t0x0085: 'APPLY.NAMES',\n\t0x0086: 'REPLACE.FONT',\n\t0x0087: 'FREEZE.PANES',\n\t0x0088: 'SHOW.INFO',\n\t0x0089: 'SPLIT',\n\t0x008A: 'ON.WINDOW',\n\t0x008B: 'ON.DATA',\n\t0x008C: 'DISABLE.INPUT',\n\t0x008E: 'OUTLINE',\n\t0x008F: 'LIST.NAMES',\n\t0x0090: 'FILE.CLOSE',\n\t0x0091: 'SAVE.WORKBOOK',\n\t0x0092: 'DATA.FORM',\n\t0x0093: 'COPY.CHART',\n\t0x0094: 'ON.TIME',\n\t0x0095: 'WAIT',\n\t0x0096: 'FORMAT.FONT',\n\t0x0097: 'FILL.UP',\n\t0x0098: 'FILL.LEFT',\n\t0x0099: 'DELETE.OVERLAY',\n\t0x009B: 'SHORT.MENUS',\n\t0x009F: 'SET.UPDATE.STATUS',\n\t0x00A1: 'COLOR.PALETTE',\n\t0x00A2: 'DELETE.STYLE',\n\t0x00A3: 'WINDOW.RESTORE',\n\t0x00A4: 'WINDOW.MAXIMIZE',\n\t0x00A6: 'CHANGE.LINK',\n\t0x00A7: 'CALCULATE.DOCUMENT',\n\t0x00A8: 'ON.KEY',\n\t0x00A9: 'APP.RESTORE',\n\t0x00AA: 'APP.MOVE',\n\t0x00AB: 'APP.SIZE',\n\t0x00AC: 'APP.MINIMIZE',\n\t0x00AD: 'APP.MAXIMIZE',\n\t0x00AE: 'BRING.TO.FRONT',\n\t0x00AF: 'SEND.TO.BACK',\n\t0x00B9: 'MAIN.CHART.TYPE',\n\t0x00BA: 'OVERLAY.CHART.TYPE',\n\t0x00BB: 'SELECT.END',\n\t0x00BC: 'OPEN.MAIL',\n\t0x00BD: 'SEND.MAIL',\n\t0x00BE: 'STANDARD.FONT',\n\t0x00BF: 'CONSOLIDATE',\n\t0x00C0: 'SORT.SPECIAL',\n\t0x00C1: 'GALLERY.3D.AREA',\n\t0x00C2: 'GALLERY.3D.COLUMN',\n\t0x00C3: 'GALLERY.3D.LINE',\n\t0x00C4: 'GALLERY.3D.PIE',\n\t0x00C5: 'VIEW.3D',\n\t0x00C6: 'GOAL.SEEK',\n\t0x00C7: 'WORKGROUP',\n\t0x00C8: 'FILL.GROUP',\n\t0x00C9: 'UPDATE.LINK',\n\t0x00CA: 'PROMOTE',\n\t0x00CB: 'DEMOTE',\n\t0x00CC: 'SHOW.DETAIL',\n\t0x00CE: 'UNGROUP',\n\t0x00CF: 'OBJECT.PROPERTIES',\n\t0x00D0: 'SAVE.NEW.OBJECT',\n\t0x00D1: 'SHARE',\n\t0x00D2: 'SHARE.NAME',\n\t0x00D3: 'DUPLICATE',\n\t0x00D4: 'APPLY.STYLE',\n\t0x00D5: 'ASSIGN.TO.OBJECT',\n\t0x00D6: 'OBJECT.PROTECTION',\n\t0x00D7: 'HIDE.OBJECT',\n\t0x00D8: 'SET.EXTRACT',\n\t0x00D9: 'CREATE.PUBLISHER',\n\t0x00DA: 'SUBSCRIBE.TO',\n\t0x00DB: 'ATTRIBUTES',\n\t0x00DC: 'SHOW.TOOLBAR',\n\t0x00DE: 'PRINT.PREVIEW',\n\t0x00DF: 'EDIT.COLOR',\n\t0x00E0: 'SHOW.LEVELS',\n\t0x00E1: 'FORMAT.MAIN',\n\t0x00E2: 'FORMAT.OVERLAY',\n\t0x00E3: 'ON.RECALC',\n\t0x00E4: 'EDIT.SERIES',\n\t0x00E5: 'DEFINE.STYLE',\n\t0x00F0: 'LINE.PRINT',\n\t0x00F3: 'ENTER.DATA',\n\t0x00F9: 'GALLERY.RADAR',\n\t0x00FA: 'MERGE.STYLES',\n\t0x00FB: 'EDITION.OPTIONS',\n\t0x00FC: 'PASTE.PICTURE',\n\t0x00FD: 'PASTE.PICTURE.LINK',\n\t0x00FE: 'SPELLING',\n\t0x0100: 'ZOOM',\n\t0x0103: 'INSERT.OBJECT',\n\t0x0104: 'WINDOW.MINIMIZE',\n\t0x0109: 'SOUND.NOTE',\n\t0x010A: 'SOUND.PLAY',\n\t0x010B: 'FORMAT.SHAPE',\n\t0x010C: 'EXTEND.POLYGON',\n\t0x010D: 'FORMAT.AUTO',\n\t0x0110: 'GALLERY.3D.BAR',\n\t0x0111: 'GALLERY.3D.SURFACE',\n\t0x0112: 'FILL.AUTO',\n\t0x0114: 'CUSTOMIZE.TOOLBAR',\n\t0x0115: 'ADD.TOOL',\n\t0x0116: 'EDIT.OBJECT',\n\t0x0117: 'ON.DOUBLECLICK',\n\t0x0118: 'ON.ENTRY',\n\t0x0119: 'WORKBOOK.ADD',\n\t0x011A: 'WORKBOOK.MOVE',\n\t0x011B: 'WORKBOOK.COPY',\n\t0x011C: 'WORKBOOK.OPTIONS',\n\t0x011D: 'SAVE.WORKSPACE',\n\t0x0120: 'CHART.WIZARD',\n\t0x0121: 'DELETE.TOOL',\n\t0x0122: 'MOVE.TOOL',\n\t0x0123: 'WORKBOOK.SELECT',\n\t0x0124: 'WORKBOOK.ACTIVATE',\n\t0x0125: 'ASSIGN.TO.TOOL',\n\t0x0127: 'COPY.TOOL',\n\t0x0128: 'RESET.TOOL',\n\t0x0129: 'CONSTRAIN.NUMERIC',\n\t0x012A: 'PASTE.TOOL',\n\t0x012E: 'WORKBOOK.NEW',\n\t0x0131: 'SCENARIO.CELLS',\n\t0x0132: 'SCENARIO.DELETE',\n\t0x0133: 'SCENARIO.ADD',\n\t0x0134: 'SCENARIO.EDIT',\n\t0x0135: 'SCENARIO.SHOW',\n\t0x0136: 'SCENARIO.SHOW.NEXT',\n\t0x0137: 'SCENARIO.SUMMARY',\n\t0x0138: 'PIVOT.TABLE.WIZARD',\n\t0x0139: 'PIVOT.FIELD.PROPERTIES',\n\t0x013A: 'PIVOT.FIELD',\n\t0x013B: 'PIVOT.ITEM',\n\t0x013C: 'PIVOT.ADD.FIELDS',\n\t0x013E: 'OPTIONS.CALCULATION',\n\t0x013F: 'OPTIONS.EDIT',\n\t0x0140: 'OPTIONS.VIEW',\n\t0x0141: 'ADDIN.MANAGER',\n\t0x0142: 'MENU.EDITOR',\n\t0x0143: 'ATTACH.TOOLBARS',\n\t0x0144: 'VBAActivate',\n\t0x0145: 'OPTIONS.CHART',\n\t0x0148: 'VBA.INSERT.FILE',\n\t0x014A: 'VBA.PROCEDURE.DEFINITION',\n\t0x0150: 'ROUTING.SLIP',\n\t0x0152: 'ROUTE.DOCUMENT',\n\t0x0153: 'MAIL.LOGON',\n\t0x0156: 'INSERT.PICTURE',\n\t0x0157: 'EDIT.TOOL',\n\t0x0158: 'GALLERY.DOUGHNUT',\n\t0x015E: 'CHART.TREND',\n\t0x0160: 'PIVOT.ITEM.PROPERTIES',\n\t0x0162: 'WORKBOOK.INSERT',\n\t0x0163: 'OPTIONS.TRANSITION',\n\t0x0164: 'OPTIONS.GENERAL',\n\t0x0172: 'FILTER.ADVANCED',\n\t0x0175: 'MAIL.ADD.MAILER',\n\t0x0176: 'MAIL.DELETE.MAILER',\n\t0x0177: 'MAIL.REPLY',\n\t0x0178: 'MAIL.REPLY.ALL',\n\t0x0179: 'MAIL.FORWARD',\n\t0x017A: 'MAIL.NEXT.LETTER',\n\t0x017B: 'DATA.LABEL',\n\t0x017C: 'INSERT.TITLE',\n\t0x017D: 'FONT.PROPERTIES',\n\t0x017E: 'MACRO.OPTIONS',\n\t0x017F: 'WORKBOOK.HIDE',\n\t0x0180: 'WORKBOOK.UNHIDE',\n\t0x0181: 'WORKBOOK.DELETE',\n\t0x0182: 'WORKBOOK.NAME',\n\t0x0184: 'GALLERY.CUSTOM',\n\t0x0186: 'ADD.CHART.AUTOFORMAT',\n\t0x0187: 'DELETE.CHART.AUTOFORMAT',\n\t0x0188: 'CHART.ADD.DATA',\n\t0x0189: 'AUTO.OUTLINE',\n\t0x018A: 'TAB.ORDER',\n\t0x018B: 'SHOW.DIALOG',\n\t0x018C: 'SELECT.ALL',\n\t0x018D: 'UNGROUP.SHEETS',\n\t0x018E: 'SUBTOTAL.CREATE',\n\t0x018F: 'SUBTOTAL.REMOVE',\n\t0x0190: 'RENAME.OBJECT',\n\t0x019C: 'WORKBOOK.SCROLL',\n\t0x019D: 'WORKBOOK.NEXT',\n\t0x019E: 'WORKBOOK.PREV',\n\t0x019F: 'WORKBOOK.TAB.SPLIT',\n\t0x01A0: 'FULL.SCREEN',\n\t0x01A1: 'WORKBOOK.PROTECT',\n\t0x01A4: 'SCROLLBAR.PROPERTIES',\n\t0x01A5: 'PIVOT.SHOW.PAGES',\n\t0x01A6: 'TEXT.TO.COLUMNS',\n\t0x01A7: 'FORMAT.CHARTTYPE',\n\t0x01A8: 'LINK.FORMAT',\n\t0x01A9: 'TRACER.DISPLAY',\n\t0x01AE: 'TRACER.NAVIGATE',\n\t0x01AF: 'TRACER.CLEAR',\n\t0x01B0: 'TRACER.ERROR',\n\t0x01B1: 'PIVOT.FIELD.GROUP',\n\t0x01B2: 'PIVOT.FIELD.UNGROUP',\n\t0x01B3: 'CHECKBOX.PROPERTIES',\n\t0x01B4: 'LABEL.PROPERTIES',\n\t0x01B5: 'LISTBOX.PROPERTIES',\n\t0x01B6: 'EDITBOX.PROPERTIES',\n\t0x01B7: 'PIVOT.REFRESH',\n\t0x01B8: 'LINK.COMBO',\n\t0x01B9: 'OPEN.TEXT',\n\t0x01BA: 'HIDE.DIALOG',\n\t0x01BB: 'SET.DIALOG.FOCUS',\n\t0x01BC: 'ENABLE.OBJECT',\n\t0x01BD: 'PUSHBUTTON.PROPERTIES',\n\t0x01BE: 'SET.DIALOG.DEFAULT',\n\t0x01BF: 'FILTER',\n\t0x01C0: 'FILTER.SHOW.ALL',\n\t0x01C1: 'CLEAR.OUTLINE',\n\t0x01C2: 'FUNCTION.WIZARD',\n\t0x01C3: 'ADD.LIST.ITEM',\n\t0x01C4: 'SET.LIST.ITEM',\n\t0x01C5: 'REMOVE.LIST.ITEM',\n\t0x01C6: 'SELECT.LIST.ITEM',\n\t0x01C7: 'SET.CONTROL.VALUE',\n\t0x01C8: 'SAVE.COPY.AS',\n\t0x01CA: 'OPTIONS.LISTS.ADD',\n\t0x01CB: 'OPTIONS.LISTS.DELETE',\n\t0x01CC: 'SERIES.AXES',\n\t0x01CD: 'SERIES.X',\n\t0x01CE: 'SERIES.Y',\n\t0x01CF: 'ERRORBAR.X',\n\t0x01D0: 'ERRORBAR.Y',\n\t0x01D1: 'FORMAT.CHART',\n\t0x01D2: 'SERIES.ORDER',\n\t0x01D3: 'MAIL.LOGOFF',\n\t0x01D4: 'CLEAR.ROUTING.SLIP',\n\t0x01D5: 'APP.ACTIVATE.MICROSOFT',\n\t0x01D6: 'MAIL.EDIT.MAILER',\n\t0x01D7: 'ON.SHEET',\n\t0x01D8: 'STANDARD.WIDTH',\n\t0x01D9: 'SCENARIO.MERGE',\n\t0x01DA: 'SUMMARY.INFO',\n\t0x01DB: 'FIND.FILE',\n\t0x01DC: 'ACTIVE.CELL.FONT',\n\t0x01DD: 'ENABLE.TIPWIZARD',\n\t0x01DE: 'VBA.MAKE.ADDIN',\n\t0x01E0: 'INSERTDATATABLE',\n\t0x01E1: 'WORKGROUP.OPTIONS',\n\t0x01E2: 'MAIL.SEND.MAILER',\n\t0x01E5: 'AUTOCORRECT',\n\t0x01E9: 'POST.DOCUMENT',\n\t0x01EB: 'PICKLIST',\n\t0x01ED: 'VIEW.SHOW',\n\t0x01EE: 'VIEW.DEFINE',\n\t0x01EF: 'VIEW.DELETE',\n\t0x01FD: 'SHEET.BACKGROUND',\n\t0x01FE: 'INSERT.MAP.OBJECT',\n\t0x01FF: 'OPTIONS.MENONO',\n\t0x0205: 'MSOCHECKS',\n\t0x0206: 'NORMAL',\n\t0x0207: 'LAYOUT',\n\t0x0208: 'RM.PRINT.AREA',\n\t0x0209: 'CLEAR.PRINT.AREA',\n\t0x020A: 'ADD.PRINT.AREA',\n\t0x020B: 'MOVE.BRK',\n\t0x0221: 'HIDECURR.NOTE',\n\t0x0222: 'HIDEALL.NOTES',\n\t0x0223: 'DELETE.NOTE',\n\t0x0224: 'TRAVERSE.NOTES',\n\t0x0225: 'ACTIVATE.NOTES',\n\t0x026C: 'PROTECT.REVISIONS',\n\t0x026D: 'UNPROTECT.REVISIONS',\n\t0x0287: 'OPTIONS.ME',\n\t0x028D: 'WEB.PUBLISH',\n\t0x029B: 'NEWWEBQUERY',\n\t0x02A1: 'PIVOT.TABLE.CHART',\n\t0x02F1: 'OPTIONS.SAVE',\n\t0x02F3: 'OPTIONS.SPELL',\n\t0x0328: 'HIDEALL.INKANNOTS'\n};\n\n/* [MS-XLS] 2.5.198.17 */\nvar Ftab = {\n\t0x0000: 'COUNT',\n\t0x0001: 'IF',\n\t0x0002: 'ISNA',\n\t0x0003: 'ISERROR',\n\t0x0004: 'SUM',\n\t0x0005: 'AVERAGE',\n\t0x0006: 'MIN',\n\t0x0007: 'MAX',\n\t0x0008: 'ROW',\n\t0x0009: 'COLUMN',\n\t0x000A: 'NA',\n\t0x000B: 'NPV',\n\t0x000C: 'STDEV',\n\t0x000D: 'DOLLAR',\n\t0x000E: 'FIXED',\n\t0x000F: 'SIN',\n\t0x0010: 'COS',\n\t0x0011: 'TAN',\n\t0x0012: 'ATAN',\n\t0x0013: 'PI',\n\t0x0014: 'SQRT',\n\t0x0015: 'EXP',\n\t0x0016: 'LN',\n\t0x0017: 'LOG10',\n\t0x0018: 'ABS',\n\t0x0019: 'INT',\n\t0x001A: 'SIGN',\n\t0x001B: 'ROUND',\n\t0x001C: 'LOOKUP',\n\t0x001D: 'INDEX',\n\t0x001E: 'REPT',\n\t0x001F: 'MID',\n\t0x0020: 'LEN',\n\t0x0021: 'VALUE',\n\t0x0022: 'TRUE',\n\t0x0023: 'FALSE',\n\t0x0024: 'AND',\n\t0x0025: 'OR',\n\t0x0026: 'NOT',\n\t0x0027: 'MOD',\n\t0x0028: 'DCOUNT',\n\t0x0029: 'DSUM',\n\t0x002A: 'DAVERAGE',\n\t0x002B: 'DMIN',\n\t0x002C: 'DMAX',\n\t0x002D: 'DSTDEV',\n\t0x002E: 'VAR',\n\t0x002F: 'DVAR',\n\t0x0030: 'TEXT',\n\t0x0031: 'LINEST',\n\t0x0032: 'TREND',\n\t0x0033: 'LOGEST',\n\t0x0034: 'GROWTH',\n\t0x0035: 'GOTO',\n\t0x0036: 'HALT',\n\t0x0037: 'RETURN',\n\t0x0038: 'PV',\n\t0x0039: 'FV',\n\t0x003A: 'NPER',\n\t0x003B: 'PMT',\n\t0x003C: 'RATE',\n\t0x003D: 'MIRR',\n\t0x003E: 'IRR',\n\t0x003F: 'RAND',\n\t0x0040: 'MATCH',\n\t0x0041: 'DATE',\n\t0x0042: 'TIME',\n\t0x0043: 'DAY',\n\t0x0044: 'MONTH',\n\t0x0045: 'YEAR',\n\t0x0046: 'WEEKDAY',\n\t0x0047: 'HOUR',\n\t0x0048: 'MINUTE',\n\t0x0049: 'SECOND',\n\t0x004A: 'NOW',\n\t0x004B: 'AREAS',\n\t0x004C: 'ROWS',\n\t0x004D: 'COLUMNS',\n\t0x004E: 'OFFSET',\n\t0x004F: 'ABSREF',\n\t0x0050: 'RELREF',\n\t0x0051: 'ARGUMENT',\n\t0x0052: 'SEARCH',\n\t0x0053: 'TRANSPOSE',\n\t0x0054: 'ERROR',\n\t0x0055: 'STEP',\n\t0x0056: 'TYPE',\n\t0x0057: 'ECHO',\n\t0x0058: 'SET.NAME',\n\t0x0059: 'CALLER',\n\t0x005A: 'DEREF',\n\t0x005B: 'WINDOWS',\n\t0x005C: 'SERIES',\n\t0x005D: 'DOCUMENTS',\n\t0x005E: 'ACTIVE.CELL',\n\t0x005F: 'SELECTION',\n\t0x0060: 'RESULT',\n\t0x0061: 'ATAN2',\n\t0x0062: 'ASIN',\n\t0x0063: 'ACOS',\n\t0x0064: 'CHOOSE',\n\t0x0065: 'HLOOKUP',\n\t0x0066: 'VLOOKUP',\n\t0x0067: 'LINKS',\n\t0x0068: 'INPUT',\n\t0x0069: 'ISREF',\n\t0x006A: 'GET.FORMULA',\n\t0x006B: 'GET.NAME',\n\t0x006C: 'SET.VALUE',\n\t0x006D: 'LOG',\n\t0x006E: 'EXEC',\n\t0x006F: 'CHAR',\n\t0x0070: 'LOWER',\n\t0x0071: 'UPPER',\n\t0x0072: 'PROPER',\n\t0x0073: 'LEFT',\n\t0x0074: 'RIGHT',\n\t0x0075: 'EXACT',\n\t0x0076: 'TRIM',\n\t0x0077: 'REPLACE',\n\t0x0078: 'SUBSTITUTE',\n\t0x0079: 'CODE',\n\t0x007A: 'NAMES',\n\t0x007B: 'DIRECTORY',\n\t0x007C: 'FIND',\n\t0x007D: 'CELL',\n\t0x007E: 'ISERR',\n\t0x007F: 'ISTEXT',\n\t0x0080: 'ISNUMBER',\n\t0x0081: 'ISBLANK',\n\t0x0082: 'T',\n\t0x0083: 'N',\n\t0x0084: 'FOPEN',\n\t0x0085: 'FCLOSE',\n\t0x0086: 'FSIZE',\n\t0x0087: 'FREADLN',\n\t0x0088: 'FREAD',\n\t0x0089: 'FWRITELN',\n\t0x008A: 'FWRITE',\n\t0x008B: 'FPOS',\n\t0x008C: 'DATEVALUE',\n\t0x008D: 'TIMEVALUE',\n\t0x008E: 'SLN',\n\t0x008F: 'SYD',\n\t0x0090: 'DDB',\n\t0x0091: 'GET.DEF',\n\t0x0092: 'REFTEXT',\n\t0x0093: 'TEXTREF',\n\t0x0094: 'INDIRECT',\n\t0x0095: 'REGISTER',\n\t0x0096: 'CALL',\n\t0x0097: 'ADD.BAR',\n\t0x0098: 'ADD.MENU',\n\t0x0099: 'ADD.COMMAND',\n\t0x009A: 'ENABLE.COMMAND',\n\t0x009B: 'CHECK.COMMAND',\n\t0x009C: 'RENAME.COMMAND',\n\t0x009D: 'SHOW.BAR',\n\t0x009E: 'DELETE.MENU',\n\t0x009F: 'DELETE.COMMAND',\n\t0x00A0: 'GET.CHART.ITEM',\n\t0x00A1: 'DIALOG.BOX',\n\t0x00A2: 'CLEAN',\n\t0x00A3: 'MDETERM',\n\t0x00A4: 'MINVERSE',\n\t0x00A5: 'MMULT',\n\t0x00A6: 'FILES',\n\t0x00A7: 'IPMT',\n\t0x00A8: 'PPMT',\n\t0x00A9: 'COUNTA',\n\t0x00AA: 'CANCEL.KEY',\n\t0x00AB: 'FOR',\n\t0x00AC: 'WHILE',\n\t0x00AD: 'BREAK',\n\t0x00AE: 'NEXT',\n\t0x00AF: 'INITIATE',\n\t0x00B0: 'REQUEST',\n\t0x00B1: 'POKE',\n\t0x00B2: 'EXECUTE',\n\t0x00B3: 'TERMINATE',\n\t0x00B4: 'RESTART',\n\t0x00B5: 'HELP',\n\t0x00B6: 'GET.BAR',\n\t0x00B7: 'PRODUCT',\n\t0x00B8: 'FACT',\n\t0x00B9: 'GET.CELL',\n\t0x00BA: 'GET.WORKSPACE',\n\t0x00BB: 'GET.WINDOW',\n\t0x00BC: 'GET.DOCUMENT',\n\t0x00BD: 'DPRODUCT',\n\t0x00BE: 'ISNONTEXT',\n\t0x00BF: 'GET.NOTE',\n\t0x00C0: 'NOTE',\n\t0x00C1: 'STDEVP',\n\t0x00C2: 'VARP',\n\t0x00C3: 'DSTDEVP',\n\t0x00C4: 'DVARP',\n\t0x00C5: 'TRUNC',\n\t0x00C6: 'ISLOGICAL',\n\t0x00C7: 'DCOUNTA',\n\t0x00C8: 'DELETE.BAR',\n\t0x00C9: 'UNREGISTER',\n\t0x00CC: 'USDOLLAR',\n\t0x00CD: 'FINDB',\n\t0x00CE: 'SEARCHB',\n\t0x00CF: 'REPLACEB',\n\t0x00D0: 'LEFTB',\n\t0x00D1: 'RIGHTB',\n\t0x00D2: 'MIDB',\n\t0x00D3: 'LENB',\n\t0x00D4: 'ROUNDUP',\n\t0x00D5: 'ROUNDDOWN',\n\t0x00D6: 'ASC',\n\t0x00D7: 'DBCS',\n\t0x00D8: 'RANK',\n\t0x00DB: 'ADDRESS',\n\t0x00DC: 'DAYS360',\n\t0x00DD: 'TODAY',\n\t0x00DE: 'VDB',\n\t0x00DF: 'ELSE',\n\t0x00E0: 'ELSE.IF',\n\t0x00E1: 'END.IF',\n\t0x00E2: 'FOR.CELL',\n\t0x00E3: 'MEDIAN',\n\t0x00E4: 'SUMPRODUCT',\n\t0x00E5: 'SINH',\n\t0x00E6: 'COSH',\n\t0x00E7: 'TANH',\n\t0x00E8: 'ASINH',\n\t0x00E9: 'ACOSH',\n\t0x00EA: 'ATANH',\n\t0x00EB: 'DGET',\n\t0x00EC: 'CREATE.OBJECT',\n\t0x00ED: 'VOLATILE',\n\t0x00EE: 'LAST.ERROR',\n\t0x00EF: 'CUSTOM.UNDO',\n\t0x00F0: 'CUSTOM.REPEAT',\n\t0x00F1: 'FORMULA.CONVERT',\n\t0x00F2: 'GET.LINK.INFO',\n\t0x00F3: 'TEXT.BOX',\n\t0x00F4: 'INFO',\n\t0x00F5: 'GROUP',\n\t0x00F6: 'GET.OBJECT',\n\t0x00F7: 'DB',\n\t0x00F8: 'PAUSE',\n\t0x00FB: 'RESUME',\n\t0x00FC: 'FREQUENCY',\n\t0x00FD: 'ADD.TOOLBAR',\n\t0x00FE: 'DELETE.TOOLBAR',\n\t0x00FF: 'User',\n\t0x0100: 'RESET.TOOLBAR',\n\t0x0101: 'EVALUATE',\n\t0x0102: 'GET.TOOLBAR',\n\t0x0103: 'GET.TOOL',\n\t0x0104: 'SPELLING.CHECK',\n\t0x0105: 'ERROR.TYPE',\n\t0x0106: 'APP.TITLE',\n\t0x0107: 'WINDOW.TITLE',\n\t0x0108: 'SAVE.TOOLBAR',\n\t0x0109: 'ENABLE.TOOL',\n\t0x010A: 'PRESS.TOOL',\n\t0x010B: 'REGISTER.ID',\n\t0x010C: 'GET.WORKBOOK',\n\t0x010D: 'AVEDEV',\n\t0x010E: 'BETADIST',\n\t0x010F: 'GAMMALN',\n\t0x0110: 'BETAINV',\n\t0x0111: 'BINOMDIST',\n\t0x0112: 'CHIDIST',\n\t0x0113: 'CHIINV',\n\t0x0114: 'COMBIN',\n\t0x0115: 'CONFIDENCE',\n\t0x0116: 'CRITBINOM',\n\t0x0117: 'EVEN',\n\t0x0118: 'EXPONDIST',\n\t0x0119: 'FDIST',\n\t0x011A: 'FINV',\n\t0x011B: 'FISHER',\n\t0x011C: 'FISHERINV',\n\t0x011D: 'FLOOR',\n\t0x011E: 'GAMMADIST',\n\t0x011F: 'GAMMAINV',\n\t0x0120: 'CEILING',\n\t0x0121: 'HYPGEOMDIST',\n\t0x0122: 'LOGNORMDIST',\n\t0x0123: 'LOGINV',\n\t0x0124: 'NEGBINOMDIST',\n\t0x0125: 'NORMDIST',\n\t0x0126: 'NORMSDIST',\n\t0x0127: 'NORMINV',\n\t0x0128: 'NORMSINV',\n\t0x0129: 'STANDARDIZE',\n\t0x012A: 'ODD',\n\t0x012B: 'PERMUT',\n\t0x012C: 'POISSON',\n\t0x012D: 'TDIST',\n\t0x012E: 'WEIBULL',\n\t0x012F: 'SUMXMY2',\n\t0x0130: 'SUMX2MY2',\n\t0x0131: 'SUMX2PY2',\n\t0x0132: 'CHITEST',\n\t0x0133: 'CORREL',\n\t0x0134: 'COVAR',\n\t0x0135: 'FORECAST',\n\t0x0136: 'FTEST',\n\t0x0137: 'INTERCEPT',\n\t0x0138: 'PEARSON',\n\t0x0139: 'RSQ',\n\t0x013A: 'STEYX',\n\t0x013B: 'SLOPE',\n\t0x013C: 'TTEST',\n\t0x013D: 'PROB',\n\t0x013E: 'DEVSQ',\n\t0x013F: 'GEOMEAN',\n\t0x0140: 'HARMEAN',\n\t0x0141: 'SUMSQ',\n\t0x0142: 'KURT',\n\t0x0143: 'SKEW',\n\t0x0144: 'ZTEST',\n\t0x0145: 'LARGE',\n\t0x0146: 'SMALL',\n\t0x0147: 'QUARTILE',\n\t0x0148: 'PERCENTILE',\n\t0x0149: 'PERCENTRANK',\n\t0x014A: 'MODE',\n\t0x014B: 'TRIMMEAN',\n\t0x014C: 'TINV',\n\t0x014E: 'MOVIE.COMMAND',\n\t0x014F: 'GET.MOVIE',\n\t0x0150: 'CONCATENATE',\n\t0x0151: 'POWER',\n\t0x0152: 'PIVOT.ADD.DATA',\n\t0x0153: 'GET.PIVOT.TABLE',\n\t0x0154: 'GET.PIVOT.FIELD',\n\t0x0155: 'GET.PIVOT.ITEM',\n\t0x0156: 'RADIANS',\n\t0x0157: 'DEGREES',\n\t0x0158: 'SUBTOTAL',\n\t0x0159: 'SUMIF',\n\t0x015A: 'COUNTIF',\n\t0x015B: 'COUNTBLANK',\n\t0x015C: 'SCENARIO.GET',\n\t0x015D: 'OPTIONS.LISTS.GET',\n\t0x015E: 'ISPMT',\n\t0x015F: 'DATEDIF',\n\t0x0160: 'DATESTRING',\n\t0x0161: 'NUMBERSTRING',\n\t0x0162: 'ROMAN',\n\t0x0163: 'OPEN.DIALOG',\n\t0x0164: 'SAVE.DIALOG',\n\t0x0165: 'VIEW.GET',\n\t0x0166: 'GETPIVOTDATA',\n\t0x0167: 'HYPERLINK',\n\t0x0168: 'PHONETIC',\n\t0x0169: 'AVERAGEA',\n\t0x016A: 'MAXA',\n\t0x016B: 'MINA',\n\t0x016C: 'STDEVPA',\n\t0x016D: 'VARPA',\n\t0x016E: 'STDEVA',\n\t0x016F: 'VARA',\n\t0x0170: 'BAHTTEXT',\n\t0x0171: 'THAIDAYOFWEEK',\n\t0x0172: 'THAIDIGIT',\n\t0x0173: 'THAIMONTHOFYEAR',\n\t0x0174: 'THAINUMSOUND',\n\t0x0175: 'THAINUMSTRING',\n\t0x0176: 'THAISTRINGLENGTH',\n\t0x0177: 'ISTHAIDIGIT',\n\t0x0178: 'ROUNDBAHTDOWN',\n\t0x0179: 'ROUNDBAHTUP',\n\t0x017A: 'THAIYEAR',\n\t0x017B: 'RTD'\n};\nvar FtabArgc = {\n\t0x0002: 1, /* ISNA */\n\t0x0003: 1, /* ISERROR */\n\t0x000F: 1, /* SIN */\n\t0x0010: 1, /* COS */\n\t0x0011: 1, /* TAN */\n\t0x0012: 1, /* ATAN */\n\t0x0014: 1, /* SQRT */\n\t0x0015: 1, /* EXP */\n\t0x0016: 1, /* LN */\n\t0x0017: 1, /* LOG10 */\n\t0x0018: 1, /* ABS */\n\t0x0019: 1, /* INT */\n\t0x001A: 1, /* SIGN */\n\t0x001B: 2, /* ROUND */\n\t0x001E: 2, /* REPT */\n\t0x001F: 3, /* MID */\n\t0x0020: 1, /* LEN */\n\t0x0021: 1, /* VALUE */\n\t0x0026: 1, /* NOT */\n\t0x0027: 2, /* MOD */\n\t0x0028: 3, /* DCOUNT */\n\t0x0029: 3, /* DSUM */\n\t0x002A: 3, /* DAVERAGE */\n\t0x002B: 3, /* DMIN */\n\t0x002C: 3, /* DMAX */\n\t0x002D: 3, /* DSTDEV */\n\t0x002F: 3, /* DVAR */\n\t0x0030: 2, /* TEXT */\n\t0x0035: 1, /* GOTO */\n\t0x003D: 3, /* MIRR */\n\t0x0041: 3, /* DATE */\n\t0x0042: 3, /* TIME */\n\t0x0043: 1, /* DAY */\n\t0x0044: 1, /* MONTH */\n\t0x0045: 1, /* YEAR */\n\t0x0047: 1, /* HOUR */\n\t0x0048: 1, /* MINUTE */\n\t0x0049: 1, /* SECOND */\n\t0x004B: 1, /* AREAS */\n\t0x004C: 1, /* ROWS */\n\t0x004D: 1, /* COLUMNS */\n\t0x004F: 2, /* ABSREF */\n\t0x0050: 2, /* RELREF */\n\t0x0053: 1, /* TRANSPOSE */\n\t0x0056: 1, /* TYPE */\n\t0x005A: 1, /* DEREF */\n\t0x0061: 2, /* ATAN2 */\n\t0x0062: 1, /* ASIN */\n\t0x0063: 1, /* ACOS */\n\t0x0069: 1, /* ISREF */\n\t0x006F: 1, /* CHAR */\n\t0x0070: 1, /* LOWER */\n\t0x0071: 1, /* UPPER */\n\t0x0072: 1, /* PROPER */\n\t0x0075: 2, /* EXACT */\n\t0x0076: 1, /* TRIM */\n\t0x0077: 4, /* REPLACE */\n\t0x0079: 1, /* CODE */\n\t0x007E: 1, /* ISERR */\n\t0x007F: 1, /* ISTEXT */\n\t0x0080: 1, /* ISNUMBER */\n\t0x0081: 1, /* ISBLANK */\n\t0x0082: 1, /* T */\n\t0x0083: 1, /* N */\n\t0x0085: 1, /* FCLOSE */\n\t0x0086: 1, /* FSIZE */\n\t0x0087: 1, /* FREADLN */\n\t0x0088: 2, /* FREAD */\n\t0x0089: 2, /* FWRITELN */\n\t0x008A: 2, /* FWRITE */\n\t0x008C: 1, /* DATEVALUE */\n\t0x008D: 1, /* TIMEVALUE */\n\t0x008E: 3, /* SLN */\n\t0x008F: 4, /* SYD */\n\t0x00A2: 1, /* CLEAN */\n\t0x00A3: 1, /* MDETERM */\n\t0x00A4: 1, /* MINVERSE */\n\t0x00A5: 2, /* MMULT */\n\t0x00AC: 1, /* WHILE */\n\t0x00AF: 2, /* INITIATE */\n\t0x00B0: 2, /* REQUEST */\n\t0x00B1: 3, /* POKE */\n\t0x00B2: 2, /* EXECUTE */\n\t0x00B3: 1, /* TERMINATE */\n\t0x00B8: 1, /* FACT */\n\t0x00BD: 3, /* DPRODUCT */\n\t0x00BE: 1, /* ISNONTEXT */\n\t0x00C3: 3, /* DSTDEVP */\n\t0x00C4: 3, /* DVARP */\n\t0x00C6: 1, /* ISLOGICAL */\n\t0x00C7: 3, /* DCOUNTA */\n\t0x00C9: 1, /* UNREGISTER */\n\t0x00CF: 4, /* REPLACEB */\n\t0x00D2: 3, /* MIDB */\n\t0x00D3: 1, /* LENB */\n\t0x00D4: 2, /* ROUNDUP */\n\t0x00D5: 2, /* ROUNDDOWN */\n\t0x00D6: 1, /* ASC */\n\t0x00D7: 1, /* DBCS */\n\t0x00E5: 1, /* SINH */\n\t0x00E6: 1, /* COSH */\n\t0x00E7: 1, /* TANH */\n\t0x00E8: 1, /* ASINH */\n\t0x00E9: 1, /* ACOSH */\n\t0x00EA: 1, /* ATANH */\n\t0x00EB: 3, /* DGET */\n\t0x00F4: 1, /* INFO */\n\t0x00FC: 2, /* FREQUENCY */\n\t0x0101: 1, /* EVALUATE */\n\t0x0105: 1, /* ERROR.TYPE */\n\t0x010F: 1, /* GAMMALN */\n\t0x0111: 4, /* BINOMDIST */\n\t0x0112: 2, /* CHIDIST */\n\t0x0113: 2, /* CHIINV */\n\t0x0114: 2, /* COMBIN */\n\t0x0115: 3, /* CONFIDENCE */\n\t0x0116: 3, /* CRITBINOM */\n\t0x0117: 1, /* EVEN */\n\t0x0118: 3, /* EXPONDIST */\n\t0x0119: 3, /* FDIST */\n\t0x011A: 3, /* FINV */\n\t0x011B: 1, /* FISHER */\n\t0x011C: 1, /* FISHERINV */\n\t0x011D: 2, /* FLOOR */\n\t0x011E: 4, /* GAMMADIST */\n\t0x011F: 3, /* GAMMAINV */\n\t0x0120: 2, /* CEILING */\n\t0x0121: 4, /* HYPGEOMDIST */\n\t0x0122: 3, /* LOGNORMDIST */\n\t0x0123: 3, /* LOGINV */\n\t0x0124: 3, /* NEGBINOMDIST */\n\t0x0125: 4, /* NORMDIST */\n\t0x0126: 1, /* NORMSDIST */\n\t0x0127: 3, /* NORMINV */\n\t0x0128: 1, /* NORMSINV */\n\t0x0129: 3, /* STANDARDIZE */\n\t0x012A: 1, /* ODD */\n\t0x012B: 2, /* PERMUT */\n\t0x012C: 3, /* POISSON */\n\t0x012D: 3, /* TDIST */\n\t0x012E: 4, /* WEIBULL */\n\t0x012F: 2, /* SUMXMY2 */\n\t0x0130: 2, /* SUMX2MY2 */\n\t0x0131: 2, /* SUMX2PY2 */\n\t0x0132: 2, /* CHITEST */\n\t0x0133: 2, /* CORREL */\n\t0x0134: 2, /* COVAR */\n\t0x0135: 3, /* FORECAST */\n\t0x0136: 2, /* FTEST */\n\t0x0137: 2, /* INTERCEPT */\n\t0x0138: 2, /* PEARSON */\n\t0x0139: 2, /* RSQ */\n\t0x013A: 2, /* STEYX */\n\t0x013B: 2, /* SLOPE */\n\t0x013C: 4, /* TTEST */\n\t0x0145: 2, /* LARGE */\n\t0x0146: 2, /* SMALL */\n\t0x0147: 2, /* QUARTILE */\n\t0x0148: 2, /* PERCENTILE */\n\t0x014B: 2, /* TRIMMEAN */\n\t0x014C: 2, /* TINV */\n\t0x0151: 2, /* POWER */\n\t0x0156: 1, /* RADIANS */\n\t0x0157: 1, /* DEGREES */\n\t0x015A: 2, /* COUNTIF */\n\t0x015B: 1, /* COUNTBLANK */\n\t0x015E: 4, /* ISPMT */\n\t0x015F: 3, /* DATEDIF */\n\t0x0160: 1, /* DATESTRING */\n\t0x0161: 2, /* NUMBERSTRING */\n\t0x0168: 1, /* PHONETIC */\n\t0x0170: 1, /* BAHTTEXT */\n\t0x0171: 1, /* THAIDAYOFWEEK */\n\t0x0172: 1, /* THAIDIGIT */\n\t0x0173: 1, /* THAIMONTHOFYEAR */\n\t0x0174: 1, /* THAINUMSOUND */\n\t0x0175: 1, /* THAINUMSTRING */\n\t0x0176: 1, /* THAISTRINGLENGTH */\n\t0x0177: 1, /* ISTHAIDIGIT */\n\t0x0178: 1, /* ROUNDBAHTDOWN */\n\t0x0179: 1, /* ROUNDBAHTUP */\n\t0x017A: 1, /* THAIYEAR */\n\t0xFFFF: 0\n};\n/* [MS-XLSX] 2.2.3 Functions */\nvar XLSXFutureFunctions = {\n\t\"_xlfn.ACOT\": \"ACOT\",\n\t\"_xlfn.ACOTH\": \"ACOTH\",\n\t\"_xlfn.AGGREGATE\": \"AGGREGATE\",\n\t\"_xlfn.ARABIC\": \"ARABIC\",\n\t\"_xlfn.AVERAGEIF\": \"AVERAGEIF\",\n\t\"_xlfn.AVERAGEIFS\": \"AVERAGEIFS\",\n\t\"_xlfn.BASE\": \"BASE\",\n\t\"_xlfn.BETA.DIST\": \"BETA.DIST\",\n\t\"_xlfn.BETA.INV\": \"BETA.INV\",\n\t\"_xlfn.BINOM.DIST\": \"BINOM.DIST\",\n\t\"_xlfn.BINOM.DIST.RANGE\": \"BINOM.DIST.RANGE\",\n\t\"_xlfn.BINOM.INV\": \"BINOM.INV\",\n\t\"_xlfn.BITAND\": \"BITAND\",\n\t\"_xlfn.BITLSHIFT\": \"BITLSHIFT\",\n\t\"_xlfn.BITOR\": \"BITOR\",\n\t\"_xlfn.BITRSHIFT\": \"BITRSHIFT\",\n\t\"_xlfn.BITXOR\": \"BITXOR\",\n\t\"_xlfn.CEILING.MATH\": \"CEILING.MATH\",\n\t\"_xlfn.CEILING.PRECISE\": \"CEILING.PRECISE\",\n\t\"_xlfn.CHISQ.DIST\": \"CHISQ.DIST\",\n\t\"_xlfn.CHISQ.DIST.RT\": \"CHISQ.DIST.RT\",\n\t\"_xlfn.CHISQ.INV\": \"CHISQ.INV\",\n\t\"_xlfn.CHISQ.INV.RT\": \"CHISQ.INV.RT\",\n\t\"_xlfn.CHISQ.TEST\": \"CHISQ.TEST\",\n\t\"_xlfn.COMBINA\": \"COMBINA\",\n\t\"_xlfn.CONFIDENCE.NORM\": \"CONFIDENCE.NORM\",\n\t\"_xlfn.CONFIDENCE.T\": \"CONFIDENCE.T\",\n\t\"_xlfn.COT\": \"COT\",\n\t\"_xlfn.COTH\": \"COTH\",\n\t\"_xlfn.COUNTIFS\": \"COUNTIFS\",\n\t\"_xlfn.COVARIANCE.P\": \"COVARIANCE.P\",\n\t\"_xlfn.COVARIANCE.S\": \"COVARIANCE.S\",\n\t\"_xlfn.CSC\": \"CSC\",\n\t\"_xlfn.CSCH\": \"CSCH\",\n\t\"_xlfn.DAYS\": \"DAYS\",\n\t\"_xlfn.DECIMAL\": \"DECIMAL\",\n\t\"_xlfn.ECMA.CEILING\": \"ECMA.CEILING\",\n\t\"_xlfn.ERF.PRECISE\": \"ERF.PRECISE\",\n\t\"_xlfn.ERFC.PRECISE\": \"ERFC.PRECISE\",\n\t\"_xlfn.EXPON.DIST\": \"EXPON.DIST\",\n\t\"_xlfn.F.DIST\": \"F.DIST\",\n\t\"_xlfn.F.DIST.RT\": \"F.DIST.RT\",\n\t\"_xlfn.F.INV\": \"F.INV\",\n\t\"_xlfn.F.INV.RT\": \"F.INV.RT\",\n\t\"_xlfn.F.TEST\": \"F.TEST\",\n\t\"_xlfn.FILTERXML\": \"FILTERXML\",\n\t\"_xlfn.FLOOR.MATH\": \"FLOOR.MATH\",\n\t\"_xlfn.FLOOR.PRECISE\": \"FLOOR.PRECISE\",\n\t\"_xlfn.FORMULATEXT\": \"FORMULATEXT\",\n\t\"_xlfn.GAMMA\": \"GAMMA\",\n\t\"_xlfn.GAMMA.DIST\": \"GAMMA.DIST\",\n\t\"_xlfn.GAMMA.INV\": \"GAMMA.INV\",\n\t\"_xlfn.GAMMALN.PRECISE\": \"GAMMALN.PRECISE\",\n\t\"_xlfn.GAUSS\": \"GAUSS\",\n\t\"_xlfn.HYPGEOM.DIST\": \"HYPGEOM.DIST\",\n\t\"_xlfn.IFNA\": \"IFNA\",\n\t\"_xlfn.IFERROR\": \"IFERROR\",\n\t\"_xlfn.IMCOSH\": \"IMCOSH\",\n\t\"_xlfn.IMCOT\": \"IMCOT\",\n\t\"_xlfn.IMCSC\": \"IMCSC\",\n\t\"_xlfn.IMCSCH\": \"IMCSCH\",\n\t\"_xlfn.IMSEC\": \"IMSEC\",\n\t\"_xlfn.IMSECH\": \"IMSECH\",\n\t\"_xlfn.IMSINH\": \"IMSINH\",\n\t\"_xlfn.IMTAN\": \"IMTAN\",\n\t\"_xlfn.ISFORMULA\": \"ISFORMULA\",\n\t\"_xlfn.ISO.CEILING\": \"ISO.CEILING\",\n\t\"_xlfn.ISOWEEKNUM\": \"ISOWEEKNUM\",\n\t\"_xlfn.LOGNORM.DIST\": \"LOGNORM.DIST\",\n\t\"_xlfn.LOGNORM.INV\": \"LOGNORM.INV\",\n\t\"_xlfn.MODE.MULT\": \"MODE.MULT\",\n\t\"_xlfn.MODE.SNGL\": \"MODE.SNGL\",\n\t\"_xlfn.MUNIT\": \"MUNIT\",\n\t\"_xlfn.NEGBINOM.DIST\": \"NEGBINOM.DIST\",\n\t\"_xlfn.NETWORKDAYS.INTL\": \"NETWORKDAYS.INTL\",\n\t\"_xlfn.NIGBINOM\": \"NIGBINOM\",\n\t\"_xlfn.NORM.DIST\": \"NORM.DIST\",\n\t\"_xlfn.NORM.INV\": \"NORM.INV\",\n\t\"_xlfn.NORM.S.DIST\": \"NORM.S.DIST\",\n\t\"_xlfn.NORM.S.INV\": \"NORM.S.INV\",\n\t\"_xlfn.NUMBERVALUE\": \"NUMBERVALUE\",\n\t\"_xlfn.PDURATION\": \"PDURATION\",\n\t\"_xlfn.PERCENTILE.EXC\": \"PERCENTILE.EXC\",\n\t\"_xlfn.PERCENTILE.INC\": \"PERCENTILE.INC\",\n\t\"_xlfn.PERCENTRANK.EXC\": \"PERCENTRANK.EXC\",\n\t\"_xlfn.PERCENTRANK.INC\": \"PERCENTRANK.INC\",\n\t\"_xlfn.PERMUTATIONA\": \"PERMUTATIONA\",\n\t\"_xlfn.PHI\": \"PHI\",\n\t\"_xlfn.POISSON.DIST\": \"POISSON.DIST\",\n\t\"_xlfn.QUARTILE.EXC\": \"QUARTILE.EXC\",\n\t\"_xlfn.QUARTILE.INC\": \"QUARTILE.INC\",\n\t\"_xlfn.QUERYSTRING\": \"QUERYSTRING\",\n\t\"_xlfn.RANK.AVG\": \"RANK.AVG\",\n\t\"_xlfn.RANK.EQ\": \"RANK.EQ\",\n\t\"_xlfn.RRI\": \"RRI\",\n\t\"_xlfn.SEC\": \"SEC\",\n\t\"_xlfn.SECH\": \"SECH\",\n\t\"_xlfn.SHEET\": \"SHEET\",\n\t\"_xlfn.SHEETS\": \"SHEETS\",\n\t\"_xlfn.SKEW.P\": \"SKEW.P\",\n\t\"_xlfn.STDEV.P\": \"STDEV.P\",\n\t\"_xlfn.STDEV.S\": \"STDEV.S\",\n\t\"_xlfn.SUMIFS\": \"SUMIFS\",\n\t\"_xlfn.T.DIST\": \"T.DIST\",\n\t\"_xlfn.T.DIST.2T\": \"T.DIST.2T\",\n\t\"_xlfn.T.DIST.RT\": \"T.DIST.RT\",\n\t\"_xlfn.T.INV\": \"T.INV\",\n\t\"_xlfn.T.INV.2T\": \"T.INV.2T\",\n\t\"_xlfn.T.TEST\": \"T.TEST\",\n\t\"_xlfn.UNICHAR\": \"UNICHAR\",\n\t\"_xlfn.UNICODE\": \"UNICODE\",\n\t\"_xlfn.VAR.P\": \"VAR.P\",\n\t\"_xlfn.VAR.S\": \"VAR.S\",\n\t\"_xlfn.WEBSERVICE\": \"WEBSERVICE\",\n\t\"_xlfn.WEIBULL.DIST\": \"WEIBULL.DIST\",\n\t\"_xlfn.WORKDAY.INTL\": \"WORKDAY.INTL\",\n\t\"_xlfn.XOR\": \"XOR\",\n\t\"_xlfn.Z.TEST\": \"Z.TEST\"\n};\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\nRELS.WS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\n\nfunction get_sst_id(sst, str) {\n\tfor(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; }\n\tsst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len;\n}\n\nfunction get_cell_style(styles, cell, opts) {\n\tvar z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n\tfor(var i = 0, len = styles.length; i != len; ++i) if(styles[i].numFmtId === z) return i;\n\tstyles[len] = {\n\t\tnumFmtId:z,\n\t\tfontId:0,\n\t\tfillId:0,\n\t\tborderId:0,\n\t\txfId:0,\n\t\tapplyNumberFormat:1\n\t};\n\treturn len;\n}\n\nfunction safe_format(p, fmtid, fillid, opts) {\n\ttry {\n\t\tif(p.t === 'e') p.w = p.w || BErr[p.v];\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v,_ssfopts);\n\t\t\t\telse p.w = SSF._general_num(p.v,_ssfopts);\n\t\t\t}\n\t\t\telse if(p.t === 'd') {\n\t\t\t\tvar dd = datenum(p.v);\n\t\t\t\tif((dd|0) === dd) p.w = SSF._general_int(dd,_ssfopts);\n\t\t\t\telse p.w = SSF._general_num(dd,_ssfopts);\n\t\t\t}\n\t\t\telse if(p.v === undefined) return \"\";\n\t\t\telse p.w = SSF._general(p.v,_ssfopts);\n\t\t}\n\t\telse if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);\n\t\telse p.w = SSF.format(fmtid,p.v,_ssfopts);\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(fillid) try {\n\t\tp.s = styles.Fills[fillid];\n\t\tif (p.s.fgColor && p.s.fgColor.theme) {\n\t\t\tp.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n\t\t}\n\t\tif (p.s.bgColor && p.s.bgColor.theme) {\n\t\t\tp.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n\t\t}\n\t} catch(e) { if(opts.WTF) throw e; }\n}\nfunction parse_ws_xml_dim(ws, s) {\n\tvar d = safe_decode_range(s);\n\tif(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws[\"!ref\"] = encode_range(d);\n}\nvar mergecregex = /<mergeCell ref=\"[A-Z0-9:]+\"\\s*\\/>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData>([^\\u2603]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<hyperlink[^>]*\\/>/g;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<col[^>]*\\/>/g;\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data, opts, rels) {\n\tif(!data) return data;\n\t/* 18.3.1.99 worksheet CT_Worksheet */\n\tvar s = {};\n\n\t/* 18.3.1.35 dimension CT_SheetDimension ? */\n\tvar ridx = data.indexOf(\"<dimension\");\n\tif(ridx > 0) {\n\t\tvar ref = data.substr(ridx,50).match(dimregex);\n\t\tif(ref != null) parse_ws_xml_dim(s, ref[1]);\n\t}\n\n\t/* 18.3.1.55 mergeCells CT_MergeCells */\n\tvar mergecells = [];\n\tif(data.indexOf(\"</mergeCells>\")!==-1) {\n\t\tvar merges = data.match(mergecregex);\n\t\tfor(ridx = 0; ridx != merges.length; ++ridx)\n\t\t\tmergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf(\"\\\"\")+1));\n\t}\n\n\t/* 18.3.1.17 cols CT_Cols */\n\tvar columns = [];\n\tif(opts.cellStyles && data.indexOf(\"</cols>\")!==-1) {\n\t\t/* 18.3.1.13 col CT_Col */\n\t\tvar cols = data.match(colregex);\n\t\tparse_ws_xml_cols(columns, cols);\n\t}\n\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n\t/* 18.3.1.80 sheetData CT_SheetData ? */\n\tvar mtch=data.match(sheetdataregex);\n\tif(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess);\n\n\t/* 18.3.1.48 hyperlinks CT_Hyperlinks */\n\tif(data.indexOf(\"</hyperlinks>\")!==-1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels);\n\n\tif(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n\tif(opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows < +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(mergecells.length > 0) s[\"!merges\"] = mergecells;\n\tif(columns.length > 0) s[\"!cols\"] = columns;\n\treturn s;\n}\n\nfunction write_ws_xml_merges(merges) {\n\tif(merges.length == 0) return \"\";\n\tvar o = '<mergeCells count=\"' + merges.length + '\">';\n\tfor(var i = 0; i != merges.length; ++i) o += '<mergeCell ref=\"' + encode_range(merges[i]) + '\"/>';\n\treturn o + '</mergeCells>';\n}\n\nfunction parse_ws_xml_hlinks(s, data, rels) {\n\tfor(var i = 0; i != data.length; ++i) {\n\t\tvar val = parsexmltag(data[i], true);\n\t\tif(!val.ref) return;\n\t\tvar rel = rels ? rels['!id'][val.id] : null;\n\t\tif(rel) {\n\t\t\tval.Target = rel.Target;\n\t\t\tif(val.location) val.Target += \"#\"+val.location;\n\t\t\tval.Rel = rel;\n\t\t} else {\n\t\t\tval.Target = val.location;\n\t\t\trel = {Target: val.location, TargetMode: 'Internal'};\n\t\t\tval.Rel = rel;\n\t\t}\n\t\tvar rng = safe_decode_range(val.ref);\n\t\tfor(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n\t\t\tvar addr = encode_cell({c:C,r:R});\n\t\t\tif(!s[addr]) s[addr] = {t:\"stub\",v:undefined};\n\t\t\ts[addr].l = val;\n\t\t}\n\t}\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n\tvar seencol = false;\n\tfor(var coli = 0; coli != cols.length; ++coli) {\n\t\tvar coll = parsexmltag(cols[coli], true);\n\t\tvar colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n\t\tdelete coll.min; delete coll.max;\n\t\tif(!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll); }\n\t\tif(coll.width) {\n\t\t\tcoll.wpx = width2px(+coll.width);\n\t\t\tcoll.wch = px2char(coll.wpx);\n\t\t\tcoll.MDW = MDW;\n\t\t}\n\t\twhile(colm <= colM) columns[colm++] = coll;\n\t}\n}\n\nfunction write_ws_xml_cols(ws, cols) {\n\tvar o = [\"<cols>\"], col, width;\n\tfor(var i = 0; i != cols.length; ++i) {\n\t\tif(!(col = cols[i])) continue;\n\t\tvar p = {min:i+1,max:i+1};\n\t\t/* wch (chars), wpx (pixels) */\n\t\twidth = -1;\n\t\tif(col.wpx) width = px2char(col.wpx);\n\t\telse if(col.wch) width = col.wch;\n\t\tif(width > -1) { p.width = char2width(width); p.customWidth= 1; }\n\t\to[o.length] = (writextag('col', null, p));\n\t}\n\to[o.length] = \"</cols>\";\n\treturn o.join(\"\");\n}\n\nfunction write_ws_xml_cell(cell, ref, ws, opts, idx, wb) {\n\tif(cell.v === undefined) return \"\";\n\tvar vv = \"\";\n\tvar oldt = cell.t, oldv = cell.v;\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': vv = ''+cell.v; break;\n\t\tcase 'e': vv = BErr[cell.v]; break;\n\t\tcase 'd':\n\t\t\tif(opts.cellDates) vv = new Date(cell.v).toISOString();\n\t\t\telse {\n\t\t\t\tcell.t = 'n';\n\t\t\t\tvv = ''+(cell.v = datenum(cell.v));\n\t\t\t\tif(typeof cell.z === 'undefined') cell.z = SSF._table[14];\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar v = writetag('v', escapexml(vv)), o = {r:ref};\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tif(os !== 0) o.s = os;\n\tswitch(cell.t) {\n\t\tcase 'n': break;\n\t\tcase 'd': o.t = \"d\"; break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t\tdefault:\n\t\t\tif(opts.bookSST) {\n\t\t\t\tv = writetag('v', ''+get_sst_id(opts.Strings, cell.v));\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t}\n\tif(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n\treturn writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = (function parse_ws_xml_data_factory() {\n\tvar cellregex = /<(?:\\w+:)?c[ >]/, rowregex = /<\\/(?:\\w+:)?row>/;\n\tvar rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<is>([\\S\\s]*?)<\\/is>/;\n\tvar match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata, s, opts, guess) {\n\tvar ri = 0, x = \"\", cells = [], cref = [], idx = 0, i=0, cc=0, d=\"\", p;\n\tvar tag, tagr = 0, tagc = 0;\n\tvar sstr;\n\tvar fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf;\n\tfor(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n\t\tx = marr[mt].trim();\n\t\tvar xlen = x.length;\n\t\tif(xlen === 0) continue;\n\n\t\t/* 18.3.1.73 row CT_Row */\n\t\tfor(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;\n\t\ttag = parsexmltag(x.substr(0,ri), true);\n\t\t/* SpreadSheetGear uses implicit r/c */\n\t\ttagr = typeof tag.r !== 'undefined' ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\tif(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n\t\tif(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n\t\t/* 18.3.1.4 c CT_Cell */\n\t\tcells = x.substr(ri).split(cellregex);\n\t\tfor(ri = typeof tag.r === 'undefined' ? 0 : 1; ri != cells.length; ++ri) {\n\t\t\tx = cells[ri].trim();\n\t\t\tif(x.length === 0) continue;\n\t\t\tcref = x.match(rregex); idx = ri; i=0; cc=0;\n\t\t\tx = \"<c \" + (x.substr(0,1)==\"<\"?\">\":\"\") + x;\n\t\t\tif(cref !== null && cref.length === 2) {\n\t\t\t\tidx = 0; d=cref[1];\n\t\t\t\tfor(i=0; i != d.length; ++i) {\n\t\t\t\t\tif((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\t\t\t\tidx = 26*idx + cc;\n\t\t\t\t}\n\t\t\t\t--idx;\n\t\t\t\ttagc = idx;\n\t\t\t} else ++tagc;\n\t\t\tfor(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n\t\t\ttag = parsexmltag(x.substr(0,i), true);\n\t\t\tif(!tag.r) tag.r = utils.encode_cell({r:tagr-1, c:tagc});\n\t\t\td = x.substr(i);\n\t\t\tp = {t:\"\"};\n\n\t\t\tif((cref=d.match(match_v))!== null && cref[1] !== '') p.v=unescapexml(cref[1]);\n\t\t\tif(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]);\n\n\t\t\t/* SCHEMA IS ACTUALLY INCORRECT HERE. IF A CELL HAS NO T, EMIT \"\" */\n\t\t\tif(tag.t === undefined && p.v === undefined) {\n\t\t\t\tif(!opts.sheetStubs) continue;\n\t\t\t\tp.t = \"stub\";\n\t\t\t}\n\t\t\telse p.t = tag.t || \"n\";\n\t\t\tif(guess.s.c > idx) guess.s.c = idx;\n\t\t\tif(guess.e.c < idx) guess.e.c = idx;\n\t\t\t/* 18.18.11 t ST_CellType */\n\t\t\tswitch(p.t) {\n\t\t\t\tcase 'n': p.v = parseFloat(p.v); break;\n\t\t\t\tcase 's':\n\t\t\t\t\tsstr = strs[parseInt(p.v, 10)];\n\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\tp.r = sstr.r;\n\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'str':\n\t\t\t\t\tp.t = \"s\";\n\t\t\t\t\tp.v = (p.v!=null) ? utf8read(p.v) : '';\n\t\t\t\t\tif(opts.cellHTML) p.h = p.v;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inlineStr':\n\t\t\t\t\tcref = d.match(isregex);\n\t\t\t\t\tp.t = 's';\n\t\t\t\t\tif(cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t; } else p.v = \"\";\n\t\t\t\t\tbreak; // inline string\n\t\t\t\tcase 'b': p.v = parsexmlbool(p.v); break;\n\t\t\t\tcase 'd':\n\t\t\t\t\tif(!opts.cellDates) { p.v = datenum(p.v); p.t = 'n'; }\n\t\t\t\t\tbreak;\n\t\t\t\t/* error string in .v, number in .v */\n\t\t\t\tcase 'e': p.w = p.v; p.v = RBErr[p.v]; break;\n\t\t\t}\n\t\t\t/* formatting */\n\t\t\tfmtid = fillid = 0;\n\t\t\tif(do_format && tag.s !== undefined) {\n\t\t\t\tcf = styles.CellXf[tag.s];\n\t\t\t\tif(cf != null) {\n\t\t\t\t\tif(cf.numFmtId != null) fmtid = cf.numFmtId;\n\t\t\t\t\tif(opts.cellStyles && cf.fillId != null) fillid = cf.fillId;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsafe_format(p, fmtid, fillid, opts);\n\t\t\ts[tag.r] = p;\n\t\t}\n\t}\n}; })();\n\nfunction write_ws_xml_data(ws, opts, idx, wb) {\n\tvar o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = \"\", cols = [], R, C;\n\tfor(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = range.s.r; R <= range.e.r; ++R) {\n\t\tr = [];\n\t\trr = encode_row(R);\n\t\tfor(C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tref = cols[C] + rr;\n\t\t\tif(ws[ref] === undefined) continue;\n\t\t\tif((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell);\n\t\t}\n\t\tif(r.length > 0) o[o.length] = (writextag('row', r.join(\"\"), {r:rr}));\n\t}\n\treturn o.join(\"\");\n}\n\nvar WS_XML_ROOT = writextag('worksheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction write_ws_xml(idx, opts, wb) {\n\tvar o = [XML_HEADER, WS_XML_ROOT];\n\tvar s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n\tvar ws = wb.Sheets[s];\n\tif(ws === undefined) ws = {};\n\tvar ref = ws['!ref']; if(ref === undefined) ref = 'A1';\n\to[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n\tif(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n\to[sidx = o.length] = '<sheetData/>';\n\tif(ws['!ref'] !== undefined) {\n\t\trdata = write_ws_xml_data(ws, opts, idx, wb);\n\t\tif(rdata.length > 0) o[o.length] = (rdata);\n\t}\n\tif(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n\tif(ws['!merges'] !== undefined && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n\tif(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.718 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n\tvar z = [];\n\tz.r = data.read_shift(4);\n\tdata.l += length-4;\n\treturn z;\n}\n\n/* [MS-XLSB] 2.4.812 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.815 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n\tvar z = {};\n\t/* TODO: pull flags */\n\tdata.l += 19;\n\tz.name = parse_XLSBCodeName(data, length - 19);\n\treturn z;\n}\n\n/* [MS-XLSB] 2.4.303 BrtCellBlank */\nfunction parse_BrtCellBlank(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\treturn [cell];\n}\nfunction write_BrtCellBlank(cell, val, o) {\n\tif(o == null) o = new_buf(8);\n\treturn write_XLSBCell(val, o);\n}\n\n\n/* [MS-XLSB] 2.4.304 BrtCellBool */\nfunction parse_BrtCellBool(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\n\n/* [MS-XLSB] 2.4.305 BrtCellError */\nfunction parse_BrtCellError(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'e'];\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellIsst */\nfunction parse_BrtCellIsst(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\n\n/* [MS-XLSB] 2.4.310 BrtCellReal */\nfunction parse_BrtCellReal(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.311 BrtCellRk */\nfunction parse_BrtCellRk(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellSt */\nfunction parse_BrtCellSt(data, length) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\n\n/* [MS-XLSB] 2.4.647 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'b'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length-9);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-9;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.648 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'e'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length-9);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-9;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.649 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\tvar o = [cell, value, 'n'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, length - 16);\n\t\to[3] = \"\"; /* TODO */\n\t}\n\telse data.l += length-16;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n\tvar start = data.l;\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\tvar o = [cell, value, 'str'];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBCellParsedFormula(data, start + length - data.l);\n\t}\n\telse data.l = start + length;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.676 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.656 BrtHLink */\nfunction parse_BrtHLink(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar relId = parse_XLNullableWideString(data);\n\tvar loc = parse_XLWideString(data);\n\tvar tooltip = parse_XLWideString(data);\n\tvar display = parse_XLWideString(data);\n\tdata.l = end;\n\treturn {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display};\n}\n\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, opts, rels) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tvar s = {};\n\n\tvar ref;\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\n\tvar pass = false, end = false;\n\tvar row, p, cf, R, C, addr, sstr, rr;\n\tvar mergecells = [];\n\trecordhopper(data, function ws_parse(val, R) {\n\t\tif(end) return;\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtWsDim': ref = val; break;\n\t\t\tcase 'BrtRowHdr':\n\t\t\t\trow = val;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n\t\t\t\trr = encode_row(row.r);\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtFmlaBool':\n\t\t\tcase 'BrtFmlaError':\n\t\t\tcase 'BrtFmlaNum':\n\t\t\tcase 'BrtFmlaString':\n\t\t\tcase 'BrtCellBool':\n\t\t\tcase 'BrtCellError':\n\t\t\tcase 'BrtCellIsst':\n\t\t\tcase 'BrtCellReal':\n\t\t\tcase 'BrtCellRk':\n\t\t\tcase 'BrtCellSt':\n\t\t\t\tp = {t:val[2]};\n\t\t\t\tswitch(val[2]) {\n\t\t\t\t\tcase 'n': p.v = val[1]; break;\n\t\t\t\t\tcase 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n\t\t\t\t\tcase 'b': p.v = val[1] ? true : false; break;\n\t\t\t\t\tcase 'e': p.v = val[1]; p.w = BErr[p.v]; break;\n\t\t\t\t\tcase 'str': p.t = 's'; p.v = utf8read(val[1]); break;\n\t\t\t\t}\n\t\t\t\tif(opts.cellFormula && val.length > 3) p.f = val[3];\n\t\t\t\tif((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts);\n\t\t\t\ts[encode_col(C=val[0].c) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtCellBlank': if(!opts.sheetStubs) break;\n\t\t\t\tp = {t:'s',v:undefined};\n\t\t\t\ts[encode_col(C=val[0].c) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\t/* Merge Cells */\n\t\t\tcase 'BrtBeginMergeCells': break;\n\t\t\tcase 'BrtEndMergeCells': break;\n\t\t\tcase 'BrtMergeCell': mergecells.push(val); break;\n\n\t\t\tcase 'BrtHLink':\n\t\t\t\tvar rel = rels['!id'][val.relId];\n\t\t\t\tif(rel) {\n\t\t\t\t\tval.Target = rel.Target;\n\t\t\t\t\tif(val.loc) val.Target += \"#\"+val.loc;\n\t\t\t\t\tval.Rel = rel;\n\t\t\t\t}\n\t\t\t\tfor(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n\t\t\t\t\taddr = encode_cell({c:C,r:R});\n\t\t\t\t\tif(!s[addr]) s[addr] = {t:'s',v:undefined};\n\t\t\t\t\ts[addr].l = val;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'BrtArrFmla': break; // TODO\n\t\t\tcase 'BrtShrFmla': break; // TODO\n\t\t\tcase 'BrtBeginSheet': break;\n\t\t\tcase 'BrtWsProp': break; // TODO\n\t\t\tcase 'BrtSheetCalcProp': break; // TODO\n\t\t\tcase 'BrtBeginWsViews': break; // TODO\n\t\t\tcase 'BrtBeginWsView': break; // TODO\n\t\t\tcase 'BrtPane': break; // TODO\n\t\t\tcase 'BrtSel': break; // TODO\n\t\t\tcase 'BrtEndWsView': break; // TODO\n\t\t\tcase 'BrtEndWsViews': break; // TODO\n\t\t\tcase 'BrtACBegin': break; // TODO\n\t\t\tcase 'BrtRwDescent': break; // TODO\n\t\t\tcase 'BrtACEnd': break; // TODO\n\t\t\tcase 'BrtWsFmtInfoEx14': break; // TODO\n\t\t\tcase 'BrtWsFmtInfo': break; // TODO\n\t\t\tcase 'BrtBeginColInfos': break; // TODO\n\t\t\tcase 'BrtColInfo': break; // TODO\n\t\t\tcase 'BrtEndColInfos': break; // TODO\n\t\t\tcase 'BrtBeginSheetData': break; // TODO\n\t\t\tcase 'BrtEndSheetData': break; // TODO\n\t\t\tcase 'BrtSheetProtection': break; // TODO\n\t\t\tcase 'BrtPrintOptions': break; // TODO\n\t\t\tcase 'BrtMargins': break; // TODO\n\t\t\tcase 'BrtPageSetup': break; // TODO\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtEndSheet': break; // TODO\n\t\t\tcase 'BrtDrawing': break; // TODO\n\t\t\tcase 'BrtLegacyDrawing': break; // TODO\n\t\t\tcase 'BrtLegacyDrawingHF': break; // TODO\n\t\t\tcase 'BrtPhoneticInfo': break; // TODO\n\t\t\tcase 'BrtBeginHeaderFooter': break; // TODO\n\t\t\tcase 'BrtEndHeaderFooter': break; // TODO\n\t\t\tcase 'BrtBrk': break; // TODO\n\t\t\tcase 'BrtBeginRwBrk': break; // TODO\n\t\t\tcase 'BrtEndRwBrk': break; // TODO\n\t\t\tcase 'BrtBeginColBrk': break; // TODO\n\t\t\tcase 'BrtEndColBrk': break; // TODO\n\t\t\tcase 'BrtBeginUserShViews': break; // TODO\n\t\t\tcase 'BrtBeginUserShView': break; // TODO\n\t\t\tcase 'BrtEndUserShView': break; // TODO\n\t\t\tcase 'BrtEndUserShViews': break; // TODO\n\t\t\tcase 'BrtBkHim': break; // TODO\n\t\t\tcase 'BrtBeginOleObjects': break; // TODO\n\t\t\tcase 'BrtOleObject': break; // TODO\n\t\t\tcase 'BrtEndOleObjects': break; // TODO\n\t\t\tcase 'BrtBeginListParts': break; // TODO\n\t\t\tcase 'BrtListPart': break; // TODO\n\t\t\tcase 'BrtEndListParts': break; // TODO\n\t\t\tcase 'BrtBeginSortState': break; // TODO\n\t\t\tcase 'BrtBeginSortCond': break; // TODO\n\t\t\tcase 'BrtEndSortCond': break; // TODO\n\t\t\tcase 'BrtEndSortState': break; // TODO\n\t\t\tcase 'BrtBeginConditionalFormatting': break; // TODO\n\t\t\tcase 'BrtEndConditionalFormatting': break; // TODO\n\t\t\tcase 'BrtBeginCFRule': break; // TODO\n\t\t\tcase 'BrtEndCFRule': break; // TODO\n\t\t\tcase 'BrtBeginDVals': break; // TODO\n\t\t\tcase 'BrtDVal': break; // TODO\n\t\t\tcase 'BrtEndDVals': break; // TODO\n\t\t\tcase 'BrtRangeProtection': break; // TODO\n\t\t\tcase 'BrtBeginDCon': break; // TODO\n\t\t\tcase 'BrtEndDCon': break; // TODO\n\t\t\tcase 'BrtBeginDRefs': break;\n\t\t\tcase 'BrtDRef': break;\n\t\t\tcase 'BrtEndDRefs': break;\n\n\t\t\t/* ActiveX */\n\t\t\tcase 'BrtBeginActiveXControls': break;\n\t\t\tcase 'BrtActiveX': break;\n\t\t\tcase 'BrtEndActiveXControls': break;\n\n\t\t\t/* AutoFilter */\n\t\t\tcase 'BrtBeginAFilter': break;\n\t\t\tcase 'BrtEndAFilter': break;\n\t\t\tcase 'BrtBeginFilterColumn': break;\n\t\t\tcase 'BrtBeginFilters': break;\n\t\t\tcase 'BrtFilter': break;\n\t\t\tcase 'BrtEndFilters': break;\n\t\t\tcase 'BrtEndFilterColumn': break;\n\t\t\tcase 'BrtDynamicFilter': break;\n\t\t\tcase 'BrtTop10Filter': break;\n\t\t\tcase 'BrtBeginCustomFilters': break;\n\t\t\tcase 'BrtCustomFilter': break;\n\t\t\tcase 'BrtEndCustomFilters': break;\n\n\t\t\t/* Smart Tags */\n\t\t\tcase 'BrtBeginSmartTags': break;\n\t\t\tcase 'BrtBeginCellSmartTags': break;\n\t\t\tcase 'BrtBeginCellSmartTag': break;\n\t\t\tcase 'BrtCellSmartTagProperty': break;\n\t\t\tcase 'BrtEndCellSmartTag': break;\n\t\t\tcase 'BrtEndCellSmartTags': break;\n\t\t\tcase 'BrtEndSmartTags': break;\n\n\t\t\t/* Cell Watch */\n\t\t\tcase 'BrtBeginCellWatches': break;\n\t\t\tcase 'BrtCellWatch': break;\n\t\t\tcase 'BrtEndCellWatches': break;\n\n\t\t\t/* Table */\n\t\t\tcase 'BrtTable': break;\n\n\t\t\t/* Ignore Cell Errors */\n\t\t\tcase 'BrtBeginCellIgnoreECs': break;\n\t\t\tcase 'BrtCellIgnoreEC': break;\n\t\t\tcase 'BrtEndCellIgnoreECs': break;\n\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n\t\t}\n\t}, opts);\n\tif(!s[\"!ref\"] && (refguess.s.r < 1000000 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s[\"!ref\"] = encode_range(ref);\n\tif(opts.sheetRows && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows < +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(mergecells.length > 0) s[\"!merges\"] = mergecells;\n\treturn s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba, cell, R, C, opts) {\n\tif(cell.v === undefined) return \"\";\n\tvar vv = \"\";\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': case 'e': vv = ''+cell.v; break;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar o = {r:R, c:C};\n\t/* TODO: cell style */\n\to.s = get_cell_style(opts.cellXfs, cell, opts);\n\tswitch(cell.t) {\n\t\tcase 's': case 'str':\n\t\t\tif(opts.bookSST) {\n\t\t\t\tvv = get_sst_id(opts.Strings, cell.v);\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t\tcase 'n': break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t}\n\twrite_record(ba, \"BrtCellBlank\", write_BrtCellBlank(cell, o));\n}\n\nfunction write_CELLTABLE(ba, ws, idx, opts, wb) {\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\twrite_record(ba, 'BrtBeginSheetData');\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\t/* [ACCELLTABLE] */\n\t\t/* BrtRowHdr */\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t/* *16384CELL */\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tif(!ws[ref]) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_bin_cell(ba, ws[ref], R, C, opts);\n\t\t}\n\t}\n\twrite_record(ba, 'BrtEndSheetData');\n}\n\nfunction write_ws_bin(idx, opts, wb) {\n\tvar ba = buf_array();\n\tvar s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n\tvar r = safe_decode_range(ws['!ref'] || \"A1\");\n\twrite_record(ba, \"BrtBeginSheet\");\n\t/* [BrtWsProp] */\n\twrite_record(ba, \"BrtWsDim\", write_BrtWsDim(r));\n\t/* [WSVIEWS2] */\n\t/* [WSFMTINFO] */\n\t/* *COLINFOS */\n\twrite_CELLTABLE(ba, ws, idx, opts, wb);\n\t/* [BrtSheetCalcProp] */\n\t/* [[BrtSheetProtectionIso] BrtSheetProtection] */\n\t/* *([BrtRangeProtectionIso] BrtRangeProtection) */\n\t/* [SCENMAN] */\n\t/* [AUTOFILTER] */\n\t/* [SORTSTATE] */\n\t/* [DCON] */\n\t/* [USERSHVIEWS] */\n\t/* [MERGECELLS] */\n\t/* [BrtPhoneticInfo] */\n\t/* *CONDITIONALFORMATTING */\n\t/* [DVALS] */\n\t/* *BrtHLink */\n\t/* [BrtPrintOptions] */\n\t/* [BrtMargins] */\n\t/* [BrtPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* [RWBRK] */\n\t/* [COLBRK] */\n\t/* *BrtBigName */\n\t/* [CELLWATCHES] */\n\t/* [IGNOREECS] */\n\t/* [SMARTTAGS] */\n\t/* [BrtDrawing] */\n\t/* [BrtLegacyDrawing] */\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [OLEOBJECTS] */\n\t/* [ACTIVEXCONTROLS] */\n\t/* [WEBPUBITEMS] */\n\t/* [LISTPARTS] */\n\t/* FRTWORKSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n\t['allowRefreshQuery', '0'],\n\t['autoCompressPictures', '1'],\n\t['backupFile', '0'],\n\t['checkCompatibility', '0'],\n\t['codeName', ''],\n\t['date1904', '0'],\n\t['dateCompatibility', '1'],\n\t//['defaultThemeVersion', '0'],\n\t['filterPrivacy', '0'],\n\t['hidePivotFieldList', '0'],\n\t['promptedSolutions', '0'],\n\t['publishItems', '0'],\n\t['refreshAllConnections', false],\n\t['saveExternalLinkValues', '1'],\n\t['showBorderUnselectedTables', '1'],\n\t['showInkAnnotation', '1'],\n\t['showObjects', 'all'],\n\t['showPivotChartFilter', '0']\n\t//['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n\t['activeTab', '0'],\n\t['autoFilterDateGrouping', '1'],\n\t['firstSheet', '0'],\n\t['minimized', '0'],\n\t['showHorizontalScroll', '1'],\n\t['showSheetTabs', '1'],\n\t['showVerticalScroll', '1'],\n\t['tabRatio', '600'],\n\t['visibility', 'visible']\n\t//window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n\t['state', 'visible']\n];\n\n/* 18.2.2 (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n\t['calcCompleted', 'true'],\n\t['calcMode', 'auto'],\n\t['calcOnSave', 'true'],\n\t['concurrentCalc', 'true'],\n\t['fullCalcOnLoad', 'false'],\n\t['fullPrecision', 'true'],\n\t['iterate', 'false'],\n\t['iterateCount', '100'],\n\t['iterateDelta', '0.001'],\n\t['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\nvar CustomWBViewDef = [\n\t['autoUpdate', 'false'],\n\t['changesSavedWin', 'false'],\n\t['includeHiddenRowCol', 'true'],\n\t['includePrintSettings', 'true'],\n\t['maximized', 'false'],\n\t['minimized', 'false'],\n\t['onlySync', 'false'],\n\t['personalView', 'false'],\n\t['showComments', 'commIndicator'],\n\t['showFormulaBar', 'true'],\n\t['showHorizontalScroll', 'true'],\n\t['showObjects', 'all'],\n\t['showSheetTabs', 'true'],\n\t['showStatusbar', 'true'],\n\t['showVerticalScroll', 'true'],\n\t['tabRatio', '600'],\n\t['xWindow', '0'],\n\t['yWindow', '0']\n];\n\nfunction push_defaults_array(target, defaults) {\n\tfor(var j = 0; j != target.length; ++j) { var w = target[j];\n\t\tfor(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n\t\t\tif(w[z[0]] == null) w[z[0]] = z[1];\n\t\t}\n\t}\n}\nfunction push_defaults(target, defaults) {\n\tfor(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n\t\tif(target[z[0]] == null) target[z[0]] = z[1];\n\t}\n}\n\nfunction parse_wb_defaults(wb) {\n\tpush_defaults(wb.WBProps, WBPropsDef);\n\tpush_defaults(wb.CalcPr, CalcPrDef);\n\n\tpush_defaults_array(wb.WBView, WBViewDef);\n\tpush_defaults_array(wb.Sheets, SheetDef);\n\n\t_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar pass = false, xmlns = \"xmlns\";\n\tdata.match(tagregex).forEach(function xml_wb(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '<?xml': break;\n\n\t\t\t/* 18.2.27 workbook CT_Workbook 1 */\n\t\t\tcase '<workbook':\n\t\t\t\tif(x.match(wbnsregex)) xmlns = \"xmlns\" + x.match(/<(\\w+):/)[1];\n\t\t\t\twb.xmlns = y[xmlns];\n\t\t\t\tbreak;\n\t\t\tcase '</workbook>': break;\n\n\t\t\t/* 18.2.13 fileVersion CT_FileVersion ? */\n\t\t\tcase '<fileVersion': delete y[0]; wb.AppVersion = y; break;\n\t\t\tcase '<fileVersion/>': break;\n\n\t\t\t/* 18.2.12 fileSharing CT_FileSharing ? */\n\t\t\tcase '<fileSharing': case '<fileSharing/>': break;\n\n\t\t\t/* 18.2.28 workbookPr CT_WorkbookPr ? */\n\t\t\tcase '<workbookPr': delete y[0]; wb.WBProps = y; break;\n\t\t\tcase '<workbookPr/>': delete y[0]; wb.WBProps = y; break;\n\n\t\t\t/* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n\t\t\tcase '<workbookProtection': break;\n\t\t\tcase '<workbookProtection/>': break;\n\n\t\t\t/* 18.2.1 bookViews CT_BookViews ? */\n\t\t\tcase '<bookViews>': case '</bookViews>': break;\n\t\t\t/* 18.2.30 workbookView CT_BookView + */\n\t\t\tcase '<workbookView': delete y[0]; wb.WBView.push(y); break;\n\n\t\t\t/* 18.2.20 sheets CT_Sheets 1 */\n\t\t\tcase '<sheets>': case '</sheets>': break; // aggregate sheet\n\t\t\t/* 18.2.19 sheet CT_Sheet + */\n\t\t\tcase '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break;\n\n\t\t\t/* 18.2.15 functionGroups CT_FunctionGroups ? */\n\t\t\tcase '<functionGroups': case '<functionGroups/>': break;\n\t\t\t/* 18.2.14 functionGroup CT_FunctionGroup + */\n\t\t\tcase '<functionGroup': break;\n\n\t\t\t/* 18.2.9 externalReferences CT_ExternalReferences ? */\n\t\t\tcase '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;\n\t\t\t/* 18.2.8 externalReference CT_ExternalReference + */\n\t\t\tcase '<externalReference': break;\n\n\t\t\t/* 18.2.6 definedNames CT_DefinedNames ? */\n\t\t\tcase '<definedNames/>': break;\n\t\t\tcase '<definedNames>': case '<definedNames': pass=true; break;\n\t\t\tcase '</definedNames>': pass=false; break;\n\t\t\t/* 18.2.5 definedName CT_DefinedName + */\n\t\t\tcase '<definedName': case '<definedName/>': case '</definedName>': break;\n\n\t\t\t/* 18.2.2 calcPr CT_CalcPr ? */\n\t\t\tcase '<calcPr': delete y[0]; wb.CalcPr = y; break;\n\t\t\tcase '<calcPr/>': delete y[0]; wb.CalcPr = y; break;\n\n\t\t\t/* 18.2.16 oleSize CT_OleSize ? (ref required) */\n\t\t\tcase '<oleSize': break;\n\n\t\t\t/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */\n\t\t\tcase '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;\n\t\t\t/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */\n\t\t\tcase '<customWorkbookView': case '</customWorkbookView>': break;\n\n\t\t\t/* 18.2.18 pivotCaches CT_PivotCaches ? */\n\t\t\tcase '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;\n\t\t\t/* 18.2.17 pivotCache CT_PivotCache ? */\n\t\t\tcase '<pivotCache': break;\n\n\t\t\t/* 18.2.21 smartTagPr CT_SmartTagPr ? */\n\t\t\tcase '<smartTagPr': case '<smartTagPr/>': break;\n\n\t\t\t/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n\t\t\tcase '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;\n\t\t\t/* 18.2.22 smartTagType CT_SmartTagType ? */\n\t\t\tcase '<smartTagType': break;\n\n\t\t\t/* 18.2.24 webPublishing CT_WebPublishing ? */\n\t\t\tcase '<webPublishing': case '<webPublishing/>': break;\n\n\t\t\t/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n\t\t\tcase '<fileRecoveryPr': case '<fileRecoveryPr/>': break;\n\n\t\t\t/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n\t\t\tcase '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;\n\t\t\t/* 18.2.25 webPublishObject CT_WebPublishObject ? */\n\t\t\tcase '<webPublishObject': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '<extLst>': case '</extLst>': case '<extLst/>': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '<ext': pass=true; break; //TODO: check with versions of excel\n\t\t\tcase '</ext>': pass=false; break;\n\n\t\t\t/* Others */\n\t\t\tcase '<ArchID': break;\n\t\t\tcase '<AlternateContent': pass=true; break;\n\t\t\tcase '</AlternateContent>': pass=false; break;\n\n\t\t\tdefault: if(!pass && opts.WTF) throw 'unrecognized ' + y[0] + ' in workbook';\n\t\t}\n\t});\n\tif(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error(\"Unknown Namespace: \" + wb.xmlns);\n\n\tparse_wb_defaults(wb);\n\n\treturn wb;\n}\n\nvar WB_XML_ROOT = writextag('workbook', null, {\n\t'xmlns': XMLNS.main[0],\n\t//'xmlns:mx': XMLNS.mx,\n\t//'xmlns:s': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction safe1904(wb) {\n\t/* TODO: store date1904 somewhere else */\n\ttry { return parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\"; } catch(e) { return \"false\"; }\n}\n\nfunction write_wb_xml(wb, opts) {\n\tvar o = [XML_HEADER];\n\to[o.length] = WB_XML_ROOT;\n\to[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb)}));\n\to[o.length] = \"<sheets>\";\n\tfor(var i = 0; i != wb.SheetNames.length; ++i)\n\t\to[o.length] = (writextag('sheet',null,{name:wb.SheetNames[i].substr(0,31), sheetId:\"\"+(i+1), \"r:id\":\"rId\"+(i+1)}));\n\to[o.length] = \"</sheets>\";\n\tif(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.301 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length) {\n\tvar z = {};\n\tz.hsState = data.read_shift(4); //ST_SheetState\n\tz.iTabID = data.read_shift(4);\n\tz.strRelID = parse_RelID(data,length-8);\n\tz.name = parse_XLWideString(data);\n\treturn z;\n}\nfunction write_BrtBundleSh(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.hsState);\n\to.write_shift(4, data.iTabID);\n\twrite_RelID(data.strRelID, o);\n\twrite_XLWideString(data.name.substr(0,31), o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.807 BrtWbProp */\nfunction parse_BrtWbProp(data, length) {\n\tdata.read_shift(4);\n\tvar dwThemeVersion = data.read_shift(4);\n\tvar strName = (length > 8) ? parse_XLWideString(data) : \"\";\n\treturn [dwThemeVersion, strName];\n}\nfunction write_BrtWbProp(data, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n\tvar o = {};\n\tdata.read_shift(4);\n\to.ArchID = data.read_shift(4);\n\tdata.l += length - 8;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction parse_wb_bin(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar pass = false, z;\n\n\trecordhopper(data, function hopper_wb(val, R) {\n\t\tswitch(R.n) {\n\t\t\tcase 'BrtBundleSh': wb.Sheets.push(val); break;\n\n\t\t\tcase 'BrtBeginBook': break;\n\t\t\tcase 'BrtFileVersion': break;\n\t\t\tcase 'BrtWbProp': break;\n\t\t\tcase 'BrtACBegin': break;\n\t\t\tcase 'BrtAbsPath15': break;\n\t\t\tcase 'BrtACEnd': break;\n\t\t\tcase 'BrtWbFactoid': break;\n\t\t\t/*case 'BrtBookProtectionIso': break;*/\n\t\t\tcase 'BrtBookProtection': break;\n\t\t\tcase 'BrtBeginBookViews': break;\n\t\t\tcase 'BrtBookView': break;\n\t\t\tcase 'BrtEndBookViews': break;\n\t\t\tcase 'BrtBeginBundleShs': break;\n\t\t\tcase 'BrtEndBundleShs': break;\n\t\t\tcase 'BrtBeginFnGroup': break;\n\t\t\tcase 'BrtEndFnGroup': break;\n\t\t\tcase 'BrtBeginExternals': break;\n\t\t\tcase 'BrtSupSelf': break;\n\t\t\tcase 'BrtSupBookSrc': break;\n\t\t\tcase 'BrtExternSheet': break;\n\t\t\tcase 'BrtEndExternals': break;\n\t\t\tcase 'BrtName': break;\n\t\t\tcase 'BrtCalcProp': break;\n\t\t\tcase 'BrtUserBookView': break;\n\t\t\tcase 'BrtBeginPivotCacheIDs': break;\n\t\t\tcase 'BrtBeginPivotCacheID': break;\n\t\t\tcase 'BrtEndPivotCacheID': break;\n\t\t\tcase 'BrtEndPivotCacheIDs': break;\n\t\t\tcase 'BrtWebOpt': break;\n\t\t\tcase 'BrtFileRecover': break;\n\t\t\tcase 'BrtFileSharing': break;\n\t\t\t/*case 'BrtBeginWebPubItems': break;\n\t\t\tcase 'BrtBeginWebPubItem': break;\n\t\t\tcase 'BrtEndWebPubItem': break;\n\t\t\tcase 'BrtEndWebPubItems': break;*/\n\n\t\t\t/* Smart Tags */\n\t\t\tcase 'BrtBeginSmartTagTypes': break;\n\t\t\tcase 'BrtSmartTagType': break;\n\t\t\tcase 'BrtEndSmartTagTypes': break;\n\n\t\t\tcase 'BrtFRTBegin': pass = true; break;\n\t\t\tcase 'BrtFRTArchID$': break;\n\t\t\tcase 'BrtWorkBookPr15': break;\n\t\t\tcase 'BrtFRTEnd': pass = false; break;\n\t\t\tcase 'BrtEndBook': break;\n\t\t\tdefault: if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + R.n);\n\t\t}\n\t});\n\n\tparse_wb_defaults(wb);\n\n\treturn wb;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BUNDLESHS(ba, wb, opts) {\n\twrite_record(ba, \"BrtBeginBundleShs\");\n\tfor(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n\t\tvar d = { hsState: 0, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n\t\twrite_record(ba, \"BrtBundleSh\", write_BrtBundleSh(d));\n\t}\n\twrite_record(ba, \"BrtEndBundleShs\");\n}\n\n/* [MS-XLSB] 2.4.643 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n\tif(!o) o = new_buf(127);\n\tfor(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n\twrite_XLWideString(\"SheetJS\", o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(\"7262\", o);\n\to.length = o.l;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_BOOKVIEWS(ba, wb, opts) {\n\twrite_record(ba, \"BrtBeginBookViews\");\n\t/* 1*(BrtBookView *FRT) */\n\twrite_record(ba, \"BrtEndBookViews\");\n}\n\n/* [MS-XLSB] 2.4.302 BrtCalcProp */\nfunction write_BrtCalcProp(data, o) {\n\tif(!o) o = new_buf(26);\n\to.write_shift(4,0); /* force recalc */\n\to.write_shift(4,1);\n\to.write_shift(4,0);\n\twrite_Xnum(0, o);\n\to.write_shift(-4, 1023);\n\to.write_shift(1, 0x33);\n\to.write_shift(1, 0x00);\n\treturn o;\n}\n\nfunction write_BrtFileRecover(data, o) {\n\tif(!o) o = new_buf(1);\n\to.write_shift(1,0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.7.60 Workbook */\nfunction write_wb_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginBook\");\n\twrite_record(ba, \"BrtFileVersion\", write_BrtFileVersion());\n\t/* [[BrtFileSharingIso] BrtFileSharing] */\n\twrite_record(ba, \"BrtWbProp\", write_BrtWbProp());\n\t/* [ACABSPATH] */\n\t/* [[BrtBookProtectionIso] BrtBookProtection] */\n\twrite_BOOKVIEWS(ba, wb, opts);\n\twrite_BUNDLESHS(ba, wb, opts);\n\t/* [FNGROUP] */\n\t/* [EXTERNALS] */\n\t/* *BrtName */\n\twrite_record(ba, \"BrtCalcProp\", write_BrtCalcProp());\n\t/* [BrtOleSize] */\n\t/* *(BrtUserBookView *FRT) */\n\t/* [PIVOTCACHEIDS] */\n\t/* [BrtWbFactoid] */\n\t/* [SMARTTAGTYPES] */\n\t/* [BrtWebOpt] */\n\twrite_record(ba, \"BrtFileRecover\", write_BrtFileRecover());\n\t/* [WEBPUBITEMS] */\n\t/* [CRERRS] */\n\t/* FRTWORKBOOK */\n\twrite_record(ba, \"BrtEndBook\");\n\n\treturn ba.end();\n}\nfunction parse_wb(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_wb_bin : parse_wb_xml)(data, opts);\n}\n\nfunction parse_ws(data, name, opts, rels) {\n\treturn (name.substr(-4)===\".bin\" ? parse_ws_bin : parse_ws_xml)(data, opts, rels);\n}\n\nfunction parse_sty(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_sty_bin : parse_sty_xml)(data, opts);\n}\n\nfunction parse_theme(data, name, opts) {\n\treturn parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_sst_bin : parse_sst_xml)(data, opts);\n}\n\nfunction parse_cmnt(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_comments_bin : parse_comments_xml)(data, opts);\n}\n\nfunction parse_cc(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? parse_cc_bin : parse_cc_xml)(data, opts);\n}\n\nfunction write_wb(wb, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data, name, opts, wb) {\n\treturn (name.substr(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb);\n}\n\nfunction write_sty(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n/*\nfunction write_cmnt(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n\nfunction write_cc(data, name, opts) {\n\treturn (name.substr(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nvar _chr = function(c) { return String.fromCharCode(c); };\nfunction xlml_parsexmltag(tag, skip_root) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = []; if(!skip_root) z[0] = words[0];\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n\t\telse {\n\t\t\tif(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n\t\t\telse w = y[1].substr(j+1);\n\t\t\tz[w] = y[2].substr(1,y[2].length-2);\n\t\t}\n\t}\n\treturn z;\n}\nfunction xlml_parsexmltagobj(tag) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = {};\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].substr(1,y[2].length-2);\n\t\telse {\n\t\t\tif(y[1].substr(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].substr(6);\n\t\t\telse w = y[1].substr(j+1);\n\t\t\tz[w] = y[2].substr(1,y[2].length-2);\n\t\t}\n\t}\n\treturn z;\n}\n\n// ----\n\nfunction xlml_format(format, value) {\n\tvar fmt = XLMLFormatMap[format] || unescapexml(format);\n\tif(fmt === \"General\") return SSF._general(value);\n\treturn SSF.format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, Rn, cp, val) {\n\tswitch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n\t\tcase \"boolean\": val = parsexmlbool(val); break;\n\t\tcase \"i2\": case \"int\": val = parseInt(val, 10); break;\n\t\tcase \"r4\": case \"float\": val = parseFloat(val); break;\n\t\tcase \"date\": case \"dateTime.tz\": val = new Date(val); break;\n\t\tcase \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n\t\tdefault: throw \"bad custprop:\" + cp[0];\n\t}\n\tCustprops[unescapexml(Rn[3])] = val;\n}\n\nfunction safe_format_xlml(cell, nf, o) {\n\ttry {\n\t\tif(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n\t\telse if(nf === \"General\") {\n\t\t\tif(cell.t === 'n') {\n\t\t\t\tif((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);\n\t\t\t\telse cell.w = SSF._general_num(cell.v);\n\t\t\t}\n\t\t\telse cell.w = SSF._general(cell.v);\n\t\t}\n\t\telse cell.w = xlml_format(nf||\"General\", cell.v);\n\t\tif(o.cellNF) cell.z = XLMLFormatMap[nf]||nf||\"General\";\n\t} catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n\tif(opts.cellStyles) {\n\t\tif(stag.Interior) {\n\t\t\tvar I = stag.Interior;\n\t\t\tif(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n\t\t}\n\t}\n\tstyles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, o) {\n\tvar nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n\tvar interiors = [];\n\tif(sid === undefined && row) sid = row.StyleID;\n\tif(sid === undefined && csty) sid = csty.StyleID;\n\twhile(styles[sid] !== undefined) {\n\t\tif(styles[sid].nf) nf = styles[sid].nf;\n\t\tif(styles[sid].Interior) interiors.push(styles[sid].Interior);\n\t\tif(!styles[sid].Parent) break;\n\t\tsid = styles[sid].Parent;\n\t}\n\tswitch(data.Type) {\n\t\tcase 'Boolean':\n\t\t\tcell.t = 'b';\n\t\t\tcell.v = parsexmlbool(xml);\n\t\t\tbreak;\n\t\tcase 'String':\n\t\t\tcell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n\t\t\tcell.v = xml.indexOf(\"<\") > -1 ? ss : cell.r;\n\t\t\tbreak;\n\t\tcase 'DateTime':\n\t\t\tcell.v = (Date.parse(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n\t\t\tif(cell.v !== cell.v) cell.v = unescapexml(xml);\n\t\t\telse if(cell.v >= 1 && cell.v<60) cell.v = cell.v -1;\n\t\t\tif(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n\t\t\t/* falls through */\n\t\tcase 'Number':\n\t\t\tif(cell.v === undefined) cell.v=+xml;\n\t\t\tif(!cell.t) cell.t = 'n';\n\t\t\tbreak;\n\t\tcase 'Error': cell.t = 'e'; cell.v = RBErr[xml]; cell.w = xml; break;\n\t\tdefault: cell.t = 's'; cell.v = xlml_fixstr(ss); break;\n\t}\n\tsafe_format_xlml(cell, nf, o);\n\tif(o.cellFormula != null && cell.Formula) {\n\t\tcell.f = rc_to_a1(unescapexml(cell.Formula), base);\n\t\tcell.Formula = undefined;\n\t}\n\tif(o.cellStyles) {\n\t\tinteriors.forEach(function(x) {\n\t\t\tif(!S.patternType && x.patternType) S.patternType = x.patternType;\n\t\t});\n\t\tcell.s = S;\n\t}\n\tcell.ixfe = cell.StyleID !== undefined ? cell.StyleID : 'Default';\n}\n\nfunction xlml_clean_comment(comment) {\n\tcomment.t = comment.v;\n\tcomment.v = comment.w = comment.ixfe = undefined;\n}\n\nfunction xlml_normalize(d) {\n\tif(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');\n\tif(typeof d === 'string') return d;\n\tthrow \"badf\";\n}\n\n/* TODO: Everything */\nvar xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\nfunction parse_xlml_xml(d, opts) {\n\tvar str = xlml_normalize(d);\n\tvar Rn;\n\tvar state = [], tmp;\n\tvar sheets = {}, sheetnames = [], cursheet = {}, sheetname = \"\";\n\tvar table = {}, cell = {}, row = {}, dtag, didx;\n\tvar c = 0, r = 0;\n\tvar refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\tvar styles = {}, stag = {};\n\tvar ss = \"\", fidx = 0;\n\tvar mergecells = [];\n\tvar Props = {}, Custprops = {}, pidx = 0, cp = {};\n\tvar comments = [], comment = {};\n\tvar cstys = [], csty;\n\txlmlregex.lastIndex = 0;\n\twhile((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n\t\tcase 'Data':\n\t\t\tif(state[state.length-1][1]) break;\n\t\t\tif(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==\"Comment\"?comment:cell, {c:c,r:r}, styles, cstys[c], row, opts);\n\t\t\telse { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n\t\t\tbreak;\n\t\tcase 'Cell':\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif(comments.length > 0) cell.c = comments;\n\t\t\t\tif((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) cursheet[encode_col(c) + encode_row(r)] = cell;\n\t\t\t\tif(cell.HRef) {\n\t\t\t\t\tcell.l = {Target:cell.HRef, tooltip:cell.HRefScreenTip};\n\t\t\t\t\tcell.HRef = cell.HRefScreenTip = undefined;\n\t\t\t\t}\n\t\t\t\tif(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\tvar cc = c + (parseInt(cell.MergeAcross,10)|0);\n\t\t\t\t\tvar rr = r + (parseInt(cell.MergeDown,10)|0);\n\t\t\t\t\tmergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n\t\t\t\t}\n\t\t\t\t++c;\n\t\t\t\tif(cell.MergeAcross) c += +cell.MergeAcross;\n\t\t\t} else {\n\t\t\t\tcell = xlml_parsexmltagobj(Rn[0]);\n\t\t\t\tif(cell.Index) c = +cell.Index - 1;\n\t\t\t\tif(c < refguess.s.c) refguess.s.c = c;\n\t\t\t\tif(c > refguess.e.c) refguess.e.c = c;\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") ++c;\n\t\t\t\tcomments = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Row':\n\t\t\tif(Rn[1]==='/' || Rn[0].substr(-2) === \"/>\") {\n\t\t\t\tif(r < refguess.s.r) refguess.s.r = r;\n\t\t\t\tif(r > refguess.e.r) refguess.e.r = r;\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") {\n\t\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\t}\n\t\t\t\tc = 0; ++r;\n\t\t\t} else {\n\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Worksheet': /* TODO: read range from FullRows/FullColumns */\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\tsheetnames.push(sheetname);\n\t\t\t\tif(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\tif(mergecells.length) cursheet[\"!merges\"] = mergecells;\n\t\t\t\tsheets[sheetname] = cursheet;\n\t\t\t} else {\n\t\t\t\trefguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };\n\t\t\t\tr = c = 0;\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tsheetname = tmp.Name;\n\t\t\t\tcursheet = {};\n\t\t\t\tmergecells = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'Table':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse if(Rn[0].slice(-2) == \"/>\") break;\n\t\t\telse {\n\t\t\t\ttable = xlml_parsexmltag(Rn[0]);\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\tcstys = [];\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'Style':\n\t\t\tif(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n\t\t\telse stag = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\n\t\tcase 'NumberFormat':\n\t\t\tstag.nf = xlml_parsexmltag(Rn[0]).Format || \"General\";\n\t\t\tbreak;\n\n\t\tcase 'Column':\n\t\t\tif(state[state.length-1][0] !== 'Table') break;\n\t\t\tcsty = xlml_parsexmltag(Rn[0]);\n\t\t\tcstys[(csty.Index-1||cstys.length)] = csty;\n\t\t\tfor(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = csty;\n\t\t\tbreak;\n\n\t\tcase 'NamedRange': break;\n\t\tcase 'NamedCell': break;\n\t\tcase 'B': break;\n\t\tcase 'I': break;\n\t\tcase 'U': break;\n\t\tcase 'S': break;\n\t\tcase 'Sub': break;\n\t\tcase 'Sup': break;\n\t\tcase 'Span': break;\n\t\tcase 'Border': break;\n\t\tcase 'Alignment': break;\n\t\tcase 'Borders': break;\n\t\tcase 'Font':\n\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n\t\t\telse fidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'Interior':\n\t\t\tif(!opts.cellStyles) break;\n\t\t\tstag.Interior = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\t\tcase 'Protection': break;\n\n\t\tcase 'Author':\n\t\tcase 'Title':\n\t\tcase 'Description':\n\t\tcase 'Created':\n\t\tcase 'Keywords':\n\t\tcase 'Subject':\n\t\tcase 'Category':\n\t\tcase 'Company':\n\t\tcase 'LastAuthor':\n\t\tcase 'LastSaved':\n\t\tcase 'LastPrinted':\n\t\tcase 'Version':\n\t\tcase 'Revision':\n\t\tcase 'TotalTime':\n\t\tcase 'HyperlinkBase':\n\t\tcase 'Manager':\n\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));\n\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'Paragraphs': break;\n\n\t\tcase 'Styles':\n\t\tcase 'Workbook':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse state.push([Rn[3], false]);\n\t\t\tbreak;\n\n\t\tcase 'Comment':\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\txlml_clean_comment(comment);\n\t\t\t\tcomments.push(comment);\n\t\t\t} else {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcomment = {a:tmp.Author};\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'Name': break;\n\n\t\tcase 'ComponentOptions':\n\t\tcase 'DocumentProperties':\n\t\tcase 'CustomDocumentProperties':\n\t\tcase 'OfficeDocumentSettings':\n\t\tcase 'PivotTable':\n\t\tcase 'PivotCache':\n\t\tcase 'Names':\n\t\tcase 'MapInfo':\n\t\tcase 'PageBreaks':\n\t\tcase 'QueryTable':\n\t\tcase 'DataValidation':\n\t\tcase 'AutoFilter':\n\t\tcase 'Sorting':\n\t\tcase 'Schema':\n\t\tcase 'data':\n\t\tcase 'ConditionalFormatting':\n\t\tcase 'SmartTagType':\n\t\tcase 'SmartTags':\n\t\tcase 'ExcelWorkbook':\n\t\tcase 'WorkbookOptions':\n\t\tcase 'WorksheetOptions':\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tvar seen = true;\n\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t/* OfficeDocumentSettings */\n\t\t\t\tcase 'OfficeDocumentSettings': switch(Rn[3]) {\n\t\t\t\t\tcase 'AllowPNG': break;\n\t\t\t\t\tcase 'RemovePersonalInformation': break;\n\t\t\t\t\tcase 'DownloadComponents': break;\n\t\t\t\t\tcase 'LocationOfComponents': break;\n\t\t\t\t\tcase 'Colors': break;\n\t\t\t\t\tcase 'Color': break;\n\t\t\t\t\tcase 'Index': break;\n\t\t\t\t\tcase 'RGB': break;\n\t\t\t\t\tcase 'PixelsPerInch': break;\n\t\t\t\t\tcase 'TargetScreenSize': break;\n\t\t\t\t\tcase 'ReadOnlyRecommended': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ComponentOptions */\n\t\t\t\tcase 'ComponentOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'Toolbar': break;\n\t\t\t\t\tcase 'HideOfficeLogo': break;\n\t\t\t\t\tcase 'SpreadsheetAutoFit': break;\n\t\t\t\t\tcase 'Label': break;\n\t\t\t\t\tcase 'Caption': break;\n\t\t\t\t\tcase 'MaxHeight': break;\n\t\t\t\t\tcase 'MaxWidth': break;\n\t\t\t\t\tcase 'NextSheetNumber': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ExcelWorkbook */\n\t\t\t\tcase 'ExcelWorkbook': switch(Rn[3]) {\n\t\t\t\t\tcase 'WindowHeight': break;\n\t\t\t\t\tcase 'WindowWidth': break;\n\t\t\t\t\tcase 'WindowTopX': break;\n\t\t\t\t\tcase 'WindowTopY': break;\n\t\t\t\t\tcase 'TabRatio': break;\n\t\t\t\t\tcase 'ProtectStructure': break;\n\t\t\t\t\tcase 'ProtectWindows': break;\n\t\t\t\t\tcase 'ActiveSheet': break;\n\t\t\t\t\tcase 'DisplayInkNotes': break;\n\t\t\t\t\tcase 'FirstVisibleSheet': break;\n\t\t\t\t\tcase 'SupBook': break;\n\t\t\t\t\tcase 'SheetName': break;\n\t\t\t\t\tcase 'SheetIndex': break;\n\t\t\t\t\tcase 'SheetIndexFirst': break;\n\t\t\t\t\tcase 'SheetIndexLast': break;\n\t\t\t\t\tcase 'Dll': break;\n\t\t\t\t\tcase 'AcceptLabelsInFormulas': break;\n\t\t\t\t\tcase 'DoNotSaveLinkValues': break;\n\t\t\t\t\tcase 'Date1904': break;\n\t\t\t\t\tcase 'Iteration': break;\n\t\t\t\t\tcase 'MaxIterations': break;\n\t\t\t\t\tcase 'MaxChange': break;\n\t\t\t\t\tcase 'Path': break;\n\t\t\t\t\tcase 'Xct': break;\n\t\t\t\t\tcase 'Count': break;\n\t\t\t\t\tcase 'SelectedSheets': break;\n\t\t\t\t\tcase 'Calculation': break;\n\t\t\t\t\tcase 'Uncalced': break;\n\t\t\t\t\tcase 'StartupPrompt': break;\n\t\t\t\t\tcase 'Crn': break;\n\t\t\t\t\tcase 'ExternName': break;\n\t\t\t\t\tcase 'Formula': break;\n\t\t\t\t\tcase 'ColFirst': break;\n\t\t\t\t\tcase 'ColLast': break;\n\t\t\t\t\tcase 'WantAdvise': break;\n\t\t\t\t\tcase 'Boolean': break;\n\t\t\t\t\tcase 'Error': break;\n\t\t\t\t\tcase 'Text': break;\n\t\t\t\t\tcase 'OLE': break;\n\t\t\t\t\tcase 'NoAutoRecover': break;\n\t\t\t\t\tcase 'PublishObjects': break;\n\t\t\t\t\tcase 'DoNotCalculateBeforeSave': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'RefModeR1C1': break;\n\t\t\t\t\tcase 'EmbedSaveSmartTags': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorkbookOptions */\n\t\t\t\tcase 'WorkbookOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'OWCVersion': break;\n\t\t\t\t\tcase 'Height': break;\n\t\t\t\t\tcase 'Width': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorksheetOptions */\n\t\t\t\tcase 'WorksheetOptions': switch(Rn[3]) {\n\t\t\t\t\tcase 'Unsynced': break;\n\t\t\t\t\tcase 'Visible': break;\n\t\t\t\t\tcase 'Print': break;\n\t\t\t\t\tcase 'Panes': break;\n\t\t\t\t\tcase 'Scale': break;\n\t\t\t\t\tcase 'Pane': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'Layout': break;\n\t\t\t\t\tcase 'Header': break;\n\t\t\t\t\tcase 'Footer': break;\n\t\t\t\t\tcase 'PageSetup': break;\n\t\t\t\t\tcase 'PageMargins': break;\n\t\t\t\t\tcase 'Selected': break;\n\t\t\t\t\tcase 'ProtectObjects': break;\n\t\t\t\t\tcase 'EnableSelection': break;\n\t\t\t\t\tcase 'ProtectScenarios': break;\n\t\t\t\t\tcase 'ValidPrinterInfo': break;\n\t\t\t\t\tcase 'HorizontalResolution': break;\n\t\t\t\t\tcase 'VerticalResolution': break;\n\t\t\t\t\tcase 'NumberofCopies': break;\n\t\t\t\t\tcase 'ActiveRow': break;\n\t\t\t\t\tcase 'ActiveCol': break;\n\t\t\t\t\tcase 'ActivePane': break;\n\t\t\t\t\tcase 'TopRowVisible': break;\n\t\t\t\t\tcase 'TopRowBottomPane': break;\n\t\t\t\t\tcase 'LeftColumnVisible': break;\n\t\t\t\t\tcase 'LeftColumnRightPane': break;\n\t\t\t\t\tcase 'FitToPage': break;\n\t\t\t\t\tcase 'RangeSelection': break;\n\t\t\t\t\tcase 'PaperSizeIndex': break;\n\t\t\t\t\tcase 'PageLayoutZoom': break;\n\t\t\t\t\tcase 'PageBreakZoom': break;\n\t\t\t\t\tcase 'FilterOn': break;\n\t\t\t\t\tcase 'DoNotDisplayGridlines': break;\n\t\t\t\t\tcase 'SplitHorizontal': break;\n\t\t\t\t\tcase 'SplitVertical': break;\n\t\t\t\t\tcase 'FreezePanes': break;\n\t\t\t\t\tcase 'FrozenNoSplit': break;\n\t\t\t\t\tcase 'FitWidth': break;\n\t\t\t\t\tcase 'FitHeight': break;\n\t\t\t\t\tcase 'CommentsLayout': break;\n\t\t\t\t\tcase 'Zoom': break;\n\t\t\t\t\tcase 'LeftToRight': break;\n\t\t\t\t\tcase 'Gridlines': break;\n\t\t\t\t\tcase 'AllowSort': break;\n\t\t\t\t\tcase 'AllowFilter': break;\n\t\t\t\t\tcase 'AllowInsertRows': break;\n\t\t\t\t\tcase 'AllowDeleteRows': break;\n\t\t\t\t\tcase 'AllowInsertCols': break;\n\t\t\t\t\tcase 'AllowDeleteCols': break;\n\t\t\t\t\tcase 'AllowInsertHyperlinks': break;\n\t\t\t\t\tcase 'AllowFormatCells': break;\n\t\t\t\t\tcase 'AllowSizeCols': break;\n\t\t\t\t\tcase 'AllowSizeRows': break;\n\t\t\t\t\tcase 'NoSummaryRowsBelowDetail': break;\n\t\t\t\t\tcase 'TabColorIndex': break;\n\t\t\t\t\tcase 'DoNotDisplayHeadings': break;\n\t\t\t\t\tcase 'ShowPageLayoutZoom': break;\n\t\t\t\t\tcase 'NoSummaryColumnsRightDetail': break;\n\t\t\t\t\tcase 'BlackAndWhite': break;\n\t\t\t\t\tcase 'DoNotDisplayZeros': break;\n\t\t\t\t\tcase 'DisplayPageBreak': break;\n\t\t\t\t\tcase 'RowColHeadings': break;\n\t\t\t\t\tcase 'DoNotDisplayOutline': break;\n\t\t\t\t\tcase 'NoOrientation': break;\n\t\t\t\t\tcase 'AllowUsePivotTables': break;\n\t\t\t\t\tcase 'ZeroHeight': break;\n\t\t\t\t\tcase 'ViewableRange': break;\n\t\t\t\t\tcase 'Selection': break;\n\t\t\t\t\tcase 'ProtectContents': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'PivotTable': case 'PivotCache': switch(Rn[3]) {\n\t\t\t\t\tcase 'ImmediateItemsOnDrop': break;\n\t\t\t\t\tcase 'ShowPageMultipleItemLabel': break;\n\t\t\t\t\tcase 'CompactRowIndent': break;\n\t\t\t\t\tcase 'Location': break;\n\t\t\t\t\tcase 'PivotField': break;\n\t\t\t\t\tcase 'Orientation': break;\n\t\t\t\t\tcase 'LayoutForm': break;\n\t\t\t\t\tcase 'LayoutSubtotalLocation': break;\n\t\t\t\t\tcase 'LayoutCompactRow': break;\n\t\t\t\t\tcase 'Position': break;\n\t\t\t\t\tcase 'PivotItem': break;\n\t\t\t\t\tcase 'DataType': break;\n\t\t\t\t\tcase 'DataField': break;\n\t\t\t\t\tcase 'SourceName': break;\n\t\t\t\t\tcase 'ParentField': break;\n\t\t\t\t\tcase 'PTLineItems': break;\n\t\t\t\t\tcase 'PTLineItem': break;\n\t\t\t\t\tcase 'CountOfSameItems': break;\n\t\t\t\t\tcase 'Item': break;\n\t\t\t\t\tcase 'ItemType': break;\n\t\t\t\t\tcase 'PTSource': break;\n\t\t\t\t\tcase 'CacheIndex': break;\n\t\t\t\t\tcase 'ConsolidationReference': break;\n\t\t\t\t\tcase 'FileName': break;\n\t\t\t\t\tcase 'Reference': break;\n\t\t\t\t\tcase 'NoColumnGrand': break;\n\t\t\t\t\tcase 'NoRowGrand': break;\n\t\t\t\t\tcase 'BlankLineAfterItems': break;\n\t\t\t\t\tcase 'Hidden': break;\n\t\t\t\t\tcase 'Subtotal': break;\n\t\t\t\t\tcase 'BaseField': break;\n\t\t\t\t\tcase 'MapChildItems': break;\n\t\t\t\t\tcase 'Function': break;\n\t\t\t\t\tcase 'RefreshOnFileOpen': break;\n\t\t\t\t\tcase 'PrintSetTitles': break;\n\t\t\t\t\tcase 'MergeLabels': break;\n\t\t\t\t\tcase 'DefaultVersion': break;\n\t\t\t\t\tcase 'RefreshName': break;\n\t\t\t\t\tcase 'RefreshDate': break;\n\t\t\t\t\tcase 'RefreshDateCopy': break;\n\t\t\t\t\tcase 'VersionLastRefresh': break;\n\t\t\t\t\tcase 'VersionLastUpdate': break;\n\t\t\t\t\tcase 'VersionUpdateableMin': break;\n\t\t\t\t\tcase 'VersionRefreshableMin': break;\n\t\t\t\t\tcase 'Calculation': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PageBreaks */\n\t\t\t\tcase 'PageBreaks': switch(Rn[3]) {\n\t\t\t\t\tcase 'ColBreaks': break;\n\t\t\t\t\tcase 'ColBreak': break;\n\t\t\t\t\tcase 'RowBreaks': break;\n\t\t\t\t\tcase 'RowBreak': break;\n\t\t\t\t\tcase 'ColStart': break;\n\t\t\t\t\tcase 'ColEnd': break;\n\t\t\t\t\tcase 'RowEnd': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* AutoFilter */\n\t\t\t\tcase 'AutoFilter': switch(Rn[3]) {\n\t\t\t\t\tcase 'AutoFilterColumn': break;\n\t\t\t\t\tcase 'AutoFilterCondition': break;\n\t\t\t\t\tcase 'AutoFilterAnd': break;\n\t\t\t\t\tcase 'AutoFilterOr': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* QueryTable */\n\t\t\t\tcase 'QueryTable': switch(Rn[3]) {\n\t\t\t\t\tcase 'Id': break;\n\t\t\t\t\tcase 'AutoFormatFont': break;\n\t\t\t\t\tcase 'AutoFormatPattern': break;\n\t\t\t\t\tcase 'QuerySource': break;\n\t\t\t\t\tcase 'QueryType': break;\n\t\t\t\t\tcase 'EnableRedirections': break;\n\t\t\t\t\tcase 'RefreshedInXl9': break;\n\t\t\t\t\tcase 'URLString': break;\n\t\t\t\t\tcase 'HTMLTables': break;\n\t\t\t\t\tcase 'Connection': break;\n\t\t\t\t\tcase 'CommandText': break;\n\t\t\t\t\tcase 'RefreshInfo': break;\n\t\t\t\t\tcase 'NoTitles': break;\n\t\t\t\t\tcase 'NextId': break;\n\t\t\t\t\tcase 'ColumnInfo': break;\n\t\t\t\t\tcase 'OverwriteCells': break;\n\t\t\t\t\tcase 'DoNotPromptForFile': break;\n\t\t\t\t\tcase 'TextWizardSettings': break;\n\t\t\t\t\tcase 'Source': break;\n\t\t\t\t\tcase 'Number': break;\n\t\t\t\t\tcase 'Decimal': break;\n\t\t\t\t\tcase 'ThousandSeparator': break;\n\t\t\t\t\tcase 'TrailingMinusNumbers': break;\n\t\t\t\t\tcase 'FormatSettings': break;\n\t\t\t\t\tcase 'FieldType': break;\n\t\t\t\t\tcase 'Delimiters': break;\n\t\t\t\t\tcase 'Tab': break;\n\t\t\t\t\tcase 'Comma': break;\n\t\t\t\t\tcase 'AutoFormatName': break;\n\t\t\t\t\tcase 'VersionLastEdit': break;\n\t\t\t\t\tcase 'VersionLastRefresh': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* Sorting */\n\t\t\t\tcase 'Sorting':\n\t\t\t\t/* ConditionalFormatting */\n\t\t\t\tcase 'ConditionalFormatting':\n\t\t\t\t/* DataValidation */\n\t\t\t\tcase 'DataValidation': switch(Rn[3]) {\n\t\t\t\t\tcase 'Range': break;\n\t\t\t\t\tcase 'Type': break;\n\t\t\t\t\tcase 'Min': break;\n\t\t\t\t\tcase 'Max': break;\n\t\t\t\t\tcase 'Sort': break;\n\t\t\t\t\tcase 'Descending': break;\n\t\t\t\t\tcase 'Order': break;\n\t\t\t\t\tcase 'CaseSensitive': break;\n\t\t\t\t\tcase 'Value': break;\n\t\t\t\t\tcase 'ErrorStyle': break;\n\t\t\t\t\tcase 'ErrorMessage': break;\n\t\t\t\t\tcase 'ErrorTitle': break;\n\t\t\t\t\tcase 'CellRangeList': break;\n\t\t\t\t\tcase 'InputMessage': break;\n\t\t\t\t\tcase 'InputTitle': break;\n\t\t\t\t\tcase 'ComboHide': break;\n\t\t\t\t\tcase 'InputHide': break;\n\t\t\t\t\tcase 'Condition': break;\n\t\t\t\t\tcase 'Qualifier': break;\n\t\t\t\t\tcase 'UseBlank': break;\n\t\t\t\t\tcase 'Value1': break;\n\t\t\t\t\tcase 'Value2': break;\n\t\t\t\t\tcase 'Format': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* MapInfo (schema) */\n\t\t\t\tcase 'MapInfo': case 'Schema': case 'data': switch(Rn[3]) {\n\t\t\t\t\tcase 'Map': break;\n\t\t\t\t\tcase 'Entry': break;\n\t\t\t\t\tcase 'Range': break;\n\t\t\t\t\tcase 'XPath': break;\n\t\t\t\t\tcase 'Field': break;\n\t\t\t\t\tcase 'XSDType': break;\n\t\t\t\t\tcase 'FilterOn': break;\n\t\t\t\t\tcase 'Aggregate': break;\n\t\t\t\t\tcase 'ElementType': break;\n\t\t\t\t\tcase 'AttributeType': break;\n\t\t\t\t/* These are from xsd (XML Schema Definition) */\n\t\t\t\t\tcase 'schema':\n\t\t\t\t\tcase 'element':\n\t\t\t\t\tcase 'complexType':\n\t\t\t\t\tcase 'datatype':\n\t\t\t\t\tcase 'all':\n\t\t\t\t\tcase 'attribute':\n\t\t\t\t\tcase 'extends': break;\n\n\t\t\t\t\tcase 'row': break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* SmartTags (can be anything) */\n\t\t\t\tcase 'SmartTags': break;\n\n\t\t\t\tdefault: seen = false; break;\n\t\t\t}\n\t\t\tif(seen) break;\n\t\t\t/* CustomDocumentProperties */\n\t\t\tif(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t\t\tif(state[state.length-1][0]==='CustomDocumentProperties') {\n\t\t\t\tif(Rn[0].substr(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") xlml_set_custprop(Custprops, Rn, cp, str.slice(pidx, Rn.index));\n\t\t\t\telse { cp = Rn; pidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t}\n\tvar out = {};\n\tif(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n\tout.SheetNames = sheetnames;\n\tout.SSF = SSF.get_table();\n\tout.Props = Props;\n\tout.Custprops = Custprops;\n\treturn out;\n}\n\nfunction parse_xlml(data, opts) {\n\tfix_read_opts(opts=opts||{});\n\tswitch(opts.type||\"base64\") {\n\t\tcase \"base64\": return parse_xlml_xml(Base64.decode(data), opts);\n\t\tcase \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n\t\tcase \"array\": return parse_xlml_xml(data.map(_chr).join(\"\"), opts);\n\t}\n}\n\nfunction write_xlml(wb, opts) { }\n\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj) {\n\tvar v = {};\n\tvar o = obj.content;\n\n\t/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n\tvar l = 28, m;\n\tm = __lpstr(o, l);\n\tl += 4 + __readUInt32LE(o,l);\n\tv.UserType = m;\n\n\t/* [MS-OLEDS] 2.3.1 ClipboardFormatOrAnsiString */\n\tm = __readUInt32LE(o,l); l+= 4;\n\tswitch(m) {\n\t\tcase 0x00000000: break;\n\t\tcase 0xffffffff: case 0xfffffffe: l+=4; break;\n\t\tdefault:\n\t\t\tif(m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n\t\t\tl += m;\n\t}\n\n\tm = __lpstr(o, l); l += m.length === 0 ? 0 : 5 + m.length; v.Reserved1 = m;\n\n\tif((m = __readUInt32LE(o,l)) !== 0x71b2e9f4) return v;\n\tthrow \"Unsupported Unicode Extension\";\n}\n\n/* 2.4.58 Continue logic */\nfunction slurp(R, blob, length, opts) {\n\tvar l = length;\n\tvar bufs = [];\n\tvar d = blob.slice(blob.l,blob.l+l);\n\tif(opts && opts.enc && opts.enc.insitu_decrypt) switch(R.n) {\n\tcase 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': break;\n\tdefault:\n\t\tif(d.length === 0) break;\n\t\topts.enc.insitu_decrypt(d);\n\t}\n\tbufs.push(d);\n\tblob.l += l;\n\tvar next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);\n\twhile(next != null && next.n === 'Continue') {\n\t\tl = __readUInt16LE(blob,blob.l+2);\n\t\tbufs.push(blob.slice(blob.l+4,blob.l+4+l));\n\t\tblob.l += 4+l;\n\t\tnext = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);\n\t}\n\tvar b = bconcat(bufs);\n\tprep_blob(b, 0);\n\tvar ll = 0; b.lens = [];\n\tfor(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n\treturn R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p, opts, date1904) {\n\tif(!p.XF) return;\n\ttry {\n\t\tvar fmtid = p.XF.ifmt||0;\n\t\tif(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse p.w = SSF._general(p.v);\n\t\t}\n\t\telse p.w = SSF.format(fmtid,p.v, {date1904:date1904||false});\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction make_cell(val, ixfe, t) {\n\treturn {v:val, ixfe:ixfe, t:t};\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options) {\n\tvar wb = {opts:{}};\n\tvar Sheets = {};\n\tvar out = {};\n\tvar Directory = {};\n\tvar found_sheet = false;\n\tvar range = {};\n\tvar last_formula = null;\n\tvar sst = [];\n\tvar cur_sheet = \"\";\n\tvar Preamble = {};\n\tvar lastcell, last_cell, cc, cmnt, rng, rngC, rngR;\n\tvar shared_formulae = {};\n\tvar array_formulae = []; /* TODO: something more clever */\n\tvar temp_val;\n\tvar country;\n\tvar cell_valid = true;\n\tvar XFs = []; /* XF records */\n\tvar palette = [];\n\tvar get_rgb = function getrgb(icv) {\n\t\tif(icv < 8) return XLSIcv[icv];\n\t\tif(icv < 64) return palette[icv-8] || XLSIcv[icv];\n\t\treturn XLSIcv[icv];\n\t};\n\tvar process_cell_style = function pcs(cell, line) {\n\t\tvar xfd = line.XF.data;\n\t\tif(!xfd || !xfd.patternType) return;\n\t\tline.s = {};\n\t\tline.s.patternType = xfd.patternType;\n\t\tvar t;\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n\t};\n\tvar addcell = function addcell(cell, line, options) {\n\t\tif(!cell_valid) return;\n\t\tif(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line);\n\t\tlastcell = cell;\n\t\tlast_cell = encode_cell(cell);\n\t\tif(range.s) {\n\t\t\tif(cell.r < range.s.r) range.s.r = cell.r;\n\t\t\tif(cell.c < range.s.c) range.s.c = cell.c;\n\t\t}\n\t\tif(range.e) {\n\t\t\tif(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n\t\t\tif(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n\t\t}\n\t\tif(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;\n\t\telse out[last_cell] = line;\n\t};\n\tvar opts = {\n\t\tenc: false, // encrypted\n\t\tsbcch: 0, // cch in the preceding SupBook\n\t\tsnames: [], // sheetnames\n\t\tsharedf: shared_formulae, // shared formulae by address\n\t\tarrayf: array_formulae, // array formulae array\n\t\trrtabid: [], // RRTabId\n\t\tlastuser: \"\", // Last User from WriteAccess\n\t\tbiff: 8, // BIFF version\n\t\tcodepage: 0, // CP from CodePage record\n\t\twinlocked: 0, // fLockWn from WinProtect\n\t\twtf: false\n\t};\n\tif(options.password) opts.password = options.password;\n\tvar mergecells = [];\n\tvar objects = [];\n\tvar supbooks = [[]]; // 1-indexed, will hold extern names\n\tvar sbc = 0, sbci = 0, sbcli = 0;\n\tsupbooks.SheetNames = opts.snames;\n\tsupbooks.sharedf = opts.sharedf;\n\tsupbooks.arrayf = opts.arrayf;\n\tvar last_Rn = '';\n\tvar file_depth = 0; /* TODO: make a real stack */\n\n\t/* explicit override for some broken writers */\n\topts.codepage = 1200;\n\tset_cp(1200);\n\n\twhile(blob.l < blob.length - 1) {\n\t\tvar s = blob.l;\n\t\tvar RecordType = blob.read_shift(2);\n\t\tif(RecordType === 0 && last_Rn === 'EOF') break;\n\t\tvar length = (blob.l === blob.length ? 0 : blob.read_shift(2)), y;\n\t\tvar R = XLSRecordEnum[RecordType];\n\t\tif(R && R.f) {\n\t\t\tif(options.bookSheets) {\n\t\t\t\tif(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;\n\t\t\t}\n\t\t\tlast_Rn = R.n;\n\t\t\tif(R.r === 2 || R.r == 12) {\n\t\t\t\tvar rt = blob.read_shift(2); length -= 2;\n\t\t\t\tif(!opts.enc && rt !== RecordType) throw \"rt mismatch\";\n\t\t\t\tif(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT\n\t\t\t}\n\t\t\t//console.error(R,blob.l,length,blob.length);\n\t\t\tvar val;\n\t\t\tif(R.n === 'EOF') val = R.f(blob, length, opts);\n\t\t\telse val = slurp(R, blob, length, opts);\n\t\t\tvar Rn = R.n;\n\t\t\t/* BIFF5 overrides */\n\t\t\tif(opts.biff === 5 || opts.biff === 2) switch(Rn) {\n\t\t\t\tcase 'Lbl': Rn = 'Label'; break;\n\t\t\t}\n\t\t\t/* nested switch statements to workaround V8 128 limit */\n\t\t\tswitch(Rn) {\n\t\t\t\t/* Workbook Options */\n\t\t\t\tcase 'Date1904': wb.opts.Date1904 = val; break;\n\t\t\t\tcase 'WriteProtect': wb.opts.WriteProtect = true; break;\n\t\t\t\tcase 'FilePass':\n\t\t\t\t\tif(!opts.enc) blob.l = 0;\n\t\t\t\t\topts.enc = val;\n\t\t\t\t\tif(opts.WTF) console.error(val);\n\t\t\t\t\tif(!options.password) throw new Error(\"File is password-protected\");\n\t\t\t\t\tif(val.Type !== 0) throw new Error(\"Encryption scheme unsupported\");\n\t\t\t\t\tif(!val.valid) throw new Error(\"Password is incorrect\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'WriteAccess': opts.lastuser = val; break;\n\t\t\t\tcase 'FileSharing': break; //TODO\n\t\t\t\tcase 'CodePage':\n\t\t\t\t\t/* overrides based on test cases */\n\t\t\t\t\tif(val === 0x5212) val = 1200;\n\t\t\t\t\telse if(val === 0x8001) val = 1252;\n\t\t\t\t\topts.codepage = val;\n\t\t\t\t\tset_cp(val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'RRTabId': opts.rrtabid = val; break;\n\t\t\t\tcase 'WinProtect': opts.winlocked = val; break;\n\t\t\t\tcase 'Template': break; // TODO\n\t\t\t\tcase 'RefreshAll': wb.opts.RefreshAll = val; break;\n\t\t\t\tcase 'BookBool': break; // TODO\n\t\t\t\tcase 'UsesELFs': /* if(val) console.error(\"Unsupported ELFs\"); */ break;\n\t\t\t\tcase 'MTRSettings': {\n\t\t\t\t\tif(val[0] && val[1]) throw \"Unsupported threads: \" + val;\n\t\t\t\t} break; // TODO: actually support threads\n\t\t\t\tcase 'CalcCount': wb.opts.CalcCount = val; break;\n\t\t\t\tcase 'CalcDelta': wb.opts.CalcDelta = val; break;\n\t\t\t\tcase 'CalcIter': wb.opts.CalcIter = val; break;\n\t\t\t\tcase 'CalcMode': wb.opts.CalcMode = val; break;\n\t\t\t\tcase 'CalcPrecision': wb.opts.CalcPrecision = val; break;\n\t\t\t\tcase 'CalcSaveRecalc': wb.opts.CalcSaveRecalc = val; break;\n\t\t\t\tcase 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1\n\t\t\t\tcase 'Uncalced': break;\n\t\t\t\tcase 'ForceFullCalculation': wb.opts.FullCalc = val; break;\n\t\t\t\tcase 'WsBool': break; // TODO\n\t\t\t\tcase 'XF': XFs.push(val); break;\n\t\t\t\tcase 'ExtSST': break; // TODO\n\t\t\t\tcase 'BookExt': break; // TODO\n\t\t\t\tcase 'RichTextStream': break;\n\t\t\t\tcase 'BkHim': break;\n\n\t\t\t\tcase 'SupBook': supbooks[++sbc] = [val]; sbci = 0; break;\n\t\t\t\tcase 'ExternName': supbooks[sbc][++sbci] = val; break;\n\t\t\t\tcase 'Index': break; // TODO\n\t\t\t\tcase 'Lbl': supbooks[0][++sbcli] = val; break;\n\t\t\t\tcase 'ExternSheet': supbooks[sbc] = supbooks[sbc].concat(val); sbci += val.length; break;\n\n\t\t\t\tcase 'Protect': out[\"!protect\"] = val; break; /* for sheet or book */\n\t\t\t\tcase 'Password': if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n\t\t\t\tcase 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/\n\n\t\t\t\tcase 'BoundSheet8': {\n\t\t\t\t\tDirectory[val.pos] = val;\n\t\t\t\t\topts.snames.push(val.name);\n\t\t\t\t} break;\n\t\t\t\tcase 'EOF': {\n\t\t\t\t\tif(--file_depth) break;\n\t\t\t\t\tif(range.e) {\n\t\t\t\t\t\tout[\"!range\"] = range;\n\t\t\t\t\t\tif(range.e.r > 0 && range.e.c > 0) {\n\t\t\t\t\t\t\trange.e.r--; range.e.c--;\n\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\trange.e.r++; range.e.c++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(mergecells.length > 0) out[\"!merges\"] = mergecells;\n\t\t\t\t\t\tif(objects.length > 0) out[\"!objects\"] = objects;\n\t\t\t\t\t}\n\t\t\t\t\tif(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n\t\t\t\t\tout = {};\n\t\t\t\t} break;\n\t\t\t\tcase 'BOF': {\n\t\t\t\t\tif(opts.biff !== 8);\n\t\t\t\t\telse if(val.BIFFVer === 0x0500) opts.biff = 5;\n\t\t\t\t\telse if(val.BIFFVer === 0x0002) opts.biff = 2;\n\t\t\t\t\telse if(val.BIFFVer === 0x0007) opts.biff = 2;\n\t\t\t\t\tif(file_depth++) break;\n\t\t\t\t\tcell_valid = true;\n\t\t\t\t\tout = {};\n\t\t\t\t\tif(opts.biff === 2) {\n\t\t\t\t\t\tif(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n\t\t\t\t\t\trange = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\t\t\t\t}\n\t\t\t\t\telse cur_sheet = (Directory[s] || {name:\"\"}).name;\n\t\t\t\t\tmergecells = [];\n\t\t\t\t\tobjects = [];\n\t\t\t\t} break;\n\t\t\t\tcase 'Number': case 'BIFF2NUM': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:'n'};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'BoolErr': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'RK': {\n\t\t\t\t\ttemp_val = {ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'};\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulRk': {\n\t\t\t\t\tfor(var j = val.c; j <= val.C; ++j) {\n\t\t\t\t\t\tvar ixfe = val.rkrec[j-val.c][0];\n\t\t\t\t\t\ttemp_val= {ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'};\n\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Formula': {\n\t\t\t\t\tswitch(val.val) {\n\t\t\t\t\t\tcase 'String': last_formula = val; break;\n\t\t\t\t\t\tcase 'Array Formula': throw \"Array Formula unsupported\";\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\ttemp_val = {v:val.val, ixfe:val.cell.ixfe, t:val.tt};\n\t\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\t\tif(options.cellFormula) temp_val.f = \"=\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\t\taddcell(val.cell, temp_val, options);\n\t\t\t\t\t\t\tlast_formula = val;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'String': {\n\t\t\t\t\tif(last_formula) {\n\t\t\t\t\t\tlast_formula.val = val;\n\t\t\t\t\t\ttemp_val = {v:last_formula.val, ixfe:last_formula.cell.ixfe, t:'s'};\n\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\tif(options.cellFormula) temp_val.f = \"=\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n\t\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell(last_formula.cell, temp_val, options);\n\t\t\t\t\t\tlast_formula = null;\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Array': {\n\t\t\t\t\tarray_formulae.push(val);\n\t\t\t\t} break;\n\t\t\t\tcase 'ShrFmla': {\n\t\t\t\t\tif(!cell_valid) break;\n\t\t\t\t\t//if(options.cellFormula) out[last_cell].f = stringify_formula(val[0], range, lastcell, supbooks, opts);\n\t\t\t\t\t/* TODO: capture range */\n\t\t\t\t\tshared_formulae[encode_cell(last_formula.cell)]= val[0];\n\t\t\t\t} break;\n\t\t\t\tcase 'LabelSst':\n\t\t\t\t\t//temp_val={v:sst[val.isst].t, ixfe:val.ixfe, t:'s'};\n\t\t\t\t\ttemp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Label': case 'BIFF2STR':\n\t\t\t\t\t/* Some writers erroneously write Label */\n\t\t\t\t\ttemp_val=make_cell(val.val, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Dimensions': {\n\t\t\t\t\tif(file_depth === 1) range = val; /* TODO: stack */\n\t\t\t\t} break;\n\t\t\t\tcase 'SST': {\n\t\t\t\t\tsst = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'Format': { /* val = [id, fmt] */\n\t\t\t\t\tSSF.load(val[1], val[0]);\n\t\t\t\t} break;\n\n\t\t\t\tcase 'MergeCells': mergecells = mergecells.concat(val); break;\n\n\t\t\t\tcase 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;\n\t\t\t\tcase 'TxO': opts.lastobj.TxO = val; break;\n\n\t\t\t\tcase 'HLink': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n\t\t\t\t\t\t\tif(out[encode_cell({c:rngC,r:rngR})])\n\t\t\t\t\t\t\t\tout[encode_cell({c:rngC,r:rngR})].l = val[1];\n\t\t\t\t} break;\n\t\t\t\tcase 'HLinkTooltip': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC)\n\t\t\t\t\t\t\tif(out[encode_cell({c:rngC,r:rngR})])\n\t\t\t\t\t\t\t\tout[encode_cell({c:rngC,r:rngR})].l.tooltip = val[1];\n\t\t\t\t} break;\n\n\t\t\t\t/* Comments */\n\t\t\t\tcase 'Note': {\n\t\t\t\t\tif(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n\t\t\t\t\tcc = out[encode_cell(val[0])];\n\t\t\t\t\tvar noteobj = objects[val[2]];\n\t\t\t\t\tif(!cc) break;\n\t\t\t\t\tif(!cc.c) cc.c = [];\n\t\t\t\t\tcmnt = {a:val[1],t:noteobj.TxO.t};\n\t\t\t\t\tcc.c.push(cmnt);\n\t\t\t\t} break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\tcase 'ClrtClient': break;\n\t\t\t\tcase 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;\n\n\t\t\t\tcase 'NameCmt': break;\n\t\t\t\tcase 'Header': break; // TODO\n\t\t\t\tcase 'Footer': break; // TODO\n\t\t\t\tcase 'HCenter': break; // TODO\n\t\t\t\tcase 'VCenter': break; // TODO\n\t\t\t\tcase 'Pls': break; // TODO\n\t\t\t\tcase 'Setup': break; // TODO\n\t\t\t\tcase 'DefColWidth': break; // TODO\n\t\t\t\tcase 'GCW': break;\n\t\t\t\tcase 'LHRecord': break;\n\t\t\t\tcase 'ColInfo': break; // TODO\n\t\t\t\tcase 'Row': break; // TODO\n\t\t\t\tcase 'DBCell': break; // TODO\n\t\t\t\tcase 'MulBlank': break; // TODO\n\t\t\t\tcase 'EntExU2': break; // TODO\n\t\t\t\tcase 'SxView': break; // TODO\n\t\t\t\tcase 'Sxvd': break; // TODO\n\t\t\t\tcase 'SXVI': break; // TODO\n\t\t\t\tcase 'SXVDEx': break; // TODO\n\t\t\t\tcase 'SxIvd': break; // TODO\n\t\t\t\tcase 'SXDI': break; // TODO\n\t\t\t\tcase 'SXLI': break; // TODO\n\t\t\t\tcase 'SXEx': break; // TODO\n\t\t\t\tcase 'QsiSXTag': break; // TODO\n\t\t\t\tcase 'Selection': break;\n\t\t\t\tcase 'Feat': break;\n\t\t\t\tcase 'FeatHdr': case 'FeatHdr11': break;\n\t\t\t\tcase 'Feature11': case 'Feature12': case 'List12': break;\n\t\t\t\tcase 'Blank': break;\n\t\t\t\tcase 'Country': country = val; break;\n\t\t\t\tcase 'RecalcId': break;\n\t\t\t\tcase 'DefaultRowHeight': case 'DxGCol': break; // TODO: htmlify\n\t\t\t\tcase 'Fbi': case 'Fbi2': case 'GelFrame': break;\n\t\t\t\tcase 'Font': break; // TODO\n\t\t\t\tcase 'XFCRC': break; // TODO\n\t\t\t\tcase 'Style': break; // TODO\n\t\t\t\tcase 'StyleExt': break; // TODO\n\t\t\t\tcase 'Palette': palette = val; break; // TODO\n\t\t\t\tcase 'Theme': break; // TODO\n\t\t\t\t/* Protection */\n\t\t\t\tcase 'ScenarioProtect': break;\n\t\t\t\tcase 'ObjProtect': break;\n\n\t\t\t\t/* Conditional Formatting */\n\t\t\t\tcase 'CondFmt12': break;\n\n\t\t\t\t/* Table */\n\t\t\t\tcase 'Table': break; // TODO\n\t\t\t\tcase 'TableStyles': break; // TODO\n\t\t\t\tcase 'TableStyle': break; // TODO\n\t\t\t\tcase 'TableStyleElement': break; // TODO\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'SXStreamID': break; // TODO\n\t\t\t\tcase 'SXVS': break; // TODO\n\t\t\t\tcase 'DConRef': break; // TODO\n\t\t\t\tcase 'SXAddl': break; // TODO\n\t\t\t\tcase 'DConBin': break; // TODO\n\t\t\t\tcase 'DConName': break; // TODO\n\t\t\t\tcase 'SXPI': break; // TODO\n\t\t\t\tcase 'SxFormat': break; // TODO\n\t\t\t\tcase 'SxSelect': break; // TODO\n\t\t\t\tcase 'SxRule': break; // TODO\n\t\t\t\tcase 'SxFilt': break; // TODO\n\t\t\t\tcase 'SxItm': break; // TODO\n\t\t\t\tcase 'SxDXF': break; // TODO\n\n\t\t\t\t/* Scenario Manager */\n\t\t\t\tcase 'ScenMan': break;\n\n\t\t\t\t/* Data Consolidation */\n\t\t\t\tcase 'DCon': break;\n\n\t\t\t\t/* Watched Cell */\n\t\t\t\tcase 'CellWatch': break;\n\n\t\t\t\t/* Print Settings */\n\t\t\t\tcase 'PrintRowCol': break;\n\t\t\t\tcase 'PrintGrid': break;\n\t\t\t\tcase 'PrintSize': break;\n\n\t\t\t\tcase 'XCT': break;\n\t\t\t\tcase 'CRN': break;\n\n\t\t\t\tcase 'Scl': {\n\t\t\t\t\t//console.log(\"Zoom Level:\", val[0]/val[1],val);\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExt': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExtOptional': {\n\n\t\t\t\t} break;\n\n\t\t\t\t/* VBA */\n\t\t\t\tcase 'ObNoMacros': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'ObProj': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'CodeName': {\n\n\t\t\t\t} break;\n\t\t\t\tcase 'GUIDTypeLib': {\n\n\t\t\t\t} break;\n\n\t\t\t\tcase 'WOpt': break; // TODO: WTF?\n\t\t\t\tcase 'PhoneticInfo': break;\n\n\t\t\t\tcase 'OleObjectSize': break;\n\n\t\t\t\t/* Differential Formatting */\n\t\t\t\tcase 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;\n\n\t\t\t\t/* Data Validation */\n\t\t\t\tcase 'Dv': case 'DVal': break;\n\n\t\t\t\t/* Data Series */\n\t\t\t\tcase 'BRAI': case 'Series': case 'SeriesText': break;\n\n\t\t\t\t/* Data Connection */\n\t\t\t\tcase 'DConn': break;\n\t\t\t\tcase 'DbOrParamQry': break;\n\t\t\t\tcase 'DBQueryExt': break;\n\n\t\t\t\t/* Formatting */\n\t\t\t\tcase 'IFmtRecord': break;\n\t\t\t\tcase 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;\n\n\t\t\t\t/* Explicitly Ignored */\n\t\t\t\tcase 'Excel9File': break;\n\t\t\t\tcase 'Units': break;\n\t\t\t\tcase 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': case 'BuiltInFnGroupCount':\n\t\t\t\t/* View Stuff */\n\t\t\t\tcase 'Window1': case 'Window2': case 'HideObj': case 'GridSet': case 'Guts':\n\t\t\t\tcase 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd':\n\t\t\t\tcase 'Pane': break;\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Chart */\n\t\t\t\tcase 'Dat':\n\t\t\t\tcase 'Begin': case 'End':\n\t\t\t\tcase 'StartBlock': case 'EndBlock':\n\t\t\t\tcase 'Frame': case 'Area':\n\t\t\t\tcase 'Axis': case 'AxisLine': case 'Tick': break;\n\t\t\t\tcase 'AxesUsed':\n\t\t\t\tcase 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;\n\t\t\t\tcase 'LineFormat': case 'AreaFormat':\n\t\t\t\tcase 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;\n\t\t\t\tcase 'PlotArea': case 'PlotGrowth': break;\n\t\t\t\tcase 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;\n\t\t\t\tcase 'DataFormat': case 'SerToCrt': case 'FontX': break;\n\t\t\t\tcase 'CatSerRange': case 'AxcExt': case 'SerFmt': break;\n\t\t\t\tcase 'ShtProps': break;\n\t\t\t\tcase 'DefaultText': case 'Text': case 'CatLab': break;\n\t\t\t\tcase 'DataLabExtContents': break;\n\t\t\t\tcase 'Legend': case 'LegendException': break;\n\t\t\t\tcase 'Pie': case 'Scatter': break;\n\t\t\t\tcase 'PieFormat': case 'MarkerFormat': break;\n\t\t\t\tcase 'StartObject': case 'EndObject': break;\n\t\t\t\tcase 'AlRuns': case 'ObjectLink': break;\n\t\t\t\tcase 'SIIndex': break;\n\t\t\t\tcase 'AttachedLabel': case 'YMult': break;\n\n\t\t\t\t/* Chart Group */\n\t\t\t\tcase 'Line': case 'Bar': break;\n\t\t\t\tcase 'Surf': break;\n\n\t\t\t\t/* Axis Group */\n\t\t\t\tcase 'AxisParent': break;\n\t\t\t\tcase 'Pos': break;\n\t\t\t\tcase 'ValueRange': break;\n\n\t\t\t\t/* Pivot Chart */\n\t\t\t\tcase 'SXViewEx9': break; // TODO\n\t\t\t\tcase 'SXViewLink': break;\n\t\t\t\tcase 'PivotChartBits': break;\n\t\t\t\tcase 'SBaseRef': break;\n\t\t\t\tcase 'TextPropsStream': break;\n\n\t\t\t\t/* Chart Misc */\n\t\t\t\tcase 'LnExt': break;\n\t\t\t\tcase 'MkrExt': break;\n\t\t\t\tcase 'CrtCoopt': break;\n\n\t\t\t\t/* Query Table */\n\t\t\t\tcase 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;\n\t\t\t\tcase 'TxtQry': break;\n\n\t\t\t\t/* Filter */\n\t\t\t\tcase 'FilterMode': break;\n\t\t\t\tcase 'AutoFilter': case 'AutoFilterInfo': break;\n\t\t\t\tcase 'AutoFilter12': break;\n\t\t\t\tcase 'DropDownObjIds': break;\n\t\t\t\tcase 'Sort': break;\n\t\t\t\tcase 'SortData': break;\n\n\t\t\t\t/* Drawing */\n\t\t\t\tcase 'ShapePropsStream': break;\n\t\t\t\tcase 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;\n\t\t\t\tcase 'ImData': break;\n\t\t\t\t/* Pub Stuff */\n\t\t\t\tcase 'WebPub': case 'AutoWebPub':\n\n\t\t\t\t/* Print Stuff */\n\t\t\t\tcase 'RightMargin': case 'LeftMargin': case 'TopMargin': case 'BottomMargin':\n\t\t\t\tcase 'HeaderFooter': case 'HFPicture': case 'PLV':\n\t\t\t\tcase 'HorizontalPageBreaks': case 'VerticalPageBreaks':\n\t\t\t\t/* Behavioral */\n\t\t\t\tcase 'Backup': case 'CompressPictures': case 'Compat12': break;\n\n\t\t\t\t/* Should not Happen */\n\t\t\t\tcase 'Continue': case 'ContinueFrt12': break;\n\n\t\t\t\t/* Future Records */\n\t\t\t\tcase 'FrtFontList': case 'FrtWrapper': break;\n\n\t\t\t\t/* BIFF5 records */\n\t\t\t\tcase 'ExternCount': break;\n\t\t\t\tcase 'RString': break;\n\t\t\t\tcase 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Miscellaneous */\n\t\t\t\tcase 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':\n\t\t\t\tcase 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':\n\t\t\t\tcase 'Name': break;\n\t\t\t\tdefault: if(options.WTF) throw 'Unrecognized Record ' + R.n;\n\t\t\t}}}}\n\t\t} else blob.l += length;\n\t}\n\tvar sheetnamesraw = opts.biff === 2 ? ['Sheet1'] : Object.keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n\tvar sheetnames = sheetnamesraw.slice();\n\twb.Directory=sheetnamesraw;\n\twb.SheetNames=sheetnamesraw;\n\tif(!options.bookSheets) wb.Sheets=Sheets;\n\twb.Preamble=Preamble;\n\twb.Strings = sst;\n\twb.SSF = SSF.get_table();\n\tif(opts.enc) wb.Encryption = opts.enc;\n\twb.Metadata = {};\n\tif(country !== undefined) wb.Metadata.Country = country;\n\treturn wb;\n}\n\nfunction parse_xlscfb(cfb, options) {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nvar CompObj, Summary, Workbook;\nif(cfb.find) {\n\tCompObj = cfb.find('!CompObj');\n\tSummary = cfb.find('!SummaryInformation');\n\tWorkbook = cfb.find('/Workbook');\n} else {\n\tprep_blob(cfb, 0);\n\tWorkbook = {content: cfb};\n}\n\nif(!Workbook) Workbook = cfb.find('/Book');\nvar CompObjP, SummaryP, WorkbookP;\n\nif(CompObj) CompObjP = parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = {};\nelse {\n\tif(Workbook) WorkbookP = parse_workbook(Workbook.content, options, !!Workbook.find);\n\telse throw new Error(\"Cannot find Workbook stream\");\n}\n\nif(cfb.find) parse_props(cfb);\n\nvar props = {};\nfor(var y in cfb.Summary) props[y] = cfb.Summary[y];\nfor(y in cfb.DocSummary) props[y] = cfb.DocSummary[y];\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\nWorkbookP.CompObjP = CompObjP;\nreturn WorkbookP;\n}\n\n/* TODO: WTF */\nfunction parse_props(cfb) {\n\t/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n\tvar DSI = cfb.find('!DocumentSummaryInformation');\n\tif(DSI) try { cfb.DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI); } catch(e) {}\n\n\t/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n\tvar SI = cfb.find('!SummaryInformation');\n\tif(SI) try { cfb.Summary = parse_PropertySetStream(SI, SummaryPIDSI); } catch(e) {}\n}\n\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n\t0x0000: { n:\"BrtRowHdr\", f:parse_BrtRowHdr },\n\t0x0001: { n:\"BrtCellBlank\", f:parse_BrtCellBlank },\n\t0x0002: { n:\"BrtCellRk\", f:parse_BrtCellRk },\n\t0x0003: { n:\"BrtCellError\", f:parse_BrtCellError },\n\t0x0004: { n:\"BrtCellBool\", f:parse_BrtCellBool },\n\t0x0005: { n:\"BrtCellReal\", f:parse_BrtCellReal },\n\t0x0006: { n:\"BrtCellSt\", f:parse_BrtCellSt },\n\t0x0007: { n:\"BrtCellIsst\", f:parse_BrtCellIsst },\n\t0x0008: { n:\"BrtFmlaString\", f:parse_BrtFmlaString },\n\t0x0009: { n:\"BrtFmlaNum\", f:parse_BrtFmlaNum },\n\t0x000A: { n:\"BrtFmlaBool\", f:parse_BrtFmlaBool },\n\t0x000B: { n:\"BrtFmlaError\", f:parse_BrtFmlaError },\n\t0x0010: { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ },\n\t0x0013: { n:\"BrtSSTItem\", f:parse_RichStr },\n\t0x0014: { n:\"BrtPCDIMissing\", f:parsenoop },\n\t0x0015: { n:\"BrtPCDINumber\", f:parsenoop },\n\t0x0016: { n:\"BrtPCDIBoolean\", f:parsenoop },\n\t0x0017: { n:\"BrtPCDIError\", f:parsenoop },\n\t0x0018: { n:\"BrtPCDIString\", f:parsenoop },\n\t0x0019: { n:\"BrtPCDIDatetime\", f:parsenoop },\n\t0x001A: { n:\"BrtPCDIIndex\", f:parsenoop },\n\t0x001B: { n:\"BrtPCDIAMissing\", f:parsenoop },\n\t0x001C: { n:\"BrtPCDIANumber\", f:parsenoop },\n\t0x001D: { n:\"BrtPCDIABoolean\", f:parsenoop },\n\t0x001E: { n:\"BrtPCDIAError\", f:parsenoop },\n\t0x001F: { n:\"BrtPCDIAString\", f:parsenoop },\n\t0x0020: { n:\"BrtPCDIADatetime\", f:parsenoop },\n\t0x0021: { n:\"BrtPCRRecord\", f:parsenoop },\n\t0x0022: { n:\"BrtPCRRecordDt\", f:parsenoop },\n\t0x0023: { n:\"BrtFRTBegin\", f:parsenoop },\n\t0x0024: { n:\"BrtFRTEnd\", f:parsenoop },\n\t0x0025: { n:\"BrtACBegin\", f:parsenoop },\n\t0x0026: { n:\"BrtACEnd\", f:parsenoop },\n\t0x0027: { n:\"BrtName\", f:parsenoop },\n\t0x0028: { n:\"BrtIndexRowBlock\", f:parsenoop },\n\t0x002A: { n:\"BrtIndexBlock\", f:parsenoop },\n\t0x002B: { n:\"BrtFont\", f:parse_BrtFont },\n\t0x002C: { n:\"BrtFmt\", f:parse_BrtFmt },\n\t0x002D: { n:\"BrtFill\", f:parsenoop },\n\t0x002E: { n:\"BrtBorder\", f:parsenoop },\n\t0x002F: { n:\"BrtXF\", f:parse_BrtXF },\n\t0x0030: { n:\"BrtStyle\", f:parsenoop },\n\t0x0031: { n:\"BrtCellMeta\", f:parsenoop },\n\t0x0032: { n:\"BrtValueMeta\", f:parsenoop },\n\t0x0033: { n:\"BrtMdb\", f:parsenoop },\n\t0x0034: { n:\"BrtBeginFmd\", f:parsenoop },\n\t0x0035: { n:\"BrtEndFmd\", f:parsenoop },\n\t0x0036: { n:\"BrtBeginMdx\", f:parsenoop },\n\t0x0037: { n:\"BrtEndMdx\", f:parsenoop },\n\t0x0038: { n:\"BrtBeginMdxTuple\", f:parsenoop },\n\t0x0039: { n:\"BrtEndMdxTuple\", f:parsenoop },\n\t0x003A: { n:\"BrtMdxMbrIstr\", f:parsenoop },\n\t0x003B: { n:\"BrtStr\", f:parsenoop },\n\t0x003C: { n:\"BrtColInfo\", f:parsenoop },\n\t0x003E: { n:\"BrtCellRString\", f:parsenoop },\n\t0x003F: { n:\"BrtCalcChainItem$\", f:parse_BrtCalcChainItem$ },\n\t0x0040: { n:\"BrtDVal\", f:parsenoop },\n\t0x0041: { n:\"BrtSxvcellNum\", f:parsenoop },\n\t0x0042: { n:\"BrtSxvcellStr\", f:parsenoop },\n\t0x0043: { n:\"BrtSxvcellBool\", f:parsenoop },\n\t0x0044: { n:\"BrtSxvcellErr\", f:parsenoop },\n\t0x0045: { n:\"BrtSxvcellDate\", f:parsenoop },\n\t0x0046: { n:\"BrtSxvcellNil\", f:parsenoop },\n\t0x0080: { n:\"BrtFileVersion\", f:parsenoop },\n\t0x0081: { n:\"BrtBeginSheet\", f:parsenoop },\n\t0x0082: { n:\"BrtEndSheet\", f:parsenoop },\n\t0x0083: { n:\"BrtBeginBook\", f:parsenoop, p:0 },\n\t0x0084: { n:\"BrtEndBook\", f:parsenoop },\n\t0x0085: { n:\"BrtBeginWsViews\", f:parsenoop },\n\t0x0086: { n:\"BrtEndWsViews\", f:parsenoop },\n\t0x0087: { n:\"BrtBeginBookViews\", f:parsenoop },\n\t0x0088: { n:\"BrtEndBookViews\", f:parsenoop },\n\t0x0089: { n:\"BrtBeginWsView\", f:parsenoop },\n\t0x008A: { n:\"BrtEndWsView\", f:parsenoop },\n\t0x008B: { n:\"BrtBeginCsViews\", f:parsenoop },\n\t0x008C: { n:\"BrtEndCsViews\", f:parsenoop },\n\t0x008D: { n:\"BrtBeginCsView\", f:parsenoop },\n\t0x008E: { n:\"BrtEndCsView\", f:parsenoop },\n\t0x008F: { n:\"BrtBeginBundleShs\", f:parsenoop },\n\t0x0090: { n:\"BrtEndBundleShs\", f:parsenoop },\n\t0x0091: { n:\"BrtBeginSheetData\", f:parsenoop },\n\t0x0092: { n:\"BrtEndSheetData\", f:parsenoop },\n\t0x0093: { n:\"BrtWsProp\", f:parse_BrtWsProp },\n\t0x0094: { n:\"BrtWsDim\", f:parse_BrtWsDim, p:16 },\n\t0x0097: { n:\"BrtPane\", f:parsenoop },\n\t0x0098: { n:\"BrtSel\", f:parsenoop },\n\t0x0099: { n:\"BrtWbProp\", f:parse_BrtWbProp },\n\t0x009A: { n:\"BrtWbFactoid\", f:parsenoop },\n\t0x009B: { n:\"BrtFileRecover\", f:parsenoop },\n\t0x009C: { n:\"BrtBundleSh\", f:parse_BrtBundleSh },\n\t0x009D: { n:\"BrtCalcProp\", f:parsenoop },\n\t0x009E: { n:\"BrtBookView\", f:parsenoop },\n\t0x009F: { n:\"BrtBeginSst\", f:parse_BrtBeginSst },\n\t0x00A0: { n:\"BrtEndSst\", f:parsenoop },\n\t0x00A1: { n:\"BrtBeginAFilter\", f:parsenoop },\n\t0x00A2: { n:\"BrtEndAFilter\", f:parsenoop },\n\t0x00A3: { n:\"BrtBeginFilterColumn\", f:parsenoop },\n\t0x00A4: { n:\"BrtEndFilterColumn\", f:parsenoop },\n\t0x00A5: { n:\"BrtBeginFilters\", f:parsenoop },\n\t0x00A6: { n:\"BrtEndFilters\", f:parsenoop },\n\t0x00A7: { n:\"BrtFilter\", f:parsenoop },\n\t0x00A8: { n:\"BrtColorFilter\", f:parsenoop },\n\t0x00A9: { n:\"BrtIconFilter\", f:parsenoop },\n\t0x00AA: { n:\"BrtTop10Filter\", f:parsenoop },\n\t0x00AB: { n:\"BrtDynamicFilter\", f:parsenoop },\n\t0x00AC: { n:\"BrtBeginCustomFilters\", f:parsenoop },\n\t0x00AD: { n:\"BrtEndCustomFilters\", f:parsenoop },\n\t0x00AE: { n:\"BrtCustomFilter\", f:parsenoop },\n\t0x00AF: { n:\"BrtAFilterDateGroupItem\", f:parsenoop },\n\t0x00B0: { n:\"BrtMergeCell\", f:parse_BrtMergeCell },\n\t0x00B1: { n:\"BrtBeginMergeCells\", f:parsenoop },\n\t0x00B2: { n:\"BrtEndMergeCells\", f:parsenoop },\n\t0x00B3: { n:\"BrtBeginPivotCacheDef\", f:parsenoop },\n\t0x00B4: { n:\"BrtEndPivotCacheDef\", f:parsenoop },\n\t0x00B5: { n:\"BrtBeginPCDFields\", f:parsenoop },\n\t0x00B6: { n:\"BrtEndPCDFields\", f:parsenoop },\n\t0x00B7: { n:\"BrtBeginPCDField\", f:parsenoop },\n\t0x00B8: { n:\"BrtEndPCDField\", f:parsenoop },\n\t0x00B9: { n:\"BrtBeginPCDSource\", f:parsenoop },\n\t0x00BA: { n:\"BrtEndPCDSource\", f:parsenoop },\n\t0x00BB: { n:\"BrtBeginPCDSRange\", f:parsenoop },\n\t0x00BC: { n:\"BrtEndPCDSRange\", f:parsenoop },\n\t0x00BD: { n:\"BrtBeginPCDFAtbl\", f:parsenoop },\n\t0x00BE: { n:\"BrtEndPCDFAtbl\", f:parsenoop },\n\t0x00BF: { n:\"BrtBeginPCDIRun\", f:parsenoop },\n\t0x00C0: { n:\"BrtEndPCDIRun\", f:parsenoop },\n\t0x00C1: { n:\"BrtBeginPivotCacheRecords\", f:parsenoop },\n\t0x00C2: { n:\"BrtEndPivotCacheRecords\", f:parsenoop },\n\t0x00C3: { n:\"BrtBeginPCDHierarchies\", f:parsenoop },\n\t0x00C4: { n:\"BrtEndPCDHierarchies\", f:parsenoop },\n\t0x00C5: { n:\"BrtBeginPCDHierarchy\", f:parsenoop },\n\t0x00C6: { n:\"BrtEndPCDHierarchy\", f:parsenoop },\n\t0x00C7: { n:\"BrtBeginPCDHFieldsUsage\", f:parsenoop },\n\t0x00C8: { n:\"BrtEndPCDHFieldsUsage\", f:parsenoop },\n\t0x00C9: { n:\"BrtBeginExtConnection\", f:parsenoop },\n\t0x00CA: { n:\"BrtEndExtConnection\", f:parsenoop },\n\t0x00CB: { n:\"BrtBeginECDbProps\", f:parsenoop },\n\t0x00CC: { n:\"BrtEndECDbProps\", f:parsenoop },\n\t0x00CD: { n:\"BrtBeginECOlapProps\", f:parsenoop },\n\t0x00CE: { n:\"BrtEndECOlapProps\", f:parsenoop },\n\t0x00CF: { n:\"BrtBeginPCDSConsol\", f:parsenoop },\n\t0x00D0: { n:\"BrtEndPCDSConsol\", f:parsenoop },\n\t0x00D1: { n:\"BrtBeginPCDSCPages\", f:parsenoop },\n\t0x00D2: { n:\"BrtEndPCDSCPages\", f:parsenoop },\n\t0x00D3: { n:\"BrtBeginPCDSCPage\", f:parsenoop },\n\t0x00D4: { n:\"BrtEndPCDSCPage\", f:parsenoop },\n\t0x00D5: { n:\"BrtBeginPCDSCPItem\", f:parsenoop },\n\t0x00D6: { n:\"BrtEndPCDSCPItem\", f:parsenoop },\n\t0x00D7: { n:\"BrtBeginPCDSCSets\", f:parsenoop },\n\t0x00D8: { n:\"BrtEndPCDSCSets\", f:parsenoop },\n\t0x00D9: { n:\"BrtBeginPCDSCSet\", f:parsenoop },\n\t0x00DA: { n:\"BrtEndPCDSCSet\", f:parsenoop },\n\t0x00DB: { n:\"BrtBeginPCDFGroup\", f:parsenoop },\n\t0x00DC: { n:\"BrtEndPCDFGroup\", f:parsenoop },\n\t0x00DD: { n:\"BrtBeginPCDFGItems\", f:parsenoop },\n\t0x00DE: { n:\"BrtEndPCDFGItems\", f:parsenoop },\n\t0x00DF: { n:\"BrtBeginPCDFGRange\", f:parsenoop },\n\t0x00E0: { n:\"BrtEndPCDFGRange\", f:parsenoop },\n\t0x00E1: { n:\"BrtBeginPCDFGDiscrete\", f:parsenoop },\n\t0x00E2: { n:\"BrtEndPCDFGDiscrete\", f:parsenoop },\n\t0x00E3: { n:\"BrtBeginPCDSDTupleCache\", f:parsenoop },\n\t0x00E4: { n:\"BrtEndPCDSDTupleCache\", f:parsenoop },\n\t0x00E5: { n:\"BrtBeginPCDSDTCEntries\", f:parsenoop },\n\t0x00E6: { n:\"BrtEndPCDSDTCEntries\", f:parsenoop },\n\t0x00E7: { n:\"BrtBeginPCDSDTCEMembers\", f:parsenoop },\n\t0x00E8: { n:\"BrtEndPCDSDTCEMembers\", f:parsenoop },\n\t0x00E9: { n:\"BrtBeginPCDSDTCEMember\", f:parsenoop },\n\t0x00EA: { n:\"BrtEndPCDSDTCEMember\", f:parsenoop },\n\t0x00EB: { n:\"BrtBeginPCDSDTCQueries\", f:parsenoop },\n\t0x00EC: { n:\"BrtEndPCDSDTCQueries\", f:parsenoop },\n\t0x00ED: { n:\"BrtBeginPCDSDTCQuery\", f:parsenoop },\n\t0x00EE: { n:\"BrtEndPCDSDTCQuery\", f:parsenoop },\n\t0x00EF: { n:\"BrtBeginPCDSDTCSets\", f:parsenoop },\n\t0x00F0: { n:\"BrtEndPCDSDTCSets\", f:parsenoop },\n\t0x00F1: { n:\"BrtBeginPCDSDTCSet\", f:parsenoop },\n\t0x00F2: { n:\"BrtEndPCDSDTCSet\", f:parsenoop },\n\t0x00F3: { n:\"BrtBeginPCDCalcItems\", f:parsenoop },\n\t0x00F4: { n:\"BrtEndPCDCalcItems\", f:parsenoop },\n\t0x00F5: { n:\"BrtBeginPCDCalcItem\", f:parsenoop },\n\t0x00F6: { n:\"BrtEndPCDCalcItem\", f:parsenoop },\n\t0x00F7: { n:\"BrtBeginPRule\", f:parsenoop },\n\t0x00F8: { n:\"BrtEndPRule\", f:parsenoop },\n\t0x00F9: { n:\"BrtBeginPRFilters\", f:parsenoop },\n\t0x00FA: { n:\"BrtEndPRFilters\", f:parsenoop },\n\t0x00FB: { n:\"BrtBeginPRFilter\", f:parsenoop },\n\t0x00FC: { n:\"BrtEndPRFilter\", f:parsenoop },\n\t0x00FD: { n:\"BrtBeginPNames\", f:parsenoop },\n\t0x00FE: { n:\"BrtEndPNames\", f:parsenoop },\n\t0x00FF: { n:\"BrtBeginPName\", f:parsenoop },\n\t0x0100: { n:\"BrtEndPName\", f:parsenoop },\n\t0x0101: { n:\"BrtBeginPNPairs\", f:parsenoop },\n\t0x0102: { n:\"BrtEndPNPairs\", f:parsenoop },\n\t0x0103: { n:\"BrtBeginPNPair\", f:parsenoop },\n\t0x0104: { n:\"BrtEndPNPair\", f:parsenoop },\n\t0x0105: { n:\"BrtBeginECWebProps\", f:parsenoop },\n\t0x0106: { n:\"BrtEndECWebProps\", f:parsenoop },\n\t0x0107: { n:\"BrtBeginEcWpTables\", f:parsenoop },\n\t0x0108: { n:\"BrtEndECWPTables\", f:parsenoop },\n\t0x0109: { n:\"BrtBeginECParams\", f:parsenoop },\n\t0x010A: { n:\"BrtEndECParams\", f:parsenoop },\n\t0x010B: { n:\"BrtBeginECParam\", f:parsenoop },\n\t0x010C: { n:\"BrtEndECParam\", f:parsenoop },\n\t0x010D: { n:\"BrtBeginPCDKPIs\", f:parsenoop },\n\t0x010E: { n:\"BrtEndPCDKPIs\", f:parsenoop },\n\t0x010F: { n:\"BrtBeginPCDKPI\", f:parsenoop },\n\t0x0110: { n:\"BrtEndPCDKPI\", f:parsenoop },\n\t0x0111: { n:\"BrtBeginDims\", f:parsenoop },\n\t0x0112: { n:\"BrtEndDims\", f:parsenoop },\n\t0x0113: { n:\"BrtBeginDim\", f:parsenoop },\n\t0x0114: { n:\"BrtEndDim\", f:parsenoop },\n\t0x0115: { n:\"BrtIndexPartEnd\", f:parsenoop },\n\t0x0116: { n:\"BrtBeginStyleSheet\", f:parsenoop },\n\t0x0117: { n:\"BrtEndStyleSheet\", f:parsenoop },\n\t0x0118: { n:\"BrtBeginSXView\", f:parsenoop },\n\t0x0119: { n:\"BrtEndSXVI\", f:parsenoop },\n\t0x011A: { n:\"BrtBeginSXVI\", f:parsenoop },\n\t0x011B: { n:\"BrtBeginSXVIs\", f:parsenoop },\n\t0x011C: { n:\"BrtEndSXVIs\", f:parsenoop },\n\t0x011D: { n:\"BrtBeginSXVD\", f:parsenoop },\n\t0x011E: { n:\"BrtEndSXVD\", f:parsenoop },\n\t0x011F: { n:\"BrtBeginSXVDs\", f:parsenoop },\n\t0x0120: { n:\"BrtEndSXVDs\", f:parsenoop },\n\t0x0121: { n:\"BrtBeginSXPI\", f:parsenoop },\n\t0x0122: { n:\"BrtEndSXPI\", f:parsenoop },\n\t0x0123: { n:\"BrtBeginSXPIs\", f:parsenoop },\n\t0x0124: { n:\"BrtEndSXPIs\", f:parsenoop },\n\t0x0125: { n:\"BrtBeginSXDI\", f:parsenoop },\n\t0x0126: { n:\"BrtEndSXDI\", f:parsenoop },\n\t0x0127: { n:\"BrtBeginSXDIs\", f:parsenoop },\n\t0x0128: { n:\"BrtEndSXDIs\", f:parsenoop },\n\t0x0129: { n:\"BrtBeginSXLI\", f:parsenoop },\n\t0x012A: { n:\"BrtEndSXLI\", f:parsenoop },\n\t0x012B: { n:\"BrtBeginSXLIRws\", f:parsenoop },\n\t0x012C: { n:\"BrtEndSXLIRws\", f:parsenoop },\n\t0x012D: { n:\"BrtBeginSXLICols\", f:parsenoop },\n\t0x012E: { n:\"BrtEndSXLICols\", f:parsenoop },\n\t0x012F: { n:\"BrtBeginSXFormat\", f:parsenoop },\n\t0x0130: { n:\"BrtEndSXFormat\", f:parsenoop },\n\t0x0131: { n:\"BrtBeginSXFormats\", f:parsenoop },\n\t0x0132: { n:\"BrtEndSxFormats\", f:parsenoop },\n\t0x0133: { n:\"BrtBeginSxSelect\", f:parsenoop },\n\t0x0134: { n:\"BrtEndSxSelect\", f:parsenoop },\n\t0x0135: { n:\"BrtBeginISXVDRws\", f:parsenoop },\n\t0x0136: { n:\"BrtEndISXVDRws\", f:parsenoop },\n\t0x0137: { n:\"BrtBeginISXVDCols\", f:parsenoop },\n\t0x0138: { n:\"BrtEndISXVDCols\", f:parsenoop },\n\t0x0139: { n:\"BrtEndSXLocation\", f:parsenoop },\n\t0x013A: { n:\"BrtBeginSXLocation\", f:parsenoop },\n\t0x013B: { n:\"BrtEndSXView\", f:parsenoop },\n\t0x013C: { n:\"BrtBeginSXTHs\", f:parsenoop },\n\t0x013D: { n:\"BrtEndSXTHs\", f:parsenoop },\n\t0x013E: { n:\"BrtBeginSXTH\", f:parsenoop },\n\t0x013F: { n:\"BrtEndSXTH\", f:parsenoop },\n\t0x0140: { n:\"BrtBeginISXTHRws\", f:parsenoop },\n\t0x0141: { n:\"BrtEndISXTHRws\", f:parsenoop },\n\t0x0142: { n:\"BrtBeginISXTHCols\", f:parsenoop },\n\t0x0143: { n:\"BrtEndISXTHCols\", f:parsenoop },\n\t0x0144: { n:\"BrtBeginSXTDMPS\", f:parsenoop },\n\t0x0145: { n:\"BrtEndSXTDMPs\", f:parsenoop },\n\t0x0146: { n:\"BrtBeginSXTDMP\", f:parsenoop },\n\t0x0147: { n:\"BrtEndSXTDMP\", f:parsenoop },\n\t0x0148: { n:\"BrtBeginSXTHItems\", f:parsenoop },\n\t0x0149: { n:\"BrtEndSXTHItems\", f:parsenoop },\n\t0x014A: { n:\"BrtBeginSXTHItem\", f:parsenoop },\n\t0x014B: { n:\"BrtEndSXTHItem\", f:parsenoop },\n\t0x014C: { n:\"BrtBeginMetadata\", f:parsenoop },\n\t0x014D: { n:\"BrtEndMetadata\", f:parsenoop },\n\t0x014E: { n:\"BrtBeginEsmdtinfo\", f:parsenoop },\n\t0x014F: { n:\"BrtMdtinfo\", f:parsenoop },\n\t0x0150: { n:\"BrtEndEsmdtinfo\", f:parsenoop },\n\t0x0151: { n:\"BrtBeginEsmdb\", f:parsenoop },\n\t0x0152: { n:\"BrtEndEsmdb\", f:parsenoop },\n\t0x0153: { n:\"BrtBeginEsfmd\", f:parsenoop },\n\t0x0154: { n:\"BrtEndEsfmd\", f:parsenoop },\n\t0x0155: { n:\"BrtBeginSingleCells\", f:parsenoop },\n\t0x0156: { n:\"BrtEndSingleCells\", f:parsenoop },\n\t0x0157: { n:\"BrtBeginList\", f:parsenoop },\n\t0x0158: { n:\"BrtEndList\", f:parsenoop },\n\t0x0159: { n:\"BrtBeginListCols\", f:parsenoop },\n\t0x015A: { n:\"BrtEndListCols\", f:parsenoop },\n\t0x015B: { n:\"BrtBeginListCol\", f:parsenoop },\n\t0x015C: { n:\"BrtEndListCol\", f:parsenoop },\n\t0x015D: { n:\"BrtBeginListXmlCPr\", f:parsenoop },\n\t0x015E: { n:\"BrtEndListXmlCPr\", f:parsenoop },\n\t0x015F: { n:\"BrtListCCFmla\", f:parsenoop },\n\t0x0160: { n:\"BrtListTrFmla\", f:parsenoop },\n\t0x0161: { n:\"BrtBeginExternals\", f:parsenoop },\n\t0x0162: { n:\"BrtEndExternals\", f:parsenoop },\n\t0x0163: { n:\"BrtSupBookSrc\", f:parsenoop },\n\t0x0165: { n:\"BrtSupSelf\", f:parsenoop },\n\t0x0166: { n:\"BrtSupSame\", f:parsenoop },\n\t0x0167: { n:\"BrtSupTabs\", f:parsenoop },\n\t0x0168: { n:\"BrtBeginSupBook\", f:parsenoop },\n\t0x0169: { n:\"BrtPlaceholderName\", f:parsenoop },\n\t0x016A: { n:\"BrtExternSheet\", f:parsenoop },\n\t0x016B: { n:\"BrtExternTableStart\", f:parsenoop },\n\t0x016C: { n:\"BrtExternTableEnd\", f:parsenoop },\n\t0x016E: { n:\"BrtExternRowHdr\", f:parsenoop },\n\t0x016F: { n:\"BrtExternCellBlank\", f:parsenoop },\n\t0x0170: { n:\"BrtExternCellReal\", f:parsenoop },\n\t0x0171: { n:\"BrtExternCellBool\", f:parsenoop },\n\t0x0172: { n:\"BrtExternCellError\", f:parsenoop },\n\t0x0173: { n:\"BrtExternCellString\", f:parsenoop },\n\t0x0174: { n:\"BrtBeginEsmdx\", f:parsenoop },\n\t0x0175: { n:\"BrtEndEsmdx\", f:parsenoop },\n\t0x0176: { n:\"BrtBeginMdxSet\", f:parsenoop },\n\t0x0177: { n:\"BrtEndMdxSet\", f:parsenoop },\n\t0x0178: { n:\"BrtBeginMdxMbrProp\", f:parsenoop },\n\t0x0179: { n:\"BrtEndMdxMbrProp\", f:parsenoop },\n\t0x017A: { n:\"BrtBeginMdxKPI\", f:parsenoop },\n\t0x017B: { n:\"BrtEndMdxKPI\", f:parsenoop },\n\t0x017C: { n:\"BrtBeginEsstr\", f:parsenoop },\n\t0x017D: { n:\"BrtEndEsstr\", f:parsenoop },\n\t0x017E: { n:\"BrtBeginPRFItem\", f:parsenoop },\n\t0x017F: { n:\"BrtEndPRFItem\", f:parsenoop },\n\t0x0180: { n:\"BrtBeginPivotCacheIDs\", f:parsenoop },\n\t0x0181: { n:\"BrtEndPivotCacheIDs\", f:parsenoop },\n\t0x0182: { n:\"BrtBeginPivotCacheID\", f:parsenoop },\n\t0x0183: { n:\"BrtEndPivotCacheID\", f:parsenoop },\n\t0x0184: { n:\"BrtBeginISXVIs\", f:parsenoop },\n\t0x0185: { n:\"BrtEndISXVIs\", f:parsenoop },\n\t0x0186: { n:\"BrtBeginColInfos\", f:parsenoop },\n\t0x0187: { n:\"BrtEndColInfos\", f:parsenoop },\n\t0x0188: { n:\"BrtBeginRwBrk\", f:parsenoop },\n\t0x0189: { n:\"BrtEndRwBrk\", f:parsenoop },\n\t0x018A: { n:\"BrtBeginColBrk\", f:parsenoop },\n\t0x018B: { n:\"BrtEndColBrk\", f:parsenoop },\n\t0x018C: { n:\"BrtBrk\", f:parsenoop },\n\t0x018D: { n:\"BrtUserBookView\", f:parsenoop },\n\t0x018E: { n:\"BrtInfo\", f:parsenoop },\n\t0x018F: { n:\"BrtCUsr\", f:parsenoop },\n\t0x0190: { n:\"BrtUsr\", f:parsenoop },\n\t0x0191: { n:\"BrtBeginUsers\", f:parsenoop },\n\t0x0193: { n:\"BrtEOF\", f:parsenoop },\n\t0x0194: { n:\"BrtUCR\", f:parsenoop },\n\t0x0195: { n:\"BrtRRInsDel\", f:parsenoop },\n\t0x0196: { n:\"BrtRREndInsDel\", f:parsenoop },\n\t0x0197: { n:\"BrtRRMove\", f:parsenoop },\n\t0x0198: { n:\"BrtRREndMove\", f:parsenoop },\n\t0x0199: { n:\"BrtRRChgCell\", f:parsenoop },\n\t0x019A: { n:\"BrtRREndChgCell\", f:parsenoop },\n\t0x019B: { n:\"BrtRRHeader\", f:parsenoop },\n\t0x019C: { n:\"BrtRRUserView\", f:parsenoop },\n\t0x019D: { n:\"BrtRRRenSheet\", f:parsenoop },\n\t0x019E: { n:\"BrtRRInsertSh\", f:parsenoop },\n\t0x019F: { n:\"BrtRRDefName\", f:parsenoop },\n\t0x01A0: { n:\"BrtRRNote\", f:parsenoop },\n\t0x01A1: { n:\"BrtRRConflict\", f:parsenoop },\n\t0x01A2: { n:\"BrtRRTQSIF\", f:parsenoop },\n\t0x01A3: { n:\"BrtRRFormat\", f:parsenoop },\n\t0x01A4: { n:\"BrtRREndFormat\", f:parsenoop },\n\t0x01A5: { n:\"BrtRRAutoFmt\", f:parsenoop },\n\t0x01A6: { n:\"BrtBeginUserShViews\", f:parsenoop },\n\t0x01A7: { n:\"BrtBeginUserShView\", f:parsenoop },\n\t0x01A8: { n:\"BrtEndUserShView\", f:parsenoop },\n\t0x01A9: { n:\"BrtEndUserShViews\", f:parsenoop },\n\t0x01AA: { n:\"BrtArrFmla\", f:parsenoop },\n\t0x01AB: { n:\"BrtShrFmla\", f:parsenoop },\n\t0x01AC: { n:\"BrtTable\", f:parsenoop },\n\t0x01AD: { n:\"BrtBeginExtConnections\", f:parsenoop },\n\t0x01AE: { n:\"BrtEndExtConnections\", f:parsenoop },\n\t0x01AF: { n:\"BrtBeginPCDCalcMems\", f:parsenoop },\n\t0x01B0: { n:\"BrtEndPCDCalcMems\", f:parsenoop },\n\t0x01B1: { n:\"BrtBeginPCDCalcMem\", f:parsenoop },\n\t0x01B2: { n:\"BrtEndPCDCalcMem\", f:parsenoop },\n\t0x01B3: { n:\"BrtBeginPCDHGLevels\", f:parsenoop },\n\t0x01B4: { n:\"BrtEndPCDHGLevels\", f:parsenoop },\n\t0x01B5: { n:\"BrtBeginPCDHGLevel\", f:parsenoop },\n\t0x01B6: { n:\"BrtEndPCDHGLevel\", f:parsenoop },\n\t0x01B7: { n:\"BrtBeginPCDHGLGroups\", f:parsenoop },\n\t0x01B8: { n:\"BrtEndPCDHGLGroups\", f:parsenoop },\n\t0x01B9: { n:\"BrtBeginPCDHGLGroup\", f:parsenoop },\n\t0x01BA: { n:\"BrtEndPCDHGLGroup\", f:parsenoop },\n\t0x01BB: { n:\"BrtBeginPCDHGLGMembers\", f:parsenoop },\n\t0x01BC: { n:\"BrtEndPCDHGLGMembers\", f:parsenoop },\n\t0x01BD: { n:\"BrtBeginPCDHGLGMember\", f:parsenoop },\n\t0x01BE: { n:\"BrtEndPCDHGLGMember\", f:parsenoop },\n\t0x01BF: { n:\"BrtBeginQSI\", f:parsenoop },\n\t0x01C0: { n:\"BrtEndQSI\", f:parsenoop },\n\t0x01C1: { n:\"BrtBeginQSIR\", f:parsenoop },\n\t0x01C2: { n:\"BrtEndQSIR\", f:parsenoop },\n\t0x01C3: { n:\"BrtBeginDeletedNames\", f:parsenoop },\n\t0x01C4: { n:\"BrtEndDeletedNames\", f:parsenoop },\n\t0x01C5: { n:\"BrtBeginDeletedName\", f:parsenoop },\n\t0x01C6: { n:\"BrtEndDeletedName\", f:parsenoop },\n\t0x01C7: { n:\"BrtBeginQSIFs\", f:parsenoop },\n\t0x01C8: { n:\"BrtEndQSIFs\", f:parsenoop },\n\t0x01C9: { n:\"BrtBeginQSIF\", f:parsenoop },\n\t0x01CA: { n:\"BrtEndQSIF\", f:parsenoop },\n\t0x01CB: { n:\"BrtBeginAutoSortScope\", f:parsenoop },\n\t0x01CC: { n:\"BrtEndAutoSortScope\", f:parsenoop },\n\t0x01CD: { n:\"BrtBeginConditionalFormatting\", f:parsenoop },\n\t0x01CE: { n:\"BrtEndConditionalFormatting\", f:parsenoop },\n\t0x01CF: { n:\"BrtBeginCFRule\", f:parsenoop },\n\t0x01D0: { n:\"BrtEndCFRule\", f:parsenoop },\n\t0x01D1: { n:\"BrtBeginIconSet\", f:parsenoop },\n\t0x01D2: { n:\"BrtEndIconSet\", f:parsenoop },\n\t0x01D3: { n:\"BrtBeginDatabar\", f:parsenoop },\n\t0x01D4: { n:\"BrtEndDatabar\", f:parsenoop },\n\t0x01D5: { n:\"BrtBeginColorScale\", f:parsenoop },\n\t0x01D6: { n:\"BrtEndColorScale\", f:parsenoop },\n\t0x01D7: { n:\"BrtCFVO\", f:parsenoop },\n\t0x01D8: { n:\"BrtExternValueMeta\", f:parsenoop },\n\t0x01D9: { n:\"BrtBeginColorPalette\", f:parsenoop },\n\t0x01DA: { n:\"BrtEndColorPalette\", f:parsenoop },\n\t0x01DB: { n:\"BrtIndexedColor\", f:parsenoop },\n\t0x01DC: { n:\"BrtMargins\", f:parsenoop },\n\t0x01DD: { n:\"BrtPrintOptions\", f:parsenoop },\n\t0x01DE: { n:\"BrtPageSetup\", f:parsenoop },\n\t0x01DF: { n:\"BrtBeginHeaderFooter\", f:parsenoop },\n\t0x01E0: { n:\"BrtEndHeaderFooter\", f:parsenoop },\n\t0x01E1: { n:\"BrtBeginSXCrtFormat\", f:parsenoop },\n\t0x01E2: { n:\"BrtEndSXCrtFormat\", f:parsenoop },\n\t0x01E3: { n:\"BrtBeginSXCrtFormats\", f:parsenoop },\n\t0x01E4: { n:\"BrtEndSXCrtFormats\", f:parsenoop },\n\t0x01E5: { n:\"BrtWsFmtInfo\", f:parsenoop },\n\t0x01E6: { n:\"BrtBeginMgs\", f:parsenoop },\n\t0x01E7: { n:\"BrtEndMGs\", f:parsenoop },\n\t0x01E8: { n:\"BrtBeginMGMaps\", f:parsenoop },\n\t0x01E9: { n:\"BrtEndMGMaps\", f:parsenoop },\n\t0x01EA: { n:\"BrtBeginMG\", f:parsenoop },\n\t0x01EB: { n:\"BrtEndMG\", f:parsenoop },\n\t0x01EC: { n:\"BrtBeginMap\", f:parsenoop },\n\t0x01ED: { n:\"BrtEndMap\", f:parsenoop },\n\t0x01EE: { n:\"BrtHLink\", f:parse_BrtHLink },\n\t0x01EF: { n:\"BrtBeginDCon\", f:parsenoop },\n\t0x01F0: { n:\"BrtEndDCon\", f:parsenoop },\n\t0x01F1: { n:\"BrtBeginDRefs\", f:parsenoop },\n\t0x01F2: { n:\"BrtEndDRefs\", f:parsenoop },\n\t0x01F3: { n:\"BrtDRef\", f:parsenoop },\n\t0x01F4: { n:\"BrtBeginScenMan\", f:parsenoop },\n\t0x01F5: { n:\"BrtEndScenMan\", f:parsenoop },\n\t0x01F6: { n:\"BrtBeginSct\", f:parsenoop },\n\t0x01F7: { n:\"BrtEndSct\", f:parsenoop },\n\t0x01F8: { n:\"BrtSlc\", f:parsenoop },\n\t0x01F9: { n:\"BrtBeginDXFs\", f:parsenoop },\n\t0x01FA: { n:\"BrtEndDXFs\", f:parsenoop },\n\t0x01FB: { n:\"BrtDXF\", f:parsenoop },\n\t0x01FC: { n:\"BrtBeginTableStyles\", f:parsenoop },\n\t0x01FD: { n:\"BrtEndTableStyles\", f:parsenoop },\n\t0x01FE: { n:\"BrtBeginTableStyle\", f:parsenoop },\n\t0x01FF: { n:\"BrtEndTableStyle\", f:parsenoop },\n\t0x0200: { n:\"BrtTableStyleElement\", f:parsenoop },\n\t0x0201: { n:\"BrtTableStyleClient\", f:parsenoop },\n\t0x0202: { n:\"BrtBeginVolDeps\", f:parsenoop },\n\t0x0203: { n:\"BrtEndVolDeps\", f:parsenoop },\n\t0x0204: { n:\"BrtBeginVolType\", f:parsenoop },\n\t0x0205: { n:\"BrtEndVolType\", f:parsenoop },\n\t0x0206: { n:\"BrtBeginVolMain\", f:parsenoop },\n\t0x0207: { n:\"BrtEndVolMain\", f:parsenoop },\n\t0x0208: { n:\"BrtBeginVolTopic\", f:parsenoop },\n\t0x0209: { n:\"BrtEndVolTopic\", f:parsenoop },\n\t0x020A: { n:\"BrtVolSubtopic\", f:parsenoop },\n\t0x020B: { n:\"BrtVolRef\", f:parsenoop },\n\t0x020C: { n:\"BrtVolNum\", f:parsenoop },\n\t0x020D: { n:\"BrtVolErr\", f:parsenoop },\n\t0x020E: { n:\"BrtVolStr\", f:parsenoop },\n\t0x020F: { n:\"BrtVolBool\", f:parsenoop },\n\t0x0210: { n:\"BrtBeginCalcChain$\", f:parsenoop },\n\t0x0211: { n:\"BrtEndCalcChain$\", f:parsenoop },\n\t0x0212: { n:\"BrtBeginSortState\", f:parsenoop },\n\t0x0213: { n:\"BrtEndSortState\", f:parsenoop },\n\t0x0214: { n:\"BrtBeginSortCond\", f:parsenoop },\n\t0x0215: { n:\"BrtEndSortCond\", f:parsenoop },\n\t0x0216: { n:\"BrtBookProtection\", f:parsenoop },\n\t0x0217: { n:\"BrtSheetProtection\", f:parsenoop },\n\t0x0218: { n:\"BrtRangeProtection\", f:parsenoop },\n\t0x0219: { n:\"BrtPhoneticInfo\", f:parsenoop },\n\t0x021A: { n:\"BrtBeginECTxtWiz\", f:parsenoop },\n\t0x021B: { n:\"BrtEndECTxtWiz\", f:parsenoop },\n\t0x021C: { n:\"BrtBeginECTWFldInfoLst\", f:parsenoop },\n\t0x021D: { n:\"BrtEndECTWFldInfoLst\", f:parsenoop },\n\t0x021E: { n:\"BrtBeginECTwFldInfo\", f:parsenoop },\n\t0x0224: { n:\"BrtFileSharing\", f:parsenoop },\n\t0x0225: { n:\"BrtOleSize\", f:parsenoop },\n\t0x0226: { n:\"BrtDrawing\", f:parsenoop },\n\t0x0227: { n:\"BrtLegacyDrawing\", f:parsenoop },\n\t0x0228: { n:\"BrtLegacyDrawingHF\", f:parsenoop },\n\t0x0229: { n:\"BrtWebOpt\", f:parsenoop },\n\t0x022A: { n:\"BrtBeginWebPubItems\", f:parsenoop },\n\t0x022B: { n:\"BrtEndWebPubItems\", f:parsenoop },\n\t0x022C: { n:\"BrtBeginWebPubItem\", f:parsenoop },\n\t0x022D: { n:\"BrtEndWebPubItem\", f:parsenoop },\n\t0x022E: { n:\"BrtBeginSXCondFmt\", f:parsenoop },\n\t0x022F: { n:\"BrtEndSXCondFmt\", f:parsenoop },\n\t0x0230: { n:\"BrtBeginSXCondFmts\", f:parsenoop },\n\t0x0231: { n:\"BrtEndSXCondFmts\", f:parsenoop },\n\t0x0232: { n:\"BrtBkHim\", f:parsenoop },\n\t0x0234: { n:\"BrtColor\", f:parsenoop },\n\t0x0235: { n:\"BrtBeginIndexedColors\", f:parsenoop },\n\t0x0236: { n:\"BrtEndIndexedColors\", f:parsenoop },\n\t0x0239: { n:\"BrtBeginMRUColors\", f:parsenoop },\n\t0x023A: { n:\"BrtEndMRUColors\", f:parsenoop },\n\t0x023C: { n:\"BrtMRUColor\", f:parsenoop },\n\t0x023D: { n:\"BrtBeginDVals\", f:parsenoop },\n\t0x023E: { n:\"BrtEndDVals\", f:parsenoop },\n\t0x0241: { n:\"BrtSupNameStart\", f:parsenoop },\n\t0x0242: { n:\"BrtSupNameValueStart\", f:parsenoop },\n\t0x0243: { n:\"BrtSupNameValueEnd\", f:parsenoop },\n\t0x0244: { n:\"BrtSupNameNum\", f:parsenoop },\n\t0x0245: { n:\"BrtSupNameErr\", f:parsenoop },\n\t0x0246: { n:\"BrtSupNameSt\", f:parsenoop },\n\t0x0247: { n:\"BrtSupNameNil\", f:parsenoop },\n\t0x0248: { n:\"BrtSupNameBool\", f:parsenoop },\n\t0x0249: { n:\"BrtSupNameFmla\", f:parsenoop },\n\t0x024A: { n:\"BrtSupNameBits\", f:parsenoop },\n\t0x024B: { n:\"BrtSupNameEnd\", f:parsenoop },\n\t0x024C: { n:\"BrtEndSupBook\", f:parsenoop },\n\t0x024D: { n:\"BrtCellSmartTagProperty\", f:parsenoop },\n\t0x024E: { n:\"BrtBeginCellSmartTag\", f:parsenoop },\n\t0x024F: { n:\"BrtEndCellSmartTag\", f:parsenoop },\n\t0x0250: { n:\"BrtBeginCellSmartTags\", f:parsenoop },\n\t0x0251: { n:\"BrtEndCellSmartTags\", f:parsenoop },\n\t0x0252: { n:\"BrtBeginSmartTags\", f:parsenoop },\n\t0x0253: { n:\"BrtEndSmartTags\", f:parsenoop },\n\t0x0254: { n:\"BrtSmartTagType\", f:parsenoop },\n\t0x0255: { n:\"BrtBeginSmartTagTypes\", f:parsenoop },\n\t0x0256: { n:\"BrtEndSmartTagTypes\", f:parsenoop },\n\t0x0257: { n:\"BrtBeginSXFilters\", f:parsenoop },\n\t0x0258: { n:\"BrtEndSXFilters\", f:parsenoop },\n\t0x0259: { n:\"BrtBeginSXFILTER\", f:parsenoop },\n\t0x025A: { n:\"BrtEndSXFilter\", f:parsenoop },\n\t0x025B: { n:\"BrtBeginFills\", f:parsenoop },\n\t0x025C: { n:\"BrtEndFills\", f:parsenoop },\n\t0x025D: { n:\"BrtBeginCellWatches\", f:parsenoop },\n\t0x025E: { n:\"BrtEndCellWatches\", f:parsenoop },\n\t0x025F: { n:\"BrtCellWatch\", f:parsenoop },\n\t0x0260: { n:\"BrtBeginCRErrs\", f:parsenoop },\n\t0x0261: { n:\"BrtEndCRErrs\", f:parsenoop },\n\t0x0262: { n:\"BrtCrashRecErr\", f:parsenoop },\n\t0x0263: { n:\"BrtBeginFonts\", f:parsenoop },\n\t0x0264: { n:\"BrtEndFonts\", f:parsenoop },\n\t0x0265: { n:\"BrtBeginBorders\", f:parsenoop },\n\t0x0266: { n:\"BrtEndBorders\", f:parsenoop },\n\t0x0267: { n:\"BrtBeginFmts\", f:parsenoop },\n\t0x0268: { n:\"BrtEndFmts\", f:parsenoop },\n\t0x0269: { n:\"BrtBeginCellXFs\", f:parsenoop },\n\t0x026A: { n:\"BrtEndCellXFs\", f:parsenoop },\n\t0x026B: { n:\"BrtBeginStyles\", f:parsenoop },\n\t0x026C: { n:\"BrtEndStyles\", f:parsenoop },\n\t0x0271: { n:\"BrtBigName\", f:parsenoop },\n\t0x0272: { n:\"BrtBeginCellStyleXFs\", f:parsenoop },\n\t0x0273: { n:\"BrtEndCellStyleXFs\", f:parsenoop },\n\t0x0274: { n:\"BrtBeginComments\", f:parsenoop },\n\t0x0275: { n:\"BrtEndComments\", f:parsenoop },\n\t0x0276: { n:\"BrtBeginCommentAuthors\", f:parsenoop },\n\t0x0277: { n:\"BrtEndCommentAuthors\", f:parsenoop },\n\t0x0278: { n:\"BrtCommentAuthor\", f:parse_BrtCommentAuthor },\n\t0x0279: { n:\"BrtBeginCommentList\", f:parsenoop },\n\t0x027A: { n:\"BrtEndCommentList\", f:parsenoop },\n\t0x027B: { n:\"BrtBeginComment\", f:parse_BrtBeginComment},\n\t0x027C: { n:\"BrtEndComment\", f:parsenoop },\n\t0x027D: { n:\"BrtCommentText\", f:parse_BrtCommentText },\n\t0x027E: { n:\"BrtBeginOleObjects\", f:parsenoop },\n\t0x027F: { n:\"BrtOleObject\", f:parsenoop },\n\t0x0280: { n:\"BrtEndOleObjects\", f:parsenoop },\n\t0x0281: { n:\"BrtBeginSxrules\", f:parsenoop },\n\t0x0282: { n:\"BrtEndSxRules\", f:parsenoop },\n\t0x0283: { n:\"BrtBeginActiveXControls\", f:parsenoop },\n\t0x0284: { n:\"BrtActiveX\", f:parsenoop },\n\t0x0285: { n:\"BrtEndActiveXControls\", f:parsenoop },\n\t0x0286: { n:\"BrtBeginPCDSDTCEMembersSortBy\", f:parsenoop },\n\t0x0288: { n:\"BrtBeginCellIgnoreECs\", f:parsenoop },\n\t0x0289: { n:\"BrtCellIgnoreEC\", f:parsenoop },\n\t0x028A: { n:\"BrtEndCellIgnoreECs\", f:parsenoop },\n\t0x028B: { n:\"BrtCsProp\", f:parsenoop },\n\t0x028C: { n:\"BrtCsPageSetup\", f:parsenoop },\n\t0x028D: { n:\"BrtBeginUserCsViews\", f:parsenoop },\n\t0x028E: { n:\"BrtEndUserCsViews\", f:parsenoop },\n\t0x028F: { n:\"BrtBeginUserCsView\", f:parsenoop },\n\t0x0290: { n:\"BrtEndUserCsView\", f:parsenoop },\n\t0x0291: { n:\"BrtBeginPcdSFCIEntries\", f:parsenoop },\n\t0x0292: { n:\"BrtEndPCDSFCIEntries\", f:parsenoop },\n\t0x0293: { n:\"BrtPCDSFCIEntry\", f:parsenoop },\n\t0x0294: { n:\"BrtBeginListParts\", f:parsenoop },\n\t0x0295: { n:\"BrtListPart\", f:parsenoop },\n\t0x0296: { n:\"BrtEndListParts\", f:parsenoop },\n\t0x0297: { n:\"BrtSheetCalcProp\", f:parsenoop },\n\t0x0298: { n:\"BrtBeginFnGroup\", f:parsenoop },\n\t0x0299: { n:\"BrtFnGroup\", f:parsenoop },\n\t0x029A: { n:\"BrtEndFnGroup\", f:parsenoop },\n\t0x029B: { n:\"BrtSupAddin\", f:parsenoop },\n\t0x029C: { n:\"BrtSXTDMPOrder\", f:parsenoop },\n\t0x029D: { n:\"BrtCsProtection\", f:parsenoop },\n\t0x029F: { n:\"BrtBeginWsSortMap\", f:parsenoop },\n\t0x02A0: { n:\"BrtEndWsSortMap\", f:parsenoop },\n\t0x02A1: { n:\"BrtBeginRRSort\", f:parsenoop },\n\t0x02A2: { n:\"BrtEndRRSort\", f:parsenoop },\n\t0x02A3: { n:\"BrtRRSortItem\", f:parsenoop },\n\t0x02A4: { n:\"BrtFileSharingIso\", f:parsenoop },\n\t0x02A5: { n:\"BrtBookProtectionIso\", f:parsenoop },\n\t0x02A6: { n:\"BrtSheetProtectionIso\", f:parsenoop },\n\t0x02A7: { n:\"BrtCsProtectionIso\", f:parsenoop },\n\t0x02A8: { n:\"BrtRangeProtectionIso\", f:parsenoop },\n\t0x0400: { n:\"BrtRwDescent\", f:parsenoop },\n\t0x0401: { n:\"BrtKnownFonts\", f:parsenoop },\n\t0x0402: { n:\"BrtBeginSXTupleSet\", f:parsenoop },\n\t0x0403: { n:\"BrtEndSXTupleSet\", f:parsenoop },\n\t0x0404: { n:\"BrtBeginSXTupleSetHeader\", f:parsenoop },\n\t0x0405: { n:\"BrtEndSXTupleSetHeader\", f:parsenoop },\n\t0x0406: { n:\"BrtSXTupleSetHeaderItem\", f:parsenoop },\n\t0x0407: { n:\"BrtBeginSXTupleSetData\", f:parsenoop },\n\t0x0408: { n:\"BrtEndSXTupleSetData\", f:parsenoop },\n\t0x0409: { n:\"BrtBeginSXTupleSetRow\", f:parsenoop },\n\t0x040A: { n:\"BrtEndSXTupleSetRow\", f:parsenoop },\n\t0x040B: { n:\"BrtSXTupleSetRowItem\", f:parsenoop },\n\t0x040C: { n:\"BrtNameExt\", f:parsenoop },\n\t0x040D: { n:\"BrtPCDH14\", f:parsenoop },\n\t0x040E: { n:\"BrtBeginPCDCalcMem14\", f:parsenoop },\n\t0x040F: { n:\"BrtEndPCDCalcMem14\", f:parsenoop },\n\t0x0410: { n:\"BrtSXTH14\", f:parsenoop },\n\t0x0411: { n:\"BrtBeginSparklineGroup\", f:parsenoop },\n\t0x0412: { n:\"BrtEndSparklineGroup\", f:parsenoop },\n\t0x0413: { n:\"BrtSparkline\", f:parsenoop },\n\t0x0414: { n:\"BrtSXDI14\", f:parsenoop },\n\t0x0415: { n:\"BrtWsFmtInfoEx14\", f:parsenoop },\n\t0x0416: { n:\"BrtBeginConditionalFormatting14\", f:parsenoop },\n\t0x0417: { n:\"BrtEndConditionalFormatting14\", f:parsenoop },\n\t0x0418: { n:\"BrtBeginCFRule14\", f:parsenoop },\n\t0x0419: { n:\"BrtEndCFRule14\", f:parsenoop },\n\t0x041A: { n:\"BrtCFVO14\", f:parsenoop },\n\t0x041B: { n:\"BrtBeginDatabar14\", f:parsenoop },\n\t0x041C: { n:\"BrtBeginIconSet14\", f:parsenoop },\n\t0x041D: { n:\"BrtDVal14\", f:parsenoop },\n\t0x041E: { n:\"BrtBeginDVals14\", f:parsenoop },\n\t0x041F: { n:\"BrtColor14\", f:parsenoop },\n\t0x0420: { n:\"BrtBeginSparklines\", f:parsenoop },\n\t0x0421: { n:\"BrtEndSparklines\", f:parsenoop },\n\t0x0422: { n:\"BrtBeginSparklineGroups\", f:parsenoop },\n\t0x0423: { n:\"BrtEndSparklineGroups\", f:parsenoop },\n\t0x0425: { n:\"BrtSXVD14\", f:parsenoop },\n\t0x0426: { n:\"BrtBeginSxview14\", f:parsenoop },\n\t0x0427: { n:\"BrtEndSxview14\", f:parsenoop },\n\t0x042A: { n:\"BrtBeginPCD14\", f:parsenoop },\n\t0x042B: { n:\"BrtEndPCD14\", f:parsenoop },\n\t0x042C: { n:\"BrtBeginExtConn14\", f:parsenoop },\n\t0x042D: { n:\"BrtEndExtConn14\", f:parsenoop },\n\t0x042E: { n:\"BrtBeginSlicerCacheIDs\", f:parsenoop },\n\t0x042F: { n:\"BrtEndSlicerCacheIDs\", f:parsenoop },\n\t0x0430: { n:\"BrtBeginSlicerCacheID\", f:parsenoop },\n\t0x0431: { n:\"BrtEndSlicerCacheID\", f:parsenoop },\n\t0x0433: { n:\"BrtBeginSlicerCache\", f:parsenoop },\n\t0x0434: { n:\"BrtEndSlicerCache\", f:parsenoop },\n\t0x0435: { n:\"BrtBeginSlicerCacheDef\", f:parsenoop },\n\t0x0436: { n:\"BrtEndSlicerCacheDef\", f:parsenoop },\n\t0x0437: { n:\"BrtBeginSlicersEx\", f:parsenoop },\n\t0x0438: { n:\"BrtEndSlicersEx\", f:parsenoop },\n\t0x0439: { n:\"BrtBeginSlicerEx\", f:parsenoop },\n\t0x043A: { n:\"BrtEndSlicerEx\", f:parsenoop },\n\t0x043B: { n:\"BrtBeginSlicer\", f:parsenoop },\n\t0x043C: { n:\"BrtEndSlicer\", f:parsenoop },\n\t0x043D: { n:\"BrtSlicerCachePivotTables\", f:parsenoop },\n\t0x043E: { n:\"BrtBeginSlicerCacheOlapImpl\", f:parsenoop },\n\t0x043F: { n:\"BrtEndSlicerCacheOlapImpl\", f:parsenoop },\n\t0x0440: { n:\"BrtBeginSlicerCacheLevelsData\", f:parsenoop },\n\t0x0441: { n:\"BrtEndSlicerCacheLevelsData\", f:parsenoop },\n\t0x0442: { n:\"BrtBeginSlicerCacheLevelData\", f:parsenoop },\n\t0x0443: { n:\"BrtEndSlicerCacheLevelData\", f:parsenoop },\n\t0x0444: { n:\"BrtBeginSlicerCacheSiRanges\", f:parsenoop },\n\t0x0445: { n:\"BrtEndSlicerCacheSiRanges\", f:parsenoop },\n\t0x0446: { n:\"BrtBeginSlicerCacheSiRange\", f:parsenoop },\n\t0x0447: { n:\"BrtEndSlicerCacheSiRange\", f:parsenoop },\n\t0x0448: { n:\"BrtSlicerCacheOlapItem\", f:parsenoop },\n\t0x0449: { n:\"BrtBeginSlicerCacheSelections\", f:parsenoop },\n\t0x044A: { n:\"BrtSlicerCacheSelection\", f:parsenoop },\n\t0x044B: { n:\"BrtEndSlicerCacheSelections\", f:parsenoop },\n\t0x044C: { n:\"BrtBeginSlicerCacheNative\", f:parsenoop },\n\t0x044D: { n:\"BrtEndSlicerCacheNative\", f:parsenoop },\n\t0x044E: { n:\"BrtSlicerCacheNativeItem\", f:parsenoop },\n\t0x044F: { n:\"BrtRangeProtection14\", f:parsenoop },\n\t0x0450: { n:\"BrtRangeProtectionIso14\", f:parsenoop },\n\t0x0451: { n:\"BrtCellIgnoreEC14\", f:parsenoop },\n\t0x0457: { n:\"BrtList14\", f:parsenoop },\n\t0x0458: { n:\"BrtCFIcon\", f:parsenoop },\n\t0x0459: { n:\"BrtBeginSlicerCachesPivotCacheIDs\", f:parsenoop },\n\t0x045A: { n:\"BrtEndSlicerCachesPivotCacheIDs\", f:parsenoop },\n\t0x045B: { n:\"BrtBeginSlicers\", f:parsenoop },\n\t0x045C: { n:\"BrtEndSlicers\", f:parsenoop },\n\t0x045D: { n:\"BrtWbProp14\", f:parsenoop },\n\t0x045E: { n:\"BrtBeginSXEdit\", f:parsenoop },\n\t0x045F: { n:\"BrtEndSXEdit\", f:parsenoop },\n\t0x0460: { n:\"BrtBeginSXEdits\", f:parsenoop },\n\t0x0461: { n:\"BrtEndSXEdits\", f:parsenoop },\n\t0x0462: { n:\"BrtBeginSXChange\", f:parsenoop },\n\t0x0463: { n:\"BrtEndSXChange\", f:parsenoop },\n\t0x0464: { n:\"BrtBeginSXChanges\", f:parsenoop },\n\t0x0465: { n:\"BrtEndSXChanges\", f:parsenoop },\n\t0x0466: { n:\"BrtSXTupleItems\", f:parsenoop },\n\t0x0468: { n:\"BrtBeginSlicerStyle\", f:parsenoop },\n\t0x0469: { n:\"BrtEndSlicerStyle\", f:parsenoop },\n\t0x046A: { n:\"BrtSlicerStyleElement\", f:parsenoop },\n\t0x046B: { n:\"BrtBeginStyleSheetExt14\", f:parsenoop },\n\t0x046C: { n:\"BrtEndStyleSheetExt14\", f:parsenoop },\n\t0x046D: { n:\"BrtBeginSlicerCachesPivotCacheID\", f:parsenoop },\n\t0x046E: { n:\"BrtEndSlicerCachesPivotCacheID\", f:parsenoop },\n\t0x046F: { n:\"BrtBeginConditionalFormattings\", f:parsenoop },\n\t0x0470: { n:\"BrtEndConditionalFormattings\", f:parsenoop },\n\t0x0471: { n:\"BrtBeginPCDCalcMemExt\", f:parsenoop },\n\t0x0472: { n:\"BrtEndPCDCalcMemExt\", f:parsenoop },\n\t0x0473: { n:\"BrtBeginPCDCalcMemsExt\", f:parsenoop },\n\t0x0474: { n:\"BrtEndPCDCalcMemsExt\", f:parsenoop },\n\t0x0475: { n:\"BrtPCDField14\", f:parsenoop },\n\t0x0476: { n:\"BrtBeginSlicerStyles\", f:parsenoop },\n\t0x0477: { n:\"BrtEndSlicerStyles\", f:parsenoop },\n\t0x0478: { n:\"BrtBeginSlicerStyleElements\", f:parsenoop },\n\t0x0479: { n:\"BrtEndSlicerStyleElements\", f:parsenoop },\n\t0x047A: { n:\"BrtCFRuleExt\", f:parsenoop },\n\t0x047B: { n:\"BrtBeginSXCondFmt14\", f:parsenoop },\n\t0x047C: { n:\"BrtEndSXCondFmt14\", f:parsenoop },\n\t0x047D: { n:\"BrtBeginSXCondFmts14\", f:parsenoop },\n\t0x047E: { n:\"BrtEndSXCondFmts14\", f:parsenoop },\n\t0x0480: { n:\"BrtBeginSortCond14\", f:parsenoop },\n\t0x0481: { n:\"BrtEndSortCond14\", f:parsenoop },\n\t0x0482: { n:\"BrtEndDVals14\", f:parsenoop },\n\t0x0483: { n:\"BrtEndIconSet14\", f:parsenoop },\n\t0x0484: { n:\"BrtEndDatabar14\", f:parsenoop },\n\t0x0485: { n:\"BrtBeginColorScale14\", f:parsenoop },\n\t0x0486: { n:\"BrtEndColorScale14\", f:parsenoop },\n\t0x0487: { n:\"BrtBeginSxrules14\", f:parsenoop },\n\t0x0488: { n:\"BrtEndSxrules14\", f:parsenoop },\n\t0x0489: { n:\"BrtBeginPRule14\", f:parsenoop },\n\t0x048A: { n:\"BrtEndPRule14\", f:parsenoop },\n\t0x048B: { n:\"BrtBeginPRFilters14\", f:parsenoop },\n\t0x048C: { n:\"BrtEndPRFilters14\", f:parsenoop },\n\t0x048D: { n:\"BrtBeginPRFilter14\", f:parsenoop },\n\t0x048E: { n:\"BrtEndPRFilter14\", f:parsenoop },\n\t0x048F: { n:\"BrtBeginPRFItem14\", f:parsenoop },\n\t0x0490: { n:\"BrtEndPRFItem14\", f:parsenoop },\n\t0x0491: { n:\"BrtBeginCellIgnoreECs14\", f:parsenoop },\n\t0x0492: { n:\"BrtEndCellIgnoreECs14\", f:parsenoop },\n\t0x0493: { n:\"BrtDxf14\", f:parsenoop },\n\t0x0494: { n:\"BrtBeginDxF14s\", f:parsenoop },\n\t0x0495: { n:\"BrtEndDxf14s\", f:parsenoop },\n\t0x0499: { n:\"BrtFilter14\", f:parsenoop },\n\t0x049A: { n:\"BrtBeginCustomFilters14\", f:parsenoop },\n\t0x049C: { n:\"BrtCustomFilter14\", f:parsenoop },\n\t0x049D: { n:\"BrtIconFilter14\", f:parsenoop },\n\t0x049E: { n:\"BrtPivotCacheConnectionName\", f:parsenoop },\n\t0x0800: { n:\"BrtBeginDecoupledPivotCacheIDs\", f:parsenoop },\n\t0x0801: { n:\"BrtEndDecoupledPivotCacheIDs\", f:parsenoop },\n\t0x0802: { n:\"BrtDecoupledPivotCacheID\", f:parsenoop },\n\t0x0803: { n:\"BrtBeginPivotTableRefs\", f:parsenoop },\n\t0x0804: { n:\"BrtEndPivotTableRefs\", f:parsenoop },\n\t0x0805: { n:\"BrtPivotTableRef\", f:parsenoop },\n\t0x0806: { n:\"BrtSlicerCacheBookPivotTables\", f:parsenoop },\n\t0x0807: { n:\"BrtBeginSxvcells\", f:parsenoop },\n\t0x0808: { n:\"BrtEndSxvcells\", f:parsenoop },\n\t0x0809: { n:\"BrtBeginSxRow\", f:parsenoop },\n\t0x080A: { n:\"BrtEndSxRow\", f:parsenoop },\n\t0x080C: { n:\"BrtPcdCalcMem15\", f:parsenoop },\n\t0x0813: { n:\"BrtQsi15\", f:parsenoop },\n\t0x0814: { n:\"BrtBeginWebExtensions\", f:parsenoop },\n\t0x0815: { n:\"BrtEndWebExtensions\", f:parsenoop },\n\t0x0816: { n:\"BrtWebExtension\", f:parsenoop },\n\t0x0817: { n:\"BrtAbsPath15\", f:parsenoop },\n\t0x0818: { n:\"BrtBeginPivotTableUISettings\", f:parsenoop },\n\t0x0819: { n:\"BrtEndPivotTableUISettings\", f:parsenoop },\n\t0x081B: { n:\"BrtTableSlicerCacheIDs\", f:parsenoop },\n\t0x081C: { n:\"BrtTableSlicerCacheID\", f:parsenoop },\n\t0x081D: { n:\"BrtBeginTableSlicerCache\", f:parsenoop },\n\t0x081E: { n:\"BrtEndTableSlicerCache\", f:parsenoop },\n\t0x081F: { n:\"BrtSxFilter15\", f:parsenoop },\n\t0x0820: { n:\"BrtBeginTimelineCachePivotCacheIDs\", f:parsenoop },\n\t0x0821: { n:\"BrtEndTimelineCachePivotCacheIDs\", f:parsenoop },\n\t0x0822: { n:\"BrtTimelineCachePivotCacheID\", f:parsenoop },\n\t0x0823: { n:\"BrtBeginTimelineCacheIDs\", f:parsenoop },\n\t0x0824: { n:\"BrtEndTimelineCacheIDs\", f:parsenoop },\n\t0x0825: { n:\"BrtBeginTimelineCacheID\", f:parsenoop },\n\t0x0826: { n:\"BrtEndTimelineCacheID\", f:parsenoop },\n\t0x0827: { n:\"BrtBeginTimelinesEx\", f:parsenoop },\n\t0x0828: { n:\"BrtEndTimelinesEx\", f:parsenoop },\n\t0x0829: { n:\"BrtBeginTimelineEx\", f:parsenoop },\n\t0x082A: { n:\"BrtEndTimelineEx\", f:parsenoop },\n\t0x082B: { n:\"BrtWorkBookPr15\", f:parsenoop },\n\t0x082C: { n:\"BrtPCDH15\", f:parsenoop },\n\t0x082D: { n:\"BrtBeginTimelineStyle\", f:parsenoop },\n\t0x082E: { n:\"BrtEndTimelineStyle\", f:parsenoop },\n\t0x082F: { n:\"BrtTimelineStyleElement\", f:parsenoop },\n\t0x0830: { n:\"BrtBeginTimelineStylesheetExt15\", f:parsenoop },\n\t0x0831: { n:\"BrtEndTimelineStylesheetExt15\", f:parsenoop },\n\t0x0832: { n:\"BrtBeginTimelineStyles\", f:parsenoop },\n\t0x0833: { n:\"BrtEndTimelineStyles\", f:parsenoop },\n\t0x0834: { n:\"BrtBeginTimelineStyleElements\", f:parsenoop },\n\t0x0835: { n:\"BrtEndTimelineStyleElements\", f:parsenoop },\n\t0x0836: { n:\"BrtDxf15\", f:parsenoop },\n\t0x0837: { n:\"BrtBeginDxfs15\", f:parsenoop },\n\t0x0838: { n:\"brtEndDxfs15\", f:parsenoop },\n\t0x0839: { n:\"BrtSlicerCacheHideItemsWithNoData\", f:parsenoop },\n\t0x083A: { n:\"BrtBeginItemUniqueNames\", f:parsenoop },\n\t0x083B: { n:\"BrtEndItemUniqueNames\", f:parsenoop },\n\t0x083C: { n:\"BrtItemUniqueName\", f:parsenoop },\n\t0x083D: { n:\"BrtBeginExtConn15\", f:parsenoop },\n\t0x083E: { n:\"BrtEndExtConn15\", f:parsenoop },\n\t0x083F: { n:\"BrtBeginOledbPr15\", f:parsenoop },\n\t0x0840: { n:\"BrtEndOledbPr15\", f:parsenoop },\n\t0x0841: { n:\"BrtBeginDataFeedPr15\", f:parsenoop },\n\t0x0842: { n:\"BrtEndDataFeedPr15\", f:parsenoop },\n\t0x0843: { n:\"BrtTextPr15\", f:parsenoop },\n\t0x0844: { n:\"BrtRangePr15\", f:parsenoop },\n\t0x0845: { n:\"BrtDbCommand15\", f:parsenoop },\n\t0x0846: { n:\"BrtBeginDbTables15\", f:parsenoop },\n\t0x0847: { n:\"BrtEndDbTables15\", f:parsenoop },\n\t0x0848: { n:\"BrtDbTable15\", f:parsenoop },\n\t0x0849: { n:\"BrtBeginDataModel\", f:parsenoop },\n\t0x084A: { n:\"BrtEndDataModel\", f:parsenoop },\n\t0x084B: { n:\"BrtBeginModelTables\", f:parsenoop },\n\t0x084C: { n:\"BrtEndModelTables\", f:parsenoop },\n\t0x084D: { n:\"BrtModelTable\", f:parsenoop },\n\t0x084E: { n:\"BrtBeginModelRelationships\", f:parsenoop },\n\t0x084F: { n:\"BrtEndModelRelationships\", f:parsenoop },\n\t0x0850: { n:\"BrtModelRelationship\", f:parsenoop },\n\t0x0851: { n:\"BrtBeginECTxtWiz15\", f:parsenoop },\n\t0x0852: { n:\"BrtEndECTxtWiz15\", f:parsenoop },\n\t0x0853: { n:\"BrtBeginECTWFldInfoLst15\", f:parsenoop },\n\t0x0854: { n:\"BrtEndECTWFldInfoLst15\", f:parsenoop },\n\t0x0855: { n:\"BrtBeginECTWFldInfo15\", f:parsenoop },\n\t0x0856: { n:\"BrtFieldListActiveItem\", f:parsenoop },\n\t0x0857: { n:\"BrtPivotCacheIdVersion\", f:parsenoop },\n\t0x0858: { n:\"BrtSXDI15\", f:parsenoop },\n\t0xFFFF: { n:\"\", f:parsenoop }\n};\n\nvar evert_RE = evert_key(XLSBRecordEnum, 'n');\n\n/* [MS-XLS] 2.3 Record Enumeration */\nvar XLSRecordEnum = {\n\t0x0003: { n:\"BIFF2NUM\", f:parse_BIFF2NUM },\n\t0x0004: { n:\"BIFF2STR\", f:parse_BIFF2STR },\n\t0x0006: { n:\"Formula\", f:parse_Formula },\n\t0x0009: { n:'BOF', f:parse_BOF },\n\t0x000a: { n:'EOF', f:parse_EOF },\n\t0x000c: { n:\"CalcCount\", f:parse_CalcCount },\n\t0x000d: { n:\"CalcMode\", f:parse_CalcMode },\n\t0x000e: { n:\"CalcPrecision\", f:parse_CalcPrecision },\n\t0x000f: { n:\"CalcRefMode\", f:parse_CalcRefMode },\n\t0x0010: { n:\"CalcDelta\", f:parse_CalcDelta },\n\t0x0011: { n:\"CalcIter\", f:parse_CalcIter },\n\t0x0012: { n:\"Protect\", f:parse_Protect },\n\t0x0013: { n:\"Password\", f:parse_Password },\n\t0x0014: { n:\"Header\", f:parse_Header },\n\t0x0015: { n:\"Footer\", f:parse_Footer },\n\t0x0017: { n:\"ExternSheet\", f:parse_ExternSheet },\n\t0x0018: { n:\"Lbl\", f:parse_Lbl },\n\t0x0019: { n:\"WinProtect\", f:parse_WinProtect },\n\t0x001a: { n:\"VerticalPageBreaks\", f:parse_VerticalPageBreaks },\n\t0x001b: { n:\"HorizontalPageBreaks\", f:parse_HorizontalPageBreaks },\n\t0x001c: { n:\"Note\", f:parse_Note },\n\t0x001d: { n:\"Selection\", f:parse_Selection },\n\t0x0022: { n:\"Date1904\", f:parse_Date1904 },\n\t0x0023: { n:\"ExternName\", f:parse_ExternName },\n\t0x0026: { n:\"LeftMargin\", f:parse_LeftMargin },\n\t0x0027: { n:\"RightMargin\", f:parse_RightMargin },\n\t0x0028: { n:\"TopMargin\", f:parse_TopMargin },\n\t0x0029: { n:\"BottomMargin\", f:parse_BottomMargin },\n\t0x002a: { n:\"PrintRowCol\", f:parse_PrintRowCol },\n\t0x002b: { n:\"PrintGrid\", f:parse_PrintGrid },\n\t0x002f: { n:\"FilePass\", f:parse_FilePass },\n\t0x0031: { n:\"Font\", f:parse_Font },\n\t0x0033: { n:\"PrintSize\", f:parse_PrintSize },\n\t0x003c: { n:\"Continue\", f:parse_Continue },\n\t0x003d: { n:\"Window1\", f:parse_Window1 },\n\t0x0040: { n:\"Backup\", f:parse_Backup },\n\t0x0041: { n:\"Pane\", f:parse_Pane },\n\t0x0042: { n:'CodePage', f:parse_CodePage },\n\t0x004d: { n:\"Pls\", f:parse_Pls },\n\t0x0050: { n:\"DCon\", f:parse_DCon },\n\t0x0051: { n:\"DConRef\", f:parse_DConRef },\n\t0x0052: { n:\"DConName\", f:parse_DConName },\n\t0x0055: { n:\"DefColWidth\", f:parse_DefColWidth },\n\t0x0059: { n:\"XCT\", f:parse_XCT },\n\t0x005a: { n:\"CRN\", f:parse_CRN },\n\t0x005b: { n:\"FileSharing\", f:parse_FileSharing },\n\t0x005c: { n:'WriteAccess', f:parse_WriteAccess },\n\t0x005d: { n:\"Obj\", f:parse_Obj },\n\t0x005e: { n:\"Uncalced\", f:parse_Uncalced },\n\t0x005f: { n:\"CalcSaveRecalc\", f:parse_CalcSaveRecalc },\n\t0x0060: { n:\"Template\", f:parse_Template },\n\t0x0061: { n:\"Intl\", f:parse_Intl },\n\t0x0063: { n:\"ObjProtect\", f:parse_ObjProtect },\n\t0x007d: { n:\"ColInfo\", f:parse_ColInfo },\n\t0x0080: { n:\"Guts\", f:parse_Guts },\n\t0x0081: { n:\"WsBool\", f:parse_WsBool },\n\t0x0082: { n:\"GridSet\", f:parse_GridSet },\n\t0x0083: { n:\"HCenter\", f:parse_HCenter },\n\t0x0084: { n:\"VCenter\", f:parse_VCenter },\n\t0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },\n\t0x0086: { n:\"WriteProtect\", f:parse_WriteProtect },\n\t0x008c: { n:\"Country\", f:parse_Country },\n\t0x008d: { n:\"HideObj\", f:parse_HideObj },\n\t0x0090: { n:\"Sort\", f:parse_Sort },\n\t0x0092: { n:\"Palette\", f:parse_Palette },\n\t0x0097: { n:\"Sync\", f:parse_Sync },\n\t0x0098: { n:\"LPr\", f:parse_LPr },\n\t0x0099: { n:\"DxGCol\", f:parse_DxGCol },\n\t0x009a: { n:\"FnGroupName\", f:parse_FnGroupName },\n\t0x009b: { n:\"FilterMode\", f:parse_FilterMode },\n\t0x009c: { n:\"BuiltInFnGroupCount\", f:parse_BuiltInFnGroupCount },\n\t0x009d: { n:\"AutoFilterInfo\", f:parse_AutoFilterInfo },\n\t0x009e: { n:\"AutoFilter\", f:parse_AutoFilter },\n\t0x00a0: { n:\"Scl\", f:parse_Scl },\n\t0x00a1: { n:\"Setup\", f:parse_Setup },\n\t0x00ae: { n:\"ScenMan\", f:parse_ScenMan },\n\t0x00af: { n:\"SCENARIO\", f:parse_SCENARIO },\n\t0x00b0: { n:\"SxView\", f:parse_SxView },\n\t0x00b1: { n:\"Sxvd\", f:parse_Sxvd },\n\t0x00b2: { n:\"SXVI\", f:parse_SXVI },\n\t0x00b4: { n:\"SxIvd\", f:parse_SxIvd },\n\t0x00b5: { n:\"SXLI\", f:parse_SXLI },\n\t0x00b6: { n:\"SXPI\", f:parse_SXPI },\n\t0x00b8: { n:\"DocRoute\", f:parse_DocRoute },\n\t0x00b9: { n:\"RecipName\", f:parse_RecipName },\n\t0x00bd: { n:\"MulRk\", f:parse_MulRk },\n\t0x00be: { n:\"MulBlank\", f:parse_MulBlank },\n\t0x00c1: { n:'Mms', f:parse_Mms },\n\t0x00c5: { n:\"SXDI\", f:parse_SXDI },\n\t0x00c6: { n:\"SXDB\", f:parse_SXDB },\n\t0x00c7: { n:\"SXFDB\", f:parse_SXFDB },\n\t0x00c8: { n:\"SXDBB\", f:parse_SXDBB },\n\t0x00c9: { n:\"SXNum\", f:parse_SXNum },\n\t0x00ca: { n:\"SxBool\", f:parse_SxBool },\n\t0x00cb: { n:\"SxErr\", f:parse_SxErr },\n\t0x00cc: { n:\"SXInt\", f:parse_SXInt },\n\t0x00cd: { n:\"SXString\", f:parse_SXString },\n\t0x00ce: { n:\"SXDtr\", f:parse_SXDtr },\n\t0x00cf: { n:\"SxNil\", f:parse_SxNil },\n\t0x00d0: { n:\"SXTbl\", f:parse_SXTbl },\n\t0x00d1: { n:\"SXTBRGIITM\", f:parse_SXTBRGIITM },\n\t0x00d2: { n:\"SxTbpg\", f:parse_SxTbpg },\n\t0x00d3: { n:\"ObProj\", f:parse_ObProj },\n\t0x00d5: { n:\"SXStreamID\", f:parse_SXStreamID },\n\t0x00d7: { n:\"DBCell\", f:parse_DBCell },\n\t0x00d8: { n:\"SXRng\", f:parse_SXRng },\n\t0x00d9: { n:\"SxIsxoper\", f:parse_SxIsxoper },\n\t0x00da: { n:\"BookBool\", f:parse_BookBool },\n\t0x00dc: { n:\"DbOrParamQry\", f:parse_DbOrParamQry },\n\t0x00dd: { n:\"ScenarioProtect\", f:parse_ScenarioProtect },\n\t0x00de: { n:\"OleObjectSize\", f:parse_OleObjectSize },\n\t0x00e0: { n:\"XF\", f:parse_XF },\n\t0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },\n\t0x00e2: { n:'InterfaceEnd', f:parse_InterfaceEnd },\n\t0x00e3: { n:\"SXVS\", f:parse_SXVS },\n\t0x00e5: { n:\"MergeCells\", f:parse_MergeCells },\n\t0x00e9: { n:\"BkHim\", f:parse_BkHim },\n\t0x00eb: { n:\"MsoDrawingGroup\", f:parse_MsoDrawingGroup },\n\t0x00ec: { n:\"MsoDrawing\", f:parse_MsoDrawing },\n\t0x00ed: { n:\"MsoDrawingSelection\", f:parse_MsoDrawingSelection },\n\t0x00ef: { n:\"PhoneticInfo\", f:parse_PhoneticInfo },\n\t0x00f0: { n:\"SxRule\", f:parse_SxRule },\n\t0x00f1: { n:\"SXEx\", f:parse_SXEx },\n\t0x00f2: { n:\"SxFilt\", f:parse_SxFilt },\n\t0x00f4: { n:\"SxDXF\", f:parse_SxDXF },\n\t0x00f5: { n:\"SxItm\", f:parse_SxItm },\n\t0x00f6: { n:\"SxName\", f:parse_SxName },\n\t0x00f7: { n:\"SxSelect\", f:parse_SxSelect },\n\t0x00f8: { n:\"SXPair\", f:parse_SXPair },\n\t0x00f9: { n:\"SxFmla\", f:parse_SxFmla },\n\t0x00fb: { n:\"SxFormat\", f:parse_SxFormat },\n\t0x00fc: { n:\"SST\", f:parse_SST },\n\t0x00fd: { n:\"LabelSst\", f:parse_LabelSst },\n\t0x00ff: { n:\"ExtSST\", f:parse_ExtSST },\n\t0x0100: { n:\"SXVDEx\", f:parse_SXVDEx },\n\t0x0103: { n:\"SXFormula\", f:parse_SXFormula },\n\t0x0122: { n:\"SXDBEx\", f:parse_SXDBEx },\n\t0x0137: { n:\"RRDInsDel\", f:parse_RRDInsDel },\n\t0x0138: { n:\"RRDHead\", f:parse_RRDHead },\n\t0x013b: { n:\"RRDChgCell\", f:parse_RRDChgCell },\n\t0x013d: { n:\"RRTabId\", f:parse_RRTabId },\n\t0x013e: { n:\"RRDRenSheet\", f:parse_RRDRenSheet },\n\t0x013f: { n:\"RRSort\", f:parse_RRSort },\n\t0x0140: { n:\"RRDMove\", f:parse_RRDMove },\n\t0x014a: { n:\"RRFormat\", f:parse_RRFormat },\n\t0x014b: { n:\"RRAutoFmt\", f:parse_RRAutoFmt },\n\t0x014d: { n:\"RRInsertSh\", f:parse_RRInsertSh },\n\t0x014e: { n:\"RRDMoveBegin\", f:parse_RRDMoveBegin },\n\t0x014f: { n:\"RRDMoveEnd\", f:parse_RRDMoveEnd },\n\t0x0150: { n:\"RRDInsDelBegin\", f:parse_RRDInsDelBegin },\n\t0x0151: { n:\"RRDInsDelEnd\", f:parse_RRDInsDelEnd },\n\t0x0152: { n:\"RRDConflict\", f:parse_RRDConflict },\n\t0x0153: { n:\"RRDDefName\", f:parse_RRDDefName },\n\t0x0154: { n:\"RRDRstEtxp\", f:parse_RRDRstEtxp },\n\t0x015f: { n:\"LRng\", f:parse_LRng },\n\t0x0160: { n:\"UsesELFs\", f:parse_UsesELFs },\n\t0x0161: { n:\"DSF\", f:parse_DSF },\n\t0x0191: { n:\"CUsr\", f:parse_CUsr },\n\t0x0192: { n:\"CbUsr\", f:parse_CbUsr },\n\t0x0193: { n:\"UsrInfo\", f:parse_UsrInfo },\n\t0x0194: { n:\"UsrExcl\", f:parse_UsrExcl },\n\t0x0195: { n:\"FileLock\", f:parse_FileLock },\n\t0x0196: { n:\"RRDInfo\", f:parse_RRDInfo },\n\t0x0197: { n:\"BCUsrs\", f:parse_BCUsrs },\n\t0x0198: { n:\"UsrChk\", f:parse_UsrChk },\n\t0x01a9: { n:\"UserBView\", f:parse_UserBView },\n\t0x01aa: { n:\"UserSViewBegin\", f:parse_UserSViewBegin },\n\t0x01ab: { n:\"UserSViewEnd\", f:parse_UserSViewEnd },\n\t0x01ac: { n:\"RRDUserView\", f:parse_RRDUserView },\n\t0x01ad: { n:\"Qsi\", f:parse_Qsi },\n\t0x01ae: { n:\"SupBook\", f:parse_SupBook },\n\t0x01af: { n:\"Prot4Rev\", f:parse_Prot4Rev },\n\t0x01b0: { n:\"CondFmt\", f:parse_CondFmt },\n\t0x01b1: { n:\"CF\", f:parse_CF },\n\t0x01b2: { n:\"DVal\", f:parse_DVal },\n\t0x01b5: { n:\"DConBin\", f:parse_DConBin },\n\t0x01b6: { n:\"TxO\", f:parse_TxO },\n\t0x01b7: { n:\"RefreshAll\", f:parse_RefreshAll },\n\t0x01b8: { n:\"HLink\", f:parse_HLink },\n\t0x01b9: { n:\"Lel\", f:parse_Lel },\n\t0x01ba: { n:\"CodeName\", f:parse_XLSCodeName },\n\t0x01bb: { n:\"SXFDBType\", f:parse_SXFDBType },\n\t0x01bc: { n:\"Prot4RevPass\", f:parse_Prot4RevPass },\n\t0x01bd: { n:\"ObNoMacros\", f:parse_ObNoMacros },\n\t0x01be: { n:\"Dv\", f:parse_Dv },\n\t0x01c0: { n:\"Excel9File\", f:parse_Excel9File },\n\t0x01c1: { n:\"RecalcId\", f:parse_RecalcId, r:2},\n\t0x01c2: { n:\"EntExU2\", f:parse_EntExU2 },\n\t0x0200: { n:\"Dimensions\", f:parse_Dimensions },\n\t0x0201: { n:\"Blank\", f:parse_Blank },\n\t0x0203: { n:\"Number\", f:parse_Number },\n\t0x0204: { n:\"Label\", f:parse_Label },\n\t0x0205: { n:\"BoolErr\", f:parse_BoolErr },\n\t0x0207: { n:\"String\", f:parse_String },\n\t0x0208: { n:'Row', f:parse_Row },\n\t0x020b: { n:\"Index\", f:parse_Index },\n\t0x0221: { n:\"Array\", f:parse_Array },\n\t0x0225: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n\t0x0236: { n:\"Table\", f:parse_Table },\n\t0x023e: { n:\"Window2\", f:parse_Window2 },\n\t0x027e: { n:\"RK\", f:parse_RK },\n\t0x0293: { n:\"Style\", f:parse_Style },\n\t0x0418: { n:\"BigName\", f:parse_BigName },\n\t0x041e: { n:\"Format\", f:parse_Format },\n\t0x043c: { n:\"ContinueBigName\", f:parse_ContinueBigName },\n\t0x04bc: { n:\"ShrFmla\", f:parse_ShrFmla },\n\t0x0800: { n:\"HLinkTooltip\", f:parse_HLinkTooltip },\n\t0x0801: { n:\"WebPub\", f:parse_WebPub },\n\t0x0802: { n:\"QsiSXTag\", f:parse_QsiSXTag },\n\t0x0803: { n:\"DBQueryExt\", f:parse_DBQueryExt },\n\t0x0804: { n:\"ExtString\", f:parse_ExtString },\n\t0x0805: { n:\"TxtQry\", f:parse_TxtQry },\n\t0x0806: { n:\"Qsir\", f:parse_Qsir },\n\t0x0807: { n:\"Qsif\", f:parse_Qsif },\n\t0x0808: { n:\"RRDTQSIF\", f:parse_RRDTQSIF },\n\t0x0809: { n:'BOF', f:parse_BOF },\n\t0x080a: { n:\"OleDbConn\", f:parse_OleDbConn },\n\t0x080b: { n:\"WOpt\", f:parse_WOpt },\n\t0x080c: { n:\"SXViewEx\", f:parse_SXViewEx },\n\t0x080d: { n:\"SXTH\", f:parse_SXTH },\n\t0x080e: { n:\"SXPIEx\", f:parse_SXPIEx },\n\t0x080f: { n:\"SXVDTEx\", f:parse_SXVDTEx },\n\t0x0810: { n:\"SXViewEx9\", f:parse_SXViewEx9 },\n\t0x0812: { n:\"ContinueFrt\", f:parse_ContinueFrt },\n\t0x0813: { n:\"RealTimeData\", f:parse_RealTimeData },\n\t0x0850: { n:\"ChartFrtInfo\", f:parse_ChartFrtInfo },\n\t0x0851: { n:\"FrtWrapper\", f:parse_FrtWrapper },\n\t0x0852: { n:\"StartBlock\", f:parse_StartBlock },\n\t0x0853: { n:\"EndBlock\", f:parse_EndBlock },\n\t0x0854: { n:\"StartObject\", f:parse_StartObject },\n\t0x0855: { n:\"EndObject\", f:parse_EndObject },\n\t0x0856: { n:\"CatLab\", f:parse_CatLab },\n\t0x0857: { n:\"YMult\", f:parse_YMult },\n\t0x0858: { n:\"SXViewLink\", f:parse_SXViewLink },\n\t0x0859: { n:\"PivotChartBits\", f:parse_PivotChartBits },\n\t0x085a: { n:\"FrtFontList\", f:parse_FrtFontList },\n\t0x0862: { n:\"SheetExt\", f:parse_SheetExt },\n\t0x0863: { n:\"BookExt\", f:parse_BookExt, r:12},\n\t0x0864: { n:\"SXAddl\", f:parse_SXAddl },\n\t0x0865: { n:\"CrErr\", f:parse_CrErr },\n\t0x0866: { n:\"HFPicture\", f:parse_HFPicture },\n\t0x0867: { n:'FeatHdr', f:parse_FeatHdr },\n\t0x0868: { n:\"Feat\", f:parse_Feat },\n\t0x086a: { n:\"DataLabExt\", f:parse_DataLabExt },\n\t0x086b: { n:\"DataLabExtContents\", f:parse_DataLabExtContents },\n\t0x086c: { n:\"CellWatch\", f:parse_CellWatch },\n\t0x0871: { n:\"FeatHdr11\", f:parse_FeatHdr11 },\n\t0x0872: { n:\"Feature11\", f:parse_Feature11 },\n\t0x0874: { n:\"DropDownObjIds\", f:parse_DropDownObjIds },\n\t0x0875: { n:\"ContinueFrt11\", f:parse_ContinueFrt11 },\n\t0x0876: { n:\"DConn\", f:parse_DConn },\n\t0x0877: { n:\"List12\", f:parse_List12 },\n\t0x0878: { n:\"Feature12\", f:parse_Feature12 },\n\t0x0879: { n:\"CondFmt12\", f:parse_CondFmt12 },\n\t0x087a: { n:\"CF12\", f:parse_CF12 },\n\t0x087b: { n:\"CFEx\", f:parse_CFEx },\n\t0x087c: { n:\"XFCRC\", f:parse_XFCRC, r:12 },\n\t0x087d: { n:\"XFExt\", f:parse_XFExt, r:12 },\n\t0x087e: { n:\"AutoFilter12\", f:parse_AutoFilter12 },\n\t0x087f: { n:\"ContinueFrt12\", f:parse_ContinueFrt12 },\n\t0x0884: { n:\"MDTInfo\", f:parse_MDTInfo },\n\t0x0885: { n:\"MDXStr\", f:parse_MDXStr },\n\t0x0886: { n:\"MDXTuple\", f:parse_MDXTuple },\n\t0x0887: { n:\"MDXSet\", f:parse_MDXSet },\n\t0x0888: { n:\"MDXProp\", f:parse_MDXProp },\n\t0x0889: { n:\"MDXKPI\", f:parse_MDXKPI },\n\t0x088a: { n:\"MDB\", f:parse_MDB },\n\t0x088b: { n:\"PLV\", f:parse_PLV },\n\t0x088c: { n:\"Compat12\", f:parse_Compat12, r:12 },\n\t0x088d: { n:\"DXF\", f:parse_DXF },\n\t0x088e: { n:\"TableStyles\", f:parse_TableStyles, r:12 },\n\t0x088f: { n:\"TableStyle\", f:parse_TableStyle },\n\t0x0890: { n:\"TableStyleElement\", f:parse_TableStyleElement },\n\t0x0892: { n:\"StyleExt\", f:parse_StyleExt },\n\t0x0893: { n:\"NamePublish\", f:parse_NamePublish },\n\t0x0894: { n:\"NameCmt\", f:parse_NameCmt },\n\t0x0895: { n:\"SortData\", f:parse_SortData },\n\t0x0896: { n:\"Theme\", f:parse_Theme, r:12 },\n\t0x0897: { n:\"GUIDTypeLib\", f:parse_GUIDTypeLib },\n\t0x0898: { n:\"FnGrp12\", f:parse_FnGrp12 },\n\t0x0899: { n:\"NameFnGrp12\", f:parse_NameFnGrp12 },\n\t0x089a: { n:\"MTRSettings\", f:parse_MTRSettings, r:12 },\n\t0x089b: { n:\"CompressPictures\", f:parse_CompressPictures },\n\t0x089c: { n:\"HeaderFooter\", f:parse_HeaderFooter },\n\t0x089d: { n:\"CrtLayout12\", f:parse_CrtLayout12 },\n\t0x089e: { n:\"CrtMlFrt\", f:parse_CrtMlFrt },\n\t0x089f: { n:\"CrtMlFrtContinue\", f:parse_CrtMlFrtContinue },\n\t0x08a3: { n:\"ForceFullCalculation\", f:parse_ForceFullCalculation },\n\t0x08a4: { n:\"ShapePropsStream\", f:parse_ShapePropsStream },\n\t0x08a5: { n:\"TextPropsStream\", f:parse_TextPropsStream },\n\t0x08a6: { n:\"RichTextStream\", f:parse_RichTextStream },\n\t0x08a7: { n:\"CrtLayout12A\", f:parse_CrtLayout12A },\n\t0x1001: { n:\"Units\", f:parse_Units },\n\t0x1002: { n:\"Chart\", f:parse_Chart },\n\t0x1003: { n:\"Series\", f:parse_Series },\n\t0x1006: { n:\"DataFormat\", f:parse_DataFormat },\n\t0x1007: { n:\"LineFormat\", f:parse_LineFormat },\n\t0x1009: { n:\"MarkerFormat\", f:parse_MarkerFormat },\n\t0x100a: { n:\"AreaFormat\", f:parse_AreaFormat },\n\t0x100b: { n:\"PieFormat\", f:parse_PieFormat },\n\t0x100c: { n:\"AttachedLabel\", f:parse_AttachedLabel },\n\t0x100d: { n:\"SeriesText\", f:parse_SeriesText },\n\t0x1014: { n:\"ChartFormat\", f:parse_ChartFormat },\n\t0x1015: { n:\"Legend\", f:parse_Legend },\n\t0x1016: { n:\"SeriesList\", f:parse_SeriesList },\n\t0x1017: { n:\"Bar\", f:parse_Bar },\n\t0x1018: { n:\"Line\", f:parse_Line },\n\t0x1019: { n:\"Pie\", f:parse_Pie },\n\t0x101a: { n:\"Area\", f:parse_Area },\n\t0x101b: { n:\"Scatter\", f:parse_Scatter },\n\t0x101c: { n:\"CrtLine\", f:parse_CrtLine },\n\t0x101d: { n:\"Axis\", f:parse_Axis },\n\t0x101e: { n:\"Tick\", f:parse_Tick },\n\t0x101f: { n:\"ValueRange\", f:parse_ValueRange },\n\t0x1020: { n:\"CatSerRange\", f:parse_CatSerRange },\n\t0x1021: { n:\"AxisLine\", f:parse_AxisLine },\n\t0x1022: { n:\"CrtLink\", f:parse_CrtLink },\n\t0x1024: { n:\"DefaultText\", f:parse_DefaultText },\n\t0x1025: { n:\"Text\", f:parse_Text },\n\t0x1026: { n:\"FontX\", f:parse_FontX },\n\t0x1027: { n:\"ObjectLink\", f:parse_ObjectLink },\n\t0x1032: { n:\"Frame\", f:parse_Frame },\n\t0x1033: { n:\"Begin\", f:parse_Begin },\n\t0x1034: { n:\"End\", f:parse_End },\n\t0x1035: { n:\"PlotArea\", f:parse_PlotArea },\n\t0x103a: { n:\"Chart3d\", f:parse_Chart3d },\n\t0x103c: { n:\"PicF\", f:parse_PicF },\n\t0x103d: { n:\"DropBar\", f:parse_DropBar },\n\t0x103e: { n:\"Radar\", f:parse_Radar },\n\t0x103f: { n:\"Surf\", f:parse_Surf },\n\t0x1040: { n:\"RadarArea\", f:parse_RadarArea },\n\t0x1041: { n:\"AxisParent\", f:parse_AxisParent },\n\t0x1043: { n:\"LegendException\", f:parse_LegendException },\n\t0x1044: { n:\"ShtProps\", f:parse_ShtProps },\n\t0x1045: { n:\"SerToCrt\", f:parse_SerToCrt },\n\t0x1046: { n:\"AxesUsed\", f:parse_AxesUsed },\n\t0x1048: { n:\"SBaseRef\", f:parse_SBaseRef },\n\t0x104a: { n:\"SerParent\", f:parse_SerParent },\n\t0x104b: { n:\"SerAuxTrend\", f:parse_SerAuxTrend },\n\t0x104e: { n:\"IFmtRecord\", f:parse_IFmtRecord },\n\t0x104f: { n:\"Pos\", f:parse_Pos },\n\t0x1050: { n:\"AlRuns\", f:parse_AlRuns },\n\t0x1051: { n:\"BRAI\", f:parse_BRAI },\n\t0x105b: { n:\"SerAuxErrBar\", f:parse_SerAuxErrBar },\n\t0x105c: { n:\"ClrtClient\", f:parse_ClrtClient },\n\t0x105d: { n:\"SerFmt\", f:parse_SerFmt },\n\t0x105f: { n:\"Chart3DBarShape\", f:parse_Chart3DBarShape },\n\t0x1060: { n:\"Fbi\", f:parse_Fbi },\n\t0x1061: { n:\"BopPop\", f:parse_BopPop },\n\t0x1062: { n:\"AxcExt\", f:parse_AxcExt },\n\t0x1063: { n:\"Dat\", f:parse_Dat },\n\t0x1064: { n:\"PlotGrowth\", f:parse_PlotGrowth },\n\t0x1065: { n:\"SIIndex\", f:parse_SIIndex },\n\t0x1066: { n:\"GelFrame\", f:parse_GelFrame },\n\t0x1067: { n:\"BopPopCustom\", f:parse_BopPopCustom },\n\t0x1068: { n:\"Fbi2\", f:parse_Fbi2 },\n\n\t/* These are specified in an older version of the spec */\n\t0x0016: { n:\"ExternCount\", f:parsenoop },\n\t0x007e: { n:\"RK\", f:parsenoop }, /* Not necessarily same as 0x027e */\n\t0x007f: { n:\"ImData\", f:parsenoop },\n\t0x0087: { n:\"Addin\", f:parsenoop },\n\t0x0088: { n:\"Edg\", f:parsenoop },\n\t0x0089: { n:\"Pub\", f:parsenoop },\n\t0x0091: { n:\"Sub\", f:parsenoop },\n\t0x0094: { n:\"LHRecord\", f:parsenoop },\n\t0x0095: { n:\"LHNGraph\", f:parsenoop },\n\t0x0096: { n:\"Sound\", f:parsenoop },\n\t0x00a9: { n:\"CoordList\", f:parsenoop },\n\t0x00ab: { n:\"GCW\", f:parsenoop },\n\t0x00bc: { n:\"ShrFmla\", f:parsenoop }, /* Not necessarily same as 0x04bc */\n\t0x00c2: { n:\"AddMenu\", f:parsenoop },\n\t0x00c3: { n:\"DelMenu\", f:parsenoop },\n\t0x00d6: { n:\"RString\", f:parsenoop },\n\t0x00df: { n:\"UDDesc\", f:parsenoop },\n\t0x00ea: { n:\"TabIdConf\", f:parsenoop },\n\t0x0162: { n:\"XL5Modify\", f:parsenoop },\n\t0x01a5: { n:\"FileSharing2\", f:parsenoop },\n\t0x0218: { n:\"Name\", f:parsenoop },\n\t0x0223: { n:\"ExternName\", f:parse_ExternName },\n\t0x0231: { n:\"Font\", f:parsenoop },\n\t0x0406: { n:\"Formula\", f:parse_Formula },\n\t0x086d: { n:\"FeatInfo\", f:parsenoop },\n\t0x0873: { n:\"FeatInfo11\", f:parsenoop },\n\t0x0881: { n:\"SXAddl12\", f:parsenoop },\n\t0x08c0: { n:\"AutoWebPub\", f:parsenoop },\n\t0x08c1: { n:\"ListObj\", f:parsenoop },\n\t0x08c2: { n:\"ListField\", f:parsenoop },\n\t0x08c3: { n:\"ListDV\", f:parsenoop },\n\t0x08c4: { n:\"ListCondFmt\", f:parsenoop },\n\t0x08c5: { n:\"ListCF\", f:parsenoop },\n\t0x08c6: { n:\"FMQry\", f:parsenoop },\n\t0x08c7: { n:\"FMSQry\", f:parsenoop },\n\t0x08c8: { n:\"PLV\", f:parsenoop }, /* supposedly PLV for Excel 11 */\n\t0x08c9: { n:\"LnExt\", f:parsenoop },\n\t0x08ca: { n:\"MkrExt\", f:parsenoop },\n\t0x08cb: { n:\"CrtCoopt\", f:parsenoop },\n\n\t0x0000: {}\n};\n\n\n/* Helper function to call out to ODS parser */\nfunction parse_ods(zip, opts) {\n\tif(typeof module !== \"undefined\" && typeof require !== 'undefined' && typeof ODS === 'undefined') ODS = require('./od' + 's');\n\tif(typeof ODS === 'undefined' || !ODS.parse_ods) throw new Error(\"Unsupported ODS\");\n\treturn ODS.parse_ods(zip, opts);\n}\nfunction fix_opts_func(defaults) {\n\treturn function fix_opts(opts) {\n\t\tfor(var i = 0; i != defaults.length; ++i) {\n\t\t\tvar d = defaults[i];\n\t\t\tif(opts[d[0]] === undefined) opts[d[0]] = d[1];\n\t\t\tif(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n\t\t}\n\t};\n}\n\nvar fix_read_opts = fix_opts_func([\n\t['cellNF', false], /* emit cell number format string as .z */\n\t['cellHTML', true], /* emit html string as .h */\n\t['cellFormula', true], /* emit formulae as .f */\n\t['cellStyles', false], /* emits style/theme as .s */\n\t['cellDates', false], /* emit date cells with type `d` */\n\n\t['sheetStubs', false], /* emit empty cells */\n\t['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n\t['bookDeps', false], /* parse calculation chains */\n\t['bookSheets', false], /* only try to get sheet names (no Sheets) */\n\t['bookProps', false], /* only try to get properties (no Sheets) */\n\t['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n\t['bookVBA', false], /* include vba raw data (vbaraw) */\n\n\t['password',''], /* password */\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\n\n\nvar fix_write_opts = fix_opts_func([\n\t['cellDates', false], /* write date cells with type `d` */\n\n\t['bookSST', false], /* Generate Shared String Table */\n\n\t['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\nfunction safe_parse_wbrels(wbrels, sheets) {\n\tif(!wbrels) return 0;\n\ttry {\n\t\twbrels = sheets.map(function pwbr(w) { return [w.name, wbrels['!id'][w.id].Target]; });\n\t} catch(e) { return null; }\n\treturn !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) {\n\ttry {\n\t\tsheetRels[sheet]=parse_rels(getzipdata(zip, relsPath, true), path);\n\t\tsheets[sheet]=parse_ws(getzipdata(zip, path),path,opts,sheetRels[sheet]);\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nvar nodirs = function nodirs(x){return x.substr(-1) != '/';};\nfunction parse_zip(zip, opts) {\n\tmake_ssf(SSF);\n\topts = opts || {};\n\tfix_read_opts(opts);\n\treset_cp();\n\n\t/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n\tif(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\n\tvar entries = keys(zip.files).filter(nodirs).sort();\n\tvar dir = parse_ct(getzipdata(zip, '[Content_Types].xml'), opts);\n\tvar xlsb = false;\n\tvar sheets, binname;\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.xml\";\n\t\tif(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n\t}\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.bin\";\n\t\tif(!getzipfile(zip,binname,true)) throw new Error(\"Could not find workbook\");\n\t\tdir.workbooks.push(binname);\n\t\txlsb = true;\n\t}\n\tif(dir.workbooks[0].substr(-3) == \"bin\") xlsb = true;\n\tif(xlsb) set_cp(1200);\n\n\tif(!opts.bookSheets && !opts.bookProps) {\n\t\tstrs = [];\n\t\tif(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\\//,'')), dir.sst, opts);\n\n\t\tstyles = {};\n\t\tif(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\\//,'')),dir.style, opts);\n\n\t\tthemes = {};\n\t\tif(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\\//,''), true),dir.themes[0], opts);\n\t}\n\n\tvar wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\\//,'')), dir.workbooks[0], opts);\n\n\tvar props = {}, propdata = \"\";\n\n\tif(dir.coreprops.length !== 0) {\n\t\tpropdata = getzipdata(zip, dir.coreprops[0].replace(/^\\//,''), true);\n\t\tif(propdata) props = parse_core_props(propdata);\n\t\tif(dir.extprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, dir.extprops[0].replace(/^\\//,''), true);\n\t\t\tif(propdata) parse_ext_props(propdata, props);\n\t\t}\n\t}\n\n\tvar custprops = {};\n\tif(!opts.bookSheets || opts.bookProps) {\n\t\tif (dir.custprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, dir.custprops[0].replace(/^\\//,''), true);\n\t\t\tif(propdata) custprops = parse_cust_props(propdata, opts);\n\t\t}\n\t}\n\n\tvar out = {};\n\tif(opts.bookSheets || opts.bookProps) {\n\t\tif(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n\t\telse if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n\t\tif(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n\t\tif(typeof sheets !== 'undefined') out.SheetNames = sheets;\n\t\tif(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n\t}\n\tsheets = {};\n\n\tvar deps = {};\n\tif(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\\//,'')),dir.calcchain,opts);\n\n\tvar i=0;\n\tvar sheetRels = {};\n\tvar path, relsPath;\n\tif(!props.Worksheets) {\n\t\tvar wbsheets = wb.Sheets;\n\t\tprops.Worksheets = wbsheets.length;\n\t\tprops.SheetNames = [];\n\t\tfor(var j = 0; j != wbsheets.length; ++j) {\n\t\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t\t}\n\t}\n\n\tvar wbext = xlsb ? \"bin\" : \"xml\";\n\tvar wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n\tvar wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile);\n\tif(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n\t/* Numbers iOS hack */\n\tvar nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n\tfor(i = 0; i != props.Worksheets; ++i) {\n\t\tif(wbrels) path = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n\t\telse {\n\t\t\tpath = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n\t\t\tpath = path.replace(/sheet0\\./,\"sheet.\");\n\t\t}\n\t\trelsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n\t\tsafe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts);\n\t}\n\n\tif(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts);\n\n\tout = {\n\t\tDirectory: dir,\n\t\tWorkbook: wb,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tDeps: deps,\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tStrings: strs,\n\t\tStyles: styles,\n\t\tThemes: themes,\n\t\tSSF: SSF.get_table()\n\t};\n\tif(opts.bookFiles) {\n\t\tout.keys = entries;\n\t\tout.files = zip.files;\n\t}\n\tif(opts.bookVBA) {\n\t\tif(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0],true);\n\t\telse if(dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);\n\t}\n\treturn out;\n}\nfunction add_rels(rels, rId, f, type, relobj) {\n\tif(!relobj) relobj = {};\n\tif(!rels['!id']) rels['!id'] = {};\n\trelobj.Id = 'rId' + rId;\n\trelobj.Type = type;\n\trelobj.Target = f;\n\tif(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n\trels['!id'][relobj.Id] = relobj;\n\trels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n}\n\nfunction write_zip(wb, opts) {\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tvar wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n\tvar ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],\n\t\tcoreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],\n\t\tTODO:[], rels:[], xmlns: \"\" };\n\tfix_write_opts(opts = opts || {});\n\tvar zip = new jszip();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tf = \"docProps/core.xml\";\n\tzip.file(f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\n\tf = \"docProps/app.xml\";\n\tif(!wb.Props) wb.Props = {};\n\twb.Props.SheetNames = wb.SheetNames;\n\twb.Props.Worksheets = wb.SheetNames.length;\n\tzip.file(f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip.file(f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip.file(f, write_wb(wb, f, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\tzip.file(f, write_ws(rId-1, f, opts, wb));\n\t\tct.sheets.push(f);\n\t\tadd_rels(opts.wbrels, rId, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS);\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip.file(f, write_sst(opts.Strings, f, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, ++rId, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip.file(f, write_theme());\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, ++rId, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip.file(f, write_sty(wb, f, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, ++rId, \"styles.\" + wbext, RELS.STY);\n\n\tzip.file(\"[Content_Types].xml\", write_ct(ct, opts));\n\tzip.file('_rels/.rels', write_rels(opts.rels));\n\tzip.file('xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\treturn zip;\n}\nfunction firstbyte(f,o) {\n\tswitch((o||{}).type || \"base64\") {\n\t\tcase 'buffer': return f[0];\n\t\tcase 'base64': return Base64.decode(f.substr(0,12)).charCodeAt(0);\n\t\tcase 'binary': return f.charCodeAt(0);\n\t\tcase 'array': return f[0];\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n}\n\nfunction read_zip(data, opts) {\n\tvar zip, d = data;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tswitch(o.type) {\n\t\tcase \"base64\": zip = new jszip(d, { base64:true }); break;\n\t\tcase \"binary\": case \"array\": zip = new jszip(d, { base64:false }); break;\n\t\tcase \"buffer\": zip = new jszip(d); break;\n\t\tcase \"file\": zip=new jszip(d=_fs.readFileSync(data)); break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\treturn parse_zip(zip, o);\n}\n\nfunction readSync(data, opts) {\n\tvar zip, d = data, isfile = false, n;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tif(o.type == \"file\") { isfile = true; o.type = \"buffer\"; d = _fs.readFileSync(data); }\n\tswitch((n = firstbyte(d, o))) {\n\t\tcase 0xD0:\n\t\t\tif(isfile) o.type = \"file\";\n\t\t\treturn parse_xlscfb(CFB.read(data, o), o);\n\t\tcase 0x09: return parse_xlscfb(s2a(o.type === 'base64' ? Base64.decode(data) : data), o);\n\t\tcase 0x3C: return parse_xlml(d, o);\n\t\tcase 0x50:\n\t\t\tif(isfile) o.type = \"file\";\n\t\t\treturn read_zip(data, opts);\n\t\tdefault: throw new Error(\"Unsupported file \" + n);\n\t}\n}\n\nfunction readFileSync(data, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\treturn readSync(data, o);\n}\nfunction write_zip_type(wb, opts) {\n\tvar o = opts||{};\n\tvar z = write_zip(wb, o);\n\tswitch(o.type) {\n\t\tcase \"base64\": return z.generate({type:\"base64\"});\n\t\tcase \"binary\": return z.generate({type:\"string\"});\n\t\tcase \"buffer\": return z.generate({type:\"nodebuffer\"});\n\t\tcase \"file\": return _fs.writeFileSync(o.file, z.generate({type:\"nodebuffer\"}));\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n}\n\nfunction writeSync(wb, opts) {\n\tvar o = opts||{};\n\tswitch(o.bookType) {\n\t\tcase 'xml': return write_xlml(wb, o);\n\t\tdefault: return write_zip_type(wb, o);\n\t}\n}\n\nfunction writeFileSync(wb, filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tswitch(o.file.substr(-5).toLowerCase()) {\n\t\tcase '.xlsx': o.bookType = 'xlsx'; break;\n\t\tcase '.xlsm': o.bookType = 'xlsm'; break;\n\t\tcase '.xlsb': o.bookType = 'xlsb'; break;\n\tdefault: switch(o.file.substr(-4).toLowerCase()) {\n\t\tcase '.xls': o.bookType = 'xls'; break;\n\t\tcase '.xml': o.bookType = 'xml'; break;\n\t}}\n\treturn writeSync(wb, o);\n}\n\nfunction decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row) { return \"\" + (row + 1); }\nfunction fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr) { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }\nfunction encode_col(col) { var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr) { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr) { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr) { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\nfunction decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }\nfunction fix_cell(cstr) { return fix_col(fix_row(cstr)); }\nfunction unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }\nfunction decode_range(range) { var x =range.split(\":\").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }\nfunction encode_range(cs,ce) {\n\tif(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);\n\tif(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);\n\treturn cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range) {\n\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\tvar idx = 0, i = 0, cc = 0;\n\tvar len = range.length;\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.s.c = --idx;\n\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.s.r = --idx;\n\n\tif(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.e.c = --idx;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.e.r = --idx;\n\treturn o;\n}\n\nfunction safe_format_cell(cell, v) {\n\tif(cell.z !== undefined) try { return (cell.w = SSF.format(cell.z, v)); } catch(e) { }\n\tif(!cell.XF) return v;\n\ttry { return (cell.w = SSF.format(cell.XF.ifmt||0, v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell, v) {\n\tif(cell == null || cell.t == null) return \"\";\n\tif(cell.w !== undefined) return cell.w;\n\tif(v === undefined) return safe_format_cell(cell, cell.v);\n\treturn safe_format_cell(cell, v);\n}\n\nfunction sheet_to_json(sheet, opts){\n\tvar val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v;\n\tvar o = opts != null ? opts : {};\n\tvar raw = o.raw;\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\trange = o.range !== undefined ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols = new Array(r.e.c-r.s.c+1);\n\tvar out = new Array(r.e.r-r.s.r-offset+1);\n\tvar outi = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tcols[C] = encode_col(C);\n\t\tval = sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val === undefined) continue;\n\t\t\t\thdr[C] = format_cell(val);\n\t\t}\n\t}\n\n\tfor (R = r.s.r + offset; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tisempty = true;\n\t\tif(header === 1) row = [];\n\t\telse {\n\t\t\trow = {};\n\t\t\tif(Object.defineProperty) Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false});\n\t\t\telse row.__rowNum__ = R;\n\t\t}\n\t\tfor (C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tval = sheet[cols[C] + rr];\n\t\t\tif(val === undefined || val.t === undefined) continue;\n\t\t\tv = val.v;\n\t\t\tswitch(val.t){\n\t\t\t\tcase 'e': continue;\n\t\t\t\tcase 's': break;\n\t\t\t\tcase 'b': case 'n': break;\n\t\t\t\tdefault: throw 'unrecognized type ' + val.t;\n\t\t\t}\n\t\t\tif(v !== undefined) {\n\t\t\t\trow[hdr[C]] = raw ? v : format_cell(val,v);\n\t\t\t\tisempty = false;\n\t\t\t}\n\t\t}\n\t\tif(isempty === false || header === 1) out[outi++] = row;\n\t}\n\tout.length = outi;\n\treturn out;\n}\n\nfunction sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}); }\n\nfunction sheet_to_csv(sheet, opts) {\n\tvar out = \"\", txt = \"\", qreg = /\"/g;\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar row = \"\", rr = \"\", cols = [];\n\tvar i = 0, cc = 0, val;\n\tvar R = 0, C = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = r.s.r; R <= r.e.r; ++R) {\n\t\trow = \"\";\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tval = sheet[cols[C] + rr];\n\t\t\ttxt = val !== undefined ? ''+format_cell(val) : \"\";\n\t\t\tfor(i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) {\n\t\t\t\ttxt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n\t\t\trow += (C === r.s.c ? \"\" : FS) + txt;\n\t\t}\n\t\tout += row + RS;\n\t}\n\treturn out;\n}\nvar make_csv = sheet_to_csv;\n\nfunction sheet_to_formulae(sheet) {\n\tvar cmds, y = \"\", x, val=\"\";\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet['!ref']), rr = \"\", cols = [], C;\n\tcmds = new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));\n\tvar i = 0;\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\ty = cols[C] + rr;\n\t\t\tx = sheet[y];\n\t\t\tval = \"\";\n\t\t\tif(x === undefined) continue;\n\t\t\tif(x.f != null) val = x.f;\n\t\t\telse if(x.w !== undefined) val = \"'\" + x.w;\n\t\t\telse if(x.v === undefined) continue;\n\t\t\telse val = \"\"+x.v;\n\t\t\tcmds[i++] = y + \"=\" + val;\n\t\t}\n\t}\n\tcmds.length = i;\n\treturn cmds;\n}\n\nvar utils = {\n\tencode_col: encode_col,\n\tencode_row: encode_row,\n\tencode_cell: encode_cell,\n\tencode_range: encode_range,\n\tdecode_col: decode_col,\n\tdecode_row: decode_row,\n\tsplit_cell: split_cell,\n\tdecode_cell: decode_cell,\n\tdecode_range: decode_range,\n\tformat_cell: format_cell,\n\tget_formulae: sheet_to_formulae,\n\tmake_csv: sheet_to_csv,\n\tmake_json: sheet_to_json,\n\tmake_formulae: sheet_to_formulae,\n\tsheet_to_csv: sheet_to_csv,\n\tsheet_to_json: sheet_to_json,\n\tsheet_to_formulae: sheet_to_formulae,\n\tsheet_to_row_object_array: sheet_to_row_object_array\n};\nXLSX.parse_xlscfb = parse_xlscfb;\nXLSX.parse_zip = parse_zip;\nXLSX.read = readSync; //xlsread\nXLSX.readFile = readFileSync; //readFile\nXLSX.readFileSync = readFileSync;\nXLSX.write = writeSync;\nXLSX.writeFile = writeFileSync;\nXLSX.writeFileSync = writeFileSync;\nXLSX.utils = utils;\nXLSX.CFB = CFB;\nXLSX.SSF = SSF;\n})(typeof exports !== 'undefined' ? exports : XLSX);\nvar XLS = XLSX;\n$tw.utils.extend(old_exports,exports);exports = old_exports;module.exports=exports;",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xlsx-utils/xlsx.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xlsx-utils/dist/cpexcel.js": {
"text": "if($tw.browser){Buffer = undefined;};/* cpexcel.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint -W100 */\nvar cptable = {version:\"1.3.7\"};\ncptable[874] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[932] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[135] = \"����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[224] = \"����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[237] = \"����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[250] = \"����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[936] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nD[254] = \"����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[254].length; ++j) if(D[254][j].charCodeAt(0) !== 0xFFFD) { e[D[254][j]] = 65024 + j; d[65024 + j] = D[254][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[949] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆЪĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[202] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[950] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[161] = \"���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[201] = \"����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[1250] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1251] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1252] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1253] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1254] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1255] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת���\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1256] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œں ،¢£¤¥¦§¨©ھ«¬®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1257] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1258] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10000] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10006] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10007] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10029] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10079] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10081] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d[i]] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\nif (typeof module !== 'undefined' && module.exports) module.exports = cptable;\n/* cputils.js (C) 2013-2014 SheetJS -- http://sheetjs.com */\n/*jshint newcap: false */\n(function(root, factory){\n \"use strict\";\n if(typeof cptable === \"undefined\") {\n if(typeof require !== \"undefined\"){\n var cpt = require('./cpt' + 'able');\n if (typeof module !== 'undefined' && module.exports) module.exports = factory(cpt);\n else root.cptable = factory(cpt);\n } else throw new Error(\"cptable not found\");\n } else cptable = factory(cptable);\n}(this, function(cpt){\n \"use strict\";\n var magic = {\n \"1200\":\"utf16le\",\n \"1201\":\"utf16be\",\n \"12000\":\"utf32le\",\n \"12001\":\"utf32be\",\n \"16969\":\"utf64le\",\n \"20127\":\"ascii\",\n \"65000\":\"utf7\",\n \"65001\":\"utf8\"\n };\n\n var sbcs_cache = [874,1250,1251,1252,1253,1254,1255,1256,10000];\n var dbcs_cache = [932,936,949,950];\n var magic_cache = [65001];\n var magic_decode = {};\n var magic_encode = {};\n var cpecache = {};\n var cpdcache = {};\n\n var sfcc = function sfcc(x) { return String.fromCharCode(x); };\n var cca = function cca(x){ return x.charCodeAt(0); };\n\n var has_buf = (typeof Buffer !== 'undefined');\n if(has_buf) {\n var mdl = 1024, mdb = new Buffer(mdl);\n var make_EE = function make_EE(E){\n var EE = new Buffer(65536);\n for(var i = 0; i < 65536;++i) EE[i] = 0;\n var keys = Object.keys(E), len = keys.length;\n for(var ee = 0, e = keys[ee]; ee < len; ++ee) {\n if(!(e = keys[ee])) continue;\n EE[e.charCodeAt(0)] = E[e];\n }\n return EE;\n };\n var sbcs_encode = function make_sbcs_encode(cp) {\n var EE = make_EE(cpt[cp].enc);\n return function sbcs_e(data, ofmt) {\n var len = data.length;\n var out, i, j, D, w;\n if(typeof data === 'string') {\n out = Buffer(len);\n for(i = 0; i < len; ++i) out[i] = EE[data.charCodeAt(i)];\n } else if(Buffer.isBuffer(data)) {\n out = Buffer(2*len);\n j = 0;\n for(i = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) out[j++] = EE[D];\n else if(D < 224) { out[j++] = EE[((D&31)<<6)+(data[i+1]&63)]; ++i; }\n else if(D < 240) { out[j++] = EE[((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63)]; i+=2; }\n else {\n w = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3;\n if(w < 65536) out[j++] = EE[w];\n else { w -= 65536; out[j++] = EE[0xD800 + ((w>>10)&1023)]; out[j++] = EE[0xDC00 + (w&1023)]; }\n }\n }\n out.length = j;\n out = out.slice(0,j);\n } else {\n out = Buffer(len);\n for(i = 0; i < len; ++i) out[i] = EE[data[i].charCodeAt(0)];\n }\n if(ofmt === undefined || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var sbcs_decode = function make_sbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = new Buffer(131072), d=0, c;\n for(d=0;d<D.length;++d) {\n if(!(c=D[d])) continue;\n var w = c.charCodeAt(0);\n DD[2*d] = w&255; DD[2*d+1] = w>>8;\n }\n return function sbcs_d(data) {\n var len = data.length, i=0, j;\n if(2 * len > mdl) { mdl = 2 * len; mdb = new Buffer(mdl); }\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n }\n mdb.length = 2 * len;\n return mdb.toString('ucs2');\n };\n };\n var dbcs_encode = function make_dbcs_encode(cp) {\n var E = cpt[cp].enc;\n var EE = new Buffer(131072);\n for(var i = 0; i < 131072; ++i) EE[i] = 0;\n var keys = Object.keys(E);\n for(var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {\n if(!(e = keys[ee])) continue;\n var f = e.charCodeAt(0);\n EE[2*f] = E[e] & 255; EE[2*f+1] = E[e]>>8;\n }\n return function dbcs_e(data, ofmt) {\n var len = data.length, out = new Buffer(2*len), i, j, jj, k, D;\n if(typeof data === 'string') {\n for(i = k = 0; i < len; ++i) {\n j = data.charCodeAt(i)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n out.length = k;\n out = out.slice(0,k);\n } else if(Buffer.isBuffer(data)) {\n for(i = k = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) j = D;\n else if(D < 224) { j = ((D&31)<<6)+(data[i+1]&63); ++i; }\n else if(D < 240) { j = ((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63); i+=2; }\n else { j = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3; }\n if(j<65536) { j*=2; out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j]; }\n else { jj = j-65536;\n j=2*(0xD800 + ((jj>>10)&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n j=2*(0xDC00 + (jj&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n out.length = k;\n out = out.slice(0,k);\n } else {\n for(i = k = 0; i < len; i++) {\n j = data[i].charCodeAt(0)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n if(ofmt === undefined || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var dbcs_decode = function make_dbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = new Buffer(131072), d=0, c, w=0, j=0, i=0;\n for(i = 0; i < 65536; ++i) { DD[2*i] = 0xFF; DD[2*i+1] = 0xFD;}\n for(d = 0; d < D.length; ++d) {\n if(!(c=D[d])) continue;\n w = c.charCodeAt(0);\n j = 2*d;\n DD[j] = w&255; DD[j+1] = w>>8;\n }\n return function dbcs_d(data) {\n var len = data.length, out = new Buffer(2*len), i, j, k=0;\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data.charCodeAt(i)<<8)+data.charCodeAt(i+1)); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n }\n out.length = k;\n return out.toString('ucs2');\n };\n };\n magic_decode[65001] = function utf8_d(data) {\n var len = data.length, w = 0, ww = 0;\n if(4 * len > mdl) { mdl = 4 * len; mdb = new Buffer(mdl); }\n mdb.length = 0;\n var i = 0;\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(var j = 1, k = 0, D = 0; i < len; i+=j) {\n j = 1; D = data[i];\n if(D < 128) w = D;\n else if(D < 224) { w=(D&31)*64+(data[i+1]&63); j=2; }\n else if(D < 240) { w=((D&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(D&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { mdb[k++] = w&255; mdb[k++] = w>>8; }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n mdb[k++] = ww&255; mdb[k++] = ww>>>8; mdb[k++] = w&255; mdb[k++] = (w>>>8)&255;\n }\n }\n mdb.length = k;\n return mdb.toString('ucs2');\n };\n magic_encode[65001] = function utf8_e(data, ofmt) {\n var len = data.length, w = 0, ww = 0, j = 0;\n var direct = typeof data === \"string\";\n if(4 * len > mdl) { mdl = 4 * len; mdb = new Buffer(mdl); }\n for(var i = 0; i < len; ++i) {\n w = direct ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) mdb[j++] = w;\n else if(w <= 0x07FF) {\n mdb[j++] = 192 + (w >> 6);\n mdb[j++] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800; ++i;\n ww = (direct ? data.charCodeAt(i) : data[i].charCodeAt(0)) - 0xDC00 + (w << 10);\n mdb[j++] = 240 + ((ww>>>18) & 0x07);\n mdb[j++] = 144 + ((ww>>>12) & 0x3F);\n mdb[j++] = 128 + ((ww>>>6) & 0x3F);\n mdb[j++] = 128 + (ww & 0x3F);\n } else {\n mdb[j++] = 224 + (w >> 12);\n mdb[j++] = 128 + ((w >> 6)&63);\n mdb[j++] = 128 + (w&63);\n }\n }\n mdb.length = j;\n if(ofmt === undefined || ofmt === 'buf') return mdb;\n if(ofmt !== 'arr') return mdb.toString('binary');\n return [].slice.call(mdb);\n };\n }\n\n var encache = function encache() {\n if(has_buf) {\n if(cpdcache[sbcs_cache[0]]) return;\n var i, s;\n for(i = 0; i < sbcs_cache.length; ++i) {\n s = sbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = sbcs_decode(s);\n cpecache[s] = sbcs_encode(s);\n }\n }\n for(i = 0; i < dbcs_cache.length; ++i) {\n s = dbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = dbcs_decode(s);\n cpecache[s] = dbcs_encode(s);\n }\n }\n for(i = 0; i < magic_cache.length; ++i) {\n s = magic_cache[i];\n if(magic_decode[s]) cpdcache[s] = magic_decode[s];\n if(magic_encode[s]) cpecache[s] = magic_encode[s];\n }\n }\n };\n var cp_decache = function cp_decache(cp) { cpdcache[cp] = cpecache[cp] = undefined; };\n var decache = function decache() {\n if(has_buf) {\n if(!cpdcache[sbcs_cache[0]]) return;\n sbcs_cache.forEach(cp_decache);\n dbcs_cache.forEach(cp_decache);\n magic_cache.forEach(cp_decache);\n }\n last_enc = last_cp = undefined;\n };\n var cache = {\n encache: encache,\n decache: decache,\n sbcs: sbcs_cache,\n dbcs: dbcs_cache\n };\n\n encache();\n\n var BM = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n var SetD = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?\";\n var last_enc, last_cp;\n var encode = function encode(cp, data, ofmt) {\n if(cp === last_cp) { return last_enc(data, ofmt); }\n if(cpecache[cp] !== undefined) { last_enc = cpecache[last_cp=cp]; return last_enc(data, ofmt); }\n if(has_buf && Buffer.isBuffer(data)) data = data.toString('utf8');\n var len = data.length;\n var out = has_buf ? new Buffer(4*len) : [], w, i, j = 0, c, tt, ww;\n var C = cpt[cp], E, M;\n if(C && (E=C.enc)) for(i = 0; i < len; ++i, ++j) {\n w = E[data[i]];\n out[j] = w&255;\n if(w > 255) {\n out[j] = w>>8;\n out[++j] = w&255;\n }\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n if(has_buf && typeof data === \"string\") { out = new Buffer(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else if(w <= 0x07FF) {\n out[j] = 192 + (w >> 6);\n out[++j] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800;\n ww = data[++i].charCodeAt(0) - 0xDC00 + (w << 10);\n out[j] = 240 + ((ww>>>18) & 0x07);\n out[++j] = 144 + ((ww>>>12) & 0x3F);\n out[++j] = 128 + ((ww>>>6) & 0x3F);\n out[++j] = 128 + (ww & 0x3F);\n } else {\n out[j] = 224 + (w >> 12);\n out[++j] = 128 + ((w >> 6)&63);\n out[++j] = 128 + (w&63);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && typeof data === \"string\") { out = new Buffer(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else throw new Error(\"bad ascii \" + w);\n }\n break;\n case \"utf16le\":\n if(has_buf && typeof data === \"string\") { out = new Buffer(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i) {\n w = data[i].charCodeAt(0);\n out[j++] = w&255;\n out[j++] = w>>8;\n }\n break;\n case \"utf16be\":\n for(i = 0; i < len; ++i) {\n w = data[i].charCodeAt(0);\n out[j++] = w>>8;\n out[j++] = w&255;\n }\n break;\n case \"utf32le\":\n for(i = 0; i < len; ++i) {\n w = data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255;\n }\n break;\n case \"utf32be\":\n for(i = 0; i < len; ++i) {\n w = data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j+3] = w&255; w >>= 8;\n out[j+2] = w&255; w >>= 8;\n out[j+1] = w&255; w >>= 8;\n out[j] = w&255; w >>= 8;\n j+=4;\n }\n break;\n case \"utf7\":\n for(i = 0; i < len; i++) {\n c = data[i];\n if(c === \"+\") { out[j++] = 0x2b; out[j++] = 0x2d; continue; }\n if(SetD.indexOf(c) > -1) { out[j++] = c.charCodeAt(0); continue; }\n tt = encode(1201, c);\n out[j++] = 0x2b;\n out[j++] = BM.charCodeAt(tt[0]>>2);\n out[j++] = BM.charCodeAt(((tt[0]&0x03)<<4) + ((tt[1]||0)>>4));\n out[j++] = BM.charCodeAt(((tt[1]&0x0F)<<2) + ((tt[2]||0)>>6));\n out[j++] = 0x2d;\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n out.length = j;\n out = out.slice(0,j);\n if(typeof Buffer === 'undefined') return (ofmt == 'str') ? out.map(sfcc).join(\"\") : out;\n if(ofmt === undefined || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n var decode = function decode(cp, data) {\n var F; if((F=cpdcache[cp])) return F(data);\n var len = data.length, out = new Array(len), w, i, j = 1, k = 0, ww;\n var C = cpt[cp], D, M;\n if(C && (D=C.dec)) {\n if(typeof data === \"string\") data = data.split(\"\").map(cca);\n for(i = 0; i < len; i+=j) {\n j = 2;\n w = D[(data[i]<<8)+ data[i+1]];\n if(!w) {\n j = 1;\n w = D[data[i]];\n }\n if(!w) throw new Error('Unrecognized code: ' + data[i] + ' ' + data[i+j-1] + ' ' + i + ' ' + j + ' ' + D[data[i]]);\n out[k++] = w;\n }\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n i = 0;\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(; i < len; i+=j) {\n j = 1;\n if(data[i] < 128) w = data[i];\n else if(data[i] < 224) { w=(data[i]&31)*64+(data[i+1]&63); j=2; }\n else if(data[i] < 240) { w=((data[i]&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(data[i]&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { out[k++] = String.fromCharCode(w); }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n out[k++] = String.fromCharCode(ww); out[k++] = String.fromCharCode(w);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n for(i = 0; i < len; i++) out[i] = String.fromCharCode(data[i]);\n k = len; break;\n case \"utf16le\":\n i = 0;\n if(len >= 2 && data[0] == 0xFF) if(data[1] == 0xFE) i = 2;\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n j = 2;\n for(; i < len; i+=j) {\n out[k++] = String.fromCharCode((data[i+1]<<8) + data[i]);\n }\n break;\n case \"utf16be\":\n i = 0;\n if(len >= 2 && data[0] == 0xFE) if(data[1] == 0xFF) i = 2;\n j = 2;\n for(; i < len; i+=j) {\n out[k++] = String.fromCharCode((data[i]<<8) + data[i+1]);\n }\n break;\n case \"utf32le\":\n i = 0;\n if(len >= 4 && data[0] == 0xFF) if(data[1] == 0xFE && data[2] == 0 && data[3] == 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i+3]<<24) + (data[i+2]<<16) + (data[i+1]<<8) + (data[i]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf32be\":\n i = 0;\n if(len >= 4 && data[3] == 0xFF) if(data[2] == 0xFE && data[1] == 0 && data[0] == 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i]<<24) + (data[i+1]<<16) + (data[i+2]<<8) + (data[i+3]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf7\":\n i = 0;\n if(len >= 4 && data[0] == 0x2B && data[1] == 0x2F && data[2] == 0x76) {\n if(len >= 5 && data[3] == 0x38 && data[4] == 0x2D) i = 5;\n else if(data[3] == 0x38 || data[3] == 0x39 || data[3] == 0x2B || data[3] == 0x2F) i = 4;\n }\n for(; i < len; i+=j) {\n if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }\n j=1;\n if(data[i+1] === 0x2d) { j = 2; out[k++] = \"+\"; continue; }\n while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\\/]/)) j++;\n var dash = 0;\n if(data[i+j] === 0x2d) { ++j; dash=1; }\n var tt = [];\n var o64;\n var c1, c2, c3;\n var e1, e2, e3, e4;\n for(var l = 1; l < j - dash;) {\n e1 = BM.indexOf(String.fromCharCode(data[i+l++]));\n e2 = BM.indexOf(String.fromCharCode(data[i+l++]));\n c1 = e1 << 2 | e2 >> 4;\n tt.push(c1);\n e3 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e3 === -1) break;\n c2 = (e2 & 15) << 4 | e3 >> 2;\n tt.push(c2);\n e4 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e4 === -1) break;\n c3 = (e3 & 3) << 6 | e4;\n if(e4 < 64) tt.push(c3);\n }\n if((tt.length & 1) === 1) tt.length--;\n o64 = decode(1201, tt);\n for(l = 0; l < o64.length; ++l) out[k++] = o64[l];\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n out.length = k;\n return out.join(\"\");\n };\n var hascp = function hascp(cp) { return cpt[cp] || magic[cp]; };\n cpt.utils = { decode: decode, encode: encode, hascp: hascp, magic: magic, cache:cache };\n return cpt;\n}));\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xlsx-utils/dist/cpexcel.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xlsx-utils/license": {
"text": "Copyright (C) 2012-2015 SheetJS\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\nExcept where noted, this license applies to any and all software programs and associated documentation files created by the Original Author and distributed with the Software:\n\n'jszip.js' is a modified version of JSZip, Copyright (c) Stuart Knightley, David Duponchel, Franz Buchinger, Ant'onio Afonso. JSZip is dual licensed and is used according to the terms of the MIT License.\n",
"type": "text/plain",
"title": "$:/plugins/tiddlywiki/xlsx-utils/license"
},
"$:/language/Help/xlsx-import": {
"title": "$:/language/Help/xlsx-import",
"description": "Import tiddlers from an XLSX spreadsheet file",
"text": "Imports tiddlers from an XLSX spreadsheet file\n\n```\n--xlsx-import <filename> <importSpec>\n```\n\n* ''filename'': filename of the `.xlsx` file\n* ''title'': title of the import specification tiddler to be used for the import"
},
"$:/plugins/tiddlywiki/xlsx-utils/importer.js": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/importer.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/xlsx-utils/importer.js\ntype: application/javascript\nmodule-type: library\n\nClass to import an Excel file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_IMPORT_SPEC_TITLE = \"$:/config/plugins/tiddlywiki/xlsx-utils/default-import-spec\";\n\nvar XLSX = require(\"$:/plugins/tiddlywiki/xlsx-utils/xlsx.js\"),\n\tJSZip = require(\"$:/plugins/tiddlywiki/jszip/jszip.js\");\n\nvar XLSXImporter = function(options) {\n\tthis.filename = options.filename;\n\tthis.text = options.text;\n\tthis.importSpec = options.importSpec || $tw.wiki.getTiddlerText(DEFAULT_IMPORT_SPEC_TITLE);\n\tthis.logger = new $tw.utils.Logger(\"xlsx-utils\");\n\tthis.results = [];\n\tif(JSZip) {\n\t\tthis.processWorkbook();\t\t\n\t}\n};\n\nXLSXImporter.prototype.getResults = function() {\n\treturn this.results;\n};\n\nXLSXImporter.prototype.processWorkbook = function() {\n\t// Read the workbook\n\tif(this.filename) {\n\t\tthis.workbook = XLSX.readFile(this.filename);\t\n\t} else if(this.text) {\n\t\tthis.workbook = XLSX.read(this.text,{type:\"base64\"});\n\t}\n\t// Read the root import specification\n\tthis.rootImportSpec = $tw.wiki.getTiddler(this.importSpec);\n\tif(this.rootImportSpec) {\n\t\t// Iterate through the sheets specified in the list field\n\t\t$tw.utils.each(this.rootImportSpec.fields.list || [],this.processSheet.bind(this));\n\t}\n};\n\nXLSXImporter.prototype.processSheet = function(sheetImportSpecTitle) {\n\t// Get the sheet import specifier\n\tthis.sheetImportSpec = $tw.wiki.getTiddler(sheetImportSpecTitle);\n\tif(this.sheetImportSpec) {\n\t\tthis.sheetName = this.sheetImportSpec.fields[\"import-sheet-name\"];\n\t\tthis.sheet = this.workbook.Sheets[this.sheetName];\n\t\tif(!this.sheet) {\n\t\t\tthis.logger.alert(\"Missing sheet '\" + this.sheetName + \"'\");\n\t\t} else {\n\t\t\t// Get the size of the sheet\n\t\t\tthis.sheetSize = this.measureSheet(this.sheet);\n\t\t\t// Read the column names from the first row\n\t\t\tthis.columnsByName = this.findColumns(this.sheet,this.sheetSize);\n\t\t\t// Iterate through the rows\n\t\t\tfor(this.row=this.sheetSize.startRow+1; this.row<=this.sheetSize.endRow; this.row++) {\n\t\t\t\t// Iterate through the row import specifiers\n\t\t\t\t$tw.utils.each(this.sheetImportSpec.fields.list || [],this.processRow.bind(this));\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n};\n\nXLSXImporter.prototype.processRow = function(rowImportSpecTitle) {\n\tthis.rowImportSpec = $tw.wiki.getTiddler(rowImportSpecTitle);\n\tif(this.rowImportSpec) {\n\t\tthis.tiddlerFields = {};\n\t\tthis.skipTiddler = false;\n\t\t// Determine the type of row\n\t\tthis.rowType = this.rowImportSpec.fields[\"import-row-type\"] || \"by-field\";\n\t\tswitch(this.rowType) {\n\t\t\tcase \"by-column\":\n\t\t\t\tthis.processRowByColumn();\n\t\t\t\tbreak;\n\t\t\tcase \"by-field\":\n\t\t\t\tthis.processRowByField();\n\t\t\t\tbreak;\n\t\t}\n\t\t// Save the tiddler if not skipped\n\t\tif(!this.skipTiddler) {\n\t\t\tif(!this.tiddlerFields.title) {\n\t\t\t\tthis.logger.alert(\"Missing title field for \" + JSON.stringify(this.tiddlerFields));\n\t\t\t}\n\t\t\tthis.results.push(this.tiddlerFields);\t\t\t\t\t\t\t\t\n\t\t}\n\t}\n};\n\nXLSXImporter.prototype.processRowByColumn = function() {\n\tvar self = this;\n\t// Iterate through the columns for the row\n\t$tw.utils.each(this.columnsByName,function(index,name) {\n\t\tvar cell = self.sheet[XLSX.utils.encode_cell({c: self.columnsByName[name], r: self.row})];\n\t\tname = name.toLowerCase();\n\t\tif(cell && cell.w && $tw.utils.isValidFieldName(name)) {\n\t\t\tself.tiddlerFields[name] = cell.w;\t\t\n\t\t}\n\t});\n\t// Skip the tiddler entirely if it doesn't have a title\n\tif(!this.tiddlerFields.title) {\n\t\tthis.skipTiddler = true;\n\t}\n};\n\nXLSXImporter.prototype.processRowByField = function() {\n\t// Iterate through the fields for the row\n\t$tw.utils.each(this.rowImportSpec.fields.list || [],this.processField.bind(this));\n};\n\nXLSXImporter.prototype.processField = function(fieldImportSpecTitle) {\n\tvar fieldImportSpec = $tw.wiki.getTiddler(fieldImportSpecTitle);\n\tif(fieldImportSpec) {\n\t\tvar fieldName = fieldImportSpec.fields[\"import-field-name\"],\n\t\t\tvalue;\n\t\tswitch(fieldImportSpec.fields[\"import-field-source\"]) {\n\t\t\tcase \"column\":\n\t\t\t\tvar columnName = fieldImportSpec.fields[\"import-field-column\"],\n\t\t\t\t\tcell = this.sheet[XLSX.utils.encode_cell({c: this.columnsByName[columnName], r: this.row})];\n\t\t\t\tif(cell) {\n\t\t\t\t\tswitch(fieldImportSpec.fields[\"import-field-type\"] || \"string\") {\n\t\t\t\t\t\tcase \"date\":\n\t\t\t\t\t\t\tif(cell.t === \"n\") {\n\t\t\t\t\t\t\t\tvalue = $tw.utils.stringifyDate(new Date((cell.v - (25567 + 2)) * 86400 * 1000));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\t\t// Intentional fall-through\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tvalue = cell.w;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"constant\":\n\t\t\t\tvalue = fieldImportSpec.fields[\"import-field-value\"]\n\t\t\t\tbreak;\n\t\t}\n\t\tvalue = (value || \"\").trim();\n\t\tif(value === \"\") {\n\t\t\tif((fieldImportSpec.fields[\"import-field-skip-tiddler-if-blank\"] || \"\").trim().toLowerCase() === \"yes\") {\n\t\t\t\tthis.skipTiddler = true;\n\t\t\t}\n\t\t\tif(fieldImportSpec.fields[\"import-field-replace-blank\"]) {\n\t\t\t\tvalue = fieldImportSpec.fields[\"import-field-replace-blank\"];\n\t\t\t}\n\t\t}\n\t\tif(fieldImportSpec.fields[\"import-field-prefix\"]) {\n\t\t\tvalue = fieldImportSpec.fields[\"import-field-prefix\"] + value;\n\t\t}\n\t\tif(fieldImportSpec.fields[\"import-field-suffix\"]) {\n\t\t\tvalue = value + fieldImportSpec.fields[\"import-field-suffix\"];\n\t\t}\n\t\tswitch(fieldImportSpec.fields[\"import-field-list-op\"] || \"none\") {\n\t\t\tcase \"none\":\n\t\t\t\tthis.tiddlerFields[fieldName] = value;\n\t\t\t\tbreak;\n\t\t\tcase \"append\":\n\t\t\t\tvar list = $tw.utils.parseStringArray(this.tiddlerFields[fieldName] || \"\");\n\t\t\t\t$tw.utils.pushTop(list,value)\n\t\t\t\tthis.tiddlerFields[fieldName] = list;\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nXLSXImporter.prototype.measureSheet = function(sheet) {\n\tvar sheetRange = XLSX.utils.decode_range(sheet[\"!ref\"]);\n\treturn {\n\t\tstartRow: Math.min(sheetRange.s.r,sheetRange.e.r),\n\t\tendRow: Math.max(sheetRange.s.r,sheetRange.e.r),\n\t\tstartCol: Math.min(sheetRange.s.c,sheetRange.e.c),\n\t\tendCol: Math.max(sheetRange.s.c,sheetRange.e.c)\n\t}\n};\n\nXLSXImporter.prototype.findColumns = function(sheet,sheetSize) {\n\tvar columnsByName = {};\n\tfor(var col=sheetSize.startCol; col<=sheetSize.endCol; col++) {\n\t\tvar cell = sheet[XLSX.utils.encode_cell({c: col, r: sheetSize.startRow})],\n\t\t\tcolumnName;\n\t\tif(cell) {\n\t\t\tcolumnName = cell.w;\n\t\t\tif(columnName) {\n\t\t\t\tcolumnsByName[columnName] = col;\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\treturn columnsByName;\n};\n\nexports.XLSXImporter = XLSXImporter;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xlsx-utils/readme": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/readme",
"text": "This plugin provides a flexible way to import tiddlers from Excel files. It is based on the library [[js-xlsx|https://github.com/SheetJS/js-xlsx]].\n\nThe plugin uses //import specifications// to determine how incoming spreadsheets are processed. You can view, create and edit import specifications in the control panel \"XLSX Utilities\" tab, or directly in the [[plugin controls|$:/plugins/tiddlywiki/xlsx-utils]]. This is also where you select which import specification is selected for use during the next import operation.\n\nEach sheet is expected to consist of a single header row followed by multiple content rows, each consisting of an independent record. The plugin automatically detects the extent of each sheet by looking for the bottom right cell that contains a value. This can lead to unexpected results if a cell is accidentally created with an invisible, blank value.\n\nImport specifications describe how tiddlers are created from a particular row of a sheet; multiple tiddlers can be generated from a single row. (Conversely, if different rows yield tiddlers with the same title then they will overwrite one another).\n\nEach field of each tiddler can be assigned a constant value, or a value taken from a named column of the sheet, optionally with a prefix and/or suffix added. There is special support for handling list fields (like the tags field), with the ability to append new items to the list.\n\nInternally, each import specifier is actually modelled as a hierarchy of connected tiddlers with the field ''import-spec-role'' indicating the following roles:\n\n* ''workbook'': describes the sheets to be imported from the workbook\n* ''sheet'': describes each sheet to be processed\n* ''row'': describes the tiddlers to be imported from each row of each sheet\n* ''field'': describes the fields to be assigned to each tiddler from each row of each sheet\n\nThe easiest way to understand the structure is to explore the example import specifications, and the corresponding spreadsheets they are designed to handle.\n\nNote that there are many possible different ways of importing a particular spreadsheet, depending on whether the structures are modelled with fields, tags, prefixes or other mechanisms. The plugin is designed to support a wide range of applications.\n\nThis plugin also requires the JSZip plugin ([[$:/plugins/tiddlywiki/jszip]]) to be installed.\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/startup.js": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/startup.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/xlsx-utils/startup.js\ntype: application/javascript\nmodule-type: startup\n\nInitialisation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"xlsx-startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Check JSZip is installed\n\tif(!$tw.utils.hop($tw.modules.titles,\"$:/plugins/tiddlywiki/jszip/jszip.js\")) {\n\t\t// Make a logger\n\t\tvar logger = new $tw.utils.Logger(\"xlsx-utils\");\n\t\tlogger.alert(\"The plugin 'xlsx-utils' requires the 'jszip' plugin to be installed\");\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/tiddlywiki/xlsx-utils/styles": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define quick-colour-selector-background() #bac0f1\n\\define quick-colour-selector-border() #9196c1\n\n\\define quick-colour-editor-background() #bae3f1\n\\define quick-colour-editor-controls() #d2ffff\n\\define quick-colour-editor-border() #97b8c3\n\n\\define quick-colour-workbook-background() #baf1db\n\\define quick-colour-workbook-controls() #d3fff6\n\\define quick-colour-workbook-border() #98c3b2\n\n\\define quick-colour-sheet-background() #f1ebba\n\\define quick-colour-sheet-controls() #fffed3\n\\define quick-colour-sheet-border() #c4be98\n\n\\define quick-colour-row-background() #f1baba\n\\define quick-colour-row-controls() #fed1d2\n\\define quick-colour-row-border() #c39697\n\n\\define quick-colour-field-background() #e0d4fb\n\\define quick-colour-field-controls() #fcefff\n\\define quick-colour-field-border() #b6adcb\n\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-import-spec-selector {\n\tborder: 1px solid <<quick-colour-selector-border>>;\n\tbackground-color: <<quick-colour-selector-background>>;\n\tpadding: 0.25em;\n}\n\n.tc-import-spec-editor-wrapper {\n\tborder: 1px solid <<quick-colour-editor-border>>;\n\tbackground-color: <<quick-colour-editor-background>>;\n\tpadding: 0.25em;\n}\n\n.tc-import-spec-editor {\n\tborder: 1px solid <<quick-colour-editor-border>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.25em;\n}\n\n.tc-import-spec-editor-controls {\n\tdisplay: block;\n\tbackground-color: <<quick-colour-editor-controls>>;\n\tborder-bottom: 1px solid <<quick-colour-editor-background>>;\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.tc-import-spec-editor-controls li {\n\tpadding: 0.25em 0.5em;\n}\n\n.tc-import-spec-editor-controls li:not(:last-child) {\n\tborder-bottom: 1px solid <<quick-colour-editor-background>>;\n}\n\n.tc-import-spec-editor-list {\n}\n\n.tc-import-spec-workbook-wrapper {\n\tborder: 1px solid <<quick-colour-workbook-border>>;\n\tbackground-color: <<quick-colour-workbook-background>>;\n\tpadding: 0.25em;\n\tmargin: 0.5em;\n}\n\n.tc-import-spec-workbook {\n\tborder: 1px solid <<quick-colour-workbook-border>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.25em;\n}\n\n.tc-import-spec-workbook-controls {\n\tdisplay: block;\n\tbackground-color: <<quick-colour-workbook-controls>>;\n\tborder-bottom: 1px solid <<quick-colour-workbook-background>>;\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.tc-import-spec-workbook-controls li {\n\tpadding: 0.25em 0.5em;\n}\n\n.tc-import-spec-workbook-controls li:not(:last-child) {\n\tborder-bottom: 1px solid <<quick-colour-workbook-background>>;\n}\n\n.tc-import-spec-workbook-list {\n}\n\n.tc-import-spec-sheet-wrapper {\n\tborder: 1px solid <<quick-colour-sheet-border>>;\n\tbackground-color: <<quick-colour-sheet-background>>;\n\tpadding: 0.25em;\n\tmargin: 0.5em;\n}\n\n.tc-import-spec-sheet {\n\tborder: 1px solid <<quick-colour-sheet-border>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.25em;\n}\n\n.tc-import-spec-sheet-controls {\n\tdisplay: block;\n\tbackground-color: <<quick-colour-sheet-controls>>;\n\tborder-bottom: 1px solid <<quick-colour-sheet-background>>;\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.tc-import-spec-sheet-controls li {\n\tpadding: 0.25em 0.5em;\n}\n\n.tc-import-spec-sheet-controls li:not(:last-child) {\n\tborder-bottom: 1px solid <<quick-colour-sheet-background>>;\n}\n\n.tc-import-spec-sheet-list {\n}\n\n.tc-import-spec-row-wrapper {\n\tborder: 1px solid <<quick-colour-row-border>>;\n\tbackground-color: <<quick-colour-row-background>>;\n\tpadding: 0.25em;\n\tmargin: 0.5em;\n}\n\n.tc-import-spec-row {\n\tborder: 1px solid <<quick-colour-row-border>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.25em;\n}\n\n.tc-import-spec-row-controls {\n\tdisplay: block;\n\tbackground-color: <<quick-colour-row-controls>>;\n\tborder-bottom: 1px solid <<quick-colour-row-background>>;\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n.tc-import-spec-row-controls li {\n\tpadding: 0.25em 0.5em;\n}\n\n.tc-import-spec-row-controls li:not(:last-child) {\n\tborder-bottom: 1px solid <<quick-colour-row-background>>;\n}\n\n.tc-import-spec-row-list {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-import-spec-field-wrapper {\n\tfont-size: 0.9em;\n\tborder: 1px solid <<quick-colour-field-border>>;\n\tbackground-color: <<quick-colour-field-background>>;\n\tpadding: 0.25em;\n\tmargin: 0.5em;\n}\n"
},
"$:/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js": {
"title": "$:/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import an xlsx file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"xlsx-import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilename = this.params[0],\n\t\timportSpec = this.params[1],\n\t\tXLSXImporter = require(\"$:/plugins/tiddlywiki/xlsx-utils/importer.js\").XLSXImporter,\n\t\timporter = new XLSXImporter({\n\t\t\tfilename: filename,\n\t\t\timportSpec: importSpec\n\t\t});\n\t$tw.wiki.addTiddlers(importer.getResults());\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/xmldom/dom": {
"text": "/*\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n */\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tdest[p] = src[p];\n\t}\n}\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(Object.create){\n\t\tvar ppt = Object.create(Super.prototype)\n\t\tpt.__proto__ = ppt;\n\t}\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknow Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\nvar htmlns = 'http://www.w3.org/1999/xhtml' ;\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0, \n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long \n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index. \n\t */\n\titem: function(index) {\n\t\treturn this[index] || null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i<this.length;i++){\n\t\t\tserializeToString(this[i],buf,isHTML,nodeFilter);\n\t\t}\n\t\treturn buf.join('');\n\t}\n};\nfunction LiveNodeList(node,refresh){\n\tthis._node = node;\n\tthis._refresh = refresh\n\t_updateLiveList(this);\n}\nfunction _updateLiveList(list){\n\tvar inc = list._node._inc || list._node.ownerDocument._inc;\n\tif(list._inc != inc){\n\t\tvar ls = list._refresh(list._node);\n\t\t//console.log(ls.length)\n\t\t__set__(list,'length',ls.length);\n\t\tcopy(ls,list);\n\t\tlist._inc = inc;\n\t}\n}\nLiveNodeList.prototype.item = function(i){\n\t_updateLiveList(this);\n\treturn this[i];\n}\n\n_extends(LiveNodeList,NodeList);\n/**\n * \n * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.\n * NamedNodeMap objects in the DOM are live.\n * used for attributes or DocumentType entities \n */\nfunction NamedNodeMap() {\n};\n\nfunction _findNodeIndex(list,node){\n\tvar i = list.length;\n\twhile(i--){\n\t\tif(list[i] === node){return i}\n\t}\n}\n\nfunction _addNamedNode(el,list,newAttr,oldAttr){\n\tif(oldAttr){\n\t\tlist[_findNodeIndex(list,oldAttr)] = newAttr;\n\t}else{\n\t\tlist[list.length++] = newAttr;\n\t}\n\tif(el){\n\t\tnewAttr.ownerElement = el;\n\t\tvar doc = el.ownerDocument;\n\t\tif(doc){\n\t\t\toldAttr && _onRemoveAttribute(doc,el,oldAttr);\n\t\t\t_onAddAttribute(doc,el,newAttr);\n\t\t}\n\t}\n}\nfunction _removeNamedNode(el,list,attr){\n\t//console.log('remove attr:'+attr)\n\tvar i = _findNodeIndex(list,attr);\n\tif(i>=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i<lastIndex){\n\t\t\tlist[i] = list[++i]\n\t\t}\n\t\tlist.length = lastIndex;\n\t\tif(el){\n\t\t\tvar doc = el.ownerDocument;\n\t\t\tif(doc){\n\t\t\t\t_onRemoveAttribute(doc,el,attr);\n\t\t\t\tattr.ownerElement = null;\n\t\t\t}\n\t\t}\n\t}else{\n\t\tthrow DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))\n\t}\n}\nNamedNodeMap.prototype = {\n\tlength:0,\n\titem:NodeList.prototype.item,\n\tgetNamedItem: function(key) {\n//\t\tif(key.indexOf(':')>0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t\t\n\t\t\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\t\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n/**\n * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490\n */\nfunction DOMImplementation(/* Object */ features) {\n\tthis._features = {};\n\tif (features) {\n\t\tfor (var feature in features) {\n\t\t\t this._features = features[feature];\n\t\t}\n\t}\n};\n\nDOMImplementation.prototype = {\n\thasFeature: function(/* string */ feature, /* string */ version) {\n\t\tvar versions = this._features[feature.toLowerCase()];\n\t\tif (versions && (!version || version in versions)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype;\n\t\tif(doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif(qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI,qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId;\n\t\tnode.systemId = systemId;\n\t\t// Introduced in DOM Level 2:\n\t\t//readonly attribute DOMString internalSubset;\n\t\t\n\t\t//TODO:..\n\t\t// readonly attribute NamedNodeMap entities;\n\t\t// readonly attribute NamedNodeMap notations;\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises \n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises \n\t\tthis.insertBefore(newChild,oldChild);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n \t\t\t\tif(map[n] == namespaceURI){\n \t\t\t\t\treturn n;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(prefix in map){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n}\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\nfunction _onUpdateChild(doc,el,newChild){\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif(newChild){\n\t\t\tcs[cs.length++] = newChild;\n\t\t}else{\n\t\t\t//console.log(1)\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile(child){\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild =child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t}\n\t}\n}\n\n/**\n * attributes;\n * children;\n * \n * writeable properties:\n * nodeValue,Attr:value,CharacterData:data\n * prefix\n */\nfunction _removeChild(parentNode,child){\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif(previous){\n\t\tprevious.nextSibling = next;\n\t}else{\n\t\tparentNode.firstChild = next\n\t}\n\tif(next){\n\t\tnext.previousSibling = previous;\n\t}else{\n\t\tparentNode.lastChild = previous;\n\t}\n\t_onUpdateChild(parentNode.ownerDocument,parentNode);\n\treturn child;\n}\n/**\n * preformance key(refChild == null)\n */\nfunction _insertBefore(parentNode,newChild,nextChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tcp.removeChild(newChild);//remove and update\n\t}\n\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = newChild.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn newChild;\n\t\t}\n\t\tvar newLast = newChild.lastChild;\n\t}else{\n\t\tnewFirst = newLast = newChild;\n\t}\n\tvar pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = nextChild;\n\t\n\t\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparentNode.firstChild = newFirst;\n\t}\n\tif(nextChild == null){\n\t\tparentNode.lastChild = newLast;\n\t}else{\n\t\tnextChild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parentNode;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);\n\t//console.log(parentNode.lastChild.nextSibling == null)\n\tif (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnewChild.firstChild = newChild.lastChild = null;\n\t}\n\treturn newChild;\n}\nfunction _appendSingleChild(parentNode,newChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tvar pre = parentNode.lastChild;\n\t\tcp.removeChild(newChild);//remove and update\n\t\tvar pre = parentNode.lastChild;\n\t}\n\tvar pre = parentNode.lastChild;\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = pre;\n\tnewChild.nextSibling = null;\n\tif(pre){\n\t\tpre.nextSibling = newChild;\n\t}else{\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);\n\treturn newChild;\n\t//console.log(\"__aa\",parentNode.lastChild.nextSibling == null)\n}\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\t\n\tinsertBefore : function(newChild, refChild){//raises \n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\tif(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t\t\n\t\treturn _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\t\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.target = target;\n\t\tnode.nodeValue= node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\t\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\t\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\t\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t\t\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\t\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\t\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\nfunction needNamespaceDefine(node,isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix||'';\n\tvar uri = node.namespaceURI;\n\tif (!prefix && !uri){\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === \"http://www.w3.org/XML/1998/namespace\" \n\t\t|| uri == 'http://www.w3.org/2000/xmlns/'){\n\t\treturn false;\n\t}\n\t\n\tvar i = visibleNamespaces.length \n\t//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\t//console.log(node.nodeType,node.tagName,ns.prefix,prefix)\n\t\tif (ns.prefix == prefix){\n\t\t\treturn ns.namespace != uri;\n\t\t}\n\t}\n\t//console.log(isHTML,uri,prefix=='')\n\t//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){\n\t//\treturn false;\n\t//}\n\t//node.flag = '11111'\n\t//console.error(3,true,node.flag,node.prefix,node.namespaceURI)\n\treturn true;\n}\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tif (!visibleNamespaces) visibleNamespaces = [];\n\t\tvar startVisibleNamespaces = visibleNamespaces.length;\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\t\t\n\t\tisHTML = (htmlns === node.namespaceURI) ||isHTML \n\t\tbuf.push('<',nodeName);\n\t\t\n\t\t\n\t\t\n\t\tfor(var i=0;i<len;i++){\n\t\t\t// add namespaces for attributes\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (attr.prefix == 'xmlns') {\n\t\t\t\tvisibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });\n\t\t\t}else if(attr.nodeName == 'xmlns'){\n\t\t\t\tvisibleNamespaces.push({ prefix: '', namespace: attr.value });\n\t\t\t}\n\t\t}\n\t\tfor(var i=0;i<len;i++){\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {\n\t\t\t\tvar prefix = attr.prefix||'';\n\t\t\t\tvar uri = attr.namespaceURI;\n\t\t\t\tvar ns = prefix ? ' xmlns:' + prefix : \" xmlns\";\n\t\t\t\tbuf.push(ns, '=\"' , uri , '\"');\n\t\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t\t}\n\t\t\tserializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t}\n\t\t// add namespace for current node\t\t\n\t\tif (needNamespaceDefine(node,isHTML, visibleNamespaces)) {\n\t\t\tvar prefix = node.prefix||'';\n\t\t\tvar uri = node.namespaceURI;\n\t\t\tvar ns = prefix ? ' xmlns:' + prefix : \" xmlns\";\n\t\t\tbuf.push(ns, '=\"' , uri , '\"');\n\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t}\n\t\t\n\t\tif(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){\n\t\t\tbuf.push('>');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('</',nodeName,'>');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn buf.push(' ',node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');\n\tcase TEXT_NODE:\n\t\treturn buf.push(node.data.replace(/[<&]/g,_xmlEncoder));\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '<![CDATA[',node.data,']]>');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"<!--\",node.data,\"-->\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('<!DOCTYPE ',node.name);\n\t\tif(pubid){\n\t\t\tbuf.push(' PUBLIC \"',pubid);\n\t\t\tif (sysid && sysid!='.') {\n\t\t\t\tbuf.push( '\" \"',sysid);\n\t\t\t}\n\t\t\tbuf.push('\">');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"<?\",node.target,\" \",node.data,\"?>\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i<len;i++){\n\t\t\t//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));\n\t\t//}\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tbreak;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t\tbreak;\n\t//case ENTITY_REFERENCE_NODE:\n\t//case PROCESSING_INSTRUCTION_NODE:\n\t////case TEXT_NODE:\n\t//case CDATA_SECTION_NODE:\n\t//case COMMENT_NODE:\n\t//\tdeep = false;\n\t//\tbreak;\n\t//case DOCUMENT_NODE:\n\t//case DOCUMENT_TYPE_NODE:\n\t//cannot be imported.\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\t//can not hit in level3\n\t//default:throw e;\n\t}\n\tif(!node2){\n\t\tnode2 = node.cloneNode(false);//false\n\t}\n\tnode2.ownerDocument = doc;\n\tnode2.parentNode = null;\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(importNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n//\n//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,\n//\t\t\t\t\tattributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};\nfunction cloneNode(doc,node,deep){\n\tvar node2 = new node.constructor();\n\tfor(var n in node){\n\t\tvar v = node[n];\n\t\tif(typeof v != 'object' ){\n\t\t\tif(v != node2[n]){\n\t\t\t\tnode2[n] = v;\n\t\t\t}\n\t\t}\n\t}\n\tif(node.childNodes){\n\t\tnode2.childNodes = new NodeList();\n\t}\n\tnode2.ownerDocument = doc;\n\tswitch (node2.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tvar attrs\t= node.attributes;\n\t\tvar attrs2\t= node2.attributes = new NamedNodeMap();\n\t\tvar len = attrs.length\n\t\tattrs2._ownerElement = node2;\n\t\tfor(var i=0;i<len;i++){\n\t\t\tnode2.setAttributeNode(cloneNode(doc,attrs.item(i),true));\n\t\t}\n\t\tbreak;;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t}\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(cloneNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n\nfunction __set__(object,key,value){\n\tobject[key] = value\n}\n//do dynamic\ntry{\n\tif(Object.defineProperty){\n\t\tObject.defineProperty(LiveNodeList.prototype,'length',{\n\t\t\tget:function(){\n\t\t\t\t_updateLiveList(this);\n\t\t\t\treturn this.$$length;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(Node.prototype,'textContent',{\n\t\t\tget:function(){\n\t\t\t\treturn getTextContent(this);\n\t\t\t},\n\t\t\tset:function(data){\n\t\t\t\tswitch(this.nodeType){\n\t\t\t\tcase ELEMENT_NODE:\n\t\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\t\twhile(this.firstChild){\n\t\t\t\t\t\tthis.removeChild(this.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tif(data || String(data)){\n\t\t\t\t\t\tthis.appendChild(this.ownerDocument.createTextNode(data));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t//TODO:\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.value = data;\n\t\t\t\t\tthis.nodeValue = data;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t\n\t\tfunction getTextContent(node){\n\t\t\tswitch(node.nodeType){\n\t\t\tcase ELEMENT_NODE:\n\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\tvar buf = [];\n\t\t\t\tnode = node.firstChild;\n\t\t\t\twhile(node){\n\t\t\t\t\tif(node.nodeType!==7 && node.nodeType !==8){\n\t\t\t\t\t\tbuf.push(getTextContent(node));\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t\treturn buf.join('');\n\t\t\tdefault:\n\t\t\t\treturn node.nodeValue;\n\t\t\t}\n\t\t}\n\t\t__set__ = function(object,key,value){\n\t\t\t//console.log(value)\n\t\t\tobject['$$'+key] = value\n\t\t}\n\t}\n}catch(e){//ie8\n}\n\n//if(typeof require == 'function'){\n\texports.DOMImplementation = DOMImplementation;\n\texports.XMLSerializer = XMLSerializer;\n//}\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xmldom/dom",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xmldom/dom-parser": {
"text": "function DOMParser(options){\r\n\tthis.options = options ||{locator:{}};\r\n\t\r\n}\r\nDOMParser.prototype.parseFromString = function(source,mimeType){\r\n\tvar options = this.options;\r\n\tvar sax = new XMLReader();\r\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\r\n\tvar errorHandler = options.errorHandler;\r\n\tvar locator = options.locator;\r\n\tvar defaultNSMap = options.xmlns||{};\r\n\tvar isHTML = /\\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;\r\n \tvar entityMap = isHTML?require('./entities').entityMap:{'lt':'<','gt':'>','amp':'&','quot':'\"','apos':\"'\"};\r\n\tif(locator){\r\n\t\tdomBuilder.setDocumentLocator(locator)\r\n\t}\r\n\t\r\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\r\n\tsax.domBuilder = options.domBuilder || domBuilder;\r\n\tif(isHTML){\r\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\r\n\t}\r\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\r\n\tif(source){\r\n\t\tsax.parse(source,defaultNSMap,entityMap);\r\n\t}else{\r\n\t\tsax.errorHandler.error(\"invalid doc source\");\r\n\t}\r\n\treturn domBuilder.doc;\r\n}\r\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\r\n\tif(!errorImpl){\r\n\t\tif(domBuilder instanceof DOMHandler){\r\n\t\t\treturn domBuilder;\r\n\t\t}\r\n\t\terrorImpl = domBuilder ;\r\n\t}\r\n\tvar errorHandler = {}\r\n\tvar isCallback = errorImpl instanceof Function;\r\n\tlocator = locator||{}\r\n\tfunction build(key){\r\n\t\tvar fn = errorImpl[key];\r\n\t\tif(!fn && isCallback){\r\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\r\n\t\t}\r\n\t\terrorHandler[key] = fn && function(msg){\r\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\r\n\t\t}||function(){};\r\n\t}\r\n\tbuild('warning');\r\n\tbuild('error');\r\n\tbuild('fatalError');\r\n\treturn errorHandler;\r\n}\r\n\r\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\r\n/**\r\n * +ContentHandler+ErrorHandler\r\n * +LexicalHandler+EntityResolver2\r\n * -DeclHandler-DTDHandler \r\n * \r\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\r\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\r\n */\r\nfunction DOMHandler() {\r\n this.cdata = false;\r\n}\r\nfunction position(locator,node){\r\n\tnode.lineNumber = locator.lineNumber;\r\n\tnode.columnNumber = locator.columnNumber;\r\n}\r\n/**\r\n * @see org.xml.sax.ContentHandler#startDocument\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\r\n */ \r\nDOMHandler.prototype = {\r\n\tstartDocument : function() {\r\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\r\n \tif (this.locator) {\r\n \tthis.doc.documentURI = this.locator.systemId;\r\n \t}\r\n\t},\r\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\r\n\t\tvar doc = this.doc;\r\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\r\n\t var len = attrs.length;\r\n\t appendElement(this, el);\r\n\t this.currentElement = el;\r\n\t \r\n\t\tthis.locator && position(this.locator,el)\r\n\t for (var i = 0 ; i < len; i++) {\r\n\t var namespaceURI = attrs.getURI(i);\r\n\t var value = attrs.getValue(i);\r\n\t var qName = attrs.getQName(i);\r\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\r\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\r\n\t\t\tattr.value = attr.nodeValue = value;\r\n\t\t\tel.setAttributeNode(attr)\r\n\t }\r\n\t},\r\n\tendElement:function(namespaceURI, localName, qName) {\r\n\t\tvar current = this.currentElement\r\n\t\tvar tagName = current.tagName;\r\n\t\tthis.currentElement = current.parentNode;\r\n\t},\r\n\tstartPrefixMapping:function(prefix, uri) {\r\n\t},\r\n\tendPrefixMapping:function(prefix) {\r\n\t},\r\n\tprocessingInstruction:function(target, data) {\r\n\t var ins = this.doc.createProcessingInstruction(target, data);\r\n\t this.locator && position(this.locator,ins)\r\n\t appendElement(this, ins);\r\n\t},\r\n\tignorableWhitespace:function(ch, start, length) {\r\n\t},\r\n\tcharacters:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t\t//console.log(chars)\r\n\t\tif(chars){\r\n\t\t\tif (this.cdata) {\r\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\r\n\t\t\t} else {\r\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\r\n\t\t\t}\r\n\t\t\tif(this.currentElement){\r\n\t\t\t\tthis.currentElement.appendChild(charNode);\r\n\t\t\t}else if(/^\\s*$/.test(chars)){\r\n\t\t\t\tthis.doc.appendChild(charNode);\r\n\t\t\t\t//process xml\r\n\t\t\t}\r\n\t\t\tthis.locator && position(this.locator,charNode)\r\n\t\t}\r\n\t},\r\n\tskippedEntity:function(name) {\r\n\t},\r\n\tendDocument:function() {\r\n\t\tthis.doc.normalize();\r\n\t},\r\n\tsetDocumentLocator:function (locator) {\r\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\r\n\t \tlocator.lineNumber = 0;\r\n\t }\r\n\t},\r\n\t//LexicalHandler\r\n\tcomment:function(chars, start, length) {\r\n\t\tchars = _toString.apply(this,arguments)\r\n\t var comm = this.doc.createComment(chars);\r\n\t this.locator && position(this.locator,comm)\r\n\t appendElement(this, comm);\r\n\t},\r\n\t\r\n\tstartCDATA:function() {\r\n\t //used in characters() methods\r\n\t this.cdata = true;\r\n\t},\r\n\tendCDATA:function() {\r\n\t this.cdata = false;\r\n\t},\r\n\t\r\n\tstartDTD:function(name, publicId, systemId) {\r\n\t\tvar impl = this.doc.implementation;\r\n\t if (impl && impl.createDocumentType) {\r\n\t var dt = impl.createDocumentType(name, publicId, systemId);\r\n\t this.locator && position(this.locator,dt)\r\n\t appendElement(this, dt);\r\n\t }\r\n\t},\r\n\t/**\r\n\t * @see org.xml.sax.ErrorHandler\r\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\r\n\t */\r\n\twarning:function(error) {\r\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\r\n\t},\r\n\terror:function(error) {\r\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\r\n\t},\r\n\tfatalError:function(error) {\r\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\r\n\t throw error;\r\n\t}\r\n}\r\nfunction _locator(l){\r\n\tif(l){\r\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\r\n\t}\r\n}\r\nfunction _toString(chars,start,length){\r\n\tif(typeof chars == 'string'){\r\n\t\treturn chars.substr(start,length)\r\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\r\n\t\tif(chars.length >= start+length || start){\r\n\t\t\treturn new java.lang.String(chars,start,length)+'';\r\n\t\t}\r\n\t\treturn chars;\r\n\t}\r\n}\r\n\r\n/*\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\r\n * used method of org.xml.sax.ext.LexicalHandler:\r\n * #comment(chars, start, length)\r\n * #startCDATA()\r\n * #endCDATA()\r\n * #startDTD(name, publicId, systemId)\r\n *\r\n *\r\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\r\n * #endDTD()\r\n * #startEntity(name)\r\n * #endEntity(name)\r\n *\r\n *\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\r\n * IGNORED method of org.xml.sax.ext.DeclHandler\r\n * \t#attributeDecl(eName, aName, type, mode, value)\r\n * #elementDecl(name, model)\r\n * #externalEntityDecl(name, publicId, systemId)\r\n * #internalEntityDecl(name, value)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\r\n * IGNORED method of org.xml.sax.EntityResolver2\r\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\r\n * #resolveEntity(publicId, systemId)\r\n * #getExternalSubset(name, baseURI)\r\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\r\n * IGNORED method of org.xml.sax.DTDHandler\r\n * #notationDecl(name, publicId, systemId) {};\r\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\r\n */\r\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\r\n\tDOMHandler.prototype[key] = function(){return null}\r\n})\r\n\r\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\r\nfunction appendElement (hander,node) {\r\n if (!hander.currentElement) {\r\n hander.doc.appendChild(node);\r\n } else {\r\n hander.currentElement.appendChild(node);\r\n }\r\n}//appendChild and setAttributeNS are preformance key\r\n\r\n//if(typeof require == 'function'){\r\n\tvar XMLReader = require('./sax').XMLReader;\r\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\r\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\r\n\texports.DOMParser = DOMParser;\r\n//}\r\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xmldom/dom-parser",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xmldom/entities": {
"text": "exports.entityMap = {\n lt: '<',\n gt: '>',\n amp: '&',\n quot: '\"',\n apos: \"'\",\n Agrave: \"À\",\n Aacute: \"Á\",\n Acirc: \"Â\",\n Atilde: \"Ã\",\n Auml: \"Ä\",\n Aring: \"Å\",\n AElig: \"Æ\",\n Ccedil: \"Ç\",\n Egrave: \"È\",\n Eacute: \"É\",\n Ecirc: \"Ê\",\n Euml: \"Ë\",\n Igrave: \"Ì\",\n Iacute: \"Í\",\n Icirc: \"Î\",\n Iuml: \"Ï\",\n ETH: \"Ð\",\n Ntilde: \"Ñ\",\n Ograve: \"Ò\",\n Oacute: \"Ó\",\n Ocirc: \"Ô\",\n Otilde: \"Õ\",\n Ouml: \"Ö\",\n Oslash: \"Ø\",\n Ugrave: \"Ù\",\n Uacute: \"Ú\",\n Ucirc: \"Û\",\n Uuml: \"Ü\",\n Yacute: \"Ý\",\n THORN: \"Þ\",\n szlig: \"ß\",\n agrave: \"à\",\n aacute: \"á\",\n acirc: \"â\",\n atilde: \"ã\",\n auml: \"ä\",\n aring: \"å\",\n aelig: \"æ\",\n ccedil: \"ç\",\n egrave: \"è\",\n eacute: \"é\",\n ecirc: \"ê\",\n euml: \"ë\",\n igrave: \"ì\",\n iacute: \"í\",\n icirc: \"î\",\n iuml: \"ï\",\n eth: \"ð\",\n ntilde: \"ñ\",\n ograve: \"ò\",\n oacute: \"ó\",\n ocirc: \"ô\",\n otilde: \"õ\",\n ouml: \"ö\",\n oslash: \"ø\",\n ugrave: \"ù\",\n uacute: \"ú\",\n ucirc: \"û\",\n uuml: \"ü\",\n yacute: \"ý\",\n thorn: \"þ\",\n yuml: \"ÿ\",\n nbsp: \" \",\n iexcl: \"¡\",\n cent: \"¢\",\n pound: \"£\",\n curren: \"¤\",\n yen: \"¥\",\n brvbar: \"¦\",\n sect: \"§\",\n uml: \"¨\",\n copy: \"©\",\n ordf: \"ª\",\n laquo: \"«\",\n not: \"¬\",\n shy: \"\",\n reg: \"®\",\n macr: \"¯\",\n deg: \"°\",\n plusmn: \"±\",\n sup2: \"²\",\n sup3: \"³\",\n acute: \"´\",\n micro: \"µ\",\n para: \"¶\",\n middot: \"·\",\n cedil: \"¸\",\n sup1: \"¹\",\n ordm: \"º\",\n raquo: \"»\",\n frac14: \"¼\",\n frac12: \"½\",\n frac34: \"¾\",\n iquest: \"¿\",\n times: \"×\",\n divide: \"÷\",\n forall: \"∀\",\n part: \"∂\",\n exist: \"∃\",\n empty: \"∅\",\n nabla: \"∇\",\n isin: \"∈\",\n notin: \"∉\",\n ni: \"∋\",\n prod: \"∏\",\n sum: \"∑\",\n minus: \"−\",\n lowast: \"∗\",\n radic: \"√\",\n prop: \"∝\",\n infin: \"∞\",\n ang: \"∠\",\n and: \"∧\",\n or: \"∨\",\n cap: \"∩\",\n cup: \"∪\",\n 'int': \"∫\",\n there4: \"∴\",\n sim: \"∼\",\n cong: \"≅\",\n asymp: \"≈\",\n ne: \"≠\",\n equiv: \"≡\",\n le: \"≤\",\n ge: \"≥\",\n sub: \"⊂\",\n sup: \"⊃\",\n nsub: \"⊄\",\n sube: \"⊆\",\n supe: \"⊇\",\n oplus: \"⊕\",\n otimes: \"⊗\",\n perp: \"⊥\",\n sdot: \"⋅\",\n Alpha: \"Α\",\n Beta: \"Β\",\n Gamma: \"Γ\",\n Delta: \"Δ\",\n Epsilon: \"Ε\",\n Zeta: \"Ζ\",\n Eta: \"Η\",\n Theta: \"Θ\",\n Iota: \"Ι\",\n Kappa: \"Κ\",\n Lambda: \"Λ\",\n Mu: \"Μ\",\n Nu: \"Ν\",\n Xi: \"Ξ\",\n Omicron: \"Ο\",\n Pi: \"Π\",\n Rho: \"Ρ\",\n Sigma: \"Σ\",\n Tau: \"Τ\",\n Upsilon: \"Υ\",\n Phi: \"Φ\",\n Chi: \"Χ\",\n Psi: \"Ψ\",\n Omega: \"Ω\",\n alpha: \"α\",\n beta: \"β\",\n gamma: \"γ\",\n delta: \"δ\",\n epsilon: \"ε\",\n zeta: \"ζ\",\n eta: \"η\",\n theta: \"θ\",\n iota: \"ι\",\n kappa: \"κ\",\n lambda: \"λ\",\n mu: \"μ\",\n nu: \"ν\",\n xi: \"ξ\",\n omicron: \"ο\",\n pi: \"π\",\n rho: \"ρ\",\n sigmaf: \"ς\",\n sigma: \"σ\",\n tau: \"τ\",\n upsilon: \"υ\",\n phi: \"φ\",\n chi: \"χ\",\n psi: \"ψ\",\n omega: \"ω\",\n thetasym: \"ϑ\",\n upsih: \"ϒ\",\n piv: \"ϖ\",\n OElig: \"Œ\",\n oelig: \"œ\",\n Scaron: \"Š\",\n scaron: \"š\",\n Yuml: \"Ÿ\",\n fnof: \"ƒ\",\n circ: \"ˆ\",\n tilde: \"˜\",\n ensp: \" \",\n emsp: \" \",\n thinsp: \" \",\n zwnj: \"\",\n zwj: \"\",\n lrm: \"\",\n rlm: \"\",\n ndash: \"–\",\n mdash: \"—\",\n lsquo: \"‘\",\n rsquo: \"’\",\n sbquo: \"‚\",\n ldquo: \"“\",\n rdquo: \"”\",\n bdquo: \"„\",\n dagger: \"†\",\n Dagger: \"‡\",\n bull: \"•\",\n hellip: \"…\",\n permil: \"‰\",\n prime: \"′\",\n Prime: \"″\",\n lsaquo: \"‹\",\n rsaquo: \"›\",\n oline: \"‾\",\n euro: \"€\",\n trade: \"™\",\n larr: \"←\",\n uarr: \"↑\",\n rarr: \"→\",\n darr: \"↓\",\n harr: \"↔\",\n crarr: \"↵\",\n lceil: \"⌈\",\n rceil: \"⌉\",\n lfloor: \"⌊\",\n rfloor: \"⌋\",\n loz: \"◊\",\n spades: \"♠\",\n clubs: \"♣\",\n hearts: \"♥\",\n diams: \"♦\"\n};\n//for(var n in exports.entityMap){console.log(exports.entityMap[n].charCodeAt())}",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xmldom/entities",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xmldom/sax": {
"text": "//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\r\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\r\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\r\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\r\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\r\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\r\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\r\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\r\n\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\nvar S_TAG = 0;//tag name offerring\r\nvar S_ATTR = 1;//attr name offerring \r\nvar S_ATTR_SPACE=2;//attr name end and space offer\r\nvar S_EQ = 3;//=space?\r\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\r\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\r\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\r\nvar S_TAG_CLOSE = 7;//closed el<el />\r\n\r\nfunction XMLReader(){\r\n\t\r\n}\r\n\r\nXMLReader.prototype = {\r\n\tparse:function(source,defaultNSMap,entityMap){\r\n\t\tvar domBuilder = this.domBuilder;\r\n\t\tdomBuilder.startDocument();\r\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\r\n\t\tparse(source,defaultNSMap,entityMap,\r\n\t\t\t\tdomBuilder,this.errorHandler);\r\n\t\tdomBuilder.endDocument();\r\n\t}\r\n}\r\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\r\n\tfunction fixedFromCharCode(code) {\r\n\t\t// String.prototype.fromCharCode does not supports\r\n\t\t// > 2 bytes unicode chars directly\r\n\t\tif (code > 0xffff) {\r\n\t\t\tcode -= 0x10000;\r\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\r\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\r\n\r\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\r\n\t\t} else {\r\n\t\t\treturn String.fromCharCode(code);\r\n\t\t}\r\n\t}\r\n\tfunction entityReplacer(a){\r\n\t\tvar k = a.slice(1,-1);\r\n\t\tif(k in entityMap){\r\n\t\t\treturn entityMap[k]; \r\n\t\t}else if(k.charAt(0) === '#'){\r\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\r\n\t\t}else{\r\n\t\t\terrorHandler.error('entity not found:'+a);\r\n\t\t\treturn a;\r\n\t\t}\r\n\t}\r\n\tfunction appendText(end){//has some bugs\r\n\t\tif(end>start){\r\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\tlocator&&position(start);\r\n\t\t\tdomBuilder.characters(xt,0,end-start);\r\n\t\t\tstart = end\r\n\t\t}\r\n\t}\r\n\tfunction position(p,m){\r\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\r\n\t\t\tlineStart = m.index;\r\n\t\t\tlineEnd = lineStart + m[0].length;\r\n\t\t\tlocator.lineNumber++;\r\n\t\t\t//console.log('line++:',locator,startPos,endPos)\r\n\t\t}\r\n\t\tlocator.columnNumber = p-lineStart+1;\r\n\t}\r\n\tvar lineStart = 0;\r\n\tvar lineEnd = 0;\r\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\r\n\tvar locator = domBuilder.locator;\r\n\t\r\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\r\n\tvar closeMap = {};\r\n\tvar start = 0;\r\n\twhile(true){\r\n\t\ttry{\r\n\t\t\tvar tagStart = source.indexOf('<',start);\r\n\t\t\tif(tagStart<0){\r\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\r\n\t\t\t\t\tvar doc = domBuilder.doc;\r\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\r\n\t \t\t\tdoc.appendChild(text);\r\n\t \t\t\tdomBuilder.currentElement = text;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif(tagStart>start){\r\n\t\t\t\tappendText(tagStart);\r\n\t\t\t}\r\n\t\t\tswitch(source.charAt(tagStart+1)){\r\n\t\t\tcase '/':\r\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\r\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\r\n\t\t\t\tvar config = parseStack.pop();\r\n\t\t\t\tif(end<0){\r\n\t\t\t\t\t\r\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\r\n\t \t\t//console.error('#@@@@@@'+tagName)\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t \t}else if(tagName.match(/\\s</)){\r\n\t \t\ttagName = tagName.replace(/[\\s<].*/,'');\r\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' maybe not complete');\r\n\t \t\tend = tagStart+1+tagName.length;\r\n\t\t\t\t}\r\n\t\t\t\t//console.error(parseStack.length,parseStack)\r\n\t\t\t\t//console.error(config);\r\n\t\t\t\tvar localNSMap = config.localNSMap;\r\n\t\t\t\tvar endMatch = config.tagName == tagName;\r\n\t\t\t\tvar endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()\r\n\t\t if(endIgnoreCaseMach){\r\n\t\t \tdomBuilder.endElement(config.uri,config.localName,tagName);\r\n\t\t\t\t\tif(localNSMap){\r\n\t\t\t\t\t\tfor(var prefix in localNSMap){\r\n\t\t\t\t\t\t\tdomBuilder.endPrefixMapping(prefix) ;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!endMatch){\r\n\t\t \terrorHandler.fatalError(\"end tag name: \"+tagName+' is not match the current start tagName:'+config.tagName );\r\n\t\t\t\t\t}\r\n\t\t }else{\r\n\t\t \tparseStack.push(config)\r\n\t\t }\r\n\t\t\t\t\r\n\t\t\t\tend++;\r\n\t\t\t\tbreak;\r\n\t\t\t\t// end elment\r\n\t\t\tcase '?':// <?...?>\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\r\n\t\t\t\tbreak;\r\n\t\t\tcase '!':// <!doctype,<![CDATA,<!--\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tend = parseDCC(source,tagStart,domBuilder,errorHandler);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tlocator&&position(tagStart);\r\n\t\t\t\tvar el = new ElementAttributes();\r\n\t\t\t\tvar currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\t\t\t\t//elStartEnd\r\n\t\t\t\tvar end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);\r\n\t\t\t\tvar len = el.length;\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tif(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tif(!entityMap.nbsp){\r\n\t\t\t\t\t\terrorHandler.warning('unclosed xml attribute');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(locator && len){\r\n\t\t\t\t\tvar locator2 = copyLocator(locator,{});\r\n\t\t\t\t\t//try{//attribute position fixed\r\n\t\t\t\t\tfor(var i = 0;i<len;i++){\r\n\t\t\t\t\t\tvar a = el[i];\r\n\t\t\t\t\t\tposition(a.offset);\r\n\t\t\t\t\t\ta.locator = copyLocator(locator,{});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//}catch(e){console.error('@@@@@'+e)}\r\n\t\t\t\t\tdomBuilder.locator = locator2\r\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\r\n\t\t\t\t\t\tparseStack.push(el)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdomBuilder.locator = locator;\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\r\n\t\t\t\t\t\tparseStack.push(el)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tif(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){\r\n\t\t\t\t\tend = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tend++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}catch(e){\r\n\t\t\terrorHandler.error('element parse error: '+e)\r\n\t\t\t//errorHandler.error('element parse error: '+e);\r\n\t\t\tend = -1;\r\n\t\t\t//throw e;\r\n\t\t}\r\n\t\tif(end>start){\r\n\t\t\tstart = end;\r\n\t\t}else{\r\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\r\n\t\t\tappendText(Math.max(tagStart,start)+1);\r\n\t\t}\r\n\t}\r\n}\r\nfunction copyLocator(f,t){\r\n\tt.lineNumber = f.lineNumber;\r\n\tt.columnNumber = f.columnNumber;\r\n\treturn t;\r\n}\r\n\r\n/**\r\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\r\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\r\n */\r\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\r\n\tvar attrName;\r\n\tvar value;\r\n\tvar p = ++start;\r\n\tvar s = S_TAG;//status\r\n\twhile(true){\r\n\t\tvar c = source.charAt(p);\r\n\t\tswitch(c){\r\n\t\tcase '=':\r\n\t\t\tif(s === S_ATTR){//attrName\r\n\t\t\t\tattrName = source.slice(start,p);\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else if(s === S_ATTR_SPACE){\r\n\t\t\t\ts = S_EQ;\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\r\n\t\t\t\tthrow new Error('attribute equal must after attrName');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '\\'':\r\n\t\tcase '\"':\r\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\r\n\t\t\t\t){//equal\r\n\t\t\t\tif(s === S_ATTR){\r\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t}\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\tp = source.indexOf(c,start)\r\n\t\t\t\tif(p>0){\r\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\tel.add(attrName,value,start-1);\r\n\t\t\t\t\ts = S_ATTR_END;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//fatalError: no end quot match\r\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\r\n\t\t\t\t}\r\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t//console.log(attrName,value,start,p)\r\n\t\t\t\tel.add(attrName,value,start);\r\n\t\t\t\t//console.dir(el)\r\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\r\n\t\t\t\tstart = p+1;\r\n\t\t\t\ts = S_ATTR_END\r\n\t\t\t}else{\r\n\t\t\t\t//fatalError: no equal before\r\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase '/':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\ts =S_TAG_CLOSE;\r\n\t\t\t\tel.closed = true;\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\tcase S_ATTR:\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tbreak;\r\n\t\t\t//case S_EQ:\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ''://end document\r\n\t\t\t//throw new Error('unexpected end of input')\r\n\t\t\terrorHandler.error('unexpected end of input');\r\n\t\t\tif(s == S_TAG){\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\t}\r\n\t\t\treturn p;\r\n\t\tcase '>':\r\n\t\t\tswitch(s){\r\n\t\t\tcase S_TAG:\r\n\t\t\t\tel.setTagName(source.slice(start,p));\r\n\t\t\tcase S_ATTR_END:\r\n\t\t\tcase S_TAG_SPACE:\r\n\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\tbreak;//normal\r\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\r\n\t\t\tcase S_ATTR:\r\n\t\t\t\tvalue = source.slice(start,p);\r\n\t\t\t\tif(value.slice(-1) === '/'){\r\n\t\t\t\t\tel.closed = true;\r\n\t\t\t\t\tvalue = value.slice(0,-1)\r\n\t\t\t\t}\r\n\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\tif(s === S_ATTR_SPACE){\r\n\t\t\t\t\tvalue = attrName;\r\n\t\t\t\t}\r\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(value,value,start)\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase S_EQ:\r\n\t\t\t\tthrow new Error('attribute value missed!!');\r\n\t\t\t}\r\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\r\n\t\t\treturn p;\r\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\r\n\t\tcase '\\u0080':\r\n\t\t\tc = ' ';\r\n\t\tdefault:\r\n\t\t\tif(c<= ' '){//space\r\n\t\t\t\tswitch(s){\r\n\t\t\t\tcase S_TAG:\r\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR:\r\n\t\t\t\t\tattrName = source.slice(start,p)\r\n\t\t\t\t\ts = S_ATTR_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\r\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\r\n\t\t\t\t\tel.add(attrName,value,start)\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\ts = S_TAG_SPACE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t//case S_TAG_SPACE:\r\n\t\t\t\t//case S_EQ:\r\n\t\t\t\t//case S_ATTR_SPACE:\r\n\t\t\t\t//\tvoid();break;\r\n\t\t\t\t//case S_TAG_CLOSE:\r\n\t\t\t\t\t//ignore warning\r\n\t\t\t\t}\r\n\t\t\t}else{//not space\r\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\r\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\r\n\t\t\t\tswitch(s){\r\n\t\t\t\t//case S_TAG:void();break;\r\n\t\t\t\t//case S_ATTR:void();break;\r\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\r\n\t\t\t\tcase S_ATTR_SPACE:\r\n\t\t\t\t\tvar tagName = el.tagName;\r\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\r\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.add(attrName,attrName,start);\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_ATTR_END:\r\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\r\n\t\t\t\tcase S_TAG_SPACE:\r\n\t\t\t\t\ts = S_ATTR;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_EQ:\r\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\r\n\t\t\t\t\tstart = p;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase S_TAG_CLOSE:\r\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}//end outer switch\r\n\t\t//console.log('p++',p)\r\n\t\tp++;\r\n\t}\r\n}\r\n/**\r\n * @return true if has new namespace define\r\n */\r\nfunction appendElement(el,domBuilder,currentNSMap){\r\n\tvar tagName = el.tagName;\r\n\tvar localNSMap = null;\r\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\tvar a = el[i];\r\n\t\tvar qName = a.qName;\r\n\t\tvar value = a.value;\r\n\t\tvar nsp = qName.indexOf(':');\r\n\t\tif(nsp>0){\r\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\r\n\t\t\tvar localName = qName.slice(nsp+1);\r\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\r\n\t\t}else{\r\n\t\t\tlocalName = qName;\r\n\t\t\tprefix = null\r\n\t\t\tnsPrefix = qName === 'xmlns' && ''\r\n\t\t}\r\n\t\t//can not set prefix,because prefix !== ''\r\n\t\ta.localName = localName ;\r\n\t\t//prefix == null for no ns prefix attribute \r\n\t\tif(nsPrefix !== false){//hack!!\r\n\t\t\tif(localNSMap == null){\r\n\t\t\t\tlocalNSMap = {}\r\n\t\t\t\t//console.log(currentNSMap,0)\r\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\r\n\t\t\t\t//console.log(currentNSMap,1)\r\n\t\t\t}\r\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\r\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\r\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \r\n\t\t}\r\n\t}\r\n\tvar i = el.length;\r\n\twhile(i--){\r\n\t\ta = el[i];\r\n\t\tvar prefix = a.prefix;\r\n\t\tif(prefix){//no prefix attribute has no namespace\r\n\t\t\tif(prefix === 'xml'){\r\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\r\n\t\t\t}if(prefix !== 'xmlns'){\r\n\t\t\t\ta.uri = currentNSMap[prefix || '']\r\n\t\t\t\t\r\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tvar nsp = tagName.indexOf(':');\r\n\tif(nsp>0){\r\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\r\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\r\n\t}else{\r\n\t\tprefix = null;//important!!\r\n\t\tlocalName = el.localName = tagName;\r\n\t}\r\n\t//no prefix element has default namespace\r\n\tvar ns = el.uri = currentNSMap[prefix || ''];\r\n\tdomBuilder.startElement(ns,localName,tagName,el);\r\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\r\n\t//localNSMap = null\r\n\tif(el.closed){\r\n\t\tdomBuilder.endElement(ns,localName,tagName);\r\n\t\tif(localNSMap){\r\n\t\t\tfor(prefix in localNSMap){\r\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \r\n\t\t\t}\r\n\t\t}\r\n\t}else{\r\n\t\tel.currentNSMap = currentNSMap;\r\n\t\tel.localNSMap = localNSMap;\r\n\t\t//parseStack.push(el);\r\n\t\treturn true;\r\n\t}\r\n}\r\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\r\n\tif(/^(?:script|textarea)$/i.test(tagName)){\r\n\t\tvar elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);\r\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\r\n\t\tif(/[&<]/.test(text)){\r\n\t\t\tif(/^script$/i.test(tagName)){\r\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\r\n\t\t\t\t\t//lexHandler.startCDATA();\r\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\t\t//lexHandler.endCDATA();\r\n\t\t\t\t\treturn elEndStart;\r\n\t\t\t\t//}\r\n\t\t\t}//}else{//text area\r\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\r\n\t\t\t\tdomBuilder.characters(text,0,text.length);\r\n\t\t\t\treturn elEndStart;\r\n\t\t\t//}\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n\treturn elStartEnd+1;\r\n}\r\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\r\n\t//if(tagName in closeMap){\r\n\tvar pos = closeMap[tagName];\r\n\tif(pos == null){\r\n\t\t//console.log(tagName)\r\n\t\tpos = source.lastIndexOf('</'+tagName+'>')\r\n\t\tif(pos<elStartEnd){//忘记闭合\r\n\t\t\tpos = source.lastIndexOf('</'+tagName)\r\n\t\t}\r\n\t\tcloseMap[tagName] =pos\r\n\t}\r\n\treturn pos<elStartEnd;\r\n\t//} \r\n}\r\nfunction _copy(source,target){\r\n\tfor(var n in source){target[n] = source[n]}\r\n}\r\nfunction parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'\r\n\tvar next= source.charAt(start+2)\r\n\tswitch(next){\r\n\tcase '-':\r\n\t\tif(source.charAt(start + 3) === '-'){\r\n\t\t\tvar end = source.indexOf('-->',start+4);\r\n\t\t\t//append comment source.substring(4,end)//<!--\r\n\t\t\tif(end>start){\r\n\t\t\t\tdomBuilder.comment(source,start+4,end-start-4);\r\n\t\t\t\treturn end+3;\r\n\t\t\t}else{\r\n\t\t\t\terrorHandler.error(\"Unclosed comment\");\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\t//error\r\n\t\t\treturn -1;\r\n\t\t}\r\n\tdefault:\r\n\t\tif(source.substr(start+3,6) == 'CDATA['){\r\n\t\t\tvar end = source.indexOf(']]>',start+9);\r\n\t\t\tdomBuilder.startCDATA();\r\n\t\t\tdomBuilder.characters(source,start+9,end-start-9);\r\n\t\t\tdomBuilder.endCDATA() \r\n\t\t\treturn end+3;\r\n\t\t}\r\n\t\t//<!DOCTYPE\r\n\t\t//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) \r\n\t\tvar matchs = split(source,start);\r\n\t\tvar len = matchs.length;\r\n\t\tif(len>1 && /!doctype/i.test(matchs[0][0])){\r\n\t\t\tvar name = matchs[1][0];\r\n\t\t\tvar pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]\r\n\t\t\tvar sysid = len>4 && matchs[4][0];\r\n\t\t\tvar lastMatch = matchs[len-1]\r\n\t\t\tdomBuilder.startDTD(name,pubid && pubid.replace(/^(['\"])(.*?)\\1$/,'$2'),\r\n\t\t\t\t\tsysid && sysid.replace(/^(['\"])(.*?)\\1$/,'$2'));\r\n\t\t\tdomBuilder.endDTD();\r\n\t\t\t\r\n\t\t\treturn lastMatch.index+lastMatch[0].length\r\n\t\t}\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\n\r\n\r\nfunction parseInstruction(source,start,domBuilder){\r\n\tvar end = source.indexOf('?>',start);\r\n\tif(end){\r\n\t\tvar match = source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);\r\n\t\tif(match){\r\n\t\t\tvar len = match[0].length;\r\n\t\t\tdomBuilder.processingInstruction(match[1], match[2]) ;\r\n\t\t\treturn end+2;\r\n\t\t}else{//error\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\n/**\r\n * @param source\r\n */\r\nfunction ElementAttributes(source){\r\n\t\r\n}\r\nElementAttributes.prototype = {\r\n\tsetTagName:function(tagName){\r\n\t\tif(!tagNamePattern.test(tagName)){\r\n\t\t\tthrow new Error('invalid tagName:'+tagName)\r\n\t\t}\r\n\t\tthis.tagName = tagName\r\n\t},\r\n\tadd:function(qName,value,offset){\r\n\t\tif(!tagNamePattern.test(qName)){\r\n\t\t\tthrow new Error('invalid attribute:'+qName)\r\n\t\t}\r\n\t\tthis[this.length++] = {qName:qName,value:value,offset:offset}\r\n\t},\r\n\tlength:0,\r\n\tgetLocalName:function(i){return this[i].localName},\r\n\tgetLocator:function(i){return this[i].locator},\r\n\tgetQName:function(i){return this[i].qName},\r\n\tgetURI:function(i){return this[i].uri},\r\n\tgetValue:function(i){return this[i].value}\r\n//\t,getIndex:function(uri, localName)){\r\n//\t\tif(localName){\r\n//\t\t\t\r\n//\t\t}else{\r\n//\t\t\tvar qName = uri\r\n//\t\t}\r\n//\t},\r\n//\tgetValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},\r\n//\tgetType:function(uri,localName){}\r\n//\tgetType:function(i){},\r\n}\r\n\r\n\r\n\r\n\r\nfunction _set_proto_(thiz,parent){\r\n\tthiz.__proto__ = parent;\r\n\treturn thiz;\r\n}\r\nif(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){\r\n\t_set_proto_ = function(thiz,parent){\r\n\t\tfunction p(){};\r\n\t\tp.prototype = parent;\r\n\t\tp = new p();\r\n\t\tfor(parent in thiz){\r\n\t\t\tp[parent] = thiz[parent];\r\n\t\t}\r\n\t\treturn p;\r\n\t}\r\n}\r\n\r\nfunction split(source,start){\r\n\tvar match;\r\n\tvar buf = [];\r\n\tvar reg = /'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;\r\n\treg.lastIndex = start;\r\n\treg.exec(source);//skip <\r\n\twhile(match = reg.exec(source)){\r\n\t\tbuf.push(match);\r\n\t\tif(match[1])return buf;\r\n\t}\r\n}\r\n\r\nexports.XMLReader = XMLReader;\r\n\r\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/xmldom/sax",
"module-type": "library"
},
"$:/plugins/tiddlywiki/xmldom/license": {
"text": "You can choose any one of those:\n\nThe MIT License (MIT):\n\nlink:http://opensource.org/licenses/MIT\n\nLGPL:\nhttp://www.gnu.org/licenses/lgpl.html\n",
"type": "text/plain",
"title": "$:/plugins/tiddlywiki/xmldom/license"
},
"$:/plugins/tiddlywiki/xmldom/readme": {
"title": "$:/plugins/tiddlywiki/xmldom/readme",
"text": "This plugin packages [[xmldom|https://github.com/jindw/xmldom]] for use by other plugins. It does not provide any end-user visible features.\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tongerner/ro/publish": {
"text": "<<tabs \"$:/plugins/tongerner/ro/help $:/plugins/tongerner/ro/hide-toolbar-buttons $:/plugins/tongerner/ro/hide-sidebar-tabs $:/plugins/tongerner/ro/hide-sidebar-buttons $:/plugins/tongerner/ro/change-settings $:/plugins/tongerner/ro/save\" \"Help\">>\n\n\n\n\n\n",
"title": "$:/plugins/tongerner/ro/publish",
"tags": "$:/tags/ControlPanel/Appearance",
"modifier": "TonGerner",
"modified": "20161108104831551",
"creator": "TonGerner",
"created": "20140715185723459",
"caption": "Publish"
},
"$:/plugins/tongerner/ro/image-save-button": {
"created": "20140715185836189",
"text": "<svg class=\"tgc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>",
"creator": "TonGerner",
"modified": "20160407160605840",
"modifier": "TonGerner",
"title": "$:/plugins/tongerner/ro/image-save-button"
},
"$:/plugins/tongerner/ro/readme": {
"created": "20140821172500339",
"text": "A plugin to make ~TiddlyWiki read-only.\n\nYou can hide:\n\n* ''All'' toolbar buttons\n* 'Sidebar' button (to switch Sidebar) and 'Advanced search' button (next to Search)\n* ''All'' Sidebar tabs, even user added tabs.\n\nClick the Publish button {{$:/plugins/tongerner/ro/images/publish}} next to the sidebar button {{$:/core/images/chevron-left}}/{{$:/core/images/chevron-right}} to start making your TW 'publish-ready'. A new window with four tabs opens. Follow the 5 steps.\n\n<<<\n''Note:''\n\n* [[$:/plugins/tongerner/ro/publish]] is also available as a tab in $:/ControlPanel (''$:/ControlPanel > Appearance > Publish'')\n* @@.RED Although you can hide the 'Sidebar' and 'Advanced Search' button, they remain 'active'!@@\n* @@.RED When in readonly mode@@, search in ''~AdvancedSearch'', tab ''Shadows'' for ''~ControlPanel'' to have access to:\n** ''$:/ControlPanel > Appearance > Publish'' to recover tabs, unhide buttons, ...\n<<<\n\n ",
"creator": "TonGerner",
"modified": "20170507114216540",
"modifier": "TonGerner",
"title": "$:/plugins/tongerner/ro/readme"
},
"$:/plugins/tongerner/ro/icon": {
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\">\n <metadata id=\"metadata7\">image/svg+xml</metadata>\n <g>\n <title>Layer 1</title>\n <g stroke=\"null\" id=\"layer1\">\n <path stroke=\"#a0a0ff\" d=\"m62.98237,124.8691l-52.98313,-30.489l0,-60.97796l52.98313,-30.48897l52.98313,30.48897l0,60.97796l-52.98313,30.489z\" id=\"path4142\" stroke-miterlimit=\"4\" stroke-width=\"1.2218\" fill=\"#a0a0ff\"/>\n <g stroke=\"null\" transform=\"matrix(3.659923335400057,0,0,3.647856469142962,20.327076261330674,1218.0946222935067) \" id=\"g4657\">\n <path stroke=\"null\" d=\"m3.22135,-313.27808l4.72483,4.70973l10.79962,-10.7651l-4.72483,-4.70973l-10.79962,10.7651zm13.51982,-13.47661l-1.99364,1.98727l4.72409,4.70899l1.99364,-1.98727c0.6766,-0.67444 -0.00001,-1.34889 -0.00001,-1.34889l-3.37088,-3.3601c0,0 -0.6766,-0.67444 -1.3532,0zm-14.18411,14.11637l-0.99229,5.72125l5.7273,-1.00138l-4.735,-4.71987l-0.00001,0z\" id=\"editor_pencil_pen_edit_write_glyph\" fill=\"#000000\"/>\n <rect stroke=\"null\" stroke-width=\"null\" stroke-linejoin=\"null\" stroke-linecap=\"null\" x=\"-236.34445\" y=\"-219.86093\" width=\"26.11743\" height=\"2.10315\" id=\"svg_1\" transform=\"matrix(0.69825835,0.71584585,-0.71584585,0.69825835,11.119094,-4.6050809) \"/>\n </g>\n </g>\n </g>\n</svg>",
"type": "image/svg+xml",
"title": "$:/plugins/tongerner/ro/icon",
"tags": "",
"modified": "20170725161725827",
"created": "20170322100000766"
},
"$:/plugins/tongerner/ro/help": {
"text": "!! Help\n\nBefore you 'publish' your ~TiddlyWiki:\n\n# Make a backup of your wiki\n# Get a defined start-up situation for your TW:\n#* Define your starting tiddler(s) in [[$:/DefaultTiddlers]]\n#* If required, define the state of the sidebar tabs\n# Follow the procedure given in the following tabs (1 - 5).\n\n<<<\n''Note:''\n\n* @@.RED When in readonly mode@@, search in ''~AdvancedSearch'', tab ''Shadows'' for ''~ControlPanel'' to have access to:\n** ''$:/ControlPanel > Appearance > Publish'' to recover tabs, unhide buttons, ...\n<<<",
"title": "$:/plugins/tongerner/ro/help",
"modifier": "TonGerner",
"modified": "20161108104959079",
"creator": "TonGerner",
"created": "20140716184603499",
"caption": "Help"
},
"$:/plugins/tongerner/ro/save-button": {
"text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}}>\n<span class=\"tc-dirty-indicator\">\n{{$:/plugins/tongerner/ro/image-save-button}}\n</span>\n</$button>",
"title": "$:/plugins/tongerner/ro/save-button",
"tags": "",
"modifier": "TonGerner",
"modified": "20170506164338685",
"creator": "TonGerner",
"created": "20170405200808621"
},
"$:/plugins/tongerner/ro/styles": {
"created": "20161104132710834",
"text": "/* Slider style */\n\nhtml .tgc-slider {\n color: #5778D8;\n font-weight: bold;\n}\n\n.tgc-slider:hover {\n color: #5778D8;\n text-decoration: underline;\n}\n\n.RED {\n color: red;\n font-weight: bold;\n}",
"title": "$:/plugins/tongerner/ro/styles",
"tags": "$:/tags/Stylesheet",
"modified": "20161104133819357",
"type": "text/css"
},
"$:/plugins/tongerner/ro/change-settings": {
"created": "20161108100322449",
"text": "!!4) Settings\nTo customise the behaviour of TiddlyWiki\n\n{{$:/snippets/viewswitcher}}\n{{$:/plugins/tongerner/ro/sidebar-layout}}\n{{$:/core/ui/ControlPanel/Settings}}\n",
"title": "$:/plugins/tongerner/ro/change-settings",
"tags": "",
"modified": "20170307110923964",
"caption": "4. Settings"
},
"$:/plugins/tongerner/ro/hide-sidebar-buttons": {
"created": "20161108100124814",
"text": "!! Hide Sidebar, Advanced search and Publish buttons\n\n!!!3a Sidebar button ({{$:/core/images/chevron-left}}/{{$:/core/images/chevron-right}})\n \n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/sidebar-button]!tag[$:/tags/Stylesheet]]\">\n<$checkbox tag=\"$:/tags/Stylesheet\"> Check for 'invisible' buttons</$checkbox></$list>\n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/sidebar-button]tag[$:/tags/Stylesheet]]\">\n<$checkbox tag=\"$:/tags/Stylesheet\"> Uncheck for visible buttons</$checkbox></$list>\n\n!!!3b Advanced search button ({{$:/core/images/advanced-search-button}})\n\n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/advanced-search-button]!tag[$:/tags/Stylesheet]]\">\n<$checkbox tag=\"$:/tags/Stylesheet\"> Check for 'invisible' buttons</$checkbox></$list>\n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/advanced-search-button]tag[$:/tags/Stylesheet]]\">\n<$checkbox tag=\"$:/tags/Stylesheet\"> Check for invisible buttons</$checkbox></$list>\n\n<<<\n''Note:''<br>Although 'invisible' (`display:none;`), Sidebar and Advanced search buttons stay active!\n<<<\n\n!!!3c Publish button ({{$:/plugins/tongerner/ro/images/publish}})\n\n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/publish-button]!tag[$:/tags/TopRightBar]]\">\n<$checkbox invertTag=yes tag=\"$:/tags/TopRightBar\"> Uncheck for visible button</$checkbox></$list>\n\n<$list filter=\"[all[shadows]!has[draft.of]tag[$:/tags/publish-button]tag[$:/tags/TopRightBar]]\">\n<$checkbox invertTag=yes tag=\"$:/tags/TopRightBar\"> Check for unvisible button</$checkbox></$list>\n\n<<<\n''Note:''<br>Publish button invisible and inactive (`$:/tags/TopRightBar` removed)\n<<<",
"title": "$:/plugins/tongerner/ro/hide-sidebar-buttons",
"tags": "",
"modified": "20170507113724230",
"caption": "3. Sidebar buttons"
},
"$:/plugins/tongerner/ro/hide-sidebar-tabs": {
"text": "!! Hide sidebar tabs\n\nHiding tabs in the Sidebar is a 2-step procedure:<br>\n 2a) Add the tag `$:/tags/hide` to tabs you want to manipulate.<br>\n 2b) Remove the tag `$:/tags/SideBar` from the tab you want to hide.\n\n!!!2a) Add tag `$:/tags/hide`\nCheck the following for adding `$:/tags/hide`\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]tag[$:/tags/SideBar]!tag[$:/tags/hide]sort[title]]\"><br>\n<$checkbox tag=\"$:/tags/hide\"> <$link to={{!!title}}><$view field=\"title\"/>\n</$link>\n</$checkbox>\n</$list>\n\nUncheck the following for removing `$:/tags/hide`\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]tag[$:/tags/SideBar]tag[$:/tags/hide]sort[title]]\"><br>\n<$checkbox tag=\"$:/tags/hide\"> <$link to={{!!title}}><$view field=\"title\"/>\n</$link>\n</$checkbox>\n</$list>\n\n!!!2b) Hide 'tabs in Sidebar'\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]tag[$:/tags/hide]!tag[$:/tags/SideBar]sort[title]]\"><br>\n<$checkbox tag=\"$:/tags/SideBar\"> Check to show <$link to={{!!title}}><$view field=\"title\"/>\n</$link>\n</$checkbox>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]tag[$:/tags/hide]tag[$:/tags/SideBar]sort[title]]\"><br>\n<$checkbox tag=\"$:/tags/SideBar\"> Uncheck to hide <$link to={{!!title}}><$view field=\"title\"/>\n</$link>\n</$checkbox>\n</$list>",
"title": "$:/plugins/tongerner/ro/hide-sidebar-tabs",
"tags": "",
"modified": "20161108104312650",
"created": "20161108100017749",
"caption": "2. Tabs"
},
"$:/plugins/tongerner/ro/hide-toolbar-buttons": {
"text": "!! Hide toolbar buttons\n\nDisable in Control panel (Appearance > Toolbars) the buttons you do not need in read-only mode.\n\n''//Disable at least the following buttons://''\n\n* ~ViewToolbar\n** Edit button {{$:/core/images/edit-button}}\n** More button {{$:/core/images/down-arrow}}\n** Info button {{$:/core/images/info-button}} (Tools tab contains button configuration!)\n* Page control buttons\n** New tiddler button {{$:/core/images/new-button}}\n** Control panel button {{$:/core/images/options-button}}\n** Save button {{$:/core/images/save-button}}\n** More button {{$:/core/images/down-arrow}}\n\n{{$:/core/ui/ControlPanel/Toolbars}}",
"title": "$:/plugins/tongerner/ro/hide-toolbar-buttons",
"tags": "",
"modified": "20161108104232014",
"created": "20161108095713019",
"caption": "1. Buttons"
},
"$:/plugins/tongerner/ro/save": {
"created": "20161108100434387",
"text": "! Save\n\n{{$:/core/ui/ControlPanel/Saving}}\n\n@@.BLUE ''Save''@@ {{$:/plugins/tongerner/ro/save-button}}\n",
"title": "$:/plugins/tongerner/ro/save",
"tags": "",
"modified": "20170507114800514",
"caption": "5. Save"
},
"$:/plugins/tongerner/ro/sidebar-layout": {
"created": "20170307110734575",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\nSidebar layout: <$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select>\n",
"title": "$:/plugins/tongerner/ro/sidebar-layout",
"tags": "",
"modified": "20170307110812299"
},
"$:/plugins/tongerner/ro/images/publish": {
"created": "20170322105731731",
"text": "<svg class=\"tgc-publish-ro tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 486 438\">\n<style>\n .ro{\n fill:none;\n stroke-width:40;\n stroke:#FF00FF;\n }\n</style>\n <path class=\"ro\" d=\"m203.2 81.6l-141.6 0 0 311.7 313.3 0 0-139.5\"/>\n <path class=\"ro\" d=\"m176.4 279.6l0-60 188-188 60.5 60.5 -189.5 189.5 -59 0\"/>\n <path class=\"ro\" d=\"m326.9 69l61.1 61.1\"/>\n</svg>",
"title": "$:/plugins/tongerner/ro/images/publish",
"tags": "",
"modified": "20170726082755369"
},
"$:/plugins/tongerner/ro/publish-button": {
"created": "20170506162930803",
"text": "<$button class=\"tc-btn-invisible\" tooltip=\"Publish\">\n<$action-sendmessage $message=\"tm-open-window\" $param=\"$:/plugins/tongerner/ro/publish\" height=\"700px\" width=\"500px\"/>\n{{$:/plugins/tongerner/ro/images/publish}}\n</$button>",
"title": "$:/plugins/tongerner/ro/publish-button",
"tags": "$:/tags/publish-button $:/tags/TopRightBar",
"modifier": "TonGerner",
"modified": "20170507113741124",
"list-before": "$:/core/ui/TopBar/menu",
"creator": "TonGerner"
},
"$:/plugins/tongerner/ro/sidebar-button-style": {
"created": "20140715185800387",
"text": "/* Hide sidebar button */\nsvg.tc-image-chevron-left {\n display: none;\n}\n\nsvg.tc-image-chevron-right {\n display: none;\n}\n",
"type": "text/css",
"title": "$:/plugins/tongerner/ro/sidebar-button-style",
"tags": "$:/tags/sidebar-button",
"modifier": "TonGerner",
"modified": "20170507113749411",
"creator": "TonGerner"
},
"$:/plugins/tongerner/ro/advanced-search-button-style": {
"created": "20150519114003182",
"text": "/* Hide advanced search button */\n.tc-image-advanced-search-button.tc-image-button {\n padding-left: 15px;\n}",
"type": "text/css",
"title": "$:/plugins/tongerner/ro/advanced-search-button-style",
"tags": "$:/tags/advanced-search-button",
"modifier": "TonGerner",
"modified": "20170507130432946",
"creator": "TonGerner"
}
}
}
/* Hide advanced search button */
.tc-image-advanced-search-button.tc-image-button {
padding-left: 15px;
}
<$button class="tc-btn-invisible" tooltip="Publish">
<$action-sendmessage $message="tm-open-window" $param="$:/plugins/tongerner/ro/publish" height="700px" width="500px"/>
{{$:/plugins/tongerner/ro/images/publish}}
</$button>
/* Hide sidebar button */
svg.tc-image-chevron-left {
display: none;
}
svg.tc-image-chevron-right {
display: none;
}
<ul class="">
<$list filter="[tag[$:/Ranger 1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Ranger 2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Ranger 3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Ranger 4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Ranger 5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<$select tiddler="$:/RenamerData" index="tag">
<$list filter="[tag[PHB]]">
<option><$view field="title"/></option>
</$list>F
</$select>
<$select tiddler='$:/RenamerData' index="tag2">
<$list filter="[tag{$:/RenamerData##tag}]">
<option><$view field="title"/></option>
</$list>
</$select>
<$select tiddler='$:/RenamerData' index="name">
<$list filter="[tag{$:/RenamerData##tag2}]">
<option><$view field='title'/></option>
</$list>
</$select>
<$edit-text tiddler="$:/RenamerData" index="name" type=/>
<$edit-text tiddler="$:/RenamerData" index="newname"/>
<$button>
<$action-setfield $tiddler={{$:/RenamerData##name}} $field="title" $value={{$:/RenamerData##newname}}/>
<$action-deletetiddler $tiddler={{$:/RenamerData##name}}/>
Renamer
</$button>
{{$:/RenamerData##tag}}
name: Вдохновения
newname: Шарлатан
tag: Часть 1
tag2: Глава 04: Личность и предыстория
Компендиум правил DnD 5e, русская версия
\define SizeButton(1:"1" 2:"2")
<$reveal type="nomatch" state="$:/state/$1$" text="show">
<$button set="$:/state/$1$" setTo="show">''Развернуть изображение''</$button>
{{$2$}}
</$reveal>
<$reveal type="match" state="$:/state/$1$" text="show">
<$button set="$:/state/$1$" setTo="hide">Свернуть изображение</$button>
{{$1$}}
</$reveal>
\end
<<SizeButton "Big""Small">>
<<AlignRight "Text Here">>
<ul class="">
<$list filter="[tag[$:/Sorcerer 1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 6lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 7lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 8lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Sorcerer 9lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<$button>
<$action-createtiddler $basetitle="Заклинания Следопыта (Beta)" text="""<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "rgrlist">></div>""" />
<$action-navigate $to="Заклинания Следопыта (Beta)"/>
Main Tiddler Creator
</$button>
<$button>
<$action-createtiddler $basetitle="$:/Ranger 1lvl" tags="rgrlist" text= <<list-links filter:"[tag[$:/Ranger 1lvl]]">> />
<$action-createtiddler $basetitle="$:/Ranger 2lvl" tags="rgrlist" text= <<list-links filter:"[tag[$:/Ranger 2lvl]]">> />
<$action-createtiddler $basetitle="$:/Ranger 3lvl" tags="rgrlist" text= <<list-links filter:"[tag[$:/Ranger 3lvl]]">> />
<$action-createtiddler $basetitle="$:/Ranger 4lvl" tags="rgrlist" text= <<list-links filter:"[tag[$:/Ranger 4lvl]]">> />
<$action-createtiddler $basetitle="$:/Ranger 5lvl" tags="rgrlist" text= <<list-links filter:"[tag[$:/Ranger 5lvl]]">> />
Tiddler Creator
</$button>
<$button>
<$action-setfield $tiddler={{{ [tag[rgrlist]!field:toc-link[no]] }}} toc-link="no"/>
toc-link disabler
</$button>
<$button>
<$action-setfield $tiddler="$:/Ranger 1lvl" caption="Заклинания первого уровня"/>
<$action-setfield $tiddler="$:/Ranger 2lvl" caption="Заклинания второго уровня"/>
<$action-setfield $tiddler="$:/Ranger 3lvl" caption="Заклинания третьего уровня"/>
<$action-setfield $tiddler="$:/Ranger 4lvl" caption="Заклинания четвертого уровня"/>
<$action-setfield $tiddler="$:/Ranger 5lvl" caption="Заклинания пятого уровня"/>
Caption insert
</$button>
<$button>
<$action-deletetiddler $filter="[tag[rgrlist]]"/>
<$action-deletetiddler $tiddler="Заклинания Паладина (Beta)"/>
Delete
</$button>
.SpecTable {width: 90%;}
.SpecHead {width: 5%;}
.SpecHead1 {width: 40%;}
.SpecHead2 {width: 70px;}
<<list-links filter:"[tag[class]]">>
$:/core/ui/AdvancedSearch/System
$:/plugins/tongerner/ro/publish
$:/plugins/tongerner/ro/save
$:/core/ui/ControlPanel/Appearance
$:/core/ui/ControlPanel/Saving/General
$:/plugins/tongerner/ro/save
$:/core/ui/ControlPanel/Toolbars/ViewToolbar
$:/core/ui/ControlPanel/Toolbars/EditorToolbar
<$fieldmangler tiddler={{{ [suffix[Магические предметы]prefix[$:/]!prefix[$:/state/]!tag[11. Случайная выборка магических предметов]] }}}>
<$button>
Tagger <$action-sendmessage $message="tm-add-tag" $param="11. Случайная выборка магических предметов"/>
</$button>
</$fieldmangler>
<$fieldmangler tiddler={{{ [tag[$:/Spells by class]] }}}>
<$button>
Remove tag <$action-sendmessage $message="tm-remove-tag" $param="$:/1lvl divination"/>
</$button>
</$fieldmangler>
$:/tags/RawMarkupWikified/TopBody
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
},
"$:/info/url/full": {
"title": "$:/info/url/full",
"text": "http://orc-news.ru/dnd5/"
},
"$:/info/url/host": {
"title": "$:/info/url/host",
"text": "orc-news.ru"
},
"$:/info/url/hostname": {
"title": "$:/info/url/hostname",
"text": "orc-news.ru"
},
"$:/info/url/protocol": {
"title": "$:/info/url/protocol",
"text": "http:"
},
"$:/info/url/port": {
"title": "$:/info/url/port",
"text": ""
},
"$:/info/url/pathname": {
"title": "$:/info/url/pathname",
"text": "/dnd5/"
},
"$:/info/url/search": {
"title": "$:/info/url/search",
"text": ""
},
"$:/info/url/origin": {
"title": "$:/info/url/origin",
"text": "http://orc-news.ru"
},
"$:/info/browser/screen/width": {
"title": "$:/info/browser/screen/width",
"text": "1536"
},
"$:/info/browser/screen/height": {
"title": "$:/info/browser/screen/height",
"text": "864"
},
"$:/info/browser/language": {
"title": "$:/info/browser/language",
"text": "ru-RU"
}
}
}
$:/themes/tiddlywiki/snowwhite
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n \tcursor: pointer;\n\tcolor: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: text-bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tbackground-color: <<colour tiddler-editor-background>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: 20%;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n font-size: 0.8em;\n margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n padding: 2px 7px;\n font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
"text": "350px"
},
"$:/themes/tiddlywiki/vanilla/options/stickytitles": {
"title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
"text": "no"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"text": "fixed-fluid"
},
"$:/themes/tiddlywiki/vanilla/options/codewrapping": {
"title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
"text": "pre-wrap"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\""
},
"$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
"text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
"text": "fixed"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
"text": "auto"
},
"$:/themes/tiddlywiki/vanilla/sticky": {
"title": "$:/themes/tiddlywiki/vanilla/sticky",
"text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
}
}
}
<$button>
<$action-createtiddler $basetitle="$:/Cantrip transmutation" tags="listbyschool" text= <<list-links filter:"[tag[cantrip]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/1lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[1lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/2lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[2lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/3lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[3lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/4lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[4lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/5lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[5lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/6lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[6lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/7lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[7lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/8lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[8lvl]tag[trans]]">> />
<$action-createtiddler $basetitle="$:/9lvl transmutation" tags="listbyschool" text= <<list-links filter:"[tag[9lvl]tag[trans]]">> />
Tiddler Creator
</$button>
<$button>
<$action-setfield $tiddler={{{ [tag[listbyschool]!field:toc-link[no]] }}} toc-link="no"/>
toc-link disabler
</$button>
<ul class="">
<$list filter="[tag[$:/Warlock 1lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 2lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 3lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 4lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 5lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 6lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 7lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 8lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<ul class="">
<$list filter="[tag[$:/Warlock 9lvl]]">
<li>
<$link to={{!!title}}>
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$link>
</li>
</$list>
</ul>
<<list-links "[tag[$:/Wizard 1lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 2lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 3lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 4lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 5lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 6lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 7lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 8lvl]sort[title]]">>
<<list-links "[tag[$:/Wizard 9lvl]sort[title]]">>
!!''Мастер''
"""Мастер — творческая сила, стоящая за каждой игрой D&D. Мастер создаёт мир, который другие игроки могут исследовать, он также создаёт приключения, которые создают сюжет. Обычно приключения завязаны на успешном выполнении задания, и могут быть размером с одно игровое собрание. Более длинные приключения могут впутать игроков в великие конфликты, которые потребуют больше игрового времени для разрешения. Будучи объединёнными вместе, такие приключения образуют кампании. Кампании в D&D могут включать в себя десятки приключений и длиться месяцами или годами.
Мастер должен уметь многое. Как архитектор кампании, Мастер создаёт приключения, помещая в них чудовищ, ловушки и сокровища, которые должны найти персонажи других игроков (искатели приключений). Как рассказчик, Мастер помогает другим игрокам представить, что происходит вокруг них, и импровизирует, когда искатели приключений совершают что-то неожиданное. Как актёр, Мастер отыгрывает роли чудовищ и своих персонажей, вдыхает в них жизнь. Как судья, Мастер интерпретирует правила и решает, когда придерживаться их, а когда нарушить.
Придумывать, писать, рассказывать, импровизировать, играть, судить — каждый Мастер справляется с этими задачами по-разному, и вам, скорее всего, некоторые из этих задач понравятся больше, чем остальные. Важно помнить, что игра в Dungeons & Dragons это хобби, и быть Мастером должно быть весело. Сконцентрируйтесь на тех аспектах игры, что вам нравятся, минимизируя остальное. Например, если вам не нравится создавать собственное приключение, вы можете использовать уже опубликованные. Вы также можете попросить других игроков помочь вам с созданием мира и изучением правил.
Правила D&D помогают вам и другим игрокам хорошо провести время, но правила в игре не играют главенствующей роли. Вы — Мастер, и вы главный в игре. Но это говорит не о том, что вы должны устраивать резню над искателями приключений, а о том, что вы должны создать такой мир, который полностью раскроется вокруг их действий и решений, заставляя игроков приходить на игры за новой порцией впечатлений! Если вы всё сделаете правильно, то закончив кампанию, игроки ещё долго будут вспоминать, что с ними происходило по ходу игры."""
!!__''Редкость''__
У каждого магического предмета есть такой показатель как «редкость». Он может быть обычным, необычным, редким, очень редким, или легендарным. Обычные магические предметы, такие как зелья лечения, встречаются чаще всего. Некоторые легендарные предметы, такие как аппарат Ква-лиша являются уникальными. Игра предполагает, что секреты создания наиболее могущественных магических предметов возникли столетия назад, и постепенно были утеряны в результате войн, катаклизмов и прочих неприятностей. Даже необычные магические предметы не могут быть легко воссозданы. Таким образом, можно сказать, что многие магические предметы являются хорошо сохранившимися предметами старины.
Показатель редкости позволяет дать грубую оценку силы предмета относительно других магических предметов. Каждый уровень редкости соответствует определённому уровню персонажа, как показано в таблице «редкость магических предметов». Например, персонажу, как правило, не удастся найти редкую магическую вещь, прежде чем он достигнет 5 уровня. И всё-таки, редкость предметов не должна влиять на сюжет вашей кампании. Если вы хотите, чтобы кольцо невидимости попало в руки персонажа 1 уровня, то так тому и быть. Вне всякого сомнения, из этого получится великая история.
Если в вашей кампании позволяется торговать магическими предметами, то показатель редкости также поможет вам установить цены на эти предметы. Примерная стоимость таких предметов представлена в таблице «редкость магических предметов». Стоимость расходуемых предметов, таких как зелья или свитки, как правило, составляет половину стоимости постоянных предметов с тем же показателем редкости.
{{$:/Редкость магических предметов}}
Кампания в стиле эпизодического телешоу редко нуждается в связях между её приключениями. В каждом из них есть свои злодеи, и как только персонажи завершают его, больше нет никаких новых зацепок. Следующее приключение представляет собой новый вызов персонажам, никак не связанный с историей, предшествующей ему. Так как персонажи приобретают опыт, они становятся более мощными, равно как и препятствия, которые они должны преодолеть. Такой вид кампании лёгок для проведения, так как требует мало усилий для нахождения или создания приключений, соответствующих уровню отряда искателей приключений.
Кампания с повествованием позволяет игрокам почувствовать, что их действия имеют далеко идущие последствия. Они не интересуются одним лишь увеличением опыта. Несколько простых модификаций могут помочь вам создать кампанию, в которой каждое более раннее приключение помогает организовать последующее.
!!__''Использование глобального сюжета''__
В этом разделе представлено несколько примеров сюжетов, которые долгое время вдохновляли классические кампании D&D.
Цель искателей приключений в первом примере состоит в том, чтобы накопить силы и победить мощного врага, который угрожает миру. Их целью во втором примере является защита чего-то, что они оберегают, от разрушения, вне зависимости от того, что ему угрожает. В действительности эти два примера являются одной и той же историей (варианты сражения между добром и злом), рассказанной по-разному.
!!!''Пример 1 Поиски частей''
Вы можете соединить приключения между собой, создав цель, которая может быть достигнута только после серии связанных заданий. Например, вы можете создать злодея, которого нельзя победить, пока персонажи не исследуют девять подземелий, в которых обитают Девять Принцев Ужаса, в каждом из которых достаточно чудовищ и опасностей, чтобы поднять искателей приключений на два или три уровня. Искатели приключений используют все свои достижения, сражаясь с Девятью Принцами Ужаса, прежде чем перейдут к эпическому заданию по уничтожению прародителя чудовищных принцев. Чем необычнее и интереснее будет каждое подземелье, тем выше ваши игроки оценят напряжённый ход кампании.
В такого рода кампаниях искатели приключений будут собрать фрагменты артефакта, рассеянные по руинам мультивселенной, чтобы воссоздать его и использовать для победы над глобальной угрозой.
!!!''Пример 2. Агенты икс''
Вы также можете выстроить кампанию вокруг идеи о том, что искатели приключений являются представителями чего-то большего — королевства или секретной организации, например. Во всём, что касается их верности, искатели приключений мотивированы своим долгом и целью защиты того, на кого они служат.
Состоящая из нескольких этапов миссия может состоять в исследовании искателями приключений и нанесении на карту неизвестной области, при этом они будут заключать союзы, где это возможно, и преодолевать угрозы, с которыми столкнуться в пути. Их целью может стать поиск древней столицы павшей империи, которая находится за враждебным королевством, что вынуждает пересечь его территорию. Персонажи могут быть паломниками в поисках святого места или членами тайного ордена, посвящённого защите последних оплотов цивилизации в разрушающемся мире. Или они могут быть шпионами и убийцами, стремящимися ослабить вражескую страну, ликвидируя её злых лидеров и разграбляя её сокровища.
!!__''Семена нового приключения''__
Вы можете сделать кампанию в виде истории с многочисленными главами, сея семена следующего приключения прежде, чем закончится приключение текущее. Эта позволит естественно перемещать персонажей вперёд к их следующей цели.
Если семя проросло, персонажам есть чем заняться и после того, как приключение закончилось. Возможно, персонаж пьёт из волшебного фонтана в подземелье и получает таинственное видение, которое приводит к следующему заданию. Отряд искателей приключений может найти тайную карту или реликвию, которая укажет им новое предназначение, когда её смысл станет понят. Возможно, персонаж Мастера предупреждает искателей приключений о нависшей опасности или просит их о помощи.
Эта уловка не должна отвлекать персонажей от текущего приключения. Проектирование успешной зацепки для будущего приключения требует изящества. Приманка должна быть привлекательной, но не настолько непреодолимой, чтобы отвлекать игроков от того, что они делают сейчас.
Чтобы не позволять игрокам отвлекаться от их цели, сохраните ваши лучшие идеи до самого конца приключения, или вставляйте их в периоды бездействия.
Вот несколько примеров того, как может быть посажено семя нового приключения:
* На теле поверженного злодея персонажи находят свидетельство того, что он работал на кого-то ещё.
* Взятый в плен персонаж Мастера сообщает местоположение кого-то или чего-то, интересующего искателей приключений.
* Персонажи идут в таверну и видят объявление о розыске (обещающее значительную награду).
* Члены местного ополчения или городской стражи сообщают, что было совершено преступление, и они ищут свидетелей или подозреваемых.
* Персонажи получают анонимное письмо, которое проливает свет на заговор или нависшую угрозу, о которой они не знали.
!!__''Предзнаменование''__
Предзнаменование представляет собой тонкую работу, деликатно закладывающую основу будущего приключения. Не все предзнаменования приносят плоды, особенно если намёк слишком неуловим, или если события уводят вашу кампанию в новом направлении. Цель предзнаменования состоит в том, чтобы намекнуть на приближающиеся события и новые угрозы вашей кампании, не делая очевидным для игроков, что вы рассказываете им о том, что их ждёт в будущем. Вот несколько примеров:
* Вещь, которая была на враге, отмечена выгравированным или написанным на ней символом неизвестной организации.
* Безумная женщина на углу улицы изрекает фрагменты древнего пророчества, указывая кривым пальцем на персонажей.
* Король и королева объявили о предстоящем браке их сына и дочери соседнего монарха, но различные фракции противятся этому, затевая волнения.
* Медвежатники-разведчики совершают набеги на цивилизованные страны и шпионят в поселениях, что является прелюдией к вторжению завоевателя-хобгоблина.
* Кукольное представление на рыночной площади предсказывает трагический финал, если два знатных рода, объявивших друг другу войну, не станут мириться.
* В городе совершаются одинаковые необычные убийства, что намекает на будущую угрозу самим персонажам.
!!''Как использовать эту книгу''
Эта книга поделена на три части. Первая часть помогает вам решить, какой тип кампании вы бы хотели начать. Вторая часть помогает создать приключения — истории, составные части кампании, которые держат игроков увлечёнными от одного игрового собрания до другого. Последняя часть помогает вам изучить правила игры и изменить их, чтобы они лучше подходили по стилю вашей кампании.
!!!__''Часть 1 Создатель миров''__
"""Каждый Мастер — создатель своего собственного мира. Придумываете ли вы свой мир, адаптируете мир из любимого фильма или романа, или используете опубликованные правила для D&D игры, в любом случае этот мир ваш на время кампании.
Мир, в котором проходит ваша кампания — один из бесконечных миров, составляющих мультивселенную D&D — огромный массив планов и миров в которых происходят приключения.
Даже если вы используете готовый мир, такой как Забытые Королевства, ваша кампания происходит в своего рода зеркальной версии этой вселенной. Этот мир ваш, и вы можете менять его по желанию, адаптируя под любые события и действия игроков.
Ваш мир это нечто большее, чем просто фон для приключений. Сродни Средиземью, Весте-росу и другим бесчисленными фэнтези мирам, это пространство, в которое вы можете погрузиться и стать свидетелем происходящих фантастических историй. Хорошо продуманный и хорошо отыгранный мир словно обволакивает искателей приключений, так что они чувствуют себя его частью.
Логичность, согласованность и постоянство — вот ключи к правдоподобному выдуманному миру. Когда искатели приключений возвращаются в город за провизией, они должны встретить тех же персонажей Мастера (далее ПМ), которых они встречали там до этого. Вскоре они запомнят имя трактирщика, а он запомнит их.
Как только вы достигнете такого уровня постоянства, вы можете сделать внезапное изменение. Если искатели приключений отправились в конюшни, чтобы купить коней, они могут обнаружить, что человек, который содержал это место, уехал домой в большой город на холмах, и сейчас его дело продолжает племянница. Такое изменение никак напрямую не влияет на искателей приключений, но заставит игроков почувствовать, что их персонажи — часть живого мира, который меняется и растёт вместе с ними.
Первая часть этой книги полностью посвящена изобретению собственного мира. Глава 1 уточняет, какого типа игру вы бы хотели проводить, помогая вам лучше представить детали вашего мира и его конфликты. Во второй главе приводится информация для встраивания вашего мира в мультивселенную, расширяющая подобный раздел из Книги игрока о планах, богах и о том, как соединить их воедино, чтобы соответствовать требованиям вашей кампании."""
!!! __''Часть 2: Создатель приключений''__
"""Пишете ли вы своё приключение или используете уже готовое, будьте готовы потратить время на приготовления, а не только на часы, которые вы проведёте за игровым столом. Вам придётся найти время и потренироваться в креативности, чтобы сочинить хороший сюжет, создать новых персонажей Мастера, придумать сражения, и продумать способы раскрытия сюжетных событий.
Часть 2 научит вас создавать и проводить отличные приключения. Глава 3 расскажет об основах приключения D&D, а глава 4 поможет создать запоминающихся ПМ. Глава 5 содержит в себе указания и советы для проведения приключений в подземельях, в пустынях, в дикой местности и других локациях, а глава 6 расскажет о времени между приключениями. В главе 7 есть всё о сокровищах, магических предметах и особых наградах, которые помогут удержать игроков увлечёнными вашей кампанией."""
!!!__''Часть 3: Создатель правил''__
"""Dungeons & Dragons это не соревновательная игра, но ей всё-таки необходим тот, кто беспристрастно взглянет на ситуацию и гарантирует, что все за столом играют по правилам. Будучи тем, кто создаёт мир игры и приключения, которые в нём происходят, Мастер лучше всего подходит на роль судьи.
Как судья, Мастер выступает посредником между игроками и правилами. Игрок говорит Мастеру, что он хочет сделать, а Мастер определяет, успешно прошло действие или нет, в некоторых случаях предлагая игроку совершить бросок кубика, чтобы добавить элемент случайности. Например, если игрок хочет, чтобы его персонаж атаковал орка, вы скажете: «Соверши бросок атаки», а сами в это время посмотрите Класс Доспеха орка.
Правила не рассчитаны на каждую возможную ситуацию, которая может возникнуть во время игры. Например, игрок можете захотеть, чтобы его персонаж швырнул жаровню, полную горячих углей, в лицо чудовищу. Как определить исход такого действия — решать вам. Вы можете предложить игроку совершить проверку Силы, мысленно установив Сложность (далее Сл) в 15. Если проверка Силы успешна, тогда вы определяете, как раскалённые угли на лице влияют на чудовище. Вы можете решить, что они причиняют урон огнём 1к4 и накладывают штраф к броскам атаки чудовища до конца его следующего хода.
Вы бросаете кость урона (или это делает игрок), и игра продолжается.
Иногда быть судьёй означает устанавливать границы. Если игрок говорит вам: «Я хочу побежать и атаковать орка», но у его персонажа недостаточно перемещения, чтобы добраться до него, вы скажете: «Слишком далеко, чтобы двигаться и атаковать. Что хочешь сделать вместо этого?» Игрок получает информацию и придумывает другой план действий.
Чтобы быть судьёй, вам нужно знать правила. Вам не обязательно знать наизусть Книгу игрока, но вы должны хорошо знать, что в ней вообще есть, чтобы, если потребует ситуация, в любой момент вы смогли открыть её и найти необходимую информацию.
Книга игрока содержит основные правила, которые необходимы, чтобы играть в игру. В третьей части этой книги представлена масса информации, которая поможет подстроить правила под различные возможные ситуации. Глава 8 предлагает советы по использованию бросков атаки, проверок характеристик и спасбросков. Она также включает в себя опции, подходящие только под определённые игровые стили и кампании, включая указания по использованию миниатюр, систему отыгрыша сцен погони и правила безумия. Если вы хотите создать свой собственный контент, такой как новые чудовища, расы и предыстории персонажей, глава 9 подскажет вам, как это сделать. В этой главе также есть необязательные правила для необычных ситуаций или игровых стилей, такие как использование огнестрельного оружия в фэнтезийных мирах."""
!!__''Покупка и продажа''__
Если вы не решите иначе, то считается, что большинство магических предметов настолько редки, что они не доступны для покупки. Обычные предметы, такие как зелья лечения, могут быть приобретены у алхимика, травника или заклинателя. Но даже в этом случае вряд ли это будет просто поход в магазин. Продавец может вместо денег попросить об оказании какой-либо услуги.
В большом городе с академией магии или крупным храмом покупка и продажа магических предметов, по вашему усмотрению, может быть более доступна. Если в вашем мире много искателей приключений, занимающихся добычей древних магических предметов, то торговля этими предметами может быть более распространённым явлением. Тем не менее, это, вероятно, всё же будет похоже на аукцион произведений искусства в реальном мире, попасть на который можно только по приглашению, и вокруг которого ошиваются воры.
Продажа магических предметов в большинстве миров затруднена, прежде всего, тем, что трудно найти на них покупателя. Многие хотели бы иметь магический меч, но лишь немногие из них могут позволить себе это. Те же, кто может позволить себе покупку такой вещи, как правило, могут потратить деньги более практичными способами. Смотрите в главе 6 один из способов продажи магических предметов.
В вашей кампании магические предметы могут быть распространены достаточно широко, чтобы путешественники могли покупать и продавать их, приложив к этому некоторые усилия. Магические предметы могут продаваться на базарах или в аукционных домах в каких-либо фантастических местах, таких как Латунный город, планарный мегаполис Сигил, или в других, менее экзотических местах. Продажа магических предметов может жёстко регулироваться, что в свою очередь будет сопровождаться наличием процветающего чёрного рынка. Техномаги могут изготавливать такие предметы для армии или искателей приключений, как они и делают это в Эберроне. Также вы можете позволить персонажам изготавливать собственные магические предметы, как это описано в главе 6.
<<<
!!!''Рецепты магических предметов''
Рецепт магического предмета описывает, как создать тот или иной магический предмет. Такой рецепт может быть отличной наградой для персонажей, если вы позволяете им создавать собственные магические предметы, как описано в главе 6.
Вы можете награждать рецептами вместо магических предметов. Обычно рецепты пишутся в книгах или свитках и являются на одну категорию более редкими, чем сам предмет, который они позволяют создать. Например, рецепт обычной вещи является необычным. Для легендарных предметов не существует рецептов.
Если создание магических предметов — обычное дело для вашей кампании, рецепты могут встречаться с той же частотой, что и предметы, которые они позволяют создать. Рецепты обычных и необычных предметов могут даже быть в продаже, и их цена должна превышать цену создаваемых ими предметов вдвое.
<<<
Согласованные детали вдыхают жизнь в вашу кампанию и помогают игрокам чувствовать, что их персонажи находятся в реальном мире. Если искатели приключений часто посещают одну и ту же таверну, её персонал, строение и обстановка не должны сильно изменяться от одного визита до другого. Перемены могут происходить в результате действий самих персонажей или событий, о которых они узнают. Когда искатели приключений убивают чудовище, оно остаётся мёртвым, если кто-либо не оживляет его. Когда они забирают сокровище из комнаты, оно не должно появиться там, когда они снова в неё зайдут — если, конечно, оно не было украдено у них! Если они оставили дверь открытой, она будет открыта до тех пор, пока кто-нибудь не закроет её.
Так как запомнить всё невозможно, необходимо вести записи. Краткие записи отмечают на карте приключения открытые двери, обезвреженные ловушки и т. п. События, происходящие за рамками приключения, лучше записывать в тетрадь, посвящённую вашей компании. Такая записная книжка или электронный файл позволят сохранять ваши заметки в организованном виде.
Ваш дневник может включать следующие элементы:
;
://''План кампании.''// Запишите основные этапы вашей кампании и то, что вы планируете использовать в будущих приключениях. Вносите изменения по мере развития кампании, добавляя идеи, которые будут у вас появляться.
:"""//''Персонажи.''// Опишите связи и цели персонажей. Это поможет вам проектировать приключение, предусматривая возможности для развития персонажа.
Фиксируйте текущие классы и уровни персонажей, а также задания и действия, которые они предпринимают в промежутках между приключениями.
Если у искателей приключений есть корабль или цитадель, запишите их название и местоположение, также как и наёмников, которые находятся в распоряжении персонажей."""
://''Раздаточный материал.''// Копируйте весь раздаточный материал, который вы вручаете игрокам, чтобы не забыть его содержание.
://''Отчёт приключения.''// Воспринимайте этот отчёт как руководство для своей кампании. Добавляйте каждую игровую сессию или приключение, чтобы контролировать ход кампании. Вы можете дать игрокам доступ к этому отчёту или к его отредактированной версии, лишённой ваших примечаний и секретов (игроки также могут вести свой собственный отчёт, к которому вы можете обратиться, если ваш собственный отчёт окажется неполным).
://''Персонажи Мастера.''// Записывайте характеристики и особенности персонажей Мастера, с которыми искатели приключений встречались более одного раза. Например, вы можете записать, чем различаются голоса важных персон в городе, их имена, где они живут и работают, имена членов их семей и близких, и даже их тайны.
://''Календарь кампании.''// Ваш мир будет казаться игрокам реалистичнее, если персонажи будут замечать течение времени. Отмечайте такие детали как смену времён года или важные праздники и следите за любыми важными событиями, которые могут повлиять на историю.
://''Инструментарий.''// Всегда отмечайте, когда вы создаёте или существенно изменяете чудовище, волшебный предмет или ловушку. Храните карты, созданные случайным образом подземелья или сцены, которые вы создали. Эта информация гарантирует, что вы не будете повторно делать эту работу, и вы сможете использовать этот материал в будущем.
!!__''Идентификация магических предметов''__
Некоторые магические предметы неотличимы от своих немагических копий, в то время как другие проявляют свой магический характер весьма заметно. Вне зависимости от этого, некоторого манипулирования с магическим предметом бывает достаточно для того, чтобы дать персонажу почувствовать в нём что-то необычайное. Однако обнаружение свойств магического предмета не происходит автоматически.
Заклинание опознание — самый быстрый способ выявить свойства магического предмета. В качестве альтернативы, персонаж может сосредоточиться на одном магическом предмете во время короткого отдыха, если он находится в физическом контакте с этим предметом. В конце отдыха персонаж изучает свойства предмета, а также понимает, как его использовать. Зелья являются исключением; достаточно попробовать немного жидкости, чтобы сказать, что это зелье делает.
Иногда магический предмет сам несёт ключ к определению его свойств. Командное слово для активации кольца может быть выгравировано крошечными буквами на его внутренней стороне, или же по изображённым на нём перьями можно предположить, что это кольцо падения пёрышком.
Ношение вещи или экспериментирование с ней также может дать намёк о её свойствах. Например, если персонаж надевает кольцо прыжков, вы можете сказать ему: «Твои шаги становятся странно пружинистыми». Возможно, после этого персонаж начнёт прыгать вверх-вниз, чтобы посмотреть, что происходит, и тогда вы сообщаете ему, что его прыжки становятся неожиданно высокими.
!!!''Вариант: Усложнение идентификации''
Если вы предпочитаете, чтобы магические предметы имели большую загадочность, вы можете исключить вариант определения свойств магического предмета во время короткого отдыха, и требовать использования заклинания опознание или проведения ряда экспериментов с предметом, или и того, и другого.
Помимо расходов, связанных с поддержанием выбранного уровня жизни, у персонажей могут быть и дополнительные затраты. Те из них, кто вступил во владение собственностью, приобрёл бизнес или нанял наёмников, должны покрывать связанные с этим расходы.
{{$:/Траты на обслуживание}}
Для искателей приключений, особенно после десятого уровня, нет ничего необычного во владении замком, таверной или другой недвижимостью. Они могут купить её на заработанные деньги, захватить силой, заполучить, удачно вытащив из колоды многих вещей; или получить любым другим способом.
Приведённая выше таблица показывает ежедневную стоимость содержания такой собственности (обычного жилья не включена сюда, так как входит в расходы на поддержание образа жизни, как разъяснено в Книге игрока). Траты на обслуживание необходимо делать каждые 30 дней. Учитывая, что персонажи проводят большую часть времени в приключениях, штат включает управляющего, который может совершать платежи в отсутствие отряда.
;
://''Суммарная стоимость в день.''// Сюда входит всё, что требуется для содержания собственности в должном виде, включая оплату наёмников. Если собственность приносит доходы, которые могут покрывать расходы (взимание платы, сбор десятины или пожертвований, продажа товаров), это уже учтено в таблице.
://''Опытные и неопытные наёмники.''// Разница между опытными и неопытными наёмниками объясняется в Книге игрока.
!!!''Бизнес''
Собственный бизнес персонажа может приносить достаточно денег, чтобы покрывать расходы на его обслуживание. Однако владелец между приключениями должен периодически проверять, что всё идёт гладко. Смотрите информацию по управлению бизнесом в разделе «деятельность во время простоя» в этой главе.
!!!''Гарнизоны''
В крепости и замки нанимают солдат для защиты (используйте ветеранов и стражей из Бестиария). Придорожные постоялые дворы, заставы, форты, дворцы и храмы полагаются на менее опытных защитников (используйте стражей из Бестиария). Эти воители составляют большую часть опытных наёмников в объектах собственности.
В промежутках между приключениями персонажи получают возможность совершать полезные действия. Позволяя дням, неделям и месяцам проходить между приключениями, помогайте игрокам развивать их персонажей, но не позволяйте им очень быстро получать слишком большую силу.
Позволяя персонажам заниматься побочными делами между приключениями, вы поощряете игроков больше вкладываться в мир кампании. Если персонаж владеет таверной в деревне или много кутит с местными жителями, он с большей вероятностью отреагирует, когда возникнет угроза деревне или её обитателям.
С течением кампании персонажи ваших игроков не только будут становиться мощнее, они будут всё глубже погружаться в мир и проникаться им. У них может возникнуть желание поучаствовать в проектах, требующих много времени между приключениями, например, в строительстве крепости и владении ею.
На более высоких уровнях вы можете выделять больше времени между приключениями, чтобы персонажи могли заняться своими делами.
У низкоуровневых персонажей свободного времени может быть несколько дней или недель, а у высокоуровневых персонажей — несколько месяцев или даже лет.
!!__''Дополнительная деятельность во время простоя''__
В 8 главе Книги игрока приведены примеры деятельности во время простоя, которыми можно заполнить паузы между приключениями. В зависимости от стиля вашей кампании, а также предыстории и интересов искателей приключений, вы можете добавить описанные ниже варианты деятельности или часть из них.
!!!''Исполнение священных ритуалов''
Набожный персонаж может между приключениями выполнять священные ритуалы в храме своего божества. Между ритуалами он медитирует и молится.
Священнослужитель может сам проводить такие ритуалы как свадьбы, похороны и рукоположения. Миряне могут совершать жертвоприношения или помогать священнослужителям.
Персонаж, который в течение как минимум 10 дней исполнял священные ритуалы, в течение следующих 2к6 дней в начале каждого дня получает вдохновение (смотрите в 4 главе Книги игрока).
!!!''Коммерческая деятельность''
Искатели приключений могут заниматься делами, не связанными с походами в подземелья и спасением мира. Персонаж может унаследовать кузницу, отряду могут подарить участок для ведения приусадебного хозяйства или даже таверну. Если у персонажей есть такой бизнес, они должны периодически контролировать дела, чтобы быть уверенными, что всё идёт хорошо.
Персонаж бросает процентные кости и добавляет количество дней, которое он занимается этой деятельностью (максимум 30), и сравнивает результат с приведённой таблицей, чтобы узнать, что произошло.
Если выпадает результат, по которому персонаж должен заплатить, но не может этого сделать, дела начинают идти очень плохо. За каждый такой невыплаченный долг персонаж получает штраф -10 на последующие броски по этой таблице.
{{$:/Коммерческая деятельность}}
!!!''Кутёж''
Персонажи могут тратить время на гедонистические удовольствия, такие как закатывание вечеринок, пьянки, азартные игры, и всё остальное, что позволяет забыть опасности, грозящие им в приключениях.
Кутящий персонаж тратит деньги, как если бы он вёл богатое существование (смотрите в 5 главе Книги игрока). В конце кутежа игрок бросает процентные кости, добавляет уровень персонажа и сравнивает результат с приведённой таблицей, чтобы узнать, что произошло с его персонажем, либо же вы сами определяете последствия.
{{$:/Кутёж}}
!!!''Получение славы''
Персонаж может в свободное время заниматься улучшением своих отношений с некой организацией (смотрите «слава» в главе 1). Между приключениями персонаж выполняет небольшие поручения и знакомится с другими представителями организации.
После того, как персонаж проведёт, занимаясь этим, количество дней, равное его текущей славе, умноженной на 10, его слава увеличится на 1.
!!!''Постройка крепости''
Персонаж может между приключениями строить крепость. Прежде чем начать работу, персонаж должен получить участок земли. Если этот участок находится в королевстве или подобных владениях, персонажу нужна королевская грамота (правовой документ, дарующий разрешение присматривать за земельным участком во имя короны), земельная грамота (правовой документ, поручающий персонажу заботиться об участке земли, пока он остаётся верным короне), или документ с печатью, подтверждающий владение участком земли. Землю также можно получить в наследство или другими способами.
Королевские и земельные грамоты обычно выдаются правителем за верную службу, хотя их также можно купить. Документы о владении можно купить или унаследовать. Маленький участок может стоить от 100 до 1000 зм. Большой особняк может стоить 5000 зм и больше, если вообще будет продаваться.
Получив участок, персонаж должен найти строительные материалы и работников. Приведённая таблица показывает стоимость постройки крепости (включая стоимость материалов и оплату труда) и требуемое время, при условии, что персонаж тратит время в простое на контроль хода работ. Работы могут продолжаться и без персонажа, но каждый день его отсутствия увеличивает время строительства на 3 дня.
{{$:/Постройка крепости}}
!!!''Продажа магических предметов''
Мало кто может купить магические предметы, и ещё меньше знают, как их добывать. Искатели приключений здесь — исключение, таково уж их призвание.
Это возможно только в городе или таком месте, где можно найти богатого покупателя, готового приобрести магический предмет. Легендарные магические предметы и бесценные артефакты не могут быть проданы между приключениями. Поиск кого-либо, способного купить такой товар, может стать отдельным приключением или заданием.
Для каждого продаваемого предмета персонаж совершает проверку Интеллекта (Анализ) со Сл 20, чтобы найти покупателей. Другой персонаж может потратить своё свободное время в простое, чтобы помочь с поиском, позволяя совершить проверки с преимуществом. При неудачной проверке никакой покупатель не найден в течение 10-дневных поисков. При успешной проверке покупатель для предмета находится после нескольких дней поиска, количество которых зависит от редкости предмета, как показано в таблице «спрос на магические предметы».
Персонаж может попытаться найти покупателей для нескольких магических предметов сразу. Это требует многократных проверок Интеллекта (Анализ), но поиски происходят одновременно, и результаты успешных и неудачных проверок не соединяются вместе. Например, если персонаж находит покупателя для обычного волшебного предмета за 2 дня, а для необычного предмета за 5 дней, но не в состоянии найти покупателя для редкого предмета, весь поиск длится 10 дней.
Для каждого предмета, который персонаж хочет продать, игрок бросает процентные кости и сверяется с таблицей «продажа магических предметов», применяя модификатор, основанный на редкости вещи, указанный в таблице «спрос на магические предметы». Персонаж также совершает проверку Харизмы (Убеждение) и добавляет результат к сумме. Полученное таким образом значение определяет, что покупатель предлагает заплатить за вещь.
Личность покупателя определяете вы. Иногда редкие и очень редкие предметы ищут через доверенных лиц, чтобы самим сохранить инкогнито. Если покупатель остаётся в тени, вы решаете, создаст ли продажа юридические осложнения для отряда в будущем.
{{$:/Спрос на магические предметы}}
{{$:/Продажа магических предметов}}
!!!''Распространение слухов''
Изменение общественного мнения — отличный способ свергнуть злодея или помочь другу. Распространение слухов — эффективный, хотя и не совсем честный способ достичь такой цели. Вовремя пущенный слух может усилить положение в обществе или вызвать скандал. Слух должен быть простым, конкретным и неопровержимым. Эффективный слух должен быть правдоподобным, обыгрывающим то, во что люди готовы поверить.
Распространение слухов о личности или организации требует количество дней, зависящее от размера поселения, как показано в приведённой таблице. В посёлке или большом городе время должно тратиться неразрывно. Если персонаж распространяет слухи десять дней, уходит на поиски приключений на несколько дней, а потом возвращается, незаконченный слух забудется безо всякого эффекта.
Персонаж должен тратить 1 зм в день, оплачивая напитки, небольшие подарки, и тому подобное. В конце времени, потраченного на распространение слухов, персонаж должен совершить проверку Харизмы (Переговоры или Убеждение) со Сл 15. При успехе преобладающее отношение к предмету слухов изменяется на один шаг к дружественному или враждебному, по желанию персонажа. При провале слухи не получают поддержки, и дальнейшие попытки распространять их будут провальными.
Изменение общего отношения к персоне или организации не меняет отношения конкретных личностей. Отдельные индивидуумы могут остаться при своём мнении, особенно если они лично взаимодействовали с предметом слухов.
{{$:/Распространение слухов}}
!!!''Создание магического предмета''
За распределение магических предметов отвечает Мастер, поэтому именно вы решаете, как они попадают к отряду. В качестве альтернативы, вы можете позволить персонажам игроков самим изготавливать магические предметы.
Создание магического предмета — долгий и затратный процесс. Для начала у персонажа должна быть формула, описывающая создание предмета Этот же персонаж должен быть заклинателем с ячейками заклинаний, способным накладывать заклинания, производимые создаваемым предметом. Кроме того, редкость создаваемого предмета определяет минимальный уровень персонажа, который может его создавать. Например, персонаж 3 уровня может создать волшебную палочку снарядов (необычный предмет), если у него есть ячейки заклинаний, и он может накладывать заклинание волшебная стрела. Этот же персонаж может создать оружие +1 (тоже необычный предмет), причём для этого не требуются никакие конкретные заклинания.
Вы можете решить, что для создания некоторых предметов нужны особые материалы или места. Например, для варки зелья могут требоваться алхимические ингредиенты, а в процессе ковки языка пламени может потребоваться находиться у лавы.
{{$:/Создание магических предметов}}
В таблице указана стоимость создания предметов (для таких расходуемых предметов, как зелья и свитки, разделите эту стоимость пополам). Персонаж, участвующий в создании предмета, вкладывает в день по 25 зм, пока предмет не будет готов. Считается, что персонаж занят работой по 8 часов в день. Таким образом, для создания необычного магического предмета требуется 20 дней и 500 зм. Вы можете корректировать эти стоимости так, как посчитаете нужным для вашей кампании.
Если создаваемый предмет будет генерировать заклинание, создатель должен в каждый день, когда он участвует в создании предмета, тратить одну ячейку заклинания с уровнем, равным уровню генерируемого заклинания. Материальные компоненты заклинания тоже должны быть под рукой в процессе создания предмета. Если в обычных условиях заклинание уничтожает эти компоненты, они уничтожаются в процессе создания. Если предмет сможет создать заклинание лишь один раз, как в случае свитка заклинания, компоненты уничтожаются в процессе создания только раз. В противном случае компоненты уничтожаются по одному разу за каждый день в процессе создания предмета.
Несколько персонажей могут объединять усилия при создании магического предмета, если все они подходят по уровню. Каждый персонаж может вкладывать свои заклинания, ячейки заклинаний и компоненты, если все они создают один и тот же предмет. Каждый персонаж может вкладывать в общий процесс по 25 зм за день.
Обычно персонаж, занимающийся такой деятельностью, создаёт один из предметов, описанных в 7 главе. Если хотите, можете позволить игрокам создавать свои собственные магические предметы, используя руководство из главы 9.
В процессе создания магического предмета персонаж может поддерживать скромное существование, не платя 1 зм в день, или комфортное существование, платя лишь половину обычной стоимости (смотрите в 5 главе Книги игрока).
!!!''Тренировки для получения уровней''
В качестве опционального правила, вы можете требовать от персонажей тратить время на обучение, прежде чем они получат все преимущества от нового уровня. Если вы используете эту опцию, когда персонаж накапливает достаточно опыта, чтобы получить новый уровень, он должен потратить некоторое количество дней, прежде чем получит классовые умения, связанные с новым уровнем.
Время тренировки зависит от получаемого уровня, как показано в таблице. Стоимость тренировки указана сразу за весь период.
{{$:/Тренировки для получения уровней}}
!!__''Создание деятельности во время простоя''__
Ваши игроки могут захотеть заняться деятельностью, не описанной ни здесь, ни в Книге игрока. Если вы изобретаете новые виды деятельности, помните о следующем:
* Деятельность не должна отменять необходимость или желание персонажей отправляться на поиски приключений.
* Деятельность, связанная с денежными затратами, предоставляет персонажам игроков возможность потратить заработанные с трудом сокровища.
* Деятельность, раскрывающая новые зацепки для приключений и ранее неизвестные факты о вашей кампании могут предсказать будущие события и конфликты.
* Для деятельности, в которой персонажи могут получить разные степени успеха, создайте соответствующие таблицы, подобные тем, что есть в этой главе.
* Если персонаж принадлежит к классу, или имеет владение или предысторию, делающую его хорошо пригодным для конкретной деятельности, попробуйте дать ему бонус к проверкам характеристик, совершаемым для выполнения этой деятельности.
!!__''Настройка на магический предмет''__
Некоторые магические предметы требуют того, чтобы существо образовало с ними связь, прежде чем оно сможет использовать их магические свойства. Эта связь называется настройкой, и у некоторых предметов могут быть определённые условия для её проведения. Если условием является класс, существо должно быть представителем этого класса, чтобы настроиться на предмет (если указанный класс это класс заклинателя, чудовище выполняет это требование, если у него есть ячейки заклинаний и оно использует список заклинаний этого класса). Если для настройки нужно быть заклинателем, существо выполняет это требование, если может накладывать хотя бы одно заклинание при помощи умений или особых свойств, без использования магических предметов и подобных вещей.
Не настроившись на предмет, который того требует, существо получает от него только немагические преимущества, если в его описании не указано иное. Например, магический щит, который требует настройки, даёт преимущества обычного щита существу, не настроившемуся на него, но при этом не проявляет свои магические свойства.
Настройка на предмет требует, чтобы существо провело короткий отдых, в течение которого оно будет фокусироваться только на этом предмете, находясь при этом в постоянном физическом контакте с ним (это не может быть тот же самый короткий отдых, что используется для изучения свойств предмета). Эта фокусировка может принимать формы тренировки с оружием (для оружия), медитации (для чудесного предмета), либо какой-то другой соответствующей деятельности. Если короткий отдых прерывается, попытка настройки терпит неудачу. Если же всё складывается удачно, то в конце короткого отдыха существо получает интуитивное понимание того, как активировать магические свойства предмета, в том числе понимает необходимые для этого командные слова.
В конкретный промежуток времени предмет может быть настроен только на одно существо, и существо не может быть настроено на более чем три магических предмета одновременно. Любая попытка настроиться на четвёртый предмет автоматически проваливается; существо сначала должно прервать настройку на один из тех трёх предметов, на которые оно настроено. Кроме того, существо не может настроиться на копии одного и того же предмета. Например, существо не может настроиться более чем на одно кольцо защиты одновременно.
Настройка на магический предмет заканчивается, если существо перестаёт удовлетворять требованиям для осуществления настройки, или если предмет находился на расстоянии более 100 футов в течение, по крайней мере, 24 часов, или если существо умирает, а также, если другое существо настаивается на предмет. Существо может также добровольно отменить настройку, потратив другой короткий отдых, фокусируясь на предмете, за исключением тех случаев, когда предмет проклят.
!!__''Проклятые предметы''__
Некоторые магические предметы несут на себе проклятья, которые порой воздействуют на своих владельцев ещё долгое время после того, как те прекратили ими пользоваться. В описании магического предмета уточняется, проклят он или нет. Большинство методов идентификации предметов, в том числе применение заклинания опознание, не позволяют обнаружить проклятье, хотя ваши знания могут намекнуть на этот факт. Проклятье должно стать сюрпризом для владельца магического предмета, когда его эффекты начнут проявляться.
Настройку на проклятую вещь нельзя отменить добровольно, пока проклятие не будет снято, например, с помощью заклинания снятие проклятья.
!!__''Категории магических предметов''__
Каждый магический предмет принадлежит к какой-либо категории: волшебные палочки, доспехи, жезлы, зелья, кольца, оружие, посохи, свитки или чудесные предметы.
!!!''Волшебные палочки''
Волшебные палочки достигают в длину 15 дюймов и изготавливаются из металла, кости или дерева. Палочка может быть также украшена навершием из стекла, камня, или какого-либо другого материала.
Зелья являются расходуемыми магическими предметами. Употребление зелья или его применение на другого персонажа совершается действием. Применение масла может занять больше времени, и это указано в его описании. Использованное зелье действует немедленно и считается израсходованным.
<<<
!!!''Вариант: Палочки без перезарядки''
У типичной волшебной палочки расходуются заряды. Если вы хотите, чтоб палочки стали ограниченным ресурсом, вы можете сделать невозможным их перезарядку. При этом рассмотрите возможность увеличения базового количества зарядов до максимальных 25. Эти заряды после использования не восстанавливаются.
<<<
!!!''Кольца''
Магические кольца наделяют удивительной силой тех, кому повезло найти их. Если в описании кольца не сказано иначе, то для того, чтобы магия кольца работала, его необходимо носить на пальце.
!!!''Доспехи''
Если в описании доспехов не сказано иначе, то для использования их магических свойств они должны быть надеты.
Для некоторых комплектов магических доспехов может быть указан вид доспеха, например, «кольчуга» или «латный доспех». Если же особого указания по этому поводу нет, вы можете определить вид доспеха случайным образом.
!!!''Жезлы''
Магические жезлы могут выглядеть как скипетры, другие же просто представляют собой тяжёлые цилиндры. Они, как правило, изготовлены из металла, дерева или кости; весят от двух до пяти фунтов, имеют длину 2-3 фута при толщине в один дюйм.
!!!''Зелья''
Различные виды магических жидкостей сгруппированы в категорию зелий: это варева, сделанные из колдовских трав, вода из магических фонтанов или священных источников, и масла, которые наносятся на существо или предмет. Объём большинства зелий составляет примерно одну унцию.
<<<
!!!''Вариант: Смешивание зелий''
Персонаж может выпить одно зелье, пока находится под действием другого, или попытаться смешать несколько зелий в одной ёмкости. В этом случае, необычные ингредиенты, используемые в создании зелий, могут привести к непредсказуемым последствиям.
Когда персонаж смешивает две зелья вместе, вы можете бросить кость и сверить результат с таблицей «смешивание зелий». Если персонаж смешивает более двух зелий, то совершайте бросок повторно для каждого последующего зелья, комбинируя результаты. Если эффекты не проявляются сразу, то оповещайте о них только тогда, когда они становятся очевидны.
{{$:/Смешивание зелий}}
<<<
!!!''Оружие''
Созданное для воплощения самых жестоких замыслов своего владельца или же напротив, выкованное служить высоким рыцарским идеалам, магическое оружие является желанным предметом для многих искателей приключений.
Для некоторых экземпляров магического оружия в описании может быть указан его вид, такой как «длинный меч» или «длинный лук». Если же вид оружия не указан, вы можете выбрать его самостоятельно или же определить случайным образом.
Если у магического оружия есть свойство «боеприпас», то выпущенные им боеприпасы считаются магическими в вопросе преодоления сопротивления и иммунитета к немагическим атакам и урону.
!!!''Посохи''
Длина магического посоха 5-6 футов. Внешне посохи могут весьма отличаться друг от друга: одни гладкие и имеют практически равный диаметр по всей длине, другие — витые и корявые; одни сделаны из дерева, другие из полированного металла или кристалла. В зависимости от материала, посох может весить от 2 до 7 фунтов.
Если не сказано иного, то посох может использоваться, как оружие, являясь при этом «боевым посохом».
!!!''Свитки''
Большинство свитков это заклинания, хранящиеся в письменной форме, но есть и те, что несут уникальные чары, которые предоставляют мощную охрану. Каким бы ни было его содержание, свиток представляет собой свёрток бумаги, иногда прикреплённый к деревянному стержню, и, как правило, хранящийся в тубе из слоновой кости, нефрита, кожи, дерева или металла.
Свиток является расходуемым магическим предметом. Независимо от характера магии, содержащейся в свитке, активация этой магии требует использования действия, чтобы прочитать свиток. После того, как магия, заключённая свитке, высвобождается, свиток не может быть использован повторно. Слова исчезают, или он рассыпается в прах.
Любое существо, которое может понимать письмена, может прочитать и магические письмена свитка и попытаться активировать его, прочитав символы.
<<<
!!!''Вариант: Неудачи при прочтении свитков''
Существо, которое пытается, но не может наложить заклинание со свитка, должно совершить спасбросок Интеллекта со Сл 10. При провале бросьте 1 к6 для определения последствий в соответствии с приведённой ниже таблицей.
{{$:/Неудача при прочтении свитков}}
<<<
!!!''Чудесные предметы''
Чудесные предметы это довольно обширная категория магических предметов, которая включает в себя предметы одежды, такие как: сапоги, ремни, плащи, перчатки и различные ювелирные изделия и украшения: амулеты, броши и обручи. Сумки, ковры, хрустальные шары, разного рода фигурки, музыкальные инструменты и многие другие предметы также попадают в эту категорию.
!!__''Ношение и использование магических предметов''__
Использование свойств магического предмета предполагает его ношение или использование. Магические предметы, предназначенные для ношения, должны быть надеты соответствующим образом: обувь — на ноги, перчатки — на руки, шляпа или шлем — на голову, кольцо — на палец. Магический доспех должен быть надет, щит ремнём прикреплён к руке, плащ накинут на плечи. Оружие нужно держать в руке.
В большинстве случаев надеваемые магические предметы подходят всем, независимо от размера. Их часто делают регулируемыми или зачаровывают на изменение размера под носителя.
Существуют редкие исключения. Если по сюжету требуется сделать предмет подходящим только существам определённой формы или размера, вы можете посчитать, что его регулировка невозможна. Например, доспех, сделанный дроу, может подходить только эльфам. Дварфы могут изготавливать доспехи, которые подходят только существам их размера и телосложения.
Когда негуманоидное существо пытается надеть предмет, не предназначенный для него, вы можете сами решить: работают ли его функции в полной мере. Например, кольцо, надетое на щупальце, может продолжать работать как обычно, но обладающая змеиным хвостом юань-ти вряд ли сможет надеть какую бы то ни было обувь.
!!!''Несколько предметов схожих видов''
Пользуйтесь здравым смыслом, чтобы определить, может ли существо носить несколько вещей схожего вида. Обычно персонаж не может носить более одной пары обуви, одной пары перчаток или рукавиц, пары браслетов, одного доспеха, одного предмета на голове и одного плаща. Вы можете делать исключения; например, персонаж вполне может носить обруч под шлемом, или накинуть себе на плечи два плаща.
!!!''Парные предметы''
Предметы, которые являются парными, такие как ботинки, наручи, рукавицы и перчатки, должны носиться в паре, чтобы персонаж получал преимущества, связанные с ними. Например, обув на одну ногу сапог ходьбы и прыжков., а на другую эльфийский сапог, персонаж не получит преимуществ ни от одного из них.
!!__''Активация предмета''__
Активация некоторых магических предметов требует конкретных действий, например, держание его в руках и произнесение командного слова. В описании каждой категории предметов и конкретно самих предметов указывается, что необходимо для их активации. Некоторые предметы требуют использование одного или нескольких из нижеследующих правил для их активации.
Если активация предмет требует совершения действия, то это действие не равносильно действию Использование предмета, так что умение плута Быстрые руки не может быть использовано для активации предмета.
!!!''Командное слово''
Командное слово — слово или фраза, которые необходимо произнести для активации предмета. В местах, где что-то препятствует звуку, например, при заклинании тишина, магические предметы, активируемые командным словом, не могут использоваться.
!!!''Расходуемые''
Некоторые предметы одноразовые. Зелье или эликсир необходимо проглотить, масло — нанести на тело. Написанное исчезает со свитка после прочтения. После использования такие предметы теряют свою магическую силу.
!!!''Заклинания''
Некоторые магические предметы позволяют использовать заложенные в них заклинания. При этом если в описании не сказано иное, заклинание накладывается с минимально возможным уровнем, у использующего не тратятся ячейки заклинаний и ему не требуются компоненты. Заклинание использует стандартные время накладывания, дистанцию и длительность, и владелец должен концентрироваться, если заклинание того требует. Многие предметы, такие как зелья не используют время накладывания и сразу дают эффект заклинания со стандартной длительностью. Ряд предметов, однако, является исключением из этого правила, так как меняет время накладывания, длительность или другие части заклинаний.
Магические предметы, такие как некоторые из посохов, могут требовать использования вашего собственного умения Использование заклинаний. Если у вас есть несколько таких умений, вы сами выбираете, какое из них использовать. Если же у вас нет этого умения (возможно, вы плут с умением Использование магических предметов), то для этого предмета ваш модификатор базовой характеристики будет равен +0, и ваш бонус мастерства при этом не будет применяться.
!!!''Заряды''
У некоторых магических предметов есть заряды, которые расходуются каждый раз, когда вы активируете их свойства. Их текущее количество становится ясным в момент изучения предмета с помощью заклинания опознание, а также когда существо производит настройку на этот предмет. Кроме того, когда происходит восстановление зарядов, существо, настроенное на этот предмет, понимает, сколько зарядов было восстановлено.
!!__''Прочность магических предметов''__
Большинство магических предметов является выдающимися произведениями искусных ремесленников. Благодаря комбинации тщательной работы и разного рода магических усилений, магическая вещь, по меньшей мере, так же прочна, как и аналогичное немагическое изделие. Большая часть магических предметов, за исключением зелий и свитков, обладают сопротивляемостью ко всем видам урона. Артефакты практически невозможно уничтожить, для этого требуются исключительные меры.
!!__''Особые свойства''__
Вы можете добавить индивидуальности магическому предмету, продумав его предысторию. Кто его сделал? Есть ли что-то необычное в его конструкции? Для чего его сделали, как изначально использовали? Какие магические причуды выделяют его от остальных предметов того же рода? Ответив на эти вопросы, вы сможете превратить обычный магический предмет, например, длинный меч +1 в приятное открытие.
Приведённые ниже таблицы могут помочь вам с этими ответами. Совершите броски по тем таблицам, по каким захотите. Некоторые из этих таблиц имеют больший смысл для ряда предметов, чем другие. Некоторые магические предметы изготавливаются определёнными видами существ. Например, эльфийский плащ изготовлен, скорее всего, эльфами, а не дварфами. Если финальный результат кажется бессмысленным, вы можете совершить ещё один бросок и выбрать лучший вариант или использовать части получившегося для вдохновения и придумать собственное описание.
<<Button "$:/01. Кем или для кого он создан?""Кем или для кого он создан?">>
<<Button "$:/02. Детали его истории?""Детали его истории?">>
<<Button "$:/03. Какими малыми свойствами обладает предмет?""Какими малыми свойствами обладает предмет?">>
<<Button "$:/04. Какими еще причудливыми особенностями обладает предмет?""Какими еще причудливыми особенностями обладает предмет?">>
Если вы используете таблицу «сокровищница», чтобы случайным образом определить, содержит ли клад магические предметы, и выпадает вариант, что предмет есть, то вы можете с помощью приведённых ниже таблиц определить, что именно это за предметы.
<<Button "$:/Таблица А: Магические предметы""Таблица А: Магические предметы">>
<<Button "$:/Таблица Б: Магические предметы""Таблица Б: Магические предметы">>
<<Button "$:/Таблица В: Магические предметы""Таблица В: Магические предметы">>
<<Button "$:/Таблица Г: Магические предметы""Таблица Г: Магические предметы">>
<<Button "$:/Таблица Д: Магические предметы""Таблица Д: Магические предметы">>
<<Button "$:/Таблица Е: Магические предметы""Таблица Е: Магические предметы">>
<<Button "$:/Таблица Ё: Магические предметы""Таблица Ё: Магические предметы">>
<<Button "$:/Таблица Ж: Магические предметы""Таблица Ж: Магические предметы">>
<<Button "$:/Таблица З: Магические предметы""Таблица З: Магические предметы">>
//Доспех (средний или тяжёлый, но не доспех из шкур), необычный//
Это доспехи усилены адамантином, одним из самых прочных из существующих веществ. Пока вы носите эти доспехи, все критические попадания по вам считаются обычными попаданиями.
//1 уровень, Воплощение, Колдун//
;
:''Время накладывания:'' 1 реакция, совершаемая вами в ответ на получение урона от существа, находящегося в пределах 60 футов от вас и видимого вами
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы указываете пальцем, и существо, причинившее вам урон, мгновенно окружается пламенем. Существо должно совершить спасбросок Ловкости. Оно получает урон огнём 2к10 при провале, или половину этого урона при успехе.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше первого.
!!!''__Алмазная душа__''
"""Начиная с 14 уровня ваше мастерство ци предоставляет вам владение всеми спасбросками.
Кроме того, если вы провалили спасбросок, вы можете повторить его, потратив 1 очко ци, и должны использовать второй результат."""
//Чудесный предмет, необычный//
Этот керамический кувшин, кажется способным вместить 1 галлон жидкости и весит 12 фунтов вне зависимости от того, полный он или пустой. Если его потрясти, то можно услышать звуки плескающийся жидкости, даже если кувшин пуст.
Вы можете действием назвать одну жидкость из приведённой ниже таблицы, отчего кувшин начнёт её производить. После этого вы можете ещё одним действием откупорить кувшин и вылить эту жидкость из сосуда со скоростью до 2 галлонов в минуту. Максимальное количество жидкости, которое может произвести кувшин, зависит от вида жидкости, названной вами.
После того, как кувшин начинает производить выбранную жидкость, он не может производить другую, или произвести названную жидкость в объёме больше её максимума, пока не наступит следующий рассвет.
<table>
<tr>
<th>Жидкость</th>
<th>Макс. объём</th>
<th>Жидкость</th>
<th>Макс. объём</th>
</tr>
<tr>
<td>Вино</td>
<td>1 галлон</td>
<td>Масло</td>
<td>1 кварта</td>
</tr>
<tr>
<td>Вода, пресная</td>
<td>8 галлонов</td>
<td>Мёд</td>
<td>1 галлон</td>
</tr>
<tr>
<td>Вода, солёная</td>
<td>12 галлонов</td>
<td>Пиво</td>
<td>4 галлона</td>
</tr>
<tr>
<td>Кислота</td>
<td>8 унций</td>
<td>Уксус</td>
<td>2 галлона</td>
</tr>
<tr>
<td>Майонез</td>
<td>2 галлона</td>
<td>Яд</td>
<td>1/2 унции</td>
</tr>
</table>
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите этот амулет, вы скрыты от магии школы Прорицания. Вы не можете быть целью подобной магии, и вас не воспринимают магические сенсоры слежения.
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите этот амулет, ваше значение Телосложения равно 19. Если ваше Телосложение без него уже 19 или выше, то амулет не оказывает на вас никакого действия.
//Чудесный предмет, очень редкий (требуется настройка)//
Пока вы носите этот амулет, вы можете действием назвать хорошо знакомое вам место на другом плане. После этого необходимо совершить проверку Интеллекта со Сл 15. При успехе вы накладываете заклинание уход в иной мир. При провале вы и все существа и предметы в пределах 15 футов от вас переноситесь в случайном направлении. Бросьте к100. При результате 1-60 вы переноситесь в случайное место на названном вами плане. При результате 61-100 вы переноситесь в случайное место на вашем текущем плане существования.
//8 уровень, Очарование, Друид/Волшебник//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок квасцов, пропитанный уксусом для эффекта антипатии или капля мёда для эффекта симпатии)
:''Длительность:'' 10 дней
"""Это заклинание привлекает или отталкивает выбранных вами существ. Вы выбираете цель в пределах дистанции: либо предмет размером не больше Огромного, либо существо, либо область не больше куба с длиной ребра 200 футов. Затем укажите вид разумных существ, такой как красные драконы, гоблины или вампиры. Вы наделяете цель аурой, которая в течение длительности либо привлекает, либо отталкивает указанных существ. Выберите либо эффект антипатии, либо эффект симпатии:
//''Антипатия.''// Эти чары вызывают у выбранных вами существ непреодолимое желание покинуть область и избегать цель. Если такое существо видит цель и оказывается в пределах 60 футов от неё, оно должно преуспеть в спасброске Мудрости, иначе станет испуганным. Существо остаётся испуганным, пока видит цель или находится в пределах 60 футов от неё. Будучи испуганным целью, существо должно тратить своё перемещение на побег в ближайшее безопасное место, откуда оно уже не увидит цель. Если существо отдалится от цели более чем на 60 футов и не сможет её видеть, оно перестаёт быть испуганным, но становится испуганным вновь, если увидит цель или окажется в пределах 60 футов от неё.
//''Симпатия.''// Эти чары вызывают у выбранных вами существ непреодолимое желание приблизиться к цели, если они находятся в пределах 60 футов от неё или видят её. Если такое существо видит цель или оказывается в пределах 60 футов от неё, оно должно преуспеть в спасброске Мудрости, иначе оно в каждом своём ходу тратит перемещение на то, чтобы войти в область или прикоснуться к цели. Сделав это, оно уже не может добровольно отойти от цели.
Если цель причиняет урон или как-то иначе вредит указанному существу, существо может совершить спасбросок Мудрости для окончания эффекта, как описано ниже.
//''Окончание эффекта.''// Если указанное существо окончит ход за пределами 60 футов от цели или не сможет её видеть, оно совершает спасбросок Мудрости. В случае успеха эффект на существе заканчивается и оно понимает, что тяга или отвращение были вызваны магией. Кроме того, попавшему под эффект заклинания существу позволяется спасбросок Мудрости каждые 24 часа, пока заклинание активно.
Совершившее успешный спасбросок существо получает иммунитет к эффекту на 1 минуту, после чего снова попадает под его действие."""
//Чудесный предмет, легендарный//
На первый взгляд этот предмет выглядит как Большая запечатанная железная бочка, весящая 500 фунтов. У бочки есть потайной затвор, который можно найти успешной проверкой Интеллекта (Анализ) со Сл 20. Этот затвор отпирает люк на одном конце бочки, позволяющий забраться внутрь двум существам Среднего или меньшего размера. У дальнего конца торчат в ряд десять рычагов, все в нейтральной позиции, но их можно перевести или в верхнее или в нижнее положение. Если использовать определённые рычаги, аппарат трансформируется и станет напоминать гигантского лобстера
Аппарат Квалиша это Большой предмет со следующей статистикой:
;
:''Класс Доспеха:'' 20 Хиты: 200
:''Скорость:'' 30 фт, плавая 30 фт. (или 0 фт. если не выдвинуты ноги и хвост)
:''Иммунитет к урону:'' психическая энергия, яд
Для того чтобы использовать аппарат в качестве транспортного средства, требуется один водитель. Пока люк заперт, аппарат водо- и воздухонепроницаем. Воздуха внутри хватит одному дышащему существу на 10 часов.
Аппарат держится на плаву. Он может погружаться на глубину до 900 футов. Глубже этой отметки аппарат получает дробящий урон 2к6 в минуту от давления.
Существо в аппарате может действием переместить от одного до двух рычагов вверх или вниз. После каждого использования рычаги сами возвращаются в нейтральное положение. Назначение десяти рычагов показано в нижеприведённой таблице.
!!!!''Рычаги аппарата Квалиша''
<table>
<tr>
<th>Рычаг </th>
<th>Вверх</th>
<th>Вниз</th>
</tr>
<tr>
<td>1</td>
<td>Ноги и хвост выдвигаются, позволяя аппарату ходить и плавать.</td>
<td>Ноги и хвост втягиваются, уменьшая скорость аппарата до 0 и лишая его способности получать преимущества от бонусов к скорости.</td>
</tr>
<tr>
<td>2</td>
<td>Заслонка переднего иллюминатора открывается.</td>
<td>Заслонка переднего иллюминатора закрывается.</td>
</tr>
<tr>
<td>3</td>
<td>Заслонки боковых иллюминаторов (по два на каждом борту) открываются.</td>
<td>Заслонки боковых иллюминаторов (по два на каждом борту) закрываются.</td>
</tr>
<tr>
<td>4</td>
<td>Из передней части аппарата выдвигаются два когтя.</td>
<td>Когти убираются.</td>
</tr>
<tr>
<td>5</td>
<td>Каждый выдвинутый коготь совершает руко пашную атаку оружием: +8 к попаданию, досягаемость 5 фт., одна цель. Попадание: Дробящий урон 7 (2к6).</td>
<td>Каждый выдвинутый коготь совершает рукопашную атаку оружием: +8 к попаданию, досягаемость 5 фт., одна цель. Попадание: цель становится схваченной (Сл высвобождения 15).</td>
</tr>
<tr>
<td>6</td>
<td>Аппарат идёт или плывёт вперёд. </td>
<td>Аппарат идёт или плывёт назад.</td>
</tr>
<tr>
<td>7</td>
<td>Аппарат поворачивает на 90 градусов налево. </td>
<td>Аппарат поворачивает на <br>90 градусов направо.</td>
</tr>
<tr>
<td>8</td>
<td>Похожие на глаза приспособления испускают яркий свет в пределах 30-футового радиуса и тусклый свет в пределах ещё 30 футов.</td>
<td>Свет тухнет.</td>
</tr>
<tr>
<td>9</td>
<td>Аппарат погружается в жидкость на глубину до 20 футов.</td>
<td>Аппарат всплывает в жидкости не более чем на 20 футов.</td>
</tr>
<tr>
<td>10</td>
<td>Задний люк отпирается и открывается.</td>
<td>Задний люк закрывается и запирается.</td>
</tr>
</table>
Артефакт это уникальный магический предмет потрясающей силы, со своим собственным происхождением и историей. Артефакт может быть создан богом или невероятно могущественным смертным. Его могли создать во время большой угрозы королевству, миру или всей мультивселенной, и именно он может быть ответственным за то, как сложилась история.
Некоторые артефакты появляются тогда, когда они очень нужны. Для других верно обратное; когда их находят, мир содрогается от ужаса. В любом случае, ввод артефакта в кампанию требует подготовки. Артефакт может быть предметом, который хочет заполучить противник, или предметом, без которого искатели приключений не преодолеют грядущие препятствия.
Обычно персонажи находят артефакты не так, как обычные магические предметы. Артефакты появляются только тогда, когда этого захотите вы, так как это скорее двигатели сюжета, чем просто магические предметы. Поиск и обнаружение артефакта часто может быть основной целью приключения. Персонажи должны будут собирать слухи, проходить испытания, и отправляться в опасные, полузабытые места, чтобы найти искомый артефакт. В качестве альтернативы, артефакт уже мог найти главный злодей. Поиск и уничтожение такого артефакта могут стать единственным методом, гарантирующим, что артефакт не будет использован во зло.
!!__''Свойства артефакта''__
У каждого артефакта есть свои магические свойства, так же как у других магических предметов, и эти свойства будут очень сильными. У артефакта могут также быть дополнительные свойства, как положительные, так и отрицательные. Можете выбрать такие свойства из таблиц в этом разделе, а можете определить их случайным образом. Вы можете также создать новые положительные и отрицательные свойства. Обычно эти свойства меняются каждый раз, когда артефакт появляется в мире.
У артефакта может быть до четырёх малых положительных свойств и до двух основных положительных свойств, а также до четырёх малых отрицательных свойств и до двух основных отрицательных свойств.
<<Button "$:/Малые положительные свойства""Малые положительные свойства">>
<<Button "$:/Основные положительные свойства""Основные положительные свойства">>
<<Button "$:/Малые отрицательные свойства""Малые отрицательные свойства">>
<<Button "$:/Основные отрицательные свойства""Основные отрицательные свойства">>
!!__''Уничтожение артефактов''__
Артефакты уничтожаются особым образом. К обычным видам урона они невосприимчивы.
У каждого артефакта есть уязвимость, с помощью которой его и можно уничтожить. Для того чтобы узнать эту уязвимость, могут потребоваться длительные исследования или успешное выполнение задания. Мастер сам решает, как можно уничтожить тот или иной артефакт. Ниже приводятся несколько вариантов:
* Артефакт должен быть расплавлен в вулкане, кузне или лаборатории, в которой его и создали.
* Артефакт следует утопить в реке Стикс.
* Артефакт должно проглотить и переварить древнее существо вроде тараска.
* Артефакт нужно искупать в крови бога или ангела.
* Артефакт следует ударить и раздробить особым оружием, созданным специально для этого.
* Артефакт должен быть раздавлен титаническими шестерёнками Механуса
* Артефакт следует вернуть его создателю, который уничтожит его одним касанием.
!!__''Примеры артефактов''__
Представленные здесь артефакты появляются в многочисленных мирах D&D. Используйте их в качестве руководства при создании своих артефактов, или можете изменять их так, как посчитаете нужным.
{{Глаз и Рука Векны}}
{{Книга восторженных деяний}}
{{Книга Мерзкой Тьмы}}
{{Меч Каса}}
{{Око Дракона}}
{{Топор Владык Дварфов}}
{{Палочка Оркуса}}
Вам нравится выступать на публике. Вы знаете, как их развлечь, очаровать и даже воодушевить. Ваша поэзия может трогать сердца слушателей, пробуждать в них горе или радость, смех или гнев. Ваша музыка ободряет их или заставляет скорбеть. Ваши танцы захватывают, а шутки всегда смешны. Чем бы вы ни занимались, ваша жизнь тесно связана с искусством.
;
:''Владение навыками:'' Акробатика, Выступление
:''Владение инструментами:'' Набор для грима, один вид музыкального инструмента
;
:''Снаряжение:'' Музыкальный инструмент (на ваш выбор), подарок от поклонницы (любовное письмо, локон волос или безделушка), костюм, поясной кошель с 15 зм
!!!''Номера артиста''
Хороший артист обладает разнообразными номерами. Выберите от одного до трёх амплуа из приведённой таблицы, чтобы определить, чем вы развлекаете публику.
<table>
<tr>
<th>к10</th>
<th>Амплуа</th>
<th>к10</th>
<th>Амплуа</th>
</tr>
<tr>
<td>1</td>
<td>Акробат</td>
<td>6</td>
<td>Пожиратель огня</td>
</tr>
<tr>
<td>2</td>
<td>Актёр</td>
<td>7</td>
<td>Поэт</td>
</tr>
<tr>
<td>3</td>
<td>Жонглёр</td>
<td>8</td>
<td>Рассказчик</td>
</tr>
<tr>
<td>4</td>
<td>Музыкант</td>
<td>9</td>
<td>Танцор</td>
</tr>
<tr>
<td>5</td>
<td>Певец</td>
<td>10</td>
<td>Шут</td>
</tr>
</table>
!!!''Умение: По многочисленным просьбам''
Вы всегда можете найти место для выступления. Обычно это таверна или постоялый двор, но это может быть цирк, театр или даже двор знатного господина. В этом месте вы получаете бесплатный постой и еду по скромным или комфортным стандартам (в зависимости от качества заведения), если вы выступаете каждый вечер. Кроме того, ваши выступления делают вас местной знаменитостью. Когда посторонние узнают вас в городе, в котором вы давали представление, они, скорее всего, будут к вам относиться хорошо.
!!!''Персонализация''
Успешные артисты могут овладевать вниманием публики, поэтому у них яркий или напористый характер. Они могут быть романтичными, и в искусстве и красоте часто обращаются к возвышенным идеалам.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Для любой ситуации я найду подходящий рассказ.</td>
</tr>
<tr>
<td>2</td>
<td>Куда бы я ни пришёл, я начинаю собирать местные слухи и распространять сплетни.</td>
</tr>
<tr>
<td>3</td>
<td>Я безнадёжный романтик, всегда ищущий «кого-то особого».</td>
</tr>
<tr>
<td>4</td>
<td>Никто не сердится на меня или возле меня подолгу, так как я могу разрядить любую напряжённую обстановку.</td>
</tr>
<tr>
<td>5</td>
<td>Мне нравятся оскорбления, даже если они направлены на меня.</td>
</tr>
<tr>
<td>6</td>
<td>Мне обидно, если я не нахожусь в центре внимания.</td>
</tr>
<tr>
<td>7</td>
<td>Превыше всего я ценю совершенство.</td>
</tr>
<tr>
<td>8</td>
<td>Моё настроение и намерения меняются так же быстро как ноты в музыке.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Красота. Выступая, я делаю мир лучше. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Традиции. Рассказы, легенды и песни прошлого не должны забываться, так как они учат нас тому, кто мы такие. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Творчество. Миру нужны новые идеи и смелые действия. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Жадность. Я занимаюсь всем этим ради денег и славы. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Народ. Мне нравится видеть улыбки на лицах во время выступления. В этом-то всё дело. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Честность. Искусство должно отражать душу; оно должно идти изнутри и показывать, чем мы являемся. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Мой инструмент — самое драгоценное, что у меня есть, и он напоминает мне о моей любви.</td>
</tr>
<tr>
<td>2</td>
<td>Кто-то украл мой драгоценный инструмент, и когда-нибудь я верну его.</td>
</tr>
<tr>
<td>3</td>
<td>Я хочу быть знаменитым, чего бы это ни стоило.</td>
</tr>
<tr>
<td>4</td>
<td>Я боготворю героя старых рассказов, и всегда сравниваю свои поступки с его.</td>
</tr>
<tr>
<td>5</td>
<td>Я всё сделаю, чтобы доказать превосходство над ненавистным конкурентом.</td>
</tr>
<tr>
<td>6</td>
<td>Я сделаю что угодно для других членов моей старой труппы.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я пойду на всё ради славы и известности.</td>
</tr>
<tr>
<td>2</td>
<td>Не могу устоять перед смазливым личиком.</td>
</tr>
<tr>
<td>3</td>
<td>Я не могу вернуться домой из-за скандала. Неприятности такого рода словно преследуют меня.</td>
</tr>
<tr>
<td>4</td>
<td>Однажды я высмеял дворянина, который всё ещё хочет оторвать мне голову. Это была ошибка, но я могу повторить её ещё неоднократно.</td>
</tr>
<tr>
<td>5</td>
<td>Я не могу скрывать свои истинные чувства. Острый язык всегда приносит мне неприятности.</td>
</tr>
<tr>
<td>6</td>
<td>Я очень стараюсь исправиться, но друзьям не стоит на меня полагаться.</td>
</tr>
</table>
!!!''Разновидность артиста: Гладиатор''
Гладиатор — такой же артист как менестрель или циркач, обученный превращать бой в искусство, от которого ликуют толпы. Вашим амплуа являются яркие сражения, хотя вы можете быть при этом акробатом или актёром. При использовании умения «По многочисленным просьбам» вы можете найти место для выступления в месте, где развлекают сражениями — арену гладиаторов или тайный бойцовский клуб. Вы можете заменить музыкальный инструмент в снаряжении на недорогое, но необычное оружие, такое как трезубец или сеть.
!!!''__Архетип плута__''
На 3 уровне вы выбираете архетип, который отображает ваши плутовские способности: вор, убийца или мистический ловкач. Подробности находятся в конце описания класса. Выбранный вами архетип предоставляет умения на 9, 13 и 17 уровнях.
!!!''__Архетип следопыта__''
На 3 уровне вы выбираете архетип, к которому вы стремитесь: охотник или повелитель зверей. Подробности этих архетипов приведены в конце описания класса. Выбранный вами архетип предоставляет умения на 3, 7, 11 и 15 уровнях.
!!''Архетипы плута''
У плутов много общих черт, включая их концентрацию на совершенствовании навыков, их выверенный и смертоносный подход к бою, и их выдающиеся рефлексы. Но разные плуты направляют эти таланты в разные воплощаемые архетипы. Ваш выбор архетипа является отражением вашей направленности, не обязательно свидетельствующей о выбранной профессии, но описывающий методы, которые вы предпочитаете.
<<Button "Вор (Плут)" "Вор">>
<<Button "Мистический ловкач (Плут)" "Мистический ловкач">>
<<Button "Убийца (Плут)" "Убийца">>
!!''Архетипы следопыта''
Идеалы следопыта могут вылиться в два пути: охотника и повелителя зверей
<<Button "Охотник (Следопыт)""Охотник">>
<<Button "Повелитель зверей (Следопыт)""Повелитель зверей">>
!!!''__Архидруид__''
"""На 20 уровне число применений Дикого облика не ограничено.
Кроме того, вы можете игнорировать соматический и вербальный компоненты заклинаний друида, а также материальные компоненты без указанной цены и не поглощаемые заклинанием. Это действует как в нормальном облике, так и в облике зверя."""
!!!__''Архифея''__
Ваш покровитель это лорд или леди фей. Существо из легенд, хранящее секреты, забытые ещё до возникновения смертных рас. Мотивы, движущие такими сущностями, непостижимы, причудливы, и могут диктоваться стремлением к величайшим магическим познаниям или вековыми обидами. Сущности такого рода включают Морозного Принца, Королеву Воздуха и Тьмы — правительницу Сумеречного Двора, Титанию из Летнего Двора, её супруга Оберона — Зелёного Лорда, Хирсама — Принца Дураков и древних карг.
!!!''Расширенный список заклинаний''
Архифея позволяет вам при изучении заклинаний колдуна выбирать из более широкого списка. В ваш список заклинаний колдуна добавляются следующие заклинания.
''Дополнительные заклинания архифеи''
<table>
<tr>
<th>Уровень заклинания</th>
<th>Заклинания</th>
</tr>
<tr>
<td>1</td>
<td>огонь фей, усыпление</td>
</tr>
<tr>
<td>2</td>
<td>воображаемая сила, умиротворение</td>
</tr>
<tr>
<td>3</td>
<td>мерцание, рост растений</td>
</tr>
<tr>
<td>4</td>
<td>высшая невидимость, подчинение зверя</td>
</tr>
<tr>
<td>5</td>
<td>подчинение личности, притворство</td>
</tr>
</table>
!!!''Фейская внешность''
"""Начиная с 1 уровня ваш покровитель дарует вам возможность демонстрировать притягательную и пугающую фейскую внешность. Вы действием можете заставить всех существ в 10-футовом кубе с центром на вас совершить спасбросок Мудрости со Сл ваших заклинаний колдуна. Все существа, провалившие спасбросок, становятся до конца вашего следующего хода очарованными или напуганными вами (на ваш выбор).
Использовав это умение, вы не можете использовать его снова, не завершив короткого либо продолжительного отдыха."""
!!!''Туманное исчезновение''
"""Начиная с 6 уровня, получив урон, вы можете раствориться облачком тумана. Если вы получили урон, вы можете реакцией стать невидимым и телепортироваться на расстоянии до 60 футов в видимое вами свободное пространство. Вы остаётесь невидимым до начала своего следующего хода, или пока не используете атаку или заклинание.
Использовав это умение, вы не можете использовать его снова, не завершив короткого либо продолжительного отдыха."""
!!!''Чарующая защита''
Начиная с 10 уровня ваш покровитель обучает вас, как обращать воздействующую на разум магию ваших врагов против них самих. Вы получаете иммунитет к состоянию очарованности, и если другое существо пытается очаровать вас, вы можете реакцией попытаться повернуть очарование против его создателя. Это существо должно преуспеть в спасброске Мудрости со Сл ваших заклинаний колдуна, иначе оно станет очаровано вами на 1 минуту, или пока не получит любой урон.
!!!''Тёмное исступление''
"""Начиная с 14 уровня вы можете погружать существ в иллюзорное пространство. Выберите действием видимое вами существо в пределах 60 футов от себя. Оно должно совершить спасбросок Мудрости со Сл ваших заклинаний колдуна. В случае провала оно очаровано или напугано вами (на ваш выбор) на протяжении 1 минуты, или пока вы не потеряете концентрацию (как если бы концентрировались на заклинании). Эффект завершается преждевременно, если существо получает любой урон.
Покуда иллюзия длится, существо считает, что оно потерялось в туманном пространстве, образ которого выбираете вы. Существо может видеть и слышать только себя, вас и иллюзию.
Использовав это умение, вы не можете использовать его снова, не завершив короткого либо продолжительного отдыха."""
//"""Халисстра открыла глаза и увидела, что плывёт по бескрайнему серебристому морю. Вдали неспешно ползли мягкие серые облака, в небе яростно извивались странные тёмные полосы, концы их были словно закреплены где-то непостижимо далеко, а середины отчаянно вращались, будто скакалки в детских руках. Она глянула вниз, любопытствуя, что удерживает её, и не увидела ничего, кроме того же странного перламутрового неба под ногами и вокруг.
Она глубоко вздохнула, поражённая этим зрелищем, и почувствовала, как лёгкие её заполнились чем-то более сладким и, пожалуй, чуть более плотным, чем воздух, но, вместо того чтобы поперхнуться или захлебнуться, она, похоже, вполне приспособилась к этому веществу. По всему её телу пробежала дрожь, она поняла, что сам процесс дыхания зачаровывает её."""//
<<AlignRight "— Ричард Бейкер, //Приговор//">>
Астральный План — мир мыслей и грёз, в котором гости путешествуют в виде бестелесных душ, пытаясь перейти во Внешние Планы. Это огромное серебристое море, одинаковое и над головой и под ногами, с белыми и серыми лоскутами, носящимися промеж сгустков света, подобных далёким звёздам. Большая часть Астрального Моря представляет собой пустые просторы. Гости могут наткнуться на окаменевший труп мёртвого бога или просто обломки скал, плывущие в серебристой пустоте. Часто встречаются цветные вихри — магические разноцветные диски из света, блестящие как крутящиеся монеты.
Существа на Астральном Плане не стареют и не страдают от голода и жажды. Именно поэтому гуманоиды, живущие на Астральном Плане (такие как гитиянки), создают заставы на других планах, часто, на Материальном Плане, чтобы их дети могли нормально взрослеть.
Путник на Астральном Плане может перемещаться, просто думая о перемещении, но расстояния здесь значат мало. В сражении скорость ходьбы существа (в футах) равна 3 х значение Интеллекта. Чем умнее существо, тем проще ему контролировать здесь своё перемещение.
!!__''Проекция в астрал''__
Путешествие в Астральный План посредством заклинания проекция в астрал включает в себя проецирование сюда сознания, обычно в поисках врат на один из Внешних Планов. Поскольку Внешние Планы это не только физические места, но и особые состояния духа, это позволяет персонажу появиться на Внешнем Плане как если бы он дошёл туда физически, но словно во сне.
Смерть такого персонажа — хоть на Астральном Плане, хоть на Внешнем Плане — не причиняет ему настоящий урон. Только разрубание серебряной нити во время нахождения на Астральном Плане (а также смерть беспомощного физического тела на Материальном Плане) могут убить персонажа по-настоящему. Таким образом, высокоуровневые персонажи иногда путешествуют на Внешние Планы при помощи проекции в астрал, не ища порталы и более прямолинейные заклинания.
Мало что может разрубить серебряную нить путника. Чаще всего это происходит из-за психического ветра (описан ниже). Легендарные серебряные мечи гитиянок тоже обладают таким свойством. Персонаж, путешествующий по Астральному Плану в своём собственном теле (посредством заклинания уход в иной мир или одного из редких порталов, ведущих прямиком сюда), лишён серебряной нити.
!!__''Цветные вихри''__
Врата, ведущие с Астрального Плана на другие планы, выглядят как двумерные цветные вихри, 1к6 × 10 футов диаметром. Для перехода на другой план требуется найти цветной вихрь, ведущий на желаемый план. Эти переходы на другие планы можно опознать по цвету, как показано в приведённой ниже таблице. Поиск вихря нужного цвета зависит от удачи: обычно это занимает 1к4 × 10 часов.
{{$:/Астральные цветные вихри}}
!!__''Психический ветер''__
Психический ветер отличается от того, что дует на Материальном Плане. Это ураган мыслей, сминающий сознание путников, а не их тела. Психический ветер состоит из утраченных воспоминаний, забытых идей, пустых дум и подсознательных страхов, сбившихся в единую массу и летающих по Астральному Плану.
Первым предвестником психического ветра является быстрое потемнение серебристо-серого неба. Через несколько раундов окрестности становятся тёмными как в безлунную ночь. Пока небеса темнеют, путник чувствует тряску, как если бы сам план сопротивлялся буре. Однако уже через несколько раундов, так же быстро, ветер исчезает, а небо становится обычным.
У психического ветра два эффекта: перемещающий и ментальный. Группа, путешествующая вместе, претерпевает один и тот же перемещающий эффект. Однако, каждый путник, попавший под действие ветра, должен также совершить спасбросок Интеллекта со Сл 15. При провале он подвергается также ментальному эффекту. Совершите бросок к20 два раза и сверьтесь с приведённой ниже таблицей, чтобы определить перемещающий и ментальный эффекты.
{{$:/Эффекты психического ветра}}
!!__''Сцены на Астральном Плане''__
По просторам Астрального Плана бродят планарные путешественники и беглецы с других планов. Самыми знаменитыми обитателями Астрального Плана являются гитиянки, беглая раса разбойников, «плавающих» на астральных кораблях, убивающая астральных путешественников и совершающая набеги на планы, граничащие с Астралом. Их город, Ту’нарат, парит в Астральном Плане, построенный на огромной скале, которая в действительности является телом мёртвого бога.
Небожители, исчадия и смертные исследователи часто посещают Астральный План в поисках цветных вихрей, ведущих в желаемое ими место. Персонажи, надолго остающиеся в Астрале, могут встретиться с ангелами, демонами, дьяволами, ночными каргами, юголотами и другими планарными путешественниками.
//3 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
От вас исходит аура живительной энергии с радиусом 30 футов. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Вы можете бонусным действием восстанавливать одному любому существу в ауре (включая себя) 2к6 хитов.
//4 уровень, Ограждение, Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 10 минут
От вас исходит защищающая жизнь аура с радиусом 30 футов. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Все невраждебные существа в ауре (включая вас) обладают сопротивлением к урону некротической энергией, и максимум их хитов не может уменьшаться. Кроме того, невраждебные живые существа восстанавливают 1 хит, когда начинают ход в этой ауре с 0 хитов.
!!!''__Аура защиты__''
"""Начиная с 6 уровня, если вы или дружественное существо в пределах 10 футов от вас должны совершить спасбросок, это существо получает бонус к спасброску, равный модификатору вашей Харизмы (минимальный бонус +1). Вы должны находиться в сознании, чтобы предоставлять этот бонус.
На 18 уровне дистанция этой ауры увеличивается до 30 футов."""
!!!''__Аура отваги__''
"""Начиная с 10 уровня, вы и дружественные существа в пределах 10 футов от вас не можете быть испуганы, пока вы находитесь в сознании.
На 18 уровне дистанция этой ауры увеличивается до 30 футов."""
//4 уровень, Ограждение, Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 10 минут
От вас исходит очищающая аура с радиусом 30 футов. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Все невраждебные существа в ауре (включая вас) не могут заболеть, имеют сопротивление к урону ядом и совершают с преимуществом спасброски от эффектов, вызывающих следующие состояния: глухота, испуг, ослепление, отравление, очарование, ошеломление и паралич.
//8 уровень, Ограждение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (крошечный контейнер, стоящий как минимум 1 000 зм, хранящий священную реликвию, такую как лоскут ткани с мантии святого или кусочек пергамента с религиозным текстом)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Божественный свет исходит от вас мягким сиянием в радиусе 30 футов. Пока заклинание активно, существа в этом радиусе, выбранные вами при накладывании этого заклинания, испускают тусклый свет в радиусе 5 футов и совершают все спасброски с преимуществом, а остальные существа совершают с помехой броски атаки по ним. Кроме того, если исчадие или нежить попадает по такому существу рукопашной атакой, аура вспыхивает ярким светом. Атакующий должен преуспеть в спасброске Телосложения, иначе станет ослеплённым, пока не окончится это заклинание.
Напевая, и перебирая пальцами по старинному монументу, найденному в заброшенных руинах, полуэльфийка в обветшалом кожаном доспехе перебирает знания, мелькающие в её голове, вызывая силой магии, заключённой в песне, людей, которые построили этот монумент и загадочное предание, которое он изображает.
Суровый человеческий воин ритмично ударяет своим мечом плашмя о доспех, задавая темп своего военного распева, вдохновляя спутников на отвагу и героизм. Магия его песни укрепляет и подбадривает их.
Смеясь, и настраивая свою цитру, девушка-гном накладывает тонкую магию на собравшихся дворян, гарантируя, что слова её спутников будут хорошо восприняты.
Неважно, кем является бард: учёным, скальдом или проходимцем; он плетёт магию из слов и музыки, вдохновляя союзников, деморализуя противников, манипулируя сознанием, создавая иллюзии, и даже исцеляя раны.
!!!''__Музыка и магия__''
В мирах D&D слова и музыка это не просто колебания воздуха, тут они содержат в себе силу. И бард является мастером речей, песен, и волшебства, заложенного в них. Барды говорят, что вся мультивселенная была вызвана к существованию и сформирована словами, которые произнесли боги. И отражения этих первородных Слов Творения до сих пор звучат в космосе. Музыка бардов это попытка уловить эти отзвуки и тонко вплести их в свои заклинания.
Наиболее сильной чертой бардов является их исключительная разносторонность. Многие барды предпочитают держаться не на передовой в бою, используя свою магию для вдохновения союзников и препятствования противникам на расстоянии. Но барды способны защищать себя и в ближнем бою, при необходимости используя магию для укрепления своих клинков и доспехов. Их заклинания чаще предназначены для очарования и создания иллюзий, а не для создания явных разрушений. Они обладают обширными знаниями во множестве тематик и естественные способности, которые позволяют им делать хорошо практически всё. Барды становятся мастерами в тех талантах, к которым стремятся их умы, оттачивая их до совершенства, от музыкальных выступлений до эзотерических знаний.
!!!''__Обучение на опыте__''
Истинные барды не являются обыденной вещью в мире. Не каждый менестрель, поющий в таверне, или шут, скачущий при королевском дворе, является бардом. Чтобы обнаружить скрытую в музыке магию, требуется тяжёлое обучение и некоторая степень природного таланта, чего большинству трубадуров и жонглёров недостаёт. Однако, определить разницу между этими исполнителями может быть трудно. Жизнь барда проходит в странствиях по землям и посвящена сбору знаний, повествованию историй, и существованию за счёт благодарности публики, как и у любого другого артиста. Но глубина знаний, уровень музыкального мастерства и связь с магией ставит бардов на другую ступень от их собратьев.
Барды редко селятся надолго в одном месте, и их естественная тяга к странствиям связана с поиском новых сказаний, обучением новым навыкам и открытию новых горизонтов, что делает карьеру искателя приключений для них естественным призванием. Каждое приключение — это возможность чему-то научиться, попрактиковать разные навыки, проникнуть в давно заброшенные гробницы, обнаружить утраченные произведения магии, расшифровать старые фолианты, пройтись по незнакомым местам, или столкнуться с экзотическими существами. Барды любят сопровождать героев, чтобы засвидетельствовать их свершения из первых рук. Бард, который может рассказать впечатляющую историю из личного опыта, зарабатывает известность среди других бардов. Более того, после повествования такого большого количества историй о великих свершениях героев, многие барды принимают их близко к сердцу и хотят принять роль героя сами.
{{Таблица развития Барда}}
{{Создание Барда}}
!!!''__Безвременное тело__''
Начиная с 18 уровня, пронизывающая вас природная магия замедляет старение. За каждые 10 лет ваше тело стареет только на 1 год.
!!!''__Безвременное тело__''
На 15 уровне ваша ци поддерживает вас, и ваше тело больше не подвержено признакам старения. Вы не можете быть состарены магически. Впрочем, вы всё ещё можете умереть от старости. Кроме того, вам больше не требуется еда и вода.
При создании персонажа вы можете совершить бросок по этой таблице, чтобы получить безделушку — небольшой предмет, немного окутанный тайной. Мастер тоже может использовать эту таблицу. Она поможет заполнить комнаты подземелий и карманы существ.
<table>
<tr>
<th>к100</th>
<th>Безделушка</th>
<th>к100</th>
<th>Безделушка</th>
</tr>
<tr>
<td>01</td>
<td>Мумифицированная рука гоблина</td>
<td>51</td>
<td>Мёртвый скарабей размером с ладонь</td>
</tr>
<tr>
<td>02</td>
<td>Кусочек кристалла, слабо светящийся в лунном свете</td>
<td>52</td>
<td>Два игрушечных солдатика, один без головы</td>
</tr>
<tr>
<td>03</td>
<td>Золотая монета, отчеканенная в неизвестной стране</td>
<td>53</td>
<td>Небольшая коробка с пуговицами разного размера</td>
</tr>
<tr>
<td>04</td>
<td>Дневник, написанный на неизвестном вам языке</td>
<td>54</td>
<td>Свеча, которая никак не загорается</td>
</tr>
<tr>
<td>05</td>
<td>Латунное кольцо, которое не темнеет со временем</td>
<td>55</td>
<td>Крохотная клетка без дверцы</td>
</tr>
<tr>
<td>06</td>
<td>Старая стеклянная шахматная фигура</td>
<td>56</td>
<td>Старый ключ</td>
</tr>
<tr>
<td>07</td>
<td>Пара игральных костей, у обеих вместо шестёрок нарисованы черепа</td>
<td>57</td>
<td>Не поддающаяся расшифровке карта сокровищ</td>
</tr>
<tr>
<td>08</td>
<td>Небольшой идол, изображающий страшное чудовище, насылающий кошмары, когда вы спите рядом с ним</td>
<td>58</td>
<td>Рукоятка от сломанного меча</td>
</tr>
<tr>
<td>09</td>
<td>Верёвочное ожерелье, на котором висят четыре мумифицированных эльфийских пальца</td>
<td>59</td>
<td>Кроличья лапка</td>
</tr>
<tr>
<td>10</td>
<td>Квитанция для получения посылки в неизвестном вам королевстве</td>
<td>60</td>
<td>Стеклянный глаз</td>
</tr>
<tr>
<td>11</td>
<td>30-граммовый кусочек неизвестного материала</td>
<td>61</td>
<td>Камея с резным портретом ужасного лица</td>
</tr>
<tr>
<td>12</td>
<td>Маленькая тряпичная кукла, утыканная иголками</td>
<td>62</td>
<td>Серебряный череп размером с монету</td>
</tr>
<tr>
<td>13</td>
<td>Зуб неизвестного зверя</td>
<td>63</td>
<td>Алебастровая маска</td>
</tr>
<tr>
<td>14</td>
<td>Огромная чешуйка, возможно, драконья</td>
<td>64</td>
<td>Пирамидка клейкого чёрного дурно пахнущего благовония</td>
</tr>
<tr>
<td>15</td>
<td>Ярко-зелёное перо</td>
<td>65</td>
<td>Ночной колпак, дарующий приятные сны</td>
</tr>
<tr>
<td>16</td>
<td>Старая гадальная карта с лицом, похожим на ваше</td>
<td>66</td>
<td>Один костяной калтроп</td>
</tr>
<tr>
<td>17</td>
<td>Стеклянная сфера, заполненная дымом</td>
<td>67</td>
<td>Золотая оправа монокля без линзы</td>
</tr>
<tr>
<td>18</td>
<td>Полукилограммовое яйцо с ярко-красной скорлупой</td>
<td>68</td>
<td>Кубик с длиной ребра 2 сантиметра, все стороны раскрашены в разные цвета</td>
</tr>
<tr>
<td>19</td>
<td>Курительная трубка, из которой вылетают пузыри</td>
<td>69</td>
<td>Хрустальная дверная ручка</td>
</tr>
<tr>
<td>20</td>
<td>Стеклянный графин с мутной жидкостью, в которой плавает странный кусочек мяса</td>
<td>70</td>
<td>Пакетик розовой пыли</td>
</tr>
<tr>
<td>21</td>
<td>Крошечная музыкальная шкатулка гномьей работы, наигрывающая мелодию, напоминающую вам о детстве</td>
<td>71</td>
<td>Два листа пергамента с фрагментом нот прекрасной песни</td>
</tr>
<tr>
<td>22</td>
<td>Маленькая деревянная статуэтка нарядного полурослика</td>
<td>72</td>
<td>Серебряная серьга в виде слезинки, сделанная из настоящей слезинки</td>
</tr>
<tr>
<td>23</td>
<td>Латунная сфера, покрытая странными рунами</td>
<td>73</td>
<td>Яичная скорлупа, разрисованная с жуткими подробностями сценами человеческих мук</td>
</tr>
<tr>
<td>24</td>
<td>Разноцветный каменный диск</td>
<td>74</td>
<td>Веер, на котором в раскрытом состоянии видно спящую кошку</td>
</tr>
<tr>
<td>25</td>
<td>Крошечный серебряный ворон</td>
<td>75</td>
<td>Набор костяных трубочек</td>
</tr>
<tr>
<td>26</td>
<td>Сумка, в которой лежат 47 человеческих зубов. Один с кариесом</td>
<td>76</td>
<td>Четырёхлистный клевер, засушенный в книге о манерах и этикете</td>
</tr>
<tr>
<td>27</td>
<td>Кусок обсидиана, всегда тёплый на ощупь</td>
<td>77</td>
<td>Лист пергамента, на котором изображена сложная механическая конструкция</td>
</tr>
<tr>
<td>28</td>
<td>Коготь дракона, подвешенный на простом кожаном шнурке</td>
<td>78</td>
<td>Разукрашенные ножны, под которые вы никак не можете найти подходящий клинок</td>
</tr>
<tr>
<td>29</td>
<td>Пара старых носков</td>
<td>79</td>
<td>Приглашение на вечеринку, на которой произошло убийство</td>
</tr>
<tr>
<td>30</td>
<td>Чистая книга, на страницах которой не получается писать ни чернилами, ни мелом, ни углём, и никакими другими обычными средствами</td>
<td>80</td>
<td>Бронзовая пентаграмма с выгравированной в центре крысиной головой</td>
</tr>
<tr>
<td>31</td>
<td>Серебряный значок в форме пятиконечной звезды</td>
<td>81</td>
<td>Фиолетовый носовой платок с вышитым именем великого архимага</td>
</tr>
<tr>
<td>32</td>
<td>Нож, принадлежавший родственнику</td>
<td>82</td>
<td>Половинка плана храма, замка или другого строения</td>
</tr>
<tr>
<td>33</td>
<td>Стеклянный флакон с обрезками ногтей</td>
<td>83</td>
<td>Кусочек сложенной ткани, который, если развернуть, превращается в модную кепку</td>
</tr>
<tr>
<td>34</td>
<td>Прямоугольное металлическое устройство с двумя крошечными металлическими колпачками на одной стороне. Если его намочить, оно сыпет искры</td>
<td>84</td>
<td>Квитанция о депозите в банке далёкого города</td>
</tr>
<tr>
<td>35</td>
<td>Белые перчатки с блёстками</td>
<td>85</td>
<td>Дневник, в котором не хватает семь страниц</td>
</tr>
<tr>
<td>36</td>
<td>Одеяние с сотней крохотных карманов</td>
<td>86</td>
<td>Пустая серебряная табакерка с надписью на поверхности «грёзы»</td>
</tr>
<tr>
<td>37</td>
<td>Маленький каменный кирпич, который ничего не весит</td>
<td>87</td>
<td>Железный святой символ неизвестного божества</td>
</tr>
<tr>
<td>38</td>
<td>Крохотный набросок портрета гоблина</td>
<td>88</td>
<td>Книга о восхождении и свержении легендарного героя, в которой нет последней главы</td>
</tr>
<tr>
<td>39</td>
<td>Пустой флакон, пахнущий духами при открытии</td>
<td>89</td>
<td>Сосуд с драконьей кровью</td>
</tr>
<tr>
<td>40</td>
<td>Драгоценный камень, который всем кроме вас кажется куском угля</td>
<td>90</td>
<td>Древняя эльфийская стрела</td>
</tr>
<tr>
<td>41</td>
<td>Кусок старого знамени</td>
<td>91</td>
<td>Иголка, которая никогда не гнётся</td>
</tr>
<tr>
<td>42</td>
<td>Знак различия древнего легиона</td>
<td>92</td>
<td>Красивая дварфская брошь</td>
</tr>
<tr>
<td>43</td>
<td>Крохотный серебряный колокольчик без язычка</td>
<td>93</td>
<td>Пустая бутылка из-под вина с небольшой наклейкой «Винокурня Винного Волшебника, Красное драконье, 331422-В»</td>
</tr>
<tr>
<td>44</td>
<td>Механическая канарейка в гномьей лампе</td>
<td>94</td>
<td>Плитка мозаики с разноцветной глазированной поверхностью</td>
</tr>
<tr>
<td>45</td>
<td>Крохотный сундук, вырезанный так, что кажется, что у него невероятно глубокое дно</td>
<td>95</td>
<td>Окаменевшая мышь</td>
</tr>
<tr>
<td>46</td>
<td>Мёртвый спрайт в чистой стеклянной бутылке</td>
<td>96</td>
<td>Чёрный пиратский флаг с черепом и костями дракона</td>
</tr>
<tr>
<td>47</td>
<td>Запаянная металлическая банка, в которой, судя по звукам, находится жидкость, песок, пауки или битое стекло (на ваш выбор)</td>
<td>97</td>
<td>Крохотный металлический краб или паук, который двигается, когда на него не смотрят</td>
</tr>
<tr>
<td>48</td>
<td>Стеклянная сфера с водой, в которой плавает механическая золотая рыбка</td>
<td>98</td>
<td>Стеклянная бутылка сала с этикеткой «Жир грифона»</td>
</tr>
<tr>
<td>49</td>
<td>Серебряная ложка с выгравированной на ручке буквой «М»</td>
<td>99</td>
<td>Деревянная коробка с керамическим дном, в которой живёт червяк с двумя головами на каждом конце тела</td>
</tr>
<tr>
<td>50</td>
<td>Свисток из дерева золотого цвета</td>
<td>100</td>
<td>Металлическая урна с прахом героя</td>
</tr>
</table>
//1 уровень, Иллюзия, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок овечьей шерсти)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте образ предмета, существа или другого видимого явления, помещающийся в объёме в куб с длиной ребра 15 футов. Образ появляется в точке, которую вы видите в пределах дистанции, и существует, пока активно заклинание. Это исключительно зрительная иллюзия, не сопровождаемая звуками, запахами и прочими сенсорными эффектами.
Вы можете действием заставить образ переместиться в любое место в пределах дистанции. Пока образ меняет местоположение, вы можете изменять его внешность, чтобы перемещение выглядело естественным. Например, если вы создаёте образ существа и перемещаете его, вы можете изменить образ, чтобы казалось, что оно идёт.
Физическое взаимодействие с образом даёт понять, что это иллюзия, потому что сквозь него всё проходит. Существа, исследующие образ действием, могут определить, что это иллюзия, совершив успешную проверку Интеллекта (Анализ) против Сл ваших заклинаний. Если существо распознаёт иллюзию, оно может видеть сквозь неё."""
!!!__''Безрассудная атака''__
Начиная со 2 уровня вы способны отбросить любую заботу о защите, чтобы атаковать ожесточённо и безрассудно. Когда вы совершаете первую атаку в свой ход, вы можете решить, что будете атаковать безрассудно. Решившись на это, вы в этом ходу совершаете рукопашные атаки оружием, использующие Силу, с преимуществом, но все броски атаки по вам до вашего следующего хода тоже совершаются с преимуществом.
В обычных кампаниях персонажи не сходят с ума от ужасов, с которыми им доведётся встретиться, и ежедневной резни, но иногда стресс от такой жизни становится невыносимым. Если в вашей
кампании прослеживается тема ужаса, вы можете использовать правила безумия, чтобы усилить эту тему, подчеркнув жуткий характер угроз, с которыми встречаются искатели приключений.
!!__''Схождение с ума''__
Разнообразные магические эффекты могут обрекать на безумие даже стойкие умы. Некоторые заклинания, такие как связь с иным миром и знак, могут насылать безумие, и вы можете использовать приведённые здесь правила вместо тех, что описаны в эффекте этих заклинаний. Болезни, яды и планарные эффекты, такие как психический ветер Астрала и воющие ветра Пандемониума тоже могут насылать безумие. Некоторые артефакты ломают психику персонажей, использующих их или настраивающихся на них.
Сопротивление насылающему безумие эффекту обычно требует спасброска Мудрости или Харизмы. Если в вашей игре присутствует характеристика Здравомыслие (смотрите в главе 9), существа могут вместо этого совершать спасбросок Здравомыслия.
!!__''Эффекты безумия''__
Безумие может быть кратковременным, долговременным или бессрочным. Большая часть относительно обычных эффектов причиняет кратковременное безумие, которое длится лишь несколько минут. Более ужасные или суммируемые эффекты могут привести к долговременному или бессрочному безумию.
Под действием кратковременного безумия персонаж находится 1к10 минут.
Под действием долговременного безумия персонаж находится 1к10 х 10 часов.
Персонаж, находящийся под действием бессрочного безумия, получает новую слабость из соответствующей таблицы, пока не будет исцелён.
!!!!''Кратковременное безумие''
<table>
<tr>
<th class="SpecHead2">к100<br></th>
<th>Эффект (длится 1к10 минут)</th>
</tr>
<tr>
<td>01–20</td>
<td>Персонаж уходит в себя и становится парализованным. Эффект оканчивается, если персонаж получает урон.</td>
</tr>
<tr>
<td>21–30</td>
<td>Персонаж становится недееспособным и всё время, пока безумен, кричит, смеётся или плачет.</td>
</tr>
<tr>
<td>31–40</td>
<td>Персонаж становится испуганным и в каждом раунде должен тратить и действие и перемещение на то, чтобы бежать от источника страха.</td>
</tr>
<tr>
<td>41–50</td>
<td>Персонаж начинает что-то невнятно бормотать и не может ни нормально общаться, ни накладывать заклинания.</td>
</tr>
<tr>
<td>51–60</td>
<td>Персонаж должен в каждом раунде действием атаковать ближайшее существо.</td>
</tr>
<tr>
<td>61–70</td>
<td>Персонаж видит яркие галлюцинации и совершает с помехой проверки характеристик.</td>
</tr>
<tr>
<td>71–75</td>
<td>Персонаж выполняет всё, что ему говорят, если это не суицидальный приказ.</td>
</tr>
<tr>
<td>76–80</td>
<td>Персонаж испытывает непреодолимое желание есть что-то странное, такое как грязь, слизь или отбросы.</td>
</tr>
<tr>
<td>81–90</td>
<td>Персонаж ошеломлён.</td>
</tr>
<tr>
<td>91–100</td>
<td>Персонаж теряет сознание.</td>
</tr>
</table>
!!!!''Долговременное безумие''
<table>
<tr>
<th class="SpecHead2">к100</th>
<th>Эффект (длится 1к10 минут)</th>
</tr>
<tr>
<td>01–10</td>
<td>Персонаж чувствует непреодолимое желание повторять одни и те же действия, например, мыть руки, трогать вещи, молиться или считать</td>
</tr>
<tr>
<td>11–20</td>
<td>Персонаж видит яркие галлюцинации и совершает с помехой проверки характеристик.</td>
</tr>
<tr>
<td>21–30</td>
<td>Персонаж страдает от сильной паранойи. Он совершает с помехой проверки Мудрости и Харизмы.</td>
</tr>
<tr>
<td>31–40</td>
<td>Персонаж считает нечто (обычно, источник безумия) ужасно отвратительным, как если бы он находился под эффектом «антипатия» заклинания антипатия/симпатия.</td>
</tr>
<tr>
<td>41–45</td>
<td>Персонаж испытывает сильное заблуждение. Выберите зелье. Персонаж считает, что находится под действием этого зелья.</td>
</tr>
<tr>
<td>46–55</td>
<td>Персонаж становится привязанным к «талисману» — персоне или предмету — и совершает с помехой броски атаки, проверки характеристик и спасброски, когда находится более чем в 30 футах от него.</td>
</tr>
<tr>
<td>56–65</td>
<td>Персонаж становится слепым (25%) или глухим (75%).</td>
</tr>
<tr>
<td>66–75</td>
<td>Персонаж испытывает неконтролируемую дрожь или тик, из-за чего совершает с помехой броски атаки, проверки характеристик и спасброски, зависящие от Силы или Ловкости.</td>
</tr>
<tr>
<td>76–85</td>
<td>Персонаж страдает от частичной амнезии. Персонаж помнит, кем он является, и сохраняет расовые особенности и классовые умения, но не узнаёт других существ или ничего не помнит до момента наступления сумасшествия.</td>
</tr>
<tr>
<td>86–90</td>
<td>Каждый раз, когда персонаж получает урон, он должен преуспеть в спасброске Мудрости со Сл 15, иначе он попадёт под действие заклинания смятение, как будто провалив спасбросок от него. Эффект смятения длится 1 минуту.</td>
</tr>
<tr>
<td>91–95</td>
<td>Персонаж теряет способность говорить.</td>
</tr>
<tr>
<td>96–00</td>
<td>Персонаж теряет сознание. Ни тряска, ни урон не могут его привести в чувство.</td>
</tr>
</table>
!!!!''Бессрочное безумие''
<table>
<tr>
<th class="SpecHead2">к100 </th>
<th>Слабость (длится до исцеления)</th>
</tr>
<tr>
<td>01–15</td>
<td>«Пока я пьян, я мыслю здраво»</td>
</tr>
<tr>
<td>16–25</td>
<td>«Я храню всё, что нахожу»</td>
</tr>
<tr>
<td>26–30</td>
<td>«Я хочу походить на того, кого хорошо знаю — я перенимаю его стиль в одежде, привычки и даже имя»</td>
</tr>
<tr>
<td>31–35 </td>
<td>«Я должен искажать факты, преувеличивать и откровенно лгать, чтобы быть интересным для других»</td>
</tr>
<tr>
<td>36–45 </td>
<td>«Меня интересует только достижение моей цели, и я игнорирую всё, лишь бы её достичь»</td>
</tr>
<tr>
<td>46–50</td>
<td>«Мне трудно заботиться о том, что происходит <br>вокруг меня»</td>
</tr>
<tr>
<td>51–55</td>
<td>«Мне не нравится то, как люди меня всё время <br>оценивают»</td>
</tr>
<tr>
<td>56–70 </td>
<td>«Я самый умный, самый мудрый, самый сильный, самый быстрый и самый красивый из всех, кого я <br>знаю»</td>
</tr>
<tr>
<td>71–80 </td>
<td>«Я убеждён, что за мной охотятся мощные враги, и повсюду находятся их агенты. Я уверен, что все они за мной постоянно следят»</td>
</tr>
<tr>
<td>81–85 </td>
<td>«Я могу доверять только одному другу. И этого особого друга вижу только я»</td>
</tr>
<tr>
<td>86–95 </td>
<td>«Я не могу ничего воспринимать всерьёз. Чем серьёзнее ситуация, тем более смешной она мне кажется»</td>
</tr>
<tr>
<td>96–100 </td>
<td>«Я понял, что мне очень нравится убивать живых существ»</td>
</tr>
</table>
!!__''Лечение безумия''__
Заклинание умиротворение может подавить действие безумия, а заклинание малое восстановление может избавить от краткосрочного или долговременного безумия. В зависимости от источника безумия, могут помочь заклинания снятие проклятья или рассеивание зла. От бессрочного безумия может помочь заклинание высшее восстановление или более сильная магия.
"""Вы выросли на улице в бедности и одиночестве, лишённые родителей. Никто не присматривал и не заботился о вас, и вам пришлось научиться делать это самому. Вам приходилось постоянно бороться за еду и следить за другими неприкаянными душами, способными обокрасть вас. Вы спали на чердаках и в переулках, мокли под дождём и боролись с болезнями, не получая медицинской помощи или приюта. Вы выжили, невзирая на все трудности, и сделали это благодаря своей сноровке, силе или скорости.
Вы начинаете приключение с суммой денег, достаточной, чтоб скромно, но уверенно прожить десять дней. Как вы получили эти деньги? Что позволило вам перейти к нормальной жизни, преодолев нищету?"""
;
:''Владение навыками:'' Ловкость рук, Скрытность
:''Владение инструментами:'' Воровские инструменты, набор для грима
;
:''Снаряжение:'' Маленький нож, карта города, в котором вы выросли, ручная мышь, безделушка в память о родителях, комплект повседневной одежды, поясной кошель с 10 зм
!!!''Умение: Городские тайны''
Вы знаете тайные лазы и проходы городских улиц, позволяющие пройти там, где другие не увидят пути. Вне боя вы (и ведомые вами союзники) можете перемещаться по городу вдвое быстрее обычного.
!!!''Персонализация''
Жизнь в нищете оставляет свой отпечаток на беспризорниках. В них, как правило, сильна привязанность к людям, с которыми они делили тяготы уличной жизни, или они исполнены желанием добиться лучшей доли, и, возможно, расквитаться с богачами, от которых они натерпелись.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>В моих карманах полно побрякушек и объедков.</td>
</tr>
<tr>
<td>2</td>
<td>Я задаю очень много вопросов.</td>
</tr>
<tr>
<td>3</td>
<td>Я часто забиваюсь в узкие закутки, где никто не сможет добраться до меня.</td>
</tr>
<tr>
<td>4</td>
<td>Я всегда сплю, прижавшись спиной к стене или дереву, сжимая узелок со всеми своими пожитками в руках.</td>
</tr>
<tr>
<td>5</td>
<td>Я не воспитан, и ем как свинья.</td>
</tr>
<tr>
<td>6</td>
<td>Я убеждён, что все, кто проявляют доброту ко мне, на самом деле скрывают злые намерения.</td>
</tr>
<tr>
<td>7</td>
<td>Я не люблю мыться.</td>
</tr>
<tr>
<td>8</td>
<td>Я прямо говорю о том, на что прочие предпочитают лишь намекнуть, или промолчать.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Уважение. Все люди, богатые ли они, или бедные, достойны уважения. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Общность. Вы должны заботиться друг о друге, ведь никто другой этого не сделает. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Перемены. Убогие возвысятся, а великие падут. Перемены в природе вещей. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Возмездие. Нужно показать богачам, чего стоит жизнь и смерть в трущобах. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Люди. Я помогаю тем, кто помогает мне. Это позволяет нам выжить. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Устремление. Я готов доказать, что достоин лучшей жизни. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Мой город или деревня это мой дом, и я буду защитить его.</td>
</tr>
<tr>
<td>2</td>
<td>Я спонсирую приют, чтобы оградить других от того, что пришлось пережить мне.</td>
</tr>
<tr>
<td>3</td>
<td>Я выжил лишь благодаря другому беспризорнику, что передал мне знания, как вести себя на улицах.</td>
</tr>
<tr>
<td>4</td>
<td>Я в неоплатном долгу перед человеком, что сжалился и помог мне.</td>
</tr>
<tr>
<td>5</td>
<td>Я избавился от нищеты, ограбив важного человека, и меня разыскивают.</td>
</tr>
<tr>
<td>6</td>
<td>Никто не должен пережить те трудности, через которые пришлось пройти мне.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Если я в меньшинстве, то я убегу из битвы.</td>
</tr>
<tr>
<td>2</td>
<td>Золото в любом виде выглядит для меня как большая куча денег, и я сделаю всё, чтобы его у меня стало больше.</td>
</tr>
<tr>
<td>3</td>
<td>Я никогда не доверяю полностью кому бы то ни было, кроме себя.</td>
</tr>
<tr>
<td>4</td>
<td>Я предпочту убить кого-нибудь во сне, нежели в честном поединке.</td>
</tr>
<tr>
<td>5</td>
<td>Это не воровство, если я взял то, в чём нуждаюсь больше, чем кто-либо другой.</td>
</tr>
<tr>
<td>6</td>
<td>Те, кто не могут позаботиться о себе, получат то, что заслужили.</td>
</tr>
</table>
//2 уровень, Ограждение, Друид/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (пепел от сожжённого листа омелы и еловая ветка)
:''Длительность:'' Концентрация, вплоть до 1 часа
От вас начинает исходить покров теней и тишины, скрывающий вас и ваших спутников от обнаружения. Пока заклинание активно, все существа, выбранные вами в пределах 30 футов (включая вас) получают бонус +10 к проверкам Ловкости (Скрытность), и их нельзя выследить без помощи магии. Существо, получившее этот бонус, не оставляет за собой следов.
!!!__''Бессознательный''__
* Находящееся без сознания существо «недееспособно» (см. состояние), не способно перемещаться и говорить, а также не осознаёт своё окружение.
* Существо роняет всё, что держит, и падает ничком.
* Существо автоматически проваливает спасброски Силы и Ловкости.
* Броски атаки по существу совершаются с преимуществом.
* Любая атака, попавшая по такому существу, считается критическим попаданием, если нападающий находится в пределах 5 футов от него.
"""Вы знаете, что такое богатство, власть и привилегии. У вас благородный титул, а ваша семья владеет землями, собирает налоги, и обладает серьёзным политическим влиянием. Вы можете быть изнеженным аристократом, незнакомым с работой и неудобствами, бывшим торговцем, только-только получившим титул, или лишённым наследства негодяем с гипертрофированным чувством собственного права. Или же вы можете быть честным, трудолюбивым землевладельцем, искренне заботящимся о тех, кто живёт и трудится на его земле, ощущая за них ответственность.
Придумайте вместе с Мастером надлежащий титул и определите, какую власть этот титул даёт. Благородный титул не существует сам по себе — он связан со всей вашей семьёй, и каким бы титулом вы ни обладали, вы передадите его своим детям. Вам нужно не только определить титул, но также описать вместе с Мастером вашу семью и её влияние на вас.
Ваша семья старая и прославленная, или она основана недавно? Каким влиянием она обладает, и в какой области? Какая репутация у вашей семьи среди прочих местных аристократов? Как к вам относятся обыватели?
Какое место занимаете вы в своей семье? Являетесь ли вы наследником главы семейства? Перешёл ли к вам уже титул? Как вы относитесь к этой ответственности? Или вы так далеки от получения наследства, что всем всё равно, чем вы там занимаетесь, лишь бы не во вред семье? Как глава вашего семейства относится к вашей карьере искателя приключений? Вы в милости, или родственники сторонятся вас?
Есть ли у вашей семьи герб? Есть ли у вас кольцо с печатью? Может, вы одеты в особые цвета? Есть ли животное, считающееся символом вашей родословной или духовным наставником?
Такие детали помогут сформировать образ вашей семьи в контексте мира и кампании."""
;
:''Владение навыками:'' История, Убеждение
:''Владение инструментами:'' Один игровой набор
:''Языки:'' Один на ваш выбор
;
:''Снаряжение:'' Комплект отличной одежды, кольцо-печатка, свиток с генеалогическим древом, кошелёк с 25 зм
!!!''Умение: Привилегированность''
Благодаря знатному происхождению, другие хорошо к вам относятся. Вас принимают в высшем обществе, и считается, что у вас есть право посещать любые места. Обыватели изо всех сил стараются сделать вам приятно и избежать вашего гнева, а другие высокородные считают вас своей ровней. Если нужно, вы можете получить аудиенцию местного дворянина.
!!!''Персонализация''
Благородные рождаются и растут в особом окружении, и их личность несёт отпечаток этого воспитания. Благородный титул идёт вкупе с множеством обязательств — ответственностью перед семьёй, другими благородными (включая короля), народом, доверенным вашей семье, и даже перед самим титулом. Все эти обязательства другие могут использовать против вас.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я применяю так много лести, что все, с кем я разговариваю, чувствуют себя самыми чудесными и важными персонами в мире.</td>
</tr>
<tr>
<td>2</td>
<td>Обыватели любят меня за доброту и великодушие.</td>
</tr>
<tr>
<td>3</td>
<td>Один лишь взгляд на мои регалии заставляет перестать сомневаться в том, что я выше немытого отребья.</td>
</tr>
<tr>
<td>4</td>
<td>Я много трачу на то, чтобы выглядеть потрясающе, и по последнему слову моды.</td>
</tr>
<tr>
<td>5</td>
<td>Мне не нравится марать руки, и я не хочу умереть в каком-нибудь неподобающем месте.</td>
</tr>
<tr>
<td>6</td>
<td>Несмотря на благородное рождение, я не ставлю себя выше народа. У всех нас течёт одинаковая кровь.</td>
</tr>
<tr>
<td>7</td>
<td>Потеряв мою милость, обратно её не вернёшь.</td>
</tr>
<tr>
<td>8</td>
<td>Оскорбишь меня, и я сотру тебя в порошок, уничтожу твоё имя, и сожгу твои поля.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Уважение. Уважение — мой долг. Кем бы ты ни был, к другим нужно относиться с уважением, невзирая на их происхождение. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Ответственность. Я должен уважать тех, кто выше меня, а те, кто ниже меня, должны уважать меня. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Независимость. Я должен доказать, что справлюсь и без заботы своей семьи. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Власть. Если соберу много власти, никто не посмеет указывать мне, что делать. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Семья. Настоящая кровь гуще. (Любое)</td>
</tr>
<tr>
<td>6</td>
<td>Благородный долг. Я должен защищать тех, кто ниже меня, и заботиться о них. (Добрый)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я пойду на любой риск, лишь бы заслужить признание семьи.</td>
</tr>
<tr>
<td>2</td>
<td>Союз моего дома с другой благородной семьёй нужно поддерживать любой ценой.</td>
</tr>
<tr>
<td>3</td>
<td>Нет никого важнее других членов моей семьи.</td>
</tr>
<tr>
<td>4</td>
<td>Я влюблён в наследницу семейства, презираемого моей роднёй.</td>
</tr>
<tr>
<td>5</td>
<td>Моя преданность правителю непоколебима.</td>
</tr>
<tr>
<td>6</td>
<td>Обыватели должны считать меня своим героем.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я втайне считаю всех ниже себя.</td>
</tr>
<tr>
<td>2</td>
<td>Я скрываю позорную тайну, которая может уничтожить мою семью.</td>
</tr>
<tr>
<td>3</td>
<td>Я слишком часто слышал завуалированные оскорбления и угрозы, и потому быстро впадаю в гнев.</td>
</tr>
<tr>
<td>4</td>
<td>У меня неустанная страсть к плотским удовольствиям.</td>
</tr>
<tr>
<td>5</td>
<td>Весь мир вращается вокруг меня.</td>
</tr>
<tr>
<td>6</td>
<td>Я часто навлекаю позор на свою семью словами и действиями.</td>
</tr>
</table>
!!!''Разновидность благородного: Рыцарь''
"""Во многих обществах рыцари — низший слой благородного сословия, но это всё равно путь в высший свет. Если хотите быть рыцарем, возьмите умение Слуги (смотрите во врезке) вместо Привилегированности. Один из ваших слуг заменяется сквайром, помогающим вам, и при этом учащимся рыцарству. Двое оставшихся могут ухаживать за вашим конём и доспехом (а также они будут помогать его надевать).
Будучи символом благородства и идеалом галантной любви, вы можете добавить в снаряжение знамя или подарок от леди, которой вы вручили своё сердце (она может быть вашей привязанностью)."""
<<<
!!!''Альтернативное умение: Слуги''
Если у вашего персонажа предыстория благородного, вы можете выбрать это умение вместо Привилегированности. На вас работают трое слуг, преданных вашей семье. Это могут быть помощники и слуги, а один может быть дворецким. Это обыватели, выполняющие за вас простую работу, но они не будут за вас сражаться, не пойдут за вами в опасные места (такие как подземелья), и они покинут вас, если их будут подвергать опасности или с ними будут плохо обращаться.
<<<
//1 уровень, Очарование, Жрец/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (капля святой воды)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы благословляете до трёх существ на свой выбор в пределах дистанции. Каждый раз, когда до окончания заклинания цель совершает бросок атаки или спасбросок, она может бросить к4 и добавить выпавшее число к результату.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше первого.
Богатство в мирах D&D принимает разные формы. Благосостояние вашего персонажа может отражаться монетами, драгоценными камнями, товарами, предметами искусства, животными и прочим имуществом. Крестьяне торгуют товарами, обменивают одни вещи на другие и платят налоги зерном и сыром. Дворяне торгуют либо правами, такими как право на добычу ископаемых, право строить или заниматься фермерством, либо золотыми слитками, которые заменяют им монеты. С монетами обычно имеют дело только торговцы, искатели приключений и те, кто оказывают профессиональные услуги за плату.
!!!__''Монеты''__
"""Монеты делают разного номинала, основываясь на относительной стоимости металла, из которого они изготовлены. Чаще всего встречаются монеты трёх видов: золотые монеты (зм), серебряные монеты (см) и медные монеты (мм).
На одну золотую монету персонаж может купить поясной кошель, 50 футов хорошей верёвки или козу. Опытный (но не виртуозный) ремесленник может зарабатывать одну золотую монету в день. Золотая монета — стандартная единица измерения богатства, даже если при этом сами монеты не используются. Когда торговцы обсуждают сделки, товары и услуги, стоящие сотни тысяч золотых монет, обмен таким бешеным количеством монет не происходит. Просто это единица измерения богатства, и настоящий обмен производится золотыми слитками, кредитными письмами и ценными товарами.
Одна золотая монета стоит десять серебряных монет, распространённых среди обывателей. Серебряная монета оплачивает один день чернорабочего, флягу лампового масла или одну ночь на захудалом постоялом дворе.
Одна серебряная монета стоит десять медных монет, распространённых среди чернорабочих и нищих. За одну медную монету можно купить свечу, факел или кусочек мела.
Иногда в грудах сокровищ попадаются необычные монеты, сделанные из других драгоценных металлов. Монеты из электрума (эм) и платины (пм) были в обращении в древних империях и королевствах, и при оплате ими они иногда вызывают подозрения. Монета из электрума стоит пять серебряных монет, а из платины — десять золотых.
Стандартная монета весит 9 грамм, так что пятьдесят любых монет весят полкилограмма или 1 фунт."""
''Стандартные нормы обмена''
<table>
<tr>
<th>Монета</th>
<th>мм</th>
<th>см</th>
<th>эм</th>
<th>зм</th>
<th>пм</th>
</tr>
<tr>
<td>Медная (мм)</td>
<td>1</td>
<td>1/10</td>
<td>1/50</td>
<td>1/100</td>
<td>1/1 000</td>
</tr>
<tr>
<td>Серебряная (см)</td>
<td>10</td>
<td>1</td>
<td>1/5</td>
<td>1/10</td>
<td>1/100</td>
</tr>
<tr>
<td>Электрумовая (эм)</td>
<td>50</td>
<td>5</td>
<td>1</td>
<td>1/2</td>
<td>1/20</td>
</tr>
<tr>
<td>Золотая (зм)</td>
<td>100</td>
<td>10</td>
<td>2</td>
<td>1</td>
<td>1/10</td>
</tr>
<tr>
<td>Платиновая (пм)</td>
<td>1 000</td>
<td>100</td>
<td>20</td>
<td>10</td>
<td>1</td>
</tr>
</table>
!!!__''Продажа сокровищ''__
"""В подземельях, которые вы исследуете, могут попадаться сокровища, снаряжение, оружие, доспехи и другие вещи. Обычно сокровища и безделушки продаются по возвращении в город или другое поселение, при условии, что вы найдёте покупателей, заинтересованных в вашем товаре.
//''Доспехи, оружие и прочее снаряжение.''// Обычно оружие, доспехи и прочее снаряжение без видимых дефектов продаётся за половину стоимости. Оружие и доспехи чудовищ редко находятся в пригодном для продажи состоянии.
//''Магические предметы.''// Продажа магического предмета — дело нелёгкое. Можно найти кого-то, кто купит зелье или свиток, но остальные предметы по карману только самым богатым дворянам. И наоборот, вы не найдёте в свободной продаже магических предметов и заклинаний кроме нескольких самых распространённых видов. Стоимость магических предметов гораздо больше золота, и это не стоит забывать.
//''Драгоценные камни, ювелирные изделия и предметы искусства.''// Эти предметы продаются на рынке за их полную стоимость, и вы можете их либо обменять на денежный эквивалент, либо использовать вместо валюты. Если сокровище очень ценное, то Мастер может потребовать, чтобы вы вначале нашли подходящего покупателя.
//''Товары.''// На пограничье многие ведут натуральный обмен. Так же как драгоценные камни, товары (железные слитки, мешки с солью, домашний скот) продаются на рынке за полную стоимость и могут использоваться как валюта."""
!''Боги в вашем мире''
Приложение «Б» Книги игрока предлагает несколько пантеонов (свободных скоплений божеств, не объединённых общей доктриной или философией) для использования в вашей игре, включая богов из уже готовых миров D&D и фэнтезийно-исторических пантеонов. При желании вы можете адаптировать один из этих пантеонов для своей кампании, или выбрать уже готовых богов и идеи. Для примера, взгляните на раздел «образец пантеона».
Что касается игровых правил, то не имеет значения, имеет ваш мир сотню богов или одну церковь, поклоняющуюся одному богу. По правилам, жрецы выбирают домен, а не божество, так что ваш мир может ассоциировать домены с богами любым удобным для вас способом.
!!__''Свободные пантеоны''__
Большинство миров D&D имеет свободные пантеоны богов. Множество богов правят различными аспектами бытия, по-разному объединяясь и конкурируя друг с другом с целью управления вселенной. Люди собираются в публичных храмах и поклоняются богами жизни и мудрости, или встречаются в скрытых местах, чтобы почтить богов разложения и разрушения.
Каждый бог в пантеоне имеет свою идеологию, и он ответственен за её продвижение в массы. В мире Серого Ястреба, Хиронеус — бог доблести и чести, который призывает на службу паладинов и жрецов, и воодушевляет их на несение идей честной войны, рыцарства и справедливости в обществе. Даже ведя бесконечную войну со своим братом Хекстором, богом войны и тирании, Хиронеус не забывает пропагандировать свою идеологию: война должна вестись благородно и справедливо.
Люди в большинстве миров D&D проповедуют многобожие, они прославляют своих богов и признают пантеоны других культур. В мире Забытых Королевств человек может попросить милости Ам-берли прежде чем отправится в плавание, присоединиться к всеобщему пиршеству во славу Чон-тии во время сбора урожая и молиться Малару перед выходом на охоту.
Отдельные личности чувствуют зов сердца к определённому божеству и утверждают, что этот бог — их покровитель. Особенно преданные личности становятся настоятелями, строят святыни или помогают содержать священное место. Ещё реже, те, кто слышат подобный зов, становятся жрецами или паладинами, наделёнными ответственностью истинной божественной силы.
Алтари и храмы служат обществу как точки сбора для религиозных обрядов и фестивалей. Жрецы в таких местах рассказывают истории о богах, учат этике своего покровителя, предлагают напутствие или благословление, совершают религиозные обряды и учат деятельности, которую их божества одобряют. В городах и мегаполисах может находиться несколько храмов для каждого бога, важного для общества, в то время как маленькие поселения могут иметь один алтарь в честь тех богов, которых чтят местные.
Чтобы быстро составить пантеон для своего мира, создайте по одному богу для каждого из восьми доменов, доступных для жрецов: Буря, Война, Жизнь, Знание, Природа, Свет, Смерть и Обман. Вы можете придумать имена и персоналии для этих божеств или позаимствовать божеств из других пантеонов. Такой подход даст вам маленький пантеон, который покрывает большинство значимых аспектов бытия, и он достаточно простой, чтобы заполнить оставшиеся области жизни другими божествами.
Бог Знаний, например, может быть также покровителем магии и предсказаний, в то время как бог Света может быть богом солнца или богом времени.
!!!''Образец пантеона''
Пантеон из Предвечных Войн — пример пантеона, собранного, в основном, из уже существующих элементов, чтобы подойти под нужды определённой кампании. Это пантеон по умолчанию из Книги игрока четвёртой редакции D&D (2008 год). Сам пантеон кратко описан в таблице «Божества Предвечных Войн».
Этот пантеон содержит несколько нечеловеческих божеств и делает их универсальными божествами. В их числе: Багамут, Груумш, Кореллон, Лолс, Морадин, Сеанин и Тиамат. Люди поклоняются Морадину и Кореллону как богам своих идеалов, а не как расовым божествам. Этот пантеон также содержит архидьявола Асмодея, как бога господства и тирании.
Некоторые боги взяты из других пантеонов, иногда с изменением имени. Бэйн взят из Забытых Королевств. Из Серого Ястреба взяты Векна, Корд, Пелор и Тариздун. Из греческого пантеоны взяты Афина (переименована в Эратис) и Тюхе (переименована в Авандру), хотя обе претерпели изменения. Сет (переименован в Зехира) взят из египетского пантеона. Королева Воронов была списана с Хель из скандинавского пантеона и с Ви Джас из Серого Ястреба. В ^списке остались три бога, придуманные с нуля: Йоун, Мелора и Торог.
{{$:/Божества Предвечных Войн}}
!!__''Другие религиозные системы''__
В своей кампании вы можете создавать пантеоны богов, которые близко связаны с одной религией, монотеистические религии, (поклонение одному божеству), дуальные системы (основанные на двух противостоящих божествах или силах), мистические культы (включая личное поклонение одному божеству, обычно входящему в пантеон), анимистические религии (почитающие духов природы), или даже силы и философии, основанные не на божествах.
<<<
!!!''Божественный ранг''
Божественные создания мультивселенной часто классифицируются согласно их космической силе. Некоторым богам поклоняются во многих мирах и в каждом по-разному, в зависимости от их влияния.
;
:''Великие божества'' выше понимания смертных. Их нельзя призвать, и они почти никогда не вмешиваются в дела смертных. В особых редких случаях они создают аватар, подобно меньшим богам, но уничтожение такого аватара никак не влияет на великого бога.
:''Меньшие боги'' воплощены где-то на планах. Некоторые меньшие боги живут на Материальном Плане, такие как, например, богиня-единорог Лурью из Забытых Королевств и титанический бог-акула Секола, почитаемый саху-агинами. Другие боги живут на Внешних Планах, Лолс, к примеру, живёт в Бездне. Смертные могут встретиться с такими божествами.
:''Квази-боги'' имеют божественное происхождение, но они не слышат и не отвечают на молитвы, не даруют жрецам заклинания, и не контролируют аспекты жизни смертных. Они всё ещё очень мощные создания, и в теории они могут стать божествами, если соберут достаточно последователей. Квази-боги делятся на три подкатегории: полубоги, титаны и мёртвые божества.
:"""//Полубоги// порождены союзом божества и смертного.
У них остались кое-какие возможности бога, но их смертная сущность делает их слабейшими среди квази-богов.
//Титаны// — божественные создания богов. Они могут быть рождены от союза двух богов, созданы в божественной кузнице, выращены из капли крови бога или наоборот, вызваны божьей волей или сущностью.
//Мёртвые боги// это боги, которые потеряли всех последователей и считаются мёртвыми с точки зрения смертных. Эзотерические ритуалы иногда способны вызвать этих существ и привлечь их скрытую силу."""
<<<
!!!''Закрытые пантеоны''
В противовес свободному пантеону, закрытый сосредоточен на одной религии, чьи учения и наставления охватывают малую группу богов. Последователи закрытого пантеона могут любить одного бога больше чем другого, но они уважают их всех и чтят их жертвоприношениями и молитвами как полагается.
Ключевая черта закрытого пантеона — это то, что все верующие распространяют одну идею или догму, которая включает в себя всех божеств.
Боги в закрытом пантеоне работают заодно, чтобы защитить и направить своих последователей. Вы может сделать закрытый пантеон похожим на семью. Одно или два божества, лидирующие в пантеоне, выступают в роли родителей, а остальные боги выступают в роли покровителей тех аспектов культуры, которым поклоняется пантеон. Один храм чтит всех членов пантеона разом.
Большинство закрытых пантеонов имеют одного или несколько сбившихся богов — богов, поклонение которым не одобрено жрецами пантеона. Обычно это злые божества и враги пантеона, такие как греческие титаны. Эти божества имеют собственные культы, привлекающие изгоев и злодеев для службы. Эти культы напоминают мистические, но их члены жёстко привязаны к одному богу, хотя и делают вид, что преданы закрытому пантеону.
Скандинавские боги служат примером закрытого пантеона. Один — лидер пантеона и отец богов. Боги, такие как Тор, Тюр и Фрея воплощают собой важные аспекты скандинавской культуры. В это же время Локи и его подданные остаются в тени, иногда помогая другим богам, а иногда объединяясь против них с врагами пантеона.
!!!''Мистические культы''
Мистические культы — скрытые религиозные организации, базирующиеся на ритуале посвящения, в которых посвящённый мистически отождествляется с богом, или с несколькими из связанных богов. Мистические культы связаны с личностью инициированного, и основываются на его связи с божеством.
Иногда мистический культ — это средство поклонения богу в пантеоне. Он принимает мифы и ритуалы пантеона, но предоставляет свои собственные мифы и обряды как основные. Для примера, скрытый орден монахов может связать себя мистическими отношениями с богом, который входит в широко известный и уважаемый пантеон.
Мистический культ придаёт особое значение истории своего бога, которая символически обыгрывается в обряде посвящения. Основная легенда мистического культа обычно простая, и часто вовлекает смерть бога, его воскрешение, или путешествие в царство мёртвых и возвращение. Мистические культы часто почитают солнечных и лунных богов, а также богов сельского хозяйства, и других божеств, отражающих циклы природы.
Ритуал посвящения повторяет основную легенду. Неофиты повторяют божьи шаги, желая разделить с богом судьбу. Чтобы показать смерть и восхождение бога, производится символическая смерть посвящённого, олицетворяющая идею смерти старой жизни и перерождение в изменённом состоянии. Посвящённый рождается заново, оставаясь в мире смертных, но чувствуя себя возвышенным. За ним закрепляют место в царстве божьем после смерти, а сам он ощущает новый смысл жизни.
!!!''Монотеизм''
Монотеистические религии почитают только одного бога, и, в некоторых случаях, отрицают существование других богов. Если вы вводите монотеистическую религию в свою кампанию вам нужно решить, существуют ли в ней другие боги. Даже если они не существуют, другие религии могут сосуществовать с монотеистичной. Если среди последователей этих религий есть жрецы с умением накладывать заклинания, их заклинания могут подпитываться истинным божеством, меньшими силами, то есть не богами, (включая мощные аберрации, небожителей, фей, исчадий или элемента-лей) или просто их верой.
Божество монотеистичной религии имеет большое влияние, и изображается создателем всего сущего, контролирующим всё, и связанным со всеми аспектами бытия. Таким образом, любой верующий в этого бога проводит жертвоприношения и молится одному и тому же богу, независимо от аспекта жизни, в котором ему необходима божественная помощь. Будь то поход на войну, подготовка к путешествию или желание влюбить в себя кого-то, поклоняющийся молится одному богу.
Некоторые монотеистические религии описывают различные стороны своего божества. Один и тот же бог является в одних случаях Создателем, а в других Разрушителем. Жрецы этого бога, концентрирующиеся на каком-то одном аспекте, определяют свой доступ к домену и, возможно, даже определяют своё мировоззрение. Жрец, почитающий разрушительные качества бога, выбирает домен Бури или Войны, в то время как тот, кто поклоняется своему богу как создателю, выбирает домен Жизни или Природы. В некоторых монотеи-стичных религиях жрецы объединяются в особые религиозные ордены, чтобы отличаться от жрецов, которые выбрали другие домены.
!!!''Дуализм''
Дуалистические религии рассматривают мир как арену для битвы между двумя диаметрально противоположными сущностями, богами или божественными силами. Чаще всего, противоположные силы — это добро и зло, или противостоящие божества. В некоторых пантеонах силы или боги порядка и хаоса являются главными противниками и основывают дуальную систему. Жизнь и смерть, свет и тьма, материя и душа, тело и разум, здоровье и болезнь, чистота и загрязнение, положительная энергия и отрицательная — вселенная D&D наполнена противоположностями, которые могут служить основанием для дуалистичной религии.
Но независимо от того, на чём основывается дуализм, одна половина его последователей обычно верит, что необходимо быть хорошим, положительным, добрым или святым, в то время как другая половина считается плохой, если не открыто злой. Если основной конфликт в религии вызван противостоянием между материей и душой, последователи этой религии верят, что одно из двух (обычно материя) является злом, а второе (душа) — добром, и пытаются освободить свои души от оков материального мира через аскетизм и отшельничество.
Иногда последователи дуалистических систем верят, что две противостоящие силы должны оставаться в балансе, постоянно отталкиваясь друг от друга, но оставаясь связанными в творческом напряжении.
В космологии, основанной на вечном противостоянии добра и зла, смертные должны решить, на чьей они стороне. Большинство из тех, кто следует дуалистической религии и поклоняется богу или
силе — добрые. Поклоняющиеся хорошему божеству верят, что их бог защитит их от приспешников злого бога. Так как злобный бог в таких религиях обычно источник разрушений для всего сущего, поклоняются ему только извращённые и порочные люди. Помимо них таких богам служат чудовища, демоны и некоторые тайные культы. Мифы в дуалистических религиях обычно предсказывают, что добрый бог победит в последней битве, но силы зла верят, что исход этой битвы не предопределён, и работают над победой своего божества.
Божества в дуалистичных системах имеют большие сферы влияния. Все аспекты существования отражаются в этой двойственной схватке, но, тем не менее, все они могут упасть на чашу весов как одной стороны, так и другой. Сельское хозяйство, милосердие, небеса, медицина, поэзия — сферы влияния доброго бога, а голод, ненависть, горе и война принадлежат злому божеству.
!!!''Анимизм''
Анимизм — это вера в то, что духи населяют все уголки реального мира. В мировоззрении анимизма всё наделено духом, от самой большой горы до мельчайшего камушка, от великого океана до журчащего ручейка, от солнца и луны до меча предков, которым сражается воин. Все эти объекты и духи, живущие в них, разумны, хотя некоторые из них более сознательны, осторожны и умны чем другие. Самые могущественные духи могут быть сравнимы с богами. Все они достойны уважения, если не почитания.
Анимисты обычно не ставят одного духа выше других. Вместо этого они молятся и проводят обряды жертвоприношения различным духам в разное время, в зависимости от ситуации. Набожный человек может совершать ежедневные службы и подношения духам предков и духам дома, регулярные мольбы важным духам, таким как Семь Обличий Госпожи Удачи, редкие благовонные жертвоприношения для духов местности, таким как дух леса, и единичные молитвы всем остальным духам.
Анимистическая религия очень терпима. Большинству духов безразлично, кому ещё поклоняется их приверженец. Пока их уважают и сдабривают жертвоприношениями, они ведут себя должным образом. Когда новые религии приходят в земли анимистов, они обычно находят здесь сторонников, но никого не обращают в свою веру. Люди не замещают старых духов и богов, а просто добавляют новых в свои молитвы. Отшельники и ученики принимают сложные философские системы и практики без изменения своих убеждений и продолжают уважать старых духов.
Анимизм функционирует как большой тесный пантеон. Жрецы анимизма служат всему пантеону, поэтому они могут выбрать любой домен, представляющий их любимого духа.
!!!''Силы и философии''
Божественные силы не обязательно должны быть получены от богов. В некоторых кампаниях можно обладать такой сильной верой в свои идеалы, что эта вера дарует магическую силу. В других кампаниях безликие силы природы или магии заменяют богов, даруя силу связанным с ними смертным.
Как друиды и следопыты могут получать свои заклинания от сил природы, а не от конкретного природного божества, так и некоторые жрецы посвящают себя идеалам, а не богам. А паладины могут служить философии справедливости и благородства вместо служения определённому божеству.
!!__''Гуманоиды и боги''__
Когда дело доходит до богов, люди представляют гораздо более широкий спектр верований и орденов, чем другие расы. Во многих мирах D&D орки, эльфы, гномы, гоблины и другие гуманоиды имеют скудные пантеоны. Ожидается, что орк будет поклоняться Груумшу или одному из его подручных богов. В сравнении с этим, человечество охватывает ошеломляющее разнообразие божеств. Каждая человеческая культура может иметь свой собственный набор богов.
В большинстве миров D&D, нет ни одного бога, который может претендовать на создание человечества. Поэтому люди склонны создавать ордены, которые расширяются до религий. Один харизма-тичный пророк может обратить целое королевство в новую веру. После смерти пророка религия может продолжить расти, может умереть, или последователи пророка обернутся друг против друга и организуют несколько противостоящих религий.
Для сравнения, религия в дварфском обществе прочна как камень. Дварфы из Забытых Королевств считают Морадина своим создателем.
В то время как отдельные дварфы могут почитать других богов, как культура дварфы находятся в долгу у Морадина и у его пантеона. Его учения и магия настолько укоренились в дварфской культуре, что попытка сменить их вызовет катаклизм.
Учитывая всё это, определите роль богов в своём мире и их связи с различными гуманоид-ными расами. У каждой ли расы есть бог-создатель? Как этот бог влияет на культуру расы? Свободен ли народ от этих божественных уз, и может ли поклоняться кому пожелает? Повернулась ли раса против своего бога- создателя? Появлялись ли новые расы, созданные богами, за последние несколько лет?
Божество также может иметь привязку к королевству, благородному роду, или другому культурному объединению. Со смертью императора новый правитель может быть назначен чудесным предзнаменованием от бога, который охранял империю в её ранние годы. В таком мире поклонение другим богам может быть вне закона или находиться под строгим контролем.
Наконец, придумайте различие между богами, которые привязаны к одной и той же гуманоид-ной расе, а также богов с более разнообразными последователями. Довольны ли расы со своими собственными пантеонами своим местом в вашем мире? А богами, принимающими активную роль в их делах? Игнорируются ли другие расы богами, или эти расы играют определяющую роль, которая может сместить баланс силы в пользу одного из богов?
Силы и философии не требуют поклонения; это не существа, которые могут слышать и отвечать на мольбы и принимать жертвоприношения. Преданность философии или силе не требует отречения от служения божеству. Человек может быть преданным философии добра и служить различным добрым божествам, или чтить силы природы и отдавать дань уважения богам природы, которых можно расценивать как частные проявления безликой силы. В мире, который включает в себя божеств с демонстративной силой (через своих жрецов), философии не будут отрицать существование богов, хотя большинство философских учений утверждают, что боги гораздо ближе к смертным, чем смертные привыкли думать. Согласно таким философиям, боги на самом деле не бессмертные (просто очень долго живут), а смертные могут достичь подобной божественности. По факту, достижение этой божественности и есть основная цель многих философий.
Силы философий исходят из веры, которую смертные в неё вкладывают. Учение, в которое верит только один человек, недостаточно сильно, чтобы даровать магическую силу этому человеку.
!!!__''Боевой стиль''__
Вы выбираете боевой стиль, соответствующий вашей специализации. Выберите один из следующих вариантов. Вы не можете выбирать один и тот же вариант боевого стиля, даже если позже у вас будет возможность выбрать ещё один стиль.
"""''Дуэлянт''
Пока вы держите рукопашное оружие в одной руке, и не используете другого оружия, вы получаете бонус +2 к броскам урона этим оружием.
''Защита''
Если существо, которое вы видите, атакует не вас, а другое существо, находящееся в пределах 5 футов от вас, вы можете реакцией создать помеху его броску атаки. Для этого вы должны использовать щит.
''Оборона''
Пока вы носите доспехи, вы получаете бонус +1 к КД.
''Сражение большим оружием''
Если у вас выпало «1» или «2» на кости урона оружия при атаке, которую вы совершали рукопашным оружием, удерживая его двумя руками, то вы можете перебросить эту кость, и должны использовать новый результат, даже если снова выпало «1» или «2». Чтобы воспользоваться этим преимуществом, ваше оружие должно иметь свойство «двуручное» или «универсальное».
''Сражение двумя оружиями''
Если вы сражаетесь двумя оружиями, вы можете добавить модификатор характеристики к урону от второй атаки.
''Стрельба''
Вы получаете бонус +2 к броску атаки, когда атакуете дальнобойным оружием."""
!!!''__Боевой стиль__''
На 2 уровне вы выбираете боевой стиль, соответствующий вашей специализации. Выберите один из следующих вариантов. Вы не можете выбирать один и тот же вариант боевого стиля, даже если позже у вас будет возможность выбрать ещё один стиль.
"""''Дуэлянт''
Пока вы держите рукопашное оружие в одной руке, и не используете другого оружия, вы получаете бонус +2 к броскам урона этим оружием.
''Защита''
Если существо, которое вы видите, атакует не вас, а другое существо, находящееся в пределах 5 футов от вас, вы можете реакцией создать помеху его броску атаки. Для этого вы должны использовать щит.
''Оборона''
Пока вы носите доспехи, вы получаете бонус +1 к КД.
''Сражение большим оружием''
Если у вас выпало «1» или «2» на кости урона оружия при атаке, которую вы совершали рукопашным оружием, удерживая его двумя руками, то вы можете перебросить эту кость, и должны использовать новый результат. Чтобы воспользоваться этим преимуществом, ваше оружие должно иметь свойство «двуручное» или «универсальное»."""
!!!''__Боевой стиль__''
На 2 уровне вы выбираете стиль сражения, соответствующий вашей специализации. Выберите один из следующих вариантов. Вы не можете выбирать один и тот же вариант боевого стиля, даже если позже у вас будет возможность выбрать ещё один стиль.
!!!''Дуэлянт''
Пока вы держите рукопашное оружие в одной руке, и не используете другого оружия, вы получаете бонус +2 к броскам урона этим оружием.
!!!''Оборона''
Пока вы носите доспехи, вы получаете бонус +1 к КД.
!!!''Сражение двумя оружиями''
Если вы сражаетесь с двумя оружиями, вы можете добавить модификатор характеристики к урону от второй атаки.
!!!''Стрельба''
Вы получаете бонус +2 к броску атаки, когда атакуете дальнобойным оружием.
!!!''__Боевые искусства__''
"""На 1 уровне ваше знание боевых искусств позволяет вам эффективно использовать в бою безоружные удары и оружие монахов — короткие мечи, а также любое простое оружие, не имеющее свойств «двуручное» и «тяжёлое».
Если вы безоружны или используете только монашеское оружие, и не носите ни доспехов, ни щита, вы получаете следующие преимущества:"""
* Вы можете использовать Ловкость вместо Силы для бросков атак и урона ваших безоружных ударов и атак монашеским оружием.
* Вы можете использовать к4 вместо обычной кости урона ваших безоружных ударов или атак монашеским оружием. Эта кость увеличивается с вашим уровнем, как показано в колонке «боевые искусства».
* Если в свой ход вы используете действие Атака для безоружной атаки, или атаки монашеским оружием, вы можете совершить ещё одну безоружную атаку бонусным действием. Например, если вы совершили действие Атака и атаковали боевым посохом, вы можете совершить бонусным действием безоружную атаку, при условии, что в этом ходу вы ещё не совершали бонусное действие.
Некоторые монастыри используют особые виды монашеского оружия. Например, вы можете использовать дубинку в виде двух деревянных брусков, соединённых короткой цепью (такое оружие называется нунчаками), или серп с более коротким и прямым лезвием (называется камой). Как бы ни называлось ваше монашеское оружие, вы используете характеристики из главы 5, соответствующие этому оружию.
//Оружие (любые боеприпасы), необычное (+1), редкое (+2), или очень редкое (+3)//
Вы получаете бонус к броскам атаки и урона, совершённым при использовании этих магических боеприпасов. Размер бонуса определяется показателем редкости боеприпаса. Попав в цель, боеприпас перестаёт быть магическим.
!!!__''Божественная кара''__
Начиная со 2 уровня, если вы попадаете по существу атакой рукопашным оружием, вы можете потратить одну ячейку заклинания любого своего класса для причинения цели урона излучением, который добавится к урону от оружия. Дополнительный урон равен 2к8 за ячейку 1 уровня, плюс 1к8 за каждый уровень ячейки выше первого, до максимума 5к8. Урон увеличивается на 1к8, если цель — нежить или исчадие.
//1 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Ваша молитва наполняет вас божественной энергией. Пока заклинание активно, ваши атаки оружием причиняют при попадании дополнительный урон 1к4.
!!!__''Божественное вмешательство''__
"""Начиная с 10 уровня вы можете воззвать к своему божеству о помощи, когда сильно в этом нуждаетесь.
Мольба о помощи совершается действием. Опишите помощь, которую вы ждёте, и киньте процентную кость. Если выпадет число, не превышающее ваш уровень жреца, ваше божество вмешается. Мастер сам выбирает природу вмешательства; подойдёт эффект какого-либо заклинания жреца или заклинания домена.
Если божество вмешивается, вы не можете использовать это умение в течение 7 дней. В противном случае вы можете использовать это умение после продолжительного отдыха.
На 20 уровне ваше воззвание автоматически успешно и не требует проверки."""
!!!''__Божественное здоровье__''
Начиная с 3 уровня божественная магия, текущая через вас, даёт вам иммунитет к болезням.
//2 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 минута
"""Вы создаёте в пределах дистанции парящее призрачное оружие, существующее, пока заклинание активно, или пока вы не накладываете это заклинание ещё раз. Когда вы накладываете это заклинание, вы можете совершить рукопашную атаку заклинанием по существу, находящемуся в пределах 5 футов от оружия. При попадании цель получает урон силовым полем, равный 1к8 + модификатор вашей базовой характеристики.
Вы можете бонусным действием в свой ход переместить оружие на 20 футов и повторить атаку по существу, находящемуся в пределах 5 футов от него.
Оружие может быть любой формы. Жрецы божеств, связанных с конкретным оружием (святой Катберт известен своей булавой, а Тор — молотом), создают эффект в виде именно такого оружия."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 1к8 за каждые две ячейки выше второго.
//7 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Вы произносите божественное слово, наделённое силой, сформировавшей мир на заре творения. Выберите любое количество существ, которых вы видите в пределах дистанции. Все эти существа, слышащие вас, должны совершить спасбросок Харизмы. При провале существо попадает под действие эффекта, основанного на текущем количестве хитов:
* 50 хитов или меньше: глухота на 1 минуту
* 40 хитов или меньше: глухота и слепота на 10 минут
* 30 хитов или меньше: слепота, глухота и ошеломление на 1 час
* 20 хитов или меньше: моментальная смерть
Вне зависимости от текущих хитов, исчадия, небожители, феи и элементали, провалившие спасбросок, изгоняются на свой родной план (если только они уже там не находятся), и не могут вернуться на ваш текущий план в течение 24 часов кроме как посредством заклинания исполнение желаний.
!!!__''Божественное чувство''__
"""Присутствие сильного зла воспринимается вашими чувствами как неприятный запах, а могущественное добро звучит как небесная музыка в ваших ушах. Вы можете действием открыть своё сознание для обнаружения таких сил. Вы до конца своего следующего хода знаете местоположение всех исчадий, небожителей и нежити в пределах 60 футов, не имеющих полного укрытия. Вы знаете тип (исчадие, небожитель, нежить) любого существа, чьё присутствие вы чувствуете, но не можете определить, кто это конкретно (например, вампир Граф Страд фон Зарович). В этом же радиусе вы также обнаруживаете присутствие мест и предметов, которые были освящены или осквернены, например, заклинанием святилище.
Вы можете использовать это умение количество раз, равное 1 + модификатор Харизмы. Когда вы заканчиваете продолжительный отдых, вы восстанавливаете все потраченные использования."""
!!''Божественные домены''
"""В пантеоне все божества оказывают влияние на разные аспекты жизни смертных и цивилизации, называемые божественным доменом. Все домены, на которые оказывает влияние божество, называются его портфолио. Например, портфолио греческого бога Аполлона включает домены Жизни, Знания и Света. Как жрец, вы выбираете один аспект из портфолио своего божества, которому вы придаёте особое значение, и вы получаете силы, предоставляемые этим доменом.
Ваш выбор может соответствовать определённому религиозному течению, посвящённому вашему божеству. Аполлон, например, был почитаем в одном регионе как Феб («сияющий»), что выделяет его влияние на домен Света, в другом месте Аполлон почитался как Ацесиус («исцеляющий»), что подчёркивает его связь с доменом Жизни. Кроме того, ваш выбор домена может быть просто вопросом личных предпочтений, аспектом божества, который больше всего близок вам.
Описание каждого домена приводит примеры божеств, имеющих влияние в этом домене. В описание включены боги из мира Забытых Королевств, Серого Ястреба, Саги о Копье и Эберрона, а также кельтского, греческого, норвежского и египетского древних пантеонов."""
<<Button "Домен бури (Жрец)" "Домен бури">>
<<Button "Домен войны (Жрец)" "Домен войны">>
<<Button "Домен жизни (Жрец)" "Домен жизни">>
<<Button "Домен знания (Жрец)" "Домен знания">>
<<Button "Домен обмана (Жрец)" "Домен обмана">>
<<Button "Домен природы (Жрец)" "Домен природы">>
<<Button "Домен света (Жрец)" "Домен света">>
!!!__''Божественный домен''__
Выберите один домен, связанный с вашим божеством: Буря, Война, Жизнь, Знание, Обман, Природа или Свет. Все домены детально рассмотрены в конце описания класса, и каждый содержит примеры божеств, связанных с ним. Ваш выбор даёт вам заклинания домена и другие умения. Он также даёт вам дополнительные способы использования Божественного канала, когда вы получаете это умение на 2 уровне, и дополнительные умения на 6, 8 и 17 уровнях.
!!!''Заклинания домена''
У каждого домена есть список заклинаний, которые вы получаете на новых уровнях жреца. Как только вы получаете заклинание домена, оно всегда считается подготовленным и не учитывается при подсчёте количества заклинаний, которые можно подготовить.
Если вы получаете доступ к заклинанию, отсутствующему в списке заклинаний жреца, оно всё равно будет считаться для вас заклинанием жреца.
!!!__''Божественный канал''__
"""На 2 уровне вы получаете возможность направлять божественную энергию непосредственно от своего божества, используя её для подпитки магических эффектов. Вы начинаете с двумя такими эффектами: Изгнание нежити и эффектом, определяемым вашим доменом. Некоторые домены дают вам дополнительные эффекты, как только вы получите новые уровни.
Когда вы используете Божественный канал, вы выбираете, какой эффект создать. Затем вы должны окончить короткий или продолжительный отдых, чтобы использовать Божественный канал снова.
Некоторые эффекты Божественного канала требуют совершить спасбросок. Когда вы используете эффекты такого рода, Сл равна Сл спасброска от ваших заклинаний жреца.
Начиная с 6 уровня вы можете использовать Божественный канал дважды перед отдыхом, а начиная с 18 уровня, вы можете использовать его три раза перед отдыхом. По окончанию короткого или продолжительного отдыха вы восстановите все потраченные использования."""
!!!''Божественный канал: Изгнание нежити''
"""Вы действием демонстрируете свой священный символ и читаете молитву, изгоняющую нежить. Вся нежить, которая может видеть или слышать вас в пределах 30 футов, должна совершить спасбросок Мудрости. Если существо провалило спасбросок, оно изгоняется на 1 минуту, или пока не получит урон.
Изгнанное существо должно тратить свои ходы, пытаясь уйти от вас как можно дальше, и не может добровольно переместиться в пространство, находящееся в пределах 30 футов от вас. Оно также не может совершать реакции. В качестве действия существо может использовать только Рывок или пытаться освободиться от эффекта, препятствующее его передвижению. Если двигаться некуда, существо может использовать действие Уклонение."""
Королевство может охватить чума, и искатели приключений отправятся на поиски лекарства Герой выходит из древнего склепа, простоявшего закрытым несколько веков, и вскоре обнаруживает, что болен. Колдун оскорбляет тёмного владыку и заболевает странным недугом, распространяющимся, когда он накладывает заклинания.
Простая болезнь может лишь немного подорвать ресурсы отряда, и может быть вылечена малым восстановлением. Более серьёзная болезнь может стать основой одного или нескольких приключений, в которых персонажи будут искать лекарство, останавливать распространение и бороться с последствиями.
Болезнь, которая делает что-то большее, чем просто поражает несколько членов отряда, это уже сюжетный элемент. Правила помогают описать эффекты болезни и то, как она излечивается, но не то, как болезнь влияет на вашу кампанию. Болезнь может поражать всех подряд, а может избирательно поражать только существ определённой расы. Чума может коснуться только конструктов или нежити, а может охватить целое поселение полу-росликов, но не трогать представителей других рас. Важно понять, какой именно сюжет нужен вам.
!!__''Примеры болезней''__
Представленные ниже примеры иллюстрируют множество болезней, способных встретиться в игре. Вы можете менять Сл спасбросков, инкубационный период, симптомы и прочие характеристики этих болезней, чтобы они подходили вашей кампании.
!!!''Глазная гниль''
Эта болезненная инфекция заставляет глаза кровоточить, и может вызвать слепоту.
Зверь или гуманоид, испивший воды, заражённой глазной гнилью, должен преуспеть в спасброске Телосложения со Сл 15, иначе заразится. На следующий день зрение этого существа становится размытым. Существо получает штраф -1 к броскам атаки и проверкам характеристик, полагающимся на зрение. В конце каждого продолжительного отдыха после появления симптомов штраф ухудшается на 1 Когда он становится равным -5, жертва становится слепой, пока её зрение не восстановит магия, такая как малое восстановление или полное исцеление.
Глазную гниль может исцелить редкий цветок, называемый очанкой, растущий на некоторых болотах. Персонаж, владеющий навыком использования набора травника, может за час сделать из цветка одну дозу лекарства. Эта доза, нанесённая на глаза перед продолжительным отдыхом, не даёт прогрессировать болезни во время этого отдыха. После применения трёх доз болезнь полностью проходит.
!!!''Сточная чума''
Сточная чума это общее название широкой категории болезней, процветающих в канализациях, мусорках и застойных болотах, переносимых существами, обитающими в этих местах, такими как крысы и отиджи.
Если гуманоида укусит существо, переносящее эту болезнь, или если он вступит в контакт с грязью или отбросами, содержащими эту болезнь, существо должно преуспеть в спасброске Телосложения со Сл 11, иначе оно станет заражённым.
Через 1к4 дня симптомы сточной чумы проявляются на заболевшем существе. Симптомы включают усталость и судороги. Больное существо получает одну степень истощения и восстанавливает только половину обычного числа хитов от потраченных Костей Хитов, и не восстанавливает хиты в конце продолжительного отдыха.
В конце каждого продолжительного отдыха заражённое существо должно совершить спасбросок Телосложения со Сл 11 При провале оно получает одну степень истощения. При успехе истощение существа уменьшается на одну степень. Если успешный спасбросок уменьшил степень истощения больного существа ниже 1 существо исцеляется от этой болезни.
!!!''Хохочущая лихорадка''
Эта болезнь поражает гуманоидов, хотя гномы почему-то имеют к ней иммунитет. Жертвы этой болезни часто закатываются приступами безумного смеха, откуда и пошло название этой болезни, а также её жуткое простонародное название: «визгунья».
Симптомы проявляются через 1к4 часа после заражения и включают в себя жар и дезориентацию. Больное существо получает одну степень истощения, которую нельзя устранить, пока болезнь не будет вылечена.
Любое событие, заставляющее больного испытать сильный стресс — включая начало сражения, получение урона, испуг или ночной кошмар — заставляет его совершить спасбросок Телосложения со Сл 13. При провале существо получает урон психической энергией 5 (1к10) и становится недееспособным от безумного смеха на 1 минуту. Существо может повторять спасбросок в конце каждого своего хода, оканчивая смех и недееспособность при успехе.
Все гуманоидные существа, начинающие ход в пределах 10 футов от заражённого существа, находящегося в приступе безумного смеха, должны преуспеть в спасброске Телосложения со Сл 10, иначе они тоже заразятся. Преуспев в этом спасброске, существо получает иммунитет к безумному смеху конкретно этого существа на 24 часа.
В конце каждого продолжительного отдыха заражённое существо может совершить спасбросок Телосложения со Сл 13. При успехе Сл этого спасброска и спасброска от заражения безумным смехом уменьшается на 1к6. Когда Сл спасброска уменьшится до 0, существо выздоровеет. Существо, провалившее три таких спасброска, получает случайным образом определённую форму бессрочного безумия, как описано в конце этой главы.
"""У персонажей есть бонус мастерства, зависящий от уровня, как описано в главе 1. У чудовищ тоже есть этот бонус, он уже включён в их блоки статистики. Этот бонус тоже используется в проверках характеристик, спасбросках и бросках атаки.
Ваш бонус мастерства не может быть добавлен к броску кости или другому числу более одного раза. Например, если два разных правила гласят, что вы можете добавлять бонус мастерства к спасброскам Мудрости, вы, тем не менее, добавляете этот бонус только один раз.
Иногда бонус мастерства может быть умножен или разделён (например, удвоен или разделён пополам) перед применением. Например, умение плута Компетентность удваивает бонус мастерства для некоторых проверок характеристик. Если обстоятельства сложились так, что бонус мастерства к одному и тому же броску может быть применён несколько раз, вы всё равно добавляете его лишь один раз, и умножаете или делите только один раз.
Если умение или эффект позволяют умножить бонус мастерства при совершении проверки характеристики, не позволяющей добавлять бонус мастерства, то бонус к проверке не добавляется. Для такой проверки бонус мастерства равен 0, а произведение 0 и любого числа всё равно даёт 0. Например, если у вас нет владения навыком История, вы не получаете преимущество от умения, позволяющего удваивать бонус мастерства при совершении проверок Интеллекта (История).
Обычно бонус мастерства для бросков атаки и спасбросков не умножается. Если какое-то умение или эффект позволяют это сделать, применяются те же самые правила."""
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эту брошь, вы обладаете сопротивлением к урону силовым полем и иммунитетом к урону от заклинания волшебная стрела.
//Заговор, Вызов, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы кидаете кислотный шарик. Выберите одно существо в пределах дистанции или два существа в пределах дистанции, находящихся в пределах 5 футов друг от друга. Цель должна преуспеть в спасброске Ловкости, иначе она получает урон кислотой 1к6.
Урон этого заклинания увеличивается на 1к6, когда вы достигаете 5 уровня (2к6), 11 уровня (3к6) и 17 уровня (4к6).
//Оружие (булава), редкое//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием. Бонус увеличивается до +3, если атакуется конструкт.
Если у вас выпадает «20» при броске атаки этим оружием, цель получает дополнительный дробящий урон 7 или дополнительный дробящий урон 14, если это был конструкт. Если у конструкта осталось 25 или меньше хитов после получения этого урона, он уничтожается.
//Оружие (булава), редкое (требуется настройка)//
Если вы попадаете этим магическим оружием по исчадию или нежити, это существо получает дополнительный урон излучением 2к6. Если у цели после получения этого урона 25 или меньше хитов, она должна преуспеть в спасброске Мудрости со Сл 15, иначе будет уничтожена. При успешном спасброске существо становится испуганным вами до конца вашего следующего хода.
Пока вы держите это оружие, оно излучает яркий свет в радиусе 20 футов и тусклый свет в радиусе ещё 20 футов.
//Оружие (булава), редкое (требуется настройка)//
У этого оружия есть 3 заряда. Если вы его держите, вы можете действием потратить 1 заряд, чтобы испустить волну ужаса. Все существа на ваш выбор в пределах 30 футов должны преуспеть в спасброске Мудрости со Сл 15, иначе станут испуганными вами на 1 минуту. Будучи испуганным таким способом, существо должно тратить ходы на то, чтобы переместиться как можно дальше от вас, и не может добровольно перемещаться в пространство в пределах 30 футов от вас. Оно также не может совершать реакции. Из всех своих действий существо может использовать только Рывок или пытаться освободиться от эффекта, препятствующего его передвижению. Если двигаться некуда, существо может использовать действие Уклонение. В конце каждого своего хода существо может повторять спасбросок, оканчивая эффект при успехе.
Булава ежедневно восстанавливает 1к3 заряда на рассвете.
//Чудесный предмет, редкий//
Это маленький чёрный шарик 3/4 дюйма в диаметре и весом в одну унцию. Как правило, 1к4 + 4 бусин силы находят вместе.
Вы можете действием бросить бусину на расстояние до 60 футов. Бусина взрывается при ударе и уничтожается. Все существа, находящиеся в пределах 10 футов от места приземления бусины, должны преуспеть в спасброске Ловкости со Сл 15, иначе получат урон силовым полем 5к4. После этого на этой площади образуется прозрачная сфера из силового поля, остающаяся на этом месте в течение 1 минуты. Все существа, провалившие спасбросок и полностью находящиеся в пределах этой площади, оказывается запертым внутри сферы. Существа, преуспевшие в спасброске, или находящиеся в этой сфере лишь частично, выталкиваются прочь от центра сферы, пока полностью не окажутся за пределами действия силового поля. Никакие атаки и эффекты не могут проникать сквозь сферу — только воздух, пригодный для дыхания.
Запертое внутри существо может действием толкать сферу, перемещая её со своей уменьшенной вдвое скоростью. Сферу можно легко поднять, так как вне зависимости от веса существ, находящихся в ней, она весит всего 1 фунт.
//Чудесный предмет, очень редкий//
Эта раскрашенная латунная бутылка весит 1 фунт. Если вы действием вынете пробку, из бутылки вырвется густое облако дыма. В конце вашего хода дым исчезает во вспышке безвредного огня, и в свободном пространстве в пределах 30 футов от вас появляется ифрит. Характеристики ифрита смотрите в Бестиарии.
Когда бутылку открывают в первый раз, Мастер определяет, что произойдёт дальше:
<table>
<tr>
<th>к100</th>
<th>Эффект</th>
</tr>
<tr>
<td>01-10</td>
<td>Ифрит нападёт на вас. Через 5 раундов сражения ифрит исчезает, а бутылка теряет магию.</td>
</tr>
<tr>
<td>11-90</td>
<td>Ифрит служит вам 1 час, выполняя все ваши команды. После этого ифрит возвращается в бутылку, которая закрывается новой пробкой. Пробку нельзя вынуть в течение 24 часов. В последующие два открытия будет происходить то же самое.</td>
</tr>
<tr>
<td>91–00</td>
<td>91–00 Ифрит может три раза наложить для вас заклинание исполнение желаний. Он исчезает после того как исполнит последнее желание или спустя 1 час, а бутылка после этого теряет магию.</td>
</tr>
</table>
Если бутылку откроют в четвёртый раз, ифрит сбежит и исчезнет, а бутылка потеряет магию. 91-00 Ифрит может три раза наложить для вас заклинание исполнение желаний. Он исчезает после того как исполнит последнее желание или спустя 1 час, а бутылка после этого теряет магию.
!!!''__Быстрое передвижение__''
Начиная с 5 уровня ваша скорость передвижения увеличивается на 10 футов, если вы не носите тяжёлые доспехи.
!!!''Быстрое создание''
Вы можете быстро создать барда, следуя этим рекомендациям. Во-первых, у вашей Харизмы должно быть наивысшее значение. Следующей по величине характеристикой должна быть Ловкость. Во-вторых, выберите предысторию «артист». В-третьих, получите заговоры злая насмешка и пляшущие огоньки вместе со следующими заклинаниями 1 уровня: волна грома, лечащее слово, обнаружение магии и очарование личности.
!!!''__Быстрое создание__''
Вы можете быстро создать варвара, следуя этим рекомендациям. Во-первых, у вашей Силы должно быть наивысшее значение. Следующим по величине должно быть Телосложение. Во-вторых, выберите предысторию «чужеземец».
!!!''Быстрое создание''
Вы можете быстро создать воина, следуя этим рекомендациям. Во-первых, у вашей Силы или Ловкости (в зависимости от того, хотите ли вы сосредоточиться на рукопашном оружии или на стрельбе из лука или фехтовальном оружии) должно быть наивысшее значение. Следующим по величине должно быть значение Телосложения (или Интеллекта, если вы планируете взять воинский архетип Мистический Рыцарь). Во-вторых, выберите предысторию «солдат».
!!!''Быстрое создание''
Вы можете быстро создать волшебника, следуя этим рекомендациям. Во-первых, у вашего Интеллекта должно быть наивысшее значение. Следующим по величине должно быть значение Телосложения или Ловкости. Если вы планируете присоединиться к школе Очарования, сделайте вторым по величине значение Харизмы. Во-вторых, выберите предысторию «мудрец». В-третьих, выберите заговоры волшебная рука, луч холода и свет, а также заклинания 1 уровня для вашей книги заклинаний: волшебная стрела, доспехи мага, огненные ладони, очарование личности, падение пёрышком и усыпление.
!!!''Быстрое создание''
Вы можете быстро создать друида, следуя этим рекомендациям. Во-первых, у вашей Мудрости должно быть наивысшее значение. Следующим по величине должно быть значение Телосложения. Во-вторых, выберите предысторию «отшельник».
!!!''Быстрое создание''
Вы можете быстро создать жреца, следуя этим рекомендациям. Во-первых, у вашей Мудрости должно быть наивысшее значение. Следующей по величине характеристикой должна быть Сила или Телосложение. Во-вторых, выберите предысторию «прислужник».
!!!''Быстрое создание''
Вы можете быстро создать колдуна, следуя этим рекомендациям. Во-первых, у вашей Харизмы должно быть наивысшее значение. Следующим по величине должно быть значение Телосложения. Во-вторых, выберите предысторию «шарлатан». В-третьих, выберите заговоры леденящее прикосновение и мистический заряд, а также заклинания 1 уровня ведьмин снаряд и очарование личности.
!!!''Быстрое создание''
Вы можете быстро создать монаха, следуя этим рекомендациям. Во-первых, у вашей Ловкости должно быть наивысшее значение. Следующим по величине должно быть значение Мудрости. Во-вторых, выберите предысторию «отшельник».
!!!''Быстрое создание''
Вы можете быстро создать паладина, следуя этим рекомендациям. Во-первых, у вашей Силы должно быть наивысшее значение. Следующим по величине должно быть значение Харизмы. Во-вторых, выберите предысторию «благородный».
!!!''Быстрое создание''
Вы можете быстро создать плута, следуя этим рекомендациям. Во-первых, у вашей Ловкости должно быть наивысшее значение. Следующим по величине должно быть значение Интеллекта, при условии, что вы планируете взять архетип Мистический ловкач. В противном случае выберите Харизму, если планируете пользоваться обманом и социальным взаимодействием. Во-вторых, выберите предысторию «шарлатан».
!!!''Быстрое создание''
Вы можете быстро создать следопыта, следуя этим рекомендациям. Во-первых, у вашей Ловкости должно быть наивысшее значение. Следующим по величине должно быть значение Мудрости. Следопыты, концентрирующиеся на сражении с двумя оружиями, делают наивысшей характеристикой Силу, а не Ловкость. Во-вторых, выберите предысторию «чужеземец».
!!!''Быстрое создание''
Вы можете быстро создать чародея, следуя этим рекомендациям. Во-первых, у вашей Харизмы должно быть наивысшее значение. Следующей по величине характеристикой должно быть Телосложение. Во-вторых, выберите предысторию «отшельник». В-третьих, получите заговоры луч холода, свет, фокусы и электрошок вместе с заклинаниями 1 уровня волшебная стрела и щит.
//5 уровень, Преобразование, Следопыт//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (колчан, содержащий как минимум один боеприпас)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы так модифицируете свой колчан, что он начинает производить бесконечный запас немагических боеприпасов, которые сами прыгают в вашу руку, когда вы тянетесь за ними.
Пока заклинание активно, вы в каждом своём ходу можете бонусным действием совершить две атаки оружием, использующим боеприпасы из колчана. Каждый раз, когда вы совершаете такую дальнобойную атаку, ваш колчан при помощи магии заменяет использованный вами боеприпас таким же немагическим боеприпасом. Все боеприпасы, созданные этим заклинанием, распадаются, когда заклинание оканчивается. Если колчан перестаёт быть вашей собственностью, заклинание оканчивается."""
Высокий, закутанный в шкуры дикарь пробирается сквозь метель, сжимая в руке свой топор. Он со смехом бросается на морозного великана, который посмел убить лося в стаде его народа.
Полуорк рычит на храбреца, осмелившегося посягнуть на его первенство в племени, готовый свернуть ему шею голыми руками, как он поступил с предыдущими шестью соперниками.
С пеной у рта дварф швыряет свой шлем в лицо напавшему дроу, и резко разворачивается, впечатав бронированный локоть в живот второму.
Несмотря на разнообразие, всех варваров объединяет одно — их ярость. Необузданный, неугасимый и бездумный гнев. Не просто эмоция, их ярость как свирепость загнанного в угол хищника, как безжалостный удар урагана, как штормовые валы океана.
Ярость некоторых из них проистекает из общения со свирепыми духами животных. Другие черпают её из злости на полную боли и страдания действительность. Но для каждого варвара ярость это источник не только боевого безумия, но и невероятных рефлексов, стойкости, а также непревзойдённой силы.
!!!''__Первобытные инстинкты__''
Жители посёлков и городов настолько гордятся своей цивилизованностью, отличающей их от животных, словно отрицание собственной природы подчёркивает их превосходство. Варвары же, напротив, считают цивилизованность проявлением слабости. Связь между их животными инстинктами, первобытной энергетикой и свирепой яростью очень сильна. Варвары чувствуют себя неуютно в окружении стен или в толпе, но раскрываются в родных диких просторах, в тундре, джунглях или степях, где их племена живут и охотятся.
Лучше всего варвары проявляют себя посреди хаоса битвы. Они могут впасть в состояние берсерка, утратив контроль над собственной яростью, и получая взамен нечеловеческую силу и стойкость. Варвар может лишь несколько раз воспользоваться резервами собственного гнева, прежде чем ему потребуется отдых, но обычно этих нескольких раз хватает, чтобы справиться с любой угрозой, встреченной на пути.
!!!''__Жизнь, полная опасностей__''
Не все члены племён, которых в цивилизованном обществе называют варварами, имеют класс «варвар». Настоящий варвар среди этих людей так же редок, как опытный воин в городе, и он исполняет схожую роль защитника людей и военного лидера. Жизнь в диких местах таит в себе опасность: соперничающие племена, смертельно опасная погода и ужасные чудовища. И варвар бросается в борьбу с этими опасностями, защищая своих людей.
Смелость перед лицом опасности делает варвара превосходным кандидатом в искатели приключений. Кочевой образ жизни часто привычен для примитивных племён, и непоседливая жизнь авантюристов не составляет трудности для варвара. Некоторые варвары скучают по сплочённому семейному укладу своих племён, но в конце концов находят замену в узах, связывающих членов отряда.
{{Таблица развития Варвара}}
{{Создание Варвара}}
Dungeons & Dragons (D&D) — ролевая игра, повествующая о мирах мечей и колдовства. Она содержит элементы детских игр, в которых мы воображали себя героями. Как и в тех играх, двигателем D&D является воображение. Эта игра о воображаемом замке, возвышающемся под грозовыми ночными небесами, и о том, как искатели приключений будут преодолевать испытания, которые выпадут на их долю.
<<<
"""
''Мастер'': После перехода через скалистые пики, дорога внезапно делает поворот на восток, и вот Замок Равенлофт возвышается перед вами. Разрушенные башни из камня хранят свой молчаливый дозор. Они выглядят заброшенными. Перед замком разверзлась глубокая пропасть, дно которой исчезает в плотном тумане. Опущенный подъёмный мост пересекает пропасть, ведя к арочному входу во двор замка. Цепи подъёмного моста скрипят на ветру, их изъеденное ржавчиной железо натянулось под весом. С вершины высоких мощных стен каменные горгульи смотрят на вас пустыми глазницами с ужасающими ухмылками. Гниющая деревянная опускная решётка ворот, зелёная от обвивающих её растений, преграждает тоннель входа. За ней находятся главные двери в Замок Равенлофт, которые открыты и заливают двор ярким тёплым светом.
''Филлип (играющий Гаретом)'': Я хочу взглянуть на горгулий. Думаю, это не просто статуи.
''Эми (играющая Ривой)'': Подъёмный мост не выглядит шатким? Я хочу посмотреть, насколько он прочный. Как мне кажется, мы сможем пересечь его, или он рухнет под нашим весом?
"""
<<<
В отличие от детских игр в воображаемых героев, D&D предлагает структуру повествования, способ определения последствий действий, совершаемых искателями приключений. Игроки бросают игральные кости, чтобы выяснить, достигла ли атака цели, могут ли они взобраться на утёс, увернутся ли от удара магической молнии и справятся ли с другой опасной задачей. Любой исход возможен, но игровые кости делают некоторые исходы более вероятными, чем другие.
<<<
"""
''Мастер'': Хорошо, давайте по очереди. Филлип, ты осматриваешь горгулий?
''Филлип'': Ага. Есть ли какой-нибудь намёк, что они могут быть существами, а не декорациями?
''Мастер'': Сделай проверку Интеллекта.
''Филлип'': Применяется ли мой навык Анализ?
''Мастер'': Конечно!
''Филлип ''(бросает к20): Эх, семь.
''Мастер'': Тебе кажется, что они выглядят как декорации. Так, Эми, Рива проверяет подъёмный мост?
"""
<<<
В игре D&D каждый игрок создаёт искателя приключений (также называемого «персонажем») и объединяется с другими искателями приключений (отыгрываемыми друзьями). Работая вместе, группа может исследовать тёмное подземелье, разрушенный город, населённый привидениями замок, затерянный глубоко в джунглях храм или заполненную лавой пещеру под таинственной горой. Искатели приключений могут решать головоломки, разговаривать с другими персонажами, сражаться с фантастическими чудовищами и обнаруживать легендарные магические предметы и другие сокровища.
Один игрок берет на себя роль Мастера, арбитра и руководящего игрой рассказчика. Мастер создаёт приключения для персонажей, которые преодолевают опасности и решают, какими путями им следовать. Мастер может описать вход в замок Равенлофт, и игроки решают, что их искатели приключений будут делать. Будут ли они переходить опасный ветхий подъёмный мост? Обвяжут ли они друг друга верёвкой, чтобы свести к минимуму вероятность, что кто-то упадёт, если мост не выдержит? Или используют заклинание, которое перенесёт их через пропасть?
Затем Мастер определяет результаты действий искателей приключений и рассказывает, что с ними произошло. Поскольку Мастер может импровизировать в описании последствий любого действия игроков, D&D бесконечно гибкая игра, и любое приключение может быть захватывающим и непредсказуемым.
В игре нет общепринятого окончания: когда одна история или задание завершается, может начаться другое, создавая непрерывную историю, называемую ''кампанией''. Многие люди, играющие в D&D, ведут кампании на протяжении нескольких месяцев или лет, встречаясь с друзьями примерно каждую неделю, чтобы вернуться к истории с того места, где они остановились. Могущество искателей приключений растёт на протяжении кампании. Каждый побеждённый монстр, каждое законченное приключение и каждое обретённое сокровище не только продвигает историю, но и даёт искателям приключений новые способности. Этот рост сил отражается в уровне искателя приключений.
В игре D&D нет побед или поражений, по крайней мере, не в том смысле, в котором эти слова обычно понимаются. Мастер и игроки совместно создают захватывающую историю об отважных искателях приключений, которые противостоят смертельным опасностям. Иногда героя может ждать ужасный конец: смерть от свирепых чудовищ или гнусного злодея. Даже если такое случится, другие искатели приключений могут начать поиски могущественной магии, способной возродить их павшего товарища, или же игрок может создать нового персонажа, чтобы продолжить игру. Группа может провалить задание, но если все хорошо провели время и создали незабываемую историю, то все выиграли.
<<list-links filter:"[tag[01. Введение]]">>
"""Здорово быть Мастером! Рассказываете фантастические истории о героях, злодеях, чудовищах и магии, но также создаёте мир, в котором эти истории живут. Если вы уже играете в D&D или только собираетесь попробовать, то эта книга для вас.
Руководство Мастера предполагает, что вы уже знакомы с основами настольной ролевой игры D&D. Если вы ранее не играли, то Стартовый набор Dungeons & Dragons отлично подходит для новых игроков и Мастеров.
Помимо этой книги есть ещё две важных: Книга игрока, которая содержит правила, необходимые для создания персонажей и общие правила игры, и Бестиарий в котором описаны готовые чудовища, населяющие миры D&D."""
<<list-links "[tag[Введениe]sort[order]]">>
!!!__''Вдохновение барда''__
"""Своими словами или музыкой вы можете вдохновлять других. Для этого вы должны бонусным действием выбрать одно существо, отличное от вас, в пределах 60 футов, которое может вас слышать. Это существо получает кость бардовского вдохновения — к6.
В течение следующих 10 минут это существо может один раз бросить эту кость и добавить результат к проверке характеристики, броску атаки или спасброску, который оно совершает. Существо может принять решение о броске кости вдохновения уже после броска к20, но должно сделать это прежде, чем Мастер объявит результат броска. Как только кость бардовского вдохновения брошена, она исчезает. Существо может иметь только одну такую кость одновременно.
Вы можете использовать это умение количество раз, равное модификатору вашей Харизмы, но как минимум один раз. Потраченные использования этого умения восстанавливаются после продолжительного отдыха.
Ваша кость бардовского вдохновения изменяется с ростом вашего уровня в этом классе. Она становится к8 на 5 уровне, к10 на 10 уровне и к12 на 15 уровне."""
!!''Вдохновение''
Вдохновение это правило, позволяющее Мастеру награждать вас за хороший отыгрыш черт, идеалов, привязанностей и слабостей. Используя вдохновение, вы можете лучше изобразить сострадание к попрошайкам, получая преимущество в переговорах с Принцем Нищих. Или вдохновение может помочь в защите родной деревни, когда вы сопротивляетесь вредоносному заклинанию волшебника, который напал на неё.
!!!__''Когда даётся вдохновение''__
"""Мастер может даровать вам вдохновение по нескольким причинам. Обычно вдохновение даётся за хороший отыгрыш черты характера, слабости или привязанности, или просто в драматичный момент игры. Спросите Мастера, за что он даёт вдохновение во время игры.
Вы не можете накапливать вдохновения — оно или есть, или нет."""
!!!__''Использование вдохновения''__
"""Если у вас есть вдохновение, вы можете использовать его для улучшения броска атаки, спасброска или проверки характеристики. Вы совершаете бросок с преимуществом.
Кроме того, если у вас есть вдохновение, вы можете наградить другого игрока за хороший отыгрыш, реализацию хитроумного решения или просто за что-то захватывающее. Когда другой персонаж делает то, что делает сюжет увлекательным или интересным, вы можете передать ему своё вдохновение."""
!!!''Ведьмачий взор''
"""//Требование: 15 уровень//
Вы можете видеть истинный облик всех перевёртышей и существ, скрытых магией школы Иллюзия или Преобразование, и находящихся в вашей линии обзора, и при этом в пределах 30 футов от вас."""
//1 уровень, Воплощение, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (веточка дерева, в которое ударила молния)
:''Длительность: ''Концентрация, вплоть до 1 минуты
Луч потрескивающей синеватой энергии устремляется к существу в пределах дистанции, формируя между вами и целью непрерывный дуговой разряд. Совершите дальнобойную атаку заклинанием по этому существу. При попадании цель получает урон электричеством 1к12, и пока заклинание активно, вы можете в каждый свой ход действием автоматически причинять цели урон электричеством 1к12. Это заклинание оканчивается, если вы действием сделаете что-то иное. Заклинание также оканчивается, если цель окажется за пределами дистанции заклинания или получит от вас полное укрытие.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, первичный урон увеличивается на 1к12 за каждый уровень ячейки выше первого.
//Чудесный предмет, необычный//
Если вы держите этот веер, вы можете действием наложить им заклинание порыв ветра (Сл спасброска 13). До следующего рассвета веером лучше не пользоваться. За каждое повторное использование до рассвета существует накопительный 20процентный шанс, что веер не сработает и превратится в бесполезные немагические обрывки.
!!!__''Великий Древний''__
"""Ваш покровитель — таинственная сущность, природа которой совершенно чужда ткани реальности. Он может прийти из Дальнего Предела, пространства за пределами реальности, или это может быть один из древних богов, известных только в легендах. Его мотивы непонятны смертным, и его знания настолько великие и древние, что даже величайшие библиотеки меркнут в сравнении с имеющимися у него секретами. Великий Древний может не знать о вашем существовании или быть полностью равнодушным к вам, но секреты, которые вы узнали, позволяют черпать магию из этого источника.
Сущностями этого типа могут быть Гонадар, зовущийся «Тот Кто Таится», Тариздун «Скованный Бог», Дендар «Ночной Змей», Заргон «Возвращающийся», Великий Ктулху, и прочие непостижимые создания."""
!!!''Расширенный список заклинаний''
Великий Древний позволяет вам при изучении заклинаний колдуна выбирать из более широкого списка. В ваш список заклинаний колдуна добавляются следующие заклинания.
''Дополнительные заклинания Великого Древнего''
<table>
<tr>
<th>Уровень заклинания</th>
<th>Заклинания</th>
</tr>
<tr>
<td>1</td>
<td>диссонирующий шёпот, жуткий смех Таши</td>
</tr>
<tr>
<td>2</td>
<td>воображаемая сила, обнаружение мыслей</td>
</tr>
<tr>
<td>3</td>
<td>подсматривание, послание</td>
</tr>
<tr>
<td>4</td>
<td>подчинение зверя, Эвардовы чёрные щупальца</td>
</tr>
<tr>
<td>5</td>
<td>подчинение личности, телекенез</td>
</tr>
</table>
!!!''Пробуждённый разум''
Начиная с 1 уровня ваше чуждое знание даёт вам возможность касаться разума других существ. Вы можете общаться телепатически с любым существом, которое видите в пределах 30 футов от себя. Вам не нужно знать общий с существом язык для того, чтобы оно понимало ваши телепатические высказывания, но существо должно быть в состоянии понимать как минимум один язык.
!!!''Энтропическая опека''
"""На 6 уровне вы научитесь магически опекать себя от атак и использовать неудачную вражескую атаку на пользу себе. Если существо совершает бросок атаки по вам, вы можете реакцией создать помеху для этого броска. Если атака промахнётся по вам, ваш следующий бросок атаки по этому существу совершается с преимуществом, если вы совершите его до конца своего следующего хода.
Использовав это умение, вы не можете использовать его снова до окончания короткого или продолжительного отдыха."""
!!!''Ментальный щит''
Начиная с 10 уровня ваши мысли не могут быть прочитаны телепатически или иными средствами, если вы не пожелаете обратного. Вы также получаете сопротивление к урону психической энергией, и каждый раз, когда существо причиняет вам урон психической энергией, это существо получает такое же количество урона, что и вы.
!!!''Создать раба''
"""На 14 уровне вы получаете способность инфицировать разум гуманоидов чужеродной магией своего покровителя. Вы можете действием коснуться недееспособного гуманоида. Это существо становится очарованным вами до тех пора, пока на него не будет сотворено заклинание снятие проклятья, либо пока оно не перестанет быть очарованным, либо пока вы не используете это умение ещё раз.
Вы можете общаться телепатически с очарованным существом, пока вы оба находитесь на одном плане существования."""
//7 уровень, Вызов, Бард/Волшебник//
;
:''Время накладывания:'' 1 минута
:''Дистанция'': 300 футов
:''Компоненты:'' В, С, М (миниатюрная дверь из слоновой кости, кусочек полированного мрамора и крошечная серебряная ложка; каждый предмет должен стоить как минимум 5 зм)
:''Длительность:'' 24 часа
"""Вы создаёте межпространственное жилище в пределах дистанции, существующее, пока заклинание активно. Вы выбираете, где будет находиться единственный вход. Вход слабо светится; он 5 футов в ширину и 10 футов в высоту. Вы и все существа, указанные вами при накладывании заклинания, можете входить в это жилище, пока дверь открыта. Вы можете открывать и закрывать дверь, если находитесь в пределах 30 футов от неё. Дверь невидима, когда закрыта.
За дверью находится великолепная прихожая с многочисленными комнатами. Там свежий и тёплый воздух.
Вы можете создать любую планировку, но пространство не может превышать 50 кубов с длиной ребра в 10 футов. Это место украшено и обставлено мебелью так, как вы пожелаете. Там достаточно еды для 100 человек с девятью переменами блюд. Вошедшим прислуживают 100 практически прозрачных слуг. Внешний облик и одежду этих слуг определяете вы. Они послушно исполняют все приказы. Каждый слуга может исполнять задачи, которые доступны любому человеческому слуге, но они не могут атаковать и совершать действия, причиняющие вред другому существу. Таким образом, слуги могут подавать вещи, чистить, штопать, гладить одежду, зажигать огни, подавать пищу, наливать вино и так далее. Слуги могут перемещаться по особняку, но не могут выходить из него. Мебель и другие предметы, созданные этим заклинанием, превращаются в дым, если их вынесут из особняка. Когда заклинание заканчивается, все существа, находящиеся в межпространстве, изгоняются в свободное пространство, ближайшее к входу."""
//Чудесный предмет, необычный//
Эта 60-футовая шёлковая верёвка весит 3 фунта и способна выдержать до 3000 фунтов веса. Если вы удерживаете один конец верёвки, вы можете действием произнести командное слово, чтобы оживить верёвку. Бонусным действием вы можете отдать приказ другому концу двигаться к какому-либо месту на ваш выбор. Этот конец будет продвигаться в сторону указанного места со скоростью 10 футов за раунд, пока не достигнет его, или пока верёвка не размотается на свою полную длину, или же пока вы не прикажете ей остановиться. Вы также можете приказать верёвке крепко обвязаться вокруг какого-либо предмета, отвязаться, навязать или развязать узлы по всей длине или самостоятельно скрутиться кольцом для удобства переноски.
Если вы приказываете верёвке навязать узлы, то они появляются через каждый фут по всей её длине. При этом верёвка становится короче на 10 футов, но зато проверки, совершённые для лазания по ней, совершаются с преимуществом.
У верёвки КД 20 и 20 хитов. Она восстанавливает 1 хит каждые 5 минут, если у неё есть хотя бы 1 хит. Если хиты верёвки опускаются до 0, она уничтожается.
//Чудесный предмет, редкий//
Это 30-футовая верёвка, весящая 3 фунта. Если вы держите один конец верёвки и действием произносите командное слово, другой конец устремляется вперёд, чтобы обмотаться вокруг существа, которое вы видите в пределах 20 футов. Цель должна преуспеть в спасброске Ловкости со Сл 15, иначе она станет опутанной.
Вы можете отпустить существо, произнеся бонусным действием второе командное слово. Цель, опутанная верёвкой, может действием совершать проверку Силы или Ловкости (на свой выбор) со Сл 15. При успехе существо перестаёт быть опутанным верёвкой.
У верёвки КД 20 и 20 хитов. Она восстанавливает 1 хит каждые 5 минут, если у неё есть хотя бы 1 хит. Если хиты верёвки опускаются до 0, она уничтожается.
<<SizeButton "$:/Веревочник (B)""$:/Веревочник (S)">>
Живущие в пещерах по всему Подземью ненасытные верёвочники рады всему, что могут поймать и сожрать. Верёвочники едят любых существ, от зверей Подземья до искателей приключений вместе с их снаряжением.
Верёвочник имеет вид сталактита или сталагмита, что позволяет ему атаковать внезапно. Существо может медленно двигаться, используя тысячи липких ресничек под своим основанием. Оно подкрадывается по стенам пещеры и вдоль потолков, выбирая лучшее место, чтобы атаковать.
//''Охотники Подземья.''//
"""Верёвочник является развитой и зрелой формой пронзателя, с которым его объединяет внешний вид и тактика охоты. Верёвочник может оставаться неподвижным на протяжении долгих часов, прикрывая свой единственный глаз, чтобы больше походить на каменное формирование. Существа, подошедшие слишком близко, удивляются, когда этот глаз распахивается, и в их направлении вылетают липкие хватающие щупальца. Верёвочник издаёт ужасные гортанные звуки, подтягивая борющихся жертв к смертельному укусу своих каменных зубов.
Верёвочник может переваривать практически всё, за исключением платины, драгоценных камней и магических вещей, которые могут быть извлечены из его глотки после смерти. Желудочный сок верёвочника также ценится алхимиками, которые используют его в качестве растворителя."""
//''Ослабляющие щупальца.''//
Верёвочник имеет шесть утолщений вдоль тела, в которых находятся щупальца, липнущие ко всему, чего касаются. Каждое щупальце имеет похожие на волосы наросты, которые проникают в плоть врагов и вытягивают их силу, так что жертва может лишь слабо сопротивляться тянущему её верёвочнику. Если щупальце отрубается или уничтожается, верёвочник производит новое ему на замену.
<<Button "$:/Веревочник (Stats)""Cтат-блок">>
//4 уровень, Вызов, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (крошечный серебряный свисток, кусочек кости и нитка)
:''Длительность:'' 8 часов
"""Вы создаёте призрачного сторожевого пса в свободном пространстве, видимом в пределах дистанции, где он и остаётся на время длительности заклинания, пока вы не отпустите его действием, или пока вы не отойдёте от него более чем на 100 футов.
Пёс невидим для всех существо кроме вас, и ему нельзя причинить вред. Если в пределах 30 футов от него оказывается существо с размером Маленькое или больше, не произнося при этом пароль, указанный вами при накладывании этого заклинания, пёс начинает громко лаять. Пёс видит невидимых существ и его зрение простирается на Эфирный План. Он игнорирует иллюзии.
В начале каждого вашего хода пёс пытается укусить одно существо в пределах 5 футов от себя, враждебное вам. Бонус атаки пса равен вашему модификатору базовой характеристики + ваш бонус мастерства. При попадании он причиняет колющий урон 4к8."""
//Чудесный предмет, необычный//
Из этой закупоренной свинцовой пробкой латунной бутылки, весящей 1 фунт, постоянно сочится тонкая струйка дыма. Если вы действием вынете пробку, из бутылки вырвется облако густого дыма с радиусом 60 футов. Пространство в облаке считается сильно заслонённой местностью. За каждую минуту, пока бутылка стоит открытой и находится внутри облака, его радиус увеличивается на 10 футов, пока не достигнет максимального радиуса 120 футов.
Облако остаётся, пока бутылка открыта. Для закрывания бутылки нужно действием произнести её командное слово. Когда бутылку закроют, дым рассеется за 10 минут. Умеренный ветер (от 11 до 20 миль в час) рассеивает дым за 1 минуту, а сильный ветер (21 миля в час и больше) сделает это за 1 раунд.
//2 уровень, Воплощение, Волшебник/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (порошок рубина на 50 зм, расходуемый заклинанием)
:''Длительность:'' Пока не рассеется
Из предмета, которого вы касаетесь, исходит пламя, эквивалентное по яркости пламени факела. Эффект выглядит как обычное пламя, но не создаёт тепла и не использует кислород. Вечный огонь можно накрыть или спрятать, но не потушить.
//5 уровень, Иллюзия, Бард/Волшебник/Колдун//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' Особая
:''Компоненты:'' В, С, М (горсть песка, капля чернил и перо, выдернутое у спящей птицы)
:''Длительность:'' 8 часов
"""Это заклинание формирует сон другого существа. Выберите целью этого заклинания известное вам существо. Цель должна находиться на одном плане существования с вами. Этим заклинанием нельзя связаться с существами, которые не спят, например, с эльфами. Вы или согласное существо, которого вы касаетесь, входите в транс, становясь посыльным. Находясь в трансе, посыльный осознаёт своё окружение, но не может совершать действий и перемещаться.
Если цель спит, посыльный появляется в её сне и может беседовать с ней, пока та спит, и пока заклинание активно. Посыльный также может формировать окружение сна, создавая местность, предметы и прочие образы. Посыльный может в любое время выйти из транса, окончив эффект этого заклинания. После пробуждения цель прекрасно помнит сон. Если в момент накладывания заклинания цель бодрствует, посыльный это узнаёт, и может либо окончить транс (и заклинание), либо подождать, пока цель заснёт, и тогда он появится во сне цели.
Вы можете сделать посыльного кошмарным для цели. В этом случае посыльный может передать послание не длиннее десяти слов, и цель обязана совершить спасбросок Мудрости. При провале отголоски кошмара длятся весь сон, и цель не получает преимуществ от этого отдыха. Кроме того, когда цель просыпается, она получает урон психической энергией 3к6.
Если у вас есть часть тела, клок волос, обрезки ногтей или другая подобная часть тела цели, она совершает спасбросок с помехой."""
!!!''Взор двух умов''
"""Вы можете действием коснуться согласного гуманоида и до конца своего следующего хода воспринимать всё его чувствами. Пока существо находится на том же плане существования, что и вы, вы можете в последующие ходы действием продлевать эту связь до конца своего следующего хода. При восприятии чувствами другого существа, вы получаете все преимущества от особых чувств, которыми обладает это существо, а сами при этом слепы и глухи. """
//2 уровень, Прорицание, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (щепотка талька и толчёного серебра)
:''Длительность:'' 1 час
Пока заклинание активно, вы видите невидимых существ и предметы, как если бы они были видимы, и ваше зрение простирается на Эфирный План. Эфирные существа и предметы выглядят призрачными и полупрозрачными.
!!!''Видения далёких королевств''
"""//Требование: 15 уровень//
Вы можете неограниченно накладывать заклинание магический глаз, не тратя ячейки заклинаний. """
Сокровища бывают нескольких видов.
;
://''Монеты.''// Самый основной вид сокровищ это деньги. Они могут встречаться в виде медных монет (мм), серебряных монет (см), монет из электрума (эм), золотых монет (зм) и платиновых монет (пм). Пятьдесят монет любого вида весят 1 фунт.
://''Драгоценные камни.''// Драгоценные камни небольшие и лёгкие, и их гораздо легче хранить, чем, к примеру, монеты того же номинала. Смотрите раздел «драгоценные камни» для определения различных видов поделочных, драгоценных и ювелирных камней, которые могут быть найдены в качестве сокровищ.
://''Произведения искусства.''// Это могут быть идолы, отлитые из чистого золота, ожерелья, усыпанные драгоценными камнями, картины древних царей, инкрустированные блюда и многое другое. Смотрите раздел «произведения искусства» для определения видов декоративных и ценных произведений искусства, которые можно найти в качестве сокровищ.
://''Магические предметы.''// Магические предметы включают в себя волшебные палочки, доспехи, жезлы, зелья, кольца, оружие, посохи, свитки и чудесные предметы. По степени редкости магические изделия могут быть разделены на обычные, необычные, редкие, очень редкие и легендарные.
Разумные чудовища часто используют магические предметы, которые имеются в их распоряжении, а другие прячут, чтобы не потерять, или чтобы их не украли. Например, если у племени хобгоблинов есть длинный меч +1 и алхимический сосуд то глава племени может использовать меч, как оружие, а алхимический сосуд будет храниться в надёжном месте.
Dungeons & Dragons это фэнтезийная игра, но эта широкая категория заключает в себе много разновидностей. В кино и художественной литературе существует много различных видов фэнтези. Вы хотите ужасную кампанию, вдохновлённую работами Лавкрафта или Кларка Эштона Смита? Или вы представляете себе мир, наполненный мускулистыми варварами и ловкими ворами, по мотивам классических книг Роберта Говарда и Фрица Лей-бера? Ваш выбор окажет влияние на атмосферу вашей кампании.
!!__''Героическое фэнтези''__
Героическое фэнтези является базовым для D&D. Книга игрока описывает этот вид фэнтези: множество гуманоидных рас сосуществуют с людьми в фантастических мирах. Искатели приключений используют магические силы, чтобы выстоять против чудовищных угроз, с которыми они сталкиваются. Сами персонажи, как правило, обычные люди, но что-то подталкивает их к приключенческой жизни. Искатели приключений являются «героями» кампании, но они не обязательно должны быть настоящими героями, они могут вести такой образ жизни из эгоистических соображений. Технология и общество находятся на уровне средневековья, хотя культура не обязательно европейская. Кампании часто вращаются вокруг древних подземелий, поисков сокровищ или вокруг попыток уничтожить чудовищ или злодеев.
Этот жанр также распространён в фэнтези литературе. Большинство романов в мире Забытых Королевств лучше всего охарактеризовать именно как героическое фэнтези, следуя по стопам многих авторов, перечисленных в приложении «Д» Книги игрока.
!!__''Меч и магия''__
Мрачный, неповоротливый боец потрошит первосвященника бога змеи на его собственном алтаре. Смеющийся плут тратит ворованные деньги на дешёвое пойло в грязных тавернах. Отважные искатели приключений отправляются в неизведанные джунгли в поисках легендарного города Золотых Масок.
Такого рода кампания подражает некоторым из классических произведений в жанре фэнтези. Здесь вы найдёте тёмный, неприукрашенный мир злых колдунов и развращённых городков, где главными героями движут жадность и личные интересы, а не альтруизм. Воины, плуты и варвары здесь встречаются гораздо чаще, чем волшебники, жрецы и паладины. В таком криминальном фэнтези мире личности, обладающие магией, часто символизируют упадок и разложение цивилизации, поэтому волшебники — это классические злодеи в таких мирах. А волшебные предметы очень редки и часто опасны.
Некоторые романы Dungeons & Dragons идут по стопам классических романов в жанре меча и магии. Мир Атхаса (встречающийся в многочисленных романах и играх по мирам Тёмного Солнца) с его героическими гладиаторами и тираническими королями-колдунами принадлежит к этому жанру.
{{$:/Начальное снаряжение}}
!!__''Эпичное фэнтези''__
Благочестивый паладин в блестящих латах берёт своё копьё и бросается на дракона. Прощаясь со своей любимой, благородный волшебник отправляется на поиски, чтобы закрыть врата Девяти Преисподних, которые открылись в далёкой пустыне. Сплочённая группа преданных друзей сражается с превосходящими силами правителя-тирана.
Кампания в жанре эпичного фэнтези рассматривает конфликт между добром и злом как основной элемент игры, с искателями приключений на стороне добра. Эти персонажи — настоящие герои, ведомые высшей целью, а не корыстными интересами и амбициями, встречающие невероятные опасности без тени сомнения. Персонажи могут иметь моральные трудности, борясь со злом внутри себя, а также со 1 злом, угрожающим миру. А истории из подобных кампаний часто включают в себя элемент романтики: трагическая судьба несчастных влюблённых, страсть, превосходящая даже смерть, и чистые отношения между рыцарями, королями и знатью.
Романы Саги о Копье являются примером традиционного эпичного фэнтези в D&D.
!!__''Мифическое фэнтези''__
В то время как разгневанный бог пытается снова и снова уничтожить его, умный плут проделывает длинный путь, возвращаясь домой с войны. Преодолевая опасных стражей подземного мира, благородный воин отправляется в темноту, чтобы получить душу своей возлюбленной. Используя своё божественное происхождение, группа полубогов совершает двенадцать подвигов, чтобы получить божественное благословение для всех смертных.
Кампания в жанре мифического фэнтези основывается на темах и историях из древней мифов и легенд от Гильгамеша до Кухулина.
!!__''Тёмное фэнтези''__
Вампиры повисли на стенах своих проклятых замков. Некроманты работают в темноте подземелья, чтобы создать жутких прислужников из мёртвой плоти. Дьяволы развращают невинных, а оборотни рыщут в поисках добычи по ночам. Всё это составные элементы жанра тёмного фэнтези.
Если вы хотите добавить ужаса в свою кампанию, у вас будет с чем поработать. Бестиарий полон существ, которые идеально подходят для страшного сюжета. Важнейший элемент такой кампании не отражён в правилах. А именно — мир тёмного фэнтези требует атмосферы непрекращающегося страха, которая основывается на медленном продвижении и выразительном описании. Ваши игроки также могут помочь; они должны быть готовы воспринять настроение, которое вы пытаетесь вызвать. Независимо от того, хотите ли вы запустить полноценную кампанию в этом жанре или просто провести одно жуткое приключение, вы должны заранее обсудить свои планы с игроками, чтобы быть уверенным, что они вас поддержат. Ужасы могут быть напряжёнными и личными, что далеко не всем по нраву.
Романы и игровые продукты в мире Равенлофт, Демиплане Ужаса, исследуют элементы тёмного фэнтези в контексте D&D.
!!__''Интрига''__
Продажный визирь вместе со старшей дочерью барона замышляют убийство самого барона. Армия хобгоблинов посылает доппельгангера-шпиона, чтобы проникнуть в город перед вторжением. На посольском балу придворный шпион встречается с работодателем.
Политические интриги, шпионаж, саботаж, и подобные мероприятия могут служить основой для увлекательнейшей кампании D&D. В таком виде игры персонажи должны больше заботиться о тренировке навыков и установлении контактов, чем об атакующих заклинаниях и магическом оружии. Ролевая игра и социальное взаимодействие имеют большее значение, чем бои, и отряд может отыграть несколько собраний, не встретив ни единого чудовища.
Опять же, убедитесь, что ваши игроки знают об этом заранее. Иначе игрок может создать дварфа-паладина, ориентированного только на оборону, а позже понять, что он находится не в своей тарелке среди полуэльфов-дипломатов и тифлин-гов-шпионов.
Ангелы из Ада — роман Эрин М. Эванс, сосредоточенный на интригах в мире Забытых Королевств, от подлой политики Баатора до спорной преемственности власти в королевстве Кормир.
!!__''Детектив''__
Кто украл легендарное волшебное оружие и спрятал его подальше в отдалённой темнице, оставив загадочную подсказку о ней? Кто поместил герцога в волшебный сон, и как его разбудить? Кто убил главу гильдии, и как убийца проник в закрытое хранилище гильдии?
Кампания в жанре детектива делает из персонажей исследователей, путешествующих из города в город и расследующих сложные дела, с которыми местные власти не могут справиться. Такая кампания делает особый акцент на головоломках и на решении задач.
Большая тайна даже может стать общей темой для целой кампании. Почему кто-то убил наставника персонажей, вынудив их отправиться в приключения? Кто на самом деле управляет культом Красной Руки? Но в таком случае персонажи смогут найти ответ на главный вопрос только в конце игры; одиночные приключения всё-таки лучше подходят к этому жанру. С другой стороны, игра из одних только загадок может стать неприятной, так что не забудьте добавить сцены других типов в игру.
Романы, написанные по различным мирам D&D, исследуют жанр детектива с фэнтези уклоном. В частности, Убийство в Кормире (Чета Вильямсона), Убийство в Халруаа (Ричарда С. Мейерса), и Буря заклятий (Эда Гринвуда) — детективы, действие которых происходит в мире Забытых Королевств. Убийство в Тарсис (Джона Мэддокса Робертса) — детектив из мира Саги о Копье.
!!__''Безрассудство''__
Моряки с рапирами отбиваются от идущих на абордаж сахуагинов. Упыри скрываются в заброшенных кораблях, ожидая прихода охотников за сокровищами. Лихие жулики и очаровательные паладины прорываются сквозь паутину дворцовых интриг и прыгают с балкона в седло ожидающих лошадей.
Безрассудные приключения пиратов и мушкетёров открывают возможности для динамичной кампании. Персонажи, как правило, проводят больше времени в городах, в королевском суде, и на мореходных судах, чем в подземельях, делая навыки взаимодействия важными (хотя и не в такой степени, как в кампании с интригой). Тем не менее, иногда герои могут попасть в места, похожие на классическое подземелье, такие как канализация под дворцом, в которой скрыты палаты злого герцога
Хорошим примером безрассудного разбойника в мире Забытых Королевств является Джек Рэй-венваилд, который фигурирует в романах Ричарда Бейкера (Город Воронов и Принц Воронов).
!!__''Война''__
Армия хобгоблинов марширует в сторону города, приказывая слонам и великанам долбить стены цитадели. Драконы кружат над варварской ордой, разбрасывая врагов, в то время как яростные воины прорубают себе путь через поля и леса. Саламандры собираются по команде ифритов, чтобы напасть на астральную крепость.
Война в фэнтезийном мире изобилует возможностями для приключений. Кампания в жанре войны в целом не связана с особенностями передвижения войск, она вместо этого фокусируется на героях, чьи действия могут переломить ход сражения. Персонажи выполнять конкретные задачи: захватить волшебный штандарт, который усиливает армии нежити, собрать подкрепление, чтобы сломать осаду, или разрезать вражеский фланг, чтобы достичь демонического командира. В других ситуациях отряд поддерживает большую армию, удерживая стратегическое расположение, пока не прибудет подкрепление, убивая вражеских разведчиков, прежде чем они смогут передать информацию, или отрезая линии снабжения. Сбор информации и дипломатические миссии могут дополнять такие, ориентированные на сражения, приключения.
Война Копья в романах Хроники Саги о Копье и Война Паучьей Королевы в серии романов с тем же названием — примеры выдающихся войн в мирах D&D.
!!__''Уся - китайское боевое фэнтези''__
Когда сенсей таинственно исчезает, её молодые ученики должны занять её место и выследить демонов “они”, терроризирующих деревню. Выполнившие задание герои, мастера боевых искусств, возвращаются домой, чтобы освободить свою деревню от злого военачальника хобгоблинов. Мастер ракшас из близлежащего монастыря проводит ритуалы, пробуждающие беспокойных призраков.
Кампания, основанная на элементах азиатских боевых искусств, идеально подходит для D&D. Игроки могут определить внешний вид своих персонажей и снаряжения, нужно лишь внести незначительные изменения, чтобы они лучше отражали данный жанр. Например, когда персонажи используют заклинания или особые способности, которые телепортируют их на короткие дистанции, они на самом деле делают высокие акробатические прыжки. Проверка лазания это теперь не поиск выступов, за которые можно ухватиться, а умение отскакивать от стен или от дерева к дереву. Воины ошеломляют своих противников, используя болевые точки. Яркие описания действий в игре никак не влияют на её правила, но важны для поддержания атмосферы и стиля текущей кампании.
Подобно умениям, классам персонажей не нужны новые правила, чтобы перевести их в новую культуру, достаточно просто изменить их названия. Традиционный китайский герой может быть паладином с мечом под названием Клятва Мести, а японский самурай может быть паладином с Клятвой преданности (бусидо), которая заключается в верности лорду (даймё). Монах становится ниндзя, который идёт Путём тени. Волшебник, чародей и колдун станут ву дженом, цункай и свами соответственно, ведь магические персонажи отлично подходят к игре, вдохновлённой средневековой азиатской культурой.
!!!''Название оружия для уся''
Игроки, использующие тетсубо или катану, а не палицу или длинный меч, гораздо глубже погружаются в атмосферу игры в кампании уся. В приведённой ниже таблице перечислены альтернативные названия для общего оружия из Книги игрока и определены их реальные культурные корни. Альтернативное название не меняет ни одного из свойств оружия.
Пересекая миры
Известный паладин Мёрлинд, из мира Орт (который фигурирует в романах и игровых продуктах мира Серого Ястреба), одет в традиционную одежду времён Старого Запада и носит пару шестизарядных на поясе. Булава Святого Кутберта — святое оружие, принадлежащего богу правосудия из мира Серого Ястреба, оказывается в музее Виктории и Альберта в Лондоне в 1985 году. По слухам, где-то в Барьерных Пиках Орта валяются обломки космического судна с причудливыми формами жизни и странными технологиями на борту. А знаменитый волшебник Эльминстер из мира Забытых Королевств, как говорят, время от времени появляется на кухне канадского писателя Эда Гринвуда — где он иногда присоединяется к другим волшебникам из миров Орт и Кринн (родной мир Саги о Копье).
Глубоко в корнях D&D лежат элементы научной фантастики и научного фэнтези, и ваша кампания также может на них основываться. Это нормально отправить персонажей через волшебное зеркало в страну чудес Льюиса Кэрролла, перенести их на борт корабля, путешествующего между звёздами, или провести свою кампанию в далёком мире будущего, где лазерные бластеры и волшебные стрелы существуют бок о бок. Возможности безграничны. В главе 9, которая называется «мастерская ведущего», предоставлены инструменты для изучения этих возможностей.
{{$:/Названия оружия для уся}}
//4 уровень, Преобразование, Волшебник/Друид/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 300 футов
:''Компоненты:'' В, С , M (капля воды и щепотка пыли)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пока это заклинание активно, вы контролируете свободно текущую или стоячую воду в кубе с длиной ребра 100 футов. Вы можете выбрать один эффект из перечисленных ниже. Вы можете в свой ход действием повторить тот же эффект или выбрать другой.
//''Водоворот.''// Для этого эффекта требуется объём воды в квадрате с длиной стороны 50 футов и глубиной 25 футов. В центре области вы формируете водоворот. Водоворот создаёт воронку шириной 5 футов в основании, 50 футов в верхней части, и высотой 25 футов. Все существа и предметы, находящиеся в воде в пределах 25 футов от водоворота, подтягиваются к нему на 10 футов. Существа могут плыть прочь от водоворота, совершая проверку Силы (Атлетика) против Сл ваших заклинаний.
Если существо впервые за раунд входит в пространство воронки или начинает в ней ход, оно должно совершить спасбросок Силы. При провале существо получает дробящий урон 2к8 и становится пойманным воронкой, пока заклинание активно. При успешном спасении существо получает половину урона, и не становится пойманным воронкой. Пойманное воронкой существо может действием пытаться уплыть от водоворота, как описано выше, но проверка Силы (Атлетика) совершается с помехой.
В каждом ходу в первый раз, когда предмет оказывается в области воронки, он получает дробящий урон 2к8; этот же урон причиняется за каждый раунд, проведённый предметом в воронке.
//''Наводнение.''// Вы увеличиваете уровень стоячей воды в области на высоту до 20 футов. Если в область попадает берег, вода выливается на землю.
Если вы выбрали область посреди другого водного пространства, то вы вместо этого создаёте волну высотой 20 футов, проходящую с одного края области до другого, где она и опадает. Все транспортные средства Огромного размера и меньше по ходу волны уносятся вместе с волной на противоположную сторону. Все транспортные средства Огромного размера и меньше, ударенные волной, получают 25 процентный шанс опрокинуться.
Уровень воды остаётся повышенным, пока заклинание не окончится или вы не выберете другой эффект. Если этот эффект создал волну, волна будет повторяться в начале вашего следующего хода, пока длится эффект «наводнение».
//''Перенаправление потока.''// Вы заставляете текущую воду в области перемещаться в выбранном вами направлении, даже если воде придётся течь через препятствия, вверх по стенам или в другом неугодном ей направлении. В области заклинания вода течёт так, как укажете вы, но оказавшись за пределами зоны заклинания, она возвращается к естественному течению. Вода продолжает течь в указанном вами направлении, пока заклинание активно или пока вы не выберете другой эффект.
//''Разделение воды.''// Вы заставляете воду в области разойтись в стороны, формируя проход. Проход простирается в области заклинания, а разделённые воды формируют стены с обеих сторон. Проход существует, пока заклинание активно, или пока вы не выберете другой эффект. После этого вода в течение раунда медленно заполняет проход, восстанавливаясь до нормального уровня."""
//8 уровень, Преобразование, Волшебник/Друид/Жрец//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' На себя (5-мильный радиус)
:''Компоненты:'' В, С, М (горящее благовоние и кусочки земли и дерева, смешанные с водой)
:''Длительность:'' Концентрация, вплоть до 8 часов
"""Вы получаете на время длительности контроль над погодой в пределах 5 миль от себя. Для накладывания этого заклинания вы должны находиться на открытом воздухе. Если вы переместитесь в место, где над головой не будет неба, заклинание тут же закончится.
Когда вы накладываете это заклинание, вы изменяете текущую погоду, которую определяет Мастер в зависимости от климата и времени года. Вы можете изменить осадки, температуру и ветер. Требуется 1к4 × 10 минут, чтобы новые условия вступили в силу. Когда новые условия вступят в силу, вы можете создать новые условия. Когда заклинание оканчивается, погода постепенно возвращается к нормальной.
Изменяя погоду, найдите текущее состояние в таблицах и измените их на 1 позицию выше или ниже. Изменяя ветер, можете изменить его направление."""
<table>
<tr>
<th colspan="2">Осадки</th>
<th colspan="2">Температура</th>
<th colspan="2">Ветер</th>
</tr>
<tr>
<th>Сила</th>
<th>Состояние</th>
<th>Сила</th>
<th>Состояние</th>
<th>Сила</th>
<th>Состояние</th>
</tr>
<tr>
<td>1</td>
<td>Чистое небо</td>
<td>1</td>
<td>Невыносимая жара</td>
<td>1</td>
<td>Штиль</td>
</tr>
<tr>
<td>2</td>
<td>Небольшая облачность</td>
<td>2</td>
<td>Жара</td>
<td>2</td>
<td>Умеренный ветер</td>
</tr>
<tr>
<td>3</td>
<td>Пасмурно или густой туман</td>
<td>3</td>
<td>Тепло</td>
<td>3</td>
<td>Сильный ветер</td>
</tr>
<tr>
<td>4</td>
<td>Дождь, град или снег</td>
<td>4</td>
<td>Прохлада</td>
<td>4</td>
<td>Буря</td>
</tr>
<tr>
<td rowspan="2">5</td>
<td rowspan="2">Проливной дождь, сильный град или метель</td>
<td>5</td>
<td>Холод</td>
<td rowspan="2">5</td>
<td rowspan="2">Шторм</td>
</tr>
<tr>
<td>6</td>
<td>Арктическая стужа</td>
</tr>
</table>
//"""Алый купол был исчерчен потоками ядовитого газа, похожими на грязные облака. Закручиваясь, они формировали нечто, похожее на глядящие с неба глаза. Глаза, которые рассеивались, не успев сфокусироваться, но тут же формирующиеся снова, и так по кругу. Окутанная рубиновым свечением, лежала тёмная кошмарная земля, представлявшая собой обнажённые камни и потоки искр и пламени, в тенях от которого извивались и дёргались какие-то твари. Горы царапали рубиновое небо. Земля Зубов, как однажды удачно назвал это место Азут, глядя на бесконечные остроконечные скалы. Это были Встречающие Земли, царство ужаса, принявшее жизни бесчисленных смертных. Они вращались над Авернусом, верхней из Девяти Преисподних."""//
<<AlignRight "— Эд Гринвуд, //Эльминстер в Аду//">>
Если Внутренние Планы это сырая материя и энергия, составляющая мультивселенную, то Внешние Планы предоставляют направление, мысль и цель для сотворения этой самой мультивселенной. Соответственно, многие мудрецы считают Внешние Планы божественными или духовными, так как больше всего они известны тем, что там живут боги.
При обсуждении всего, что касается божеств, язык становится очень метафоричным. Их настоящие дома это вовсе не какие-то конкретные строения, а воплощение той самой идеи, что
Внешние Планы — это миры мысли и духа. Так же, как и в случае со Стихийными Планами, ощутимую часть Внешних Планов можно представить в виде пограничного региона, а обширные духовные области будут лежать за пределами обычных органов чувств.
Даже в воспринимаемых частях внешность может быть обманчивой. Изначально большинство Внешних Планов выглядит гостеприимно и знакомо уроженцам Материального Плана. Однако даже ландшафт здесь может меняться по прихоти мощных сил, обитающих здесь, полностью перестраиваясь, стирая и заново формируя реальность, удовлетворяющую потребности этих божеств.
Расстояние — практически бессмысленное понятие на Внешних Планах. Воспринимаемые части планов могут выглядеть небольшими, но могут также растягиваться до размеров, кажущихся бесконечными. Искатели приключений могут пройти за день все Девять Преисподних, с первого по девятый слой — если повелители Преисподних захотят этого. В противном же случае путники по одному только слою могут пробираться неделю.
По умолчанию Внешние Планы это группа из шестнадцати планов, соответствующих восьми мировоззрениям (исключая нейтральность, которой соответствуют Внешние Земли, описанные в разделе «прочие планы») и переходам между ними.
{{$:/Внешние планы}}
Планы с элементом добра в мировоззрении называются ''Верхними Планами'', а содержащие элемент зла называются ''Нижними Планами''. Мировоззрение плана это его сущность, и персонажи, чьё мировоззрение не совпадает с мировоззрением плана, чувствует себя на нём очень неуютно. Например, когда доброе существо посещает Элизиум, оно чувствует себя в гармонии, но злое существо не сможет там найти себе место.
Верхние Планы — дом небожителей, включая ангелов, коатлей и пегасов. Нижние Планы — дом исчадий: демонов, дьяволов, юголотов и им подобных. В планах между ними есть свои уникальные обитатели: раса конструктов модронов в Механусе и аберрации слаады в Лимбо.
!!__''Слои Внешних Планов''__
Большая часть Внешних Планов содержит в себе несколько разных сред или царств. Эти царства часто представляют и изображают как связанные между собой слои одного и того же плана, поэтому путники и называют их «слоями». Например, Гора
Целестия напоминает пирог из семи слоёв, в Девяти Преисподних девять слоёв, а в Бездне, кажется, слоёв несчётное множество.
Большинство порталов извне ведёт на первый слой составного плана. В зависимости от плана, этот слой изображают либо верхним, либо нижним. Будучи местом прибытия чужаков, первый слой выполняет задачу городских ворот.
!!__''Путешествие между Внешними Планами''__
Путешествие между Внешними Планами не отличается от простого перемещения на Внешний План. Персонажи, путешествующие посредством заклинания проекция в астрал, могут перейти с одного плана в Астральный План, и искать там цветной вихрь, ведущий в нужное место. Персонажи могут также использовать уход в иной мир, чтобы перейти непосредственно на другой план. Однако гораздо чаще персонажи используют порталы — либо порталы, соединяющие два плана, либо порталы, ведущие в Сигил, Город Дверей, в котором есть порталы на все существующие планы.
Две планарные достопримечательности соединяют между собой часть Внешних Планов: река Стикс и Бесконечная Лестница. В вашей кампании могут существовать и другие планарные перекрёстки, такие как Мировое Древо, чьи корни касаются Нижних Планов, а ветви достигают Верхних Планов, или может быть, в вашей космологии можно перейти с одного плана на другой просто пешком, пройдя долгий путь.
!!!''Река Стикс''
Эта река бурлит от грязи, обломков и трупов от сражений, идущих на её берегах. Все существа кроме исчадий, касающиеся её воды или выпивающие её, попадают под действие заклинания слабоумие. Сл спасброска Интеллекта для противодействия этому эффекту равна 15.
Стикс течёт по верхним слоям Ахерона, Девяти Преисподних, Геенны, Гадеса, Карцери, Бездны и Пандемониума. Притоки Стикса идут с нижних слоёв этих планов. Например, притоки Стикса есть на всех слоях Девяти Преисподних, что и позволяет переходить с одного слоя этого плана на другой.
По водам Стикса ходят мрачные паромы, управляемые кормчими, знающими как справляться с непредсказуемыми потоками и завихрениями воды. За соответствующую плату, эти кормчие могут перевезти пассажиров с одного плана на другой. Некоторые из них — исчадия, но встречаются также души мёртвых существ с Материального Плана.
!!!''Бесконечная Лестница''
Бесконечная Лестница это межпространственная винтовая лестница, соединяющая планы. Вход на Бесконечную Лестницу обычно выглядит как ничем не примечательная дверь. За проходом находится небольшая площадка с такими же непримечательными лестницами вверх и вниз. Бесконечная Лестница изменяет свой облик, пока по ней поднимаешься или спускаешься, становясь из обычной деревянной или каменной лестницы хаотичным скопищем ступенек, висящих в лучащемся пространстве, где нет двух ступенек с одинаковым направлением гравитации. Говорят, что если тщательно поискать на площадке Бесконечной Лестницы, можно найти своё самое сокровенное желание.
Двери на Бесконечную Лестницу часто скрываются в полузабытых местах, которыми мало кто пользуется. На любом плане может быть сразу несколько дверей на Бесконечную Лестницу, но эти входы известны далеко не всем, и иногда они охраняются дэвами, сфинксами, юголотами и другими сильными чудовищами.
!!__''Опциональные правила''__
У каждого Внешнего Плана есть своя характеристика, делающая путешествие по нему уникальным опытом. План может влиять на посетителей множеством способов, взывая к чертам характера и слабостям, демонстрируя так свой характер, или даже меняя мировоззрение в сторону мировоззрения уроженцев этого плана. В описание каждого плана входит одно или несколько правил, которые вы можете использовать для того, чтобы сделать это место запоминающимся.
!!!''Опциональное правило: Психический диссонанс''
Все Внешние Планы излучают психический диссонанс, влияющий на посетителей с отличающимся мировоззрением — добрых существ на Нижних Планах, злых на Верхних Планах — если те проведут здесь слишком много времени. Вы можете воспроизвести этот диссонанс этим опциональным правилом. В конце продолжительного отдыха, проведённого на неподходящем плане, посетитель должен совершить спасбросок Телосложения со Сл 10. При провале существо получает одну степень истощения. Несовпадение по шкале законность-хаотичность не вызывает такого эффекта, поэтому на Механус и Лимбо это правило не распространяется.
!!__''Гора Целестия''__
Единственная священная гора Целестия выходит из сияющего Серебряного Моря и уходит в высоты, которые едва видно и трудно описать, а семь плато отмечают её семь небесных слоёв. Этот план — модель правосудия и порядка, небесной милости и бесконечного сострадания, где ангелы и защитники добра противостоят нападкам зла. Это одно из малочисленных мест на планах, где путники могут по-настоящему расслабиться. Местные обитатели стремятся быть праведными. Бесчисленные существа стремятся достичь вершины горы, но способны на это только самые чистые души. Один лишь взор на этот горный пик наполняет душу трепетом.
!!!''Опциональное правило: Благословенное попечение''
В противоположность диссонансу, испытываемому здесь злыми существами, добрые существа благословляются самим планом. Существа с добрым мировоззрением получают преимущества от заклинания благословение, пока они находятся на этом плане. Кроме того, завершение продолжительного отдыха на этом плане дарует добрым существам преимущества от заклинания малое восстановление.
!!__''Битопия''__
Два слоя Двойного рая Битопии похожи между собой, но всё же противопоставлены друг другу: один это возделываемый пасторальный ландшафт, а другой — необузданная глушь, хотя оба отражают доброту, а при необходимости и принятие порядка. Битопия — рай продуктивного труда, удовольствие от проделанной работы. Доброта, текущая сквозь этот план, создаёт в живущих здесь существах благорасположение и счастье.
!!!''Опциональное правило: Вездесущее добро''
В конце каждого продолжительного отдыха, совершённого на этом плане, посетитель, чьё мировоззрение не законно-доброе и не нейтрально-доброе, должен совершить спасбросок Мудрости со Сл 10. При провале мировоззрение существа меняется на законно-доброе или нейтрально-доброе (в зависимости от того, к чему ближе его предыдущее мировоззрение). Изменение станет постоянным, если существо не покидает план в течение 1к4 дней. В противном cлучае мировоззрение существа возвращается через один день, проведённый вне Битопии.
Накладывание заклинания рассеивание добра и зла на такое существо тоже восстанавливает исходное мировоззрение.
!!__Элизиум__
Элизиум это дом существ несравненной доброты и сострадания, и гостеприимное убежище для путников, ищущих безопасную гавань. Идиллистиче-ские ландшафты этого плана пронизаны жизнью и красотой. В кости и душу тех, кто приходит на этот план, проникает спокойствие. Это приют заслуженного отдыха, место, где на многих щеках блестят слёзы счастья.
!!!''Опциональное правило: Подавляющая радость''
Посетители этого плана рискуют попасть под сокрушающее ощущение удовольствия и счастья. В конце каждого продолжительного отдыха, совершённого на этом плане, посетитель должен совершить спасбросок Мудрости со Сл 10. При провале существо не захочет покидать этот план, не совершив здесь ещё один продолжительный отдых. После трёх проваленных спасбросков существо уже никогда добровольно не покинет этот план, а если его перенесут насильно, сделает всё, что в его силах, чтобы вернуться на этот план. Заклинание рассеивание добра и зла устраняет этот эффект на этом существе.
!!__''Звериные Земли''__
Звериные Земли это план природной свободы, лесов, разнящихся от поросших мхом мангровых рощ до заснеженной тайги, густых джунглей, где ветви переплетены так густо, что не пропускают свет, обширных равнин, где травы и дикие цветы колышутся на ветру, сияющем жизненной силой. Этот план воплощает дикость и красоту природы, но он также будит животные инстинкты, спящие в живых существах.
!!!''Опциональное правило: Рай охотника''
Посетители Звериных Земель обнаруживают, что их способности охотника и разведчика улучшаются, и, находясь здесь, персонажи совершают с преимуществом проверки Мудрости (Внимательность), Мудрости (Выживание) и Мудрости (Уход за животными).
!!!''Опциональное правило: Превращение в зверя''
Каждый раз, когда посетитель убивает зверя, родного для этого плана, убийца должен преуспеть в спасброске Харизмы со Сл 10, иначе он превратится (как будто под действием заклинания превращение) в такой же тип зверя, что он убил. В этом облике существо сохраняет своё сознание и способность говорить. В конце каждого продолжительного отдыха превращённое существо может повторять спасбросок. При успехе существо возвращает себе свой облик. После трёх проваленных спасбросков превращение может быть отменено только заклинанием снятие проклятья или аналогичной магией.
!!__''Арборея''__
Арборея символизирует не просто жизнь, а место жестокого отношения и сильной привязанности, капризов и яркой, но быстро сгорающей страсти. Местные добрые по натуре обитатели преданны сражению со злом, но их безрассудные эмоции иногда вырываются наружу с разрушительными последствиями. Ярость здесь широко распространена и считается заменой радости. Горы и леса здесь чрезвычайно крупные и красивые, и все поляны и ручьи заселены духами природы, которые не терпят нарушений обязательств. Путники должны вести себя здесь осторожно.
Арборея — дом множества эльфов и эльфийских божеств. Эльфы, родившиеся на этом плане, обладают типом «небожитель», и в сердце они очень дикие, готовые в любой миг ринуться в сражение. Во всём остальном они выглядят и ведут себя как обычные эльфы.
!!!''Опциональное правило: Острая тоска''
Отслеживайте, сколько дней гости проведут на Арборее. Когда посетитель уходит, он должен совершить спасбросок Харизмы со Сл 5, плюс 1 за каждый проведённый на этом плане день. При провале существо охватывает тоска по Арборее. Пока эффект действует, существо совершает с помехой проверки характеристик. В конце каждого продолжительного отдыха существо может повторять этот спасбросок, оканчивая эффект в случае успеха. Заклинание рассеивание добра и зла устраняет этот эффект на этом существе.
!!__''Асгард''__
Асгард это грубое царство парящих гор, глубоких фиордов и овеваемых ветрами полей сражений, с долгим и жарким летом, и беспощадными лютыми зимами. Его континенты парят над океаном из вулканического камня, под которым находятся такие огромные ледяные пещеры, что в них помещаются целые королевства великанов, людей, дварфов, гномов и прочих созданий. Герои приходят на Асгард, чтобы испытать своё мужество в схватке не только с самим планом, но и с великанами, драконами и прочими жуткими существами, бродящими по обширным равнинам Асгарда
!!!''Опциональное правило: Бессмертный гнев''
Асгард — дом убитых героев, ведущих вечное сражение на полях славы. Все существа кроме конструктов и нежити, убитые на Асгарде атакой или заклинанием, становятся снова живыми на рассвете следующего дня. Все хиты существа восстанавливаются, а все состояния и негативные эффекты, бывшие у него перед смертью, исчезают.
!!__''Лимбо''__
Лимбо это план чистого хаоса, кипящий бульон из непостоянной материи и энергии. Камень здесь плавится в воду, которая затвердевает металлом, потом превращается в алмаз, сгорающий дымом, который становится снегом, и так далее, в бесконечном непредсказуемом процессе изменений. Среди этого беспорядка дрейфуют участки с более привычным ландшафтом — куски лесов, лугов, разрушенные замки, и даже бурлящие ручьи. Весь этот план — кошмарный беспорядок.
На Лимбо нет гравитации, поэтому существа, пришедшие сюда, парят на месте. Существо может перемещаться со скоростью, не превышающей своей скорости ходьбы, в любом направлении, просто подумав о желаемом направлении путешествия.
Лимбо подстраивается под волю существ, населяющих его. Очень дисциплинированное и мощное сознание может создавать здесь целые острова, и поддерживать такие места в течение нескольких лет. Однако, такие бесхитростные существа как рыбы, например, проживут не больше минуты, после чего вода, окружающая их, замёрзнет, испарится или превратится в стекло. Слаады живут здесь и парят среди хаоса, создавая ничто, в то время как монахи гитзераев силой мысли создают целые монастыри.
!!!''Опциональное правило: Сила мысли''
Существо на Лимбо может действием совершить проверку Интеллекта, чтобы силой мысли переместить находящийся на этом плане предмет, видимый в пределах 30 футов. Сл зависит от размера предмета: Сл 5 для Крохотного, Сл 10 для Маленького, Сл 15 для Среднего, Сл 20 для Большого и Сл 25 для Огромного или ещё большего. При успешной проверке существо перемещает предмет на 5 футов плюс 1 фут за каждую единицу результата сверх положенной Сл.
Существо может также действием совершить проверку Интеллекта для изменения немагического предмета, который никто не несёт и не носит. Применяются те же правила по дистанции, а Сл зависит от размера предмета: Сл 10 для Крохотного, Сл 15 для Маленького, Сл 20 для Среднего и Сл 25 для Большого или ещё большего. При успешной проверке существо превращает предмет в другой неживой предмет такого же размера, например, превращает валун в огненный шар.
Существо может действием совершить проверку Интеллекта, чтобы стабилизировать сферическую область с центром на себе. Сл зависит от радиуса сферы. Базовая Сл 5 для сферы с радиусом 10 футов; каждые дополнительные 10 футов радиуса увеличивают Сл на 5. При успешной проверке существо не даёт этой области быть изменённой планом в течение 24 часов, или пока оно не использует это умение ещё раз.
!!__''Пандемониум''__
Пандемониум это план безумия, огромная скала, пронизанная туннелями, в которых воет ветер. Здесь холодно, шумно и темно, так как нет естественного света. Ветер быстро тушит немагическое открытое пламя, такое как у факелов и костров. Из-за него же говорить приходится криком, и то слышно лишь в пределах 10 футов. Существа совершают с помехой все проверки характеристик, основанные на слухе.
Большая часть обитателей этого плана — существа, изгнанные сюда, и уже не надеющиеся сбежать, и большая их часть сведена с ума постоянным шумом, либо же живёт в таких местах, где шум ветра похож на далёкий крик муки.
!!!''Опциональное правило: Ветер безумия''
Посетитель должен совершать спасбросок Мудрости со Сл 10 после каждого часа, проведённого на воющем ветру. При провале существо получает один уровень истощения. Существо, получившее шестой уровень истощения на этом плане не умирает, а получает случайное бессрочное безумие, из главы 8. Окончание продолжительного отдыха не уменьшает уровень истощения существа, если оно не защитилось каким-либо образом от сводящего с ума ветра.
!!__''Бездна''__
Бездна является воплощением всего порочного, жуткого и хаотичного. Её практически бесконечные слои уводят по спирали, принимая всё более и более мерзкие формы.
На каждом слою Бездны царит своя уникальная среда. Нет двух похожих слоёв, и все они суровые и негостеприимные. Каждый слой также отражает энтропическую природу Бездны. Фактически, всё, что можно увидеть или коснуться на этом плане, находится в разлагающемся, ветхом или изъеденном состоянии.
!!!''Опциональное правило: Развращение Бездной''
Посетитель с незлым мировоззрением, оканчивающий в Бездне продолжительный отдых, должен совершить спасбросок Харизмы со Сл 10. При провале существо становится развращённым. Определите эффект развращения по прилагающейся таблице. Вы можете заменить некоторые эффекты придуманными собой.
Окончив продолжительный отдых, развращённое существо может совершить спасбросок Харизмы со Сл 15. При успешном спасении эффект развращения оканчивается. Заклинание рассеивание добра и зла и любая магия, снимающая проклятья, также оканчивают этот эффект.
Если развращённое существо не покинет этот план в течение 1к4 + 2 дней, его мировоззрение становится хаотично-злым. Накладывание на него заклинания рассеивание добра и зла восстанавливает исходное мировоззрение.
{{$:/Развращение Бездной}}
!!!''Важные слои''
Слои Бездны определяются демоническими повелителями, правящими ими, что и демонстрируют приведённые ниже примеры. Подробности о демонических повелителях можно найти в Бестиарии.
;
://''Ненасытная Утроба.''// Слой Демогоргона в Бездне представляет собой обширные пустоши разгульной дикости и безумия, где даже мощные демоны сходят с ума от страха. Отражая двойственную природу Демогоргона, Ненасытная Утроба состоит из массивного первозданного континента, покрытого густыми джунглями, окружённого, по-видимому, бесконечным океаном. Князь Демонов правит этим слоем, сидя в двойной змеевидной башне, выступающей над штормовым морем. Каждая из башен увенчана огромным черепом с клыками. В этой крепости Бездны мало кто может долго находиться, не сходя с ума.
:''//Танатос.//'' Будь на то воля Оркуса, все планы выглядели бы как его жуткое царство Танатос, а все существа были бы нежитью под его контролем. Укрытый сверху чёрным небом, Танатос демонстрирует мрачные горы, болота, разрушенные города и леса с чёрными искривлёнными деревьями. Ландшафт усеян склепами, мавзолеями, надгробными плитами и саркофагами. Повсюду ходит нежить, вырываясь из склепов и могил, стремясь разорвать на части глупых забредших сюда существ. Оркус правит Танатосом из большого дворца, известного как Утрата, построенного из обсидиана и костей. Этот дворец, находящийся на завывающей пустоши, называемой Концом Забвения, окружён склепами и могилами, образующими узкие аллеи многоярусного некрополя.
:"""''//Демоническая Паутина.//'' Слой Лолс представляет собой обширную сеть из толстой магической паутины, создающей проходы и похожие на коконы комнаты. В этой паутине висят здания, строения, корабли и прочие предметы, будто бы пойманные огромным пауком. Эта паутина создаёт в разных местах этого плана случайные порталы, затягивающие предметы с демипланов и миров Материального Плана, нужные для планов Королевы Пауков. Слуги Лолс также строят в паутине настоящие подземелья, охотясь на врагов Лолс в пересекающихся коридорах из укреплённого паутиной камня.
Глубоко под этими подземельями находятся бездонные Ямы Демонической Паутины. Там и живёт Лолс, окружённая помощницами — демонами йохлол, созданными ей для служения, и которые в царстве Королевы Пауков превосходят по статусу всех других демонов."""
://''Бесконечный Лабиринт''//. Слой Бафомета на Бездне представляет собой не имеющее выхода подземелье, в центре которого находится огромный дворец Рогатого Короля в форме зиккурата Представляющий собой месиво из кривых коридоров и многочисленных комнат, дворец окружён рвом шириной в милю, в котором скрывается безумная последовательность из лестниц и туннелей, ведущих в глубины крепости.
://''Тройное Царство.''// Тёмный Князь Граз’зт правит Аззагратом, который состоит из трёх слоёв Бездны. Его средоточием власти является потрясающий Серебряный Дворец в городе Зелатар, чьи шумные рынки и различные места для получения удовольствия привлекают со всей мультивселенной гостей, ищущих тайные магические знания и извращённые удовольствия. По приказу Граз’зта демоны Аззаграта поддерживают видимость цивилизованности и вежливости. Однако так называемое Тройное Царство опасно настолько же, насколько и другие места в Бездне, и планарные путешественники могут бесследно исчезнуть в похожих на лабиринты городах и лесах, где вместо ветвей растут змеи.
://''Лощины Смерти.''// Йеногу правит слоем из низких долин, известных как Лощины Смерти. Здесь существа должны охотиться ради выживания. Даже растения, которым нужно омывать корни кровью, могут схватить зазевавшегося прохожего. Слуги Йеногу, помогающие усмирить голод своего повелителя, рыщущего по своему миру в поисках добычи, хватают существ на Материальном Плане и выпускают на свободу здесь.
!!__''Карцери''__
Являясь прототипом всех существующих тюрем, Карцери является планом одиночества и отчаяния. В его шести слоях находятся обширные болота, густые джунгли, продуваемые ветрами пустыни, зазубренные горы, безжизненные океаны и чёрный лёд. Все виды убогого жилья для предателей и подлецов, заточённых на этом плане.
!!!''Опциональное правило: Тюремный план''
Покинуть Карцери не так-то легко. Магические попытки любыми заклинаниями кроме исполнения желаний автоматически проваливаются. Порталы и врата, открываемые в другие планы, становятся односторонними. Есть и тайные выходы отсюда, но они скрыты и хорошо охраняются ловушками и опасными чудовищами.
!!__''Гадес''__
Слои Гадеса называются Тремя Мраками — это места без радости, надежды и энтузиазма. Являясь серой землёй с пепельным небом, Гадес является пристанищем многочисленных душ, не доставшихся ни богам Верхних Планов, ни исчадьям, правящим Нижними Планами. Эти души становятся личинками, живущими в этом месте, лишённом солнца, луны, звёзд и времён года. Этот мрак, вытягивающий цвета и эмоции, наваливается на посетителей тяжким грузом. Правило «отчаяние Царства Теней», приведённое ранее в этой главе, может использоваться также для демонстрации влияния на посетителей и этого места.
!!!''Опциональное правило: Мерзкое превращение''
В конце каждого продолжительного отдыха, совершённого на этом плане, посетитель должен совершить спасбросок Мудрости со Сл 10. При провале существо получает одну степень истощения, от которой нельзя избавиться, пока существо находится на Гадесе. Если существо получает шестую степень истощения, оно не умирает, а превращается навсегда в ларву, после чего все степени истощения проходят.
Ларва это жалкое исчадие, сохраняющее подобие своего прежнего лица, но с телом жирного червя. У ларвы остаются лишь призрачные воспоминания о предыдущей жизни, а все игровые параметры меняются на те, что прописаны в приведённом ниже блоке статистики.
На Гадесе ползает множество ларв. Ночные карги, личи и ракшасы собирают их, чтобы в дальнейшем использовать в мерзких ритуалах. Другим исчадиям нравится их просто есть.
{{Ларва}}
!!//''Геенна''//
Геенна это план подозрений и жадности. Это родина юголотов, обитающих здесь в огромных количествах. На всех четырёх её слоях доминируют вулканические горы, а в воздухе парят меньшие вулканические подобия айсбергов, периодически врезающиеся в настоящие горы.
Каменистая поверхность этого плана делает перемещения трудными и опасными. Практически везде поверхность находится под углом 45 градусов, но есть и более крутые обрывы и глубокие каньоны. Опасности добавляют и вулканические расселины, источающие ядовитые испарения и опаляющий огонь.
На Геенне нет места жалости и состраданию. Исчадия, живущие здесь, самые жадные и эгоистичные во всей мультивселенной.
!!!''Опциональное правило: Жестокая помеха''
Жестокая природа этого плана мешает посетителям помогать друг другу. Каждый раз, когда посетитель накладывает заклинание с благоприятным эффектом, включая заклинания, восстанавливающие хиты и отменяющие состояния, заклинатель вначале должен совершить спасбросок Харизмы со Сл 10. При провале заклинание проваливается, ячейка заклинания тратится, и действие тратится впустую.
!!//''Девять Преисподних''//
Девять Преисподних Баатора будоражат воображение путешественников, жадность искателей сокровищ и ярость благопристойных существ. Это план законопослушания и зла, и образчик осознанной жестокости. Дьяволы Девяти Преисподних обязаны повиноваться вышестоящим, но внутри своих индивидуальных каст они бунтуют как хотят. Многие идут на что угодно, на любую подлость, чтобы продвинуться рангом повыше. На самом верху иерархии находится Асмодей, которого никому не перехитрить. Если кто-то его свергнет, он будет править всем планом. Таков закон Девяти Преисподних.
!!!''Опциональное правило: Вездесущее зло''
Девять Преисподних пропитаны злом, и посетители этого плана чувствуют его влияние. В конце каждого продолжительного отдыха, совершённого на этом плане, посетитель, чьё мировоззрение не злое, должен совершить спасбросок Мудрости со Сл 10. При провале мировоззрение существа меняется на законно-злое. Изменение станет постоянным, если существо не покидает план в течение 1к4 дней. В противном случае мировоззрение существа возвращается через один день, проведённый вне Девяти Преисподних. Накладывание заклинания рассеивание добра и зла на такое существо тоже восстанавливает исходное мировоззрение.
!!!''Девять слоёв''
У Девяти Преисподних девять слоёв. Восемь первых находятся под контролем архидьяволов, служащих Асмодею, эрцгерцогу Нессуса, девятого слоя. Чтобы достичь самого глубокого слоя Девяти Преисподних, нужно пройти по всем восьми предыдущим слоям. Быстрее всего это сделать по реке Стикс, проходящей по всем слоям, но только самые храбрые искатели приключений могут выдержать муки и пытки такого путешествия.
;
:"""//''Авернус.''// Никакие планарные порталы не ведут на нижние слои Девяти Преисподних, таков приказ Асмодея. Именно поэтому первый слой, Авернус, является местом прибытия всех гостей этого плана. Авернус представляет собой каменистую пустошь с реками крови и облаками кусачих мух. Иногда с чёрного неба падают огненные кометы, оставляющие дымящиеся кратеры. Пустые поля сражений завалены оружием и костями, показывая, где легионы Девяти Преисподних встретили на своей земле врагов и победили.
Авернусом правит эрцгерцогиня Зариэль, сместившая своего конкурента, Бела, который лишился милости Асмодея и по принуждению стал советником Зариэль. Тиамат, Королева Злых Драконов, пленена на этом слое, и правит своим небольшим доменом, но не покидает Девять Преисподних согласно древнему контракту с Асмодеем (условия которого известны только Тиамат и Владыке Девяти).
Средоточием власти Зариэль является парящая в воздухе базальтовая цитадель, украшенная частично сожжёнными трупами посетителей, не сумевших угодить эрцгерцогине. Зариэль выглядит как ангел, чья когда-то прекрасная кожа и крылья обожжены огнём. Её глаза горят яростным белым светом, от которого глядящие на неё существа могут воспламениться."""
:"""//''Дис.''// Дис, второй слой Девяти Преисподних, это лабиринт из каньонов, зажатых горами, богатыми железной рудой. По каньонам проложены дороги из железа, за которыми присматривают гарнизоны, размещающиеся в железных крепостях на скалах.
Этот слой назван в честь своего повелителя, Диспатера Этот эрцгерцог, ловкий манипулятор и мошенник, дьявольски привлекателен. Только небольшие рожки, хвост и копыто на левой ноге отличают его от человека. Его алый трон находится в сердце Железного Города Дис, огромном метрополисе, самом большом в Девяти Преисподних. Путешественники по планам приходят сюда для заключения сделок с дьяволами, ночными каргами, ракшасами, инкубами, суккубами и прочими исчадьями. Диспатер получает отчисления со всех сделок, заключённых здесь, благодаря особому пункту во всех контрактах.
Диспатер — один из самых преданных и находчивых вассалов Асмодея, и мало кто во всей мультивселенной может его перехитрить. Он больше других дьяволов одержим идеей заключать сделки со смертными в обмен на их души, и его эмиссары безустанно плетут зловещие козни на Материальном Плане."""
:"""//''Минаурос.''// Третий слой Девяти Преисподних это сплошное зловонное болото. С коричневого неба этого слоя идёт кислотный дождь, толстый слой грязи покрывает его гниющую поверхность, а под трясинами скрываются ямы, поджидающие неосторожных путников. На болотах стоят огромные города из резного камня, включая великий город Минаурос, в честь которого и назван этот план.
Скользкие стены этого города возвышаются на сотни футов, защищая затопленные залы Мам-мона. Эрцгерцог Минауроса напоминает массивного змея с торсом и головой лысого рогатого гуманоида. Жадность Маммона вошла в легенды, и это один из малочисленных архидьяволов, оказывающий услуги за золото, а не души. Его логово завалено сокровищами тех, кто пытался — и не смог — превзойти его в сделке."""
:"""//''Флегетос.''// Флегетос, четвёртый слой, это огненный пейзаж, в котором моря горячей магмы создают горячие ураганные ветра, удушающий дым и вулканический пепел. В заполненном огнём кратере самого большого вулкана Флегетоса находится Абримох, город-крепость, построенный из обсидиана и тёмного стекла. Из-за рек расплавленной лавы, стекающих по его внешним стенам, город напоминает чашу гигантского адского фонтана.
В Абримохе власть принадлежит двум архидьяволам, правящим в тандеме: эрцгерцогу Бе-лиалу и эрцгерцогине Фьёрне, дочери Белиала. Бе-лиал — привлекательный дьявол с мощным телосложением, ведущий себя учтиво, даже когда его слова несут угрозу. Его дочь — статная дьяволица, чья красота способна найти отзвук в самом чёрном сердце Девяти Преисподних. Союз Белиала и Фьёрны нерушим, так как каждый понимает, что его выживание зависит от партнёра."""
:"""//''Стигия.''// Четвёртый слой Девяти Преисподних это морозное царство льда, в котором горит холодное пламя. Слой окружён замёрзшим морем, а угрюмое небо разрывается от молний.
Эрцгерцог Левистус, когда-то предавший Асмодея, заморожен во льдах Стигии в качестве наказания, но по-прежнему правит своим планом, телепатически общаясь со своими последователями и слугами, как в Девяти Преисподних, так и на Материальном Плане.
Стигия это ещё и дом её бывшего правителя, змеевидного архидьявола Гериона, освобождённого от должности Асмодеем, чтобы пленённый Левистус мог править дальше. Впадение Гериона в немилость вызвало множество споров. Никто не знает, была ли у Асмодея тайная причина смещать архидьявола, или же он для чего-то испытывает преданность Гериона."""
:"""//''Малболг.''// Малболг, шестой слой, пережил многих правителей, в том числе Малагард, графиню-ведьму, и архидьявола Молоха. Малагард лишилась милости и была уничтожена Асмодеем в приступе обиды, а её предшественник, Молох, всё ещё обитает где-то на шестом слое в облике беса, намереваясь вернуть себе расположение Асмодея. Малболг выглядит как бесконечный склон невероятно огромной горы. Части этого слоя время от времени ломаются, создавая опасные и оглушительные каменные лавины. Обитатели Малболга живут в рассыпающихся крепостях и огромных пещерах, вырезанных в склоне.
Сейчас эрцгерцогиней Малболга является дочь Асмодея, Гласия. Она выглядит как суккуб с небольшими рожками, кожаными крыльями и расщеплённым хвостом. От отца она унаследовала жестокость и любовь к козням. Цитадель, в которой она проживает на склоне Малболга, стоит на треснувших колоннах и опорах, крепких, несмотря на внешний вид. Под дворцом находится лабиринт, связанный с клетками и пыточными камерами, где Гласия держит в заточении и пытает тех, кто не угодил ей."""
:"""//''Маладомини.''// Седьмой слой, Маладоми-ни, это покрытая руинами пустошь. Мёртвые города формируют заброшенный урбанистический ландшафт, а между ними стоят пустые рудники, ветхие дороги, груды шлака, пустые остовы крепостей и рои голодных мух.
Эрцгерцогом Маладомини является Вельзевул, Повелитель Мух. У этого жирного исчадия нижняя половина тела огромного слизняка. Это наказание Асмодея за пошатнувшуюся преданность. Вельзевул — презренное и жалкое чудище, которое давно планирует свергнуть Асмодея, но у которого никогда это не получалось. На нём лежит проклятье, из-за которого все сделки, заключённые с ним, обречены на провал. Периодически Асмодей оказывает благосклонность Вельзевулу, но причины этого непонятны другим эрцгерцогам, хотя они и подозревают, что эрцгерцог Нес-суса всё ещё ценит поверженного противника."""
:"""//''Кания.''// Кания, восьмой слой Девяти Преисподних, это ледяной ландшафт, бури которого могут содрать плоть с костей. Города, вмороженные в лёд, могут предоставить укрытие гостям и пленникам правителя Кании, великолепного и коварного архидьявола Мефистофеля.
Мефистофель обитает в ледяной цитадели Мефистар, в которой он и планирует захват Трона Баатора и завоевание всех планов. Это величайший союзник и противник Асмодея, и эрцгерцог Нессуса вроде бы доверяет советам Мефистофеля. Мефистофель знает, что не сможет сместить Асмодея, пока тот не совершит роковой ошибки, и потому оба ждут, пока обстоятельства не столкнут их. Мефистофель также является чем-то вроде крёстного отца Гласии, что лишь делает ситуацию более запутанной.
Мефистофель - это импозантный, высокий дьявол с впечатляющими рогами и сдержанными манерами. Он торгует душами, как прочие архидьяволы, но редко уделяет время недостойным существам. Его инстинкты остры как ледяные ветра Кании, и говорят, что перехитрить его может только Асмодей."""
:"""//''Нессус.''// Самый нижний слой Девяти Преисподних, Нессус, это царство тёмных ям, стены которых усыпаны крепостями. Там генералы, исчадия преисподней, преданные Асмодею, муштруют легионы дьяволов и строят планы по завоеванию мультивселенной. В центре этого слоя находится огромный разлом неизвестной глубины, в котором возвышается Мальшим, огромная цитадель в форме шпиля, дом Асмодея и его инфернальных придворных.
Мальшим напоминает огромный пустой внутри сталагмит. Это также тюрьма для душ, запертых Асмодеем для сохранности. Просьба убедить его выпустить даже одну душу обойдётся очень дорого, ходят слухи, что раньше эрцгерцог Нессуса брал за это целые королевства.
Асмодей чаще всего предстаёт в виде привлекательного бородатого гуманоида с небольшими рожками на лбу, пронзительными красными глазами и в струящейся мантии. Он принимает и другие обличья, но его редко видят без скипетра с рубином в руке. Асмодей — самый хитрый и благовоспитанный из архидьяволов. Абсолютное зло, представителем которого он является, можно увидеть либо если он сам того пожелает, либо же если он забудется и выйдет из себя."""
!!//''Ахерон''//
У Ахерона четыре слоя, и каждый состоит из огромных железных кубов, парящих в воздухе. Иногда кубы сталкиваются. Эхо от таких столкновений проносится по плану, сливаясь со звуками воюющих армий. Такова природа Ахерона: борьба и война, и духи павших солдат ведут вечный бой с орками Груумша, гоблиноидами Маглубиет и легионами прочих воинствующих богов.
!!!''Опциональное правило: Кровожадность''
Ахерон вознаграждает существ за причинение вреда другим, даруя стойкость в бою. Находясь на Ахероне, существо получает временные хиты в количестве, равном половине максимума хитов, каждый раз, когда опускает хиты враждебного существа до 0.
!!__''Механус''__
На Механусе порядок представлен царством часовых шестерёнок, сцепленных между собой и вращающихся с разными скоростями. Создаётся впечатление, что шестерёнки заняты вычислениями, такими масштабными, что ни одно божество не может понять его предназначение. Механус воплощает абсолютный порядок, и его влияние чувствуют те, кто проводят здесь время.
Основными обитателями Механуса являются модроны. Этот план является ещё и домом создателя модронов: божественной сущности, называющейся Праймусом.
!!!''Опциональное правило: Закон средних чисел''
Находясь на Механусе, существа всегда используют средний урон для атак и заклинаний. Например, атака, обычно причиняющая урон 1к10 + 5, на Механусе всегда причиняет урон 10.
!!!''Опциональное правило: Преобладающий порядок''
В конце каждого продолжительного отдыха, совершённого на этом плане, посетитель, чьё мировоззрение не законно-нейтральное, должен совершить спасбросок Мудрости со Сл 10. При провале мировоззрение существа меняется на законнонейтральное. Мировоззрение существа возвращается через один день, проведённый вне Механуса. Накладывание заклинания рассеивание добра и зла на такое существо тоже восстанавливает исходное мировоззрение.
!!__''Аркадия''__
Аркадия славится садами растущих идеальными рядами деревьев, вычерченными по линейке ручьями, ровными полями, идеальными дорогами и городами, спроектированными в геометрически приятных формах. Горы здесь не повреждены эрозией. Всё на Аркадии направлено на всеобщее благо и безупречное существование. Здесь чистота вечна, и ничто не нарушает гармонию.
Смена дня и ночи зависит от шара, парящего над самым высоким горным пиком Аркадии. Половина этого шара излучает солнечный свет и приносит день; другая половина испускает лунный свет и приносит звёздную ночь. Шар вращается с постоянной скоростью, сменяя день на ночь на всём плане.
За погоду на Аркадии отвечают четыре союзных полубога, называемых Королями Бури: Король Облаков, Королева Ветров, Король Молний и Королева Дождей. Каждый из них живёт в замке, окружённом погодой, за которую он отвечает.
Под прекрасными горами Аркадии находятся многочисленные королевства дварфов, которым по много тысяч лет. У дварфов, родившихся на этом плане, тип «небожитель», и они всегда храбрые и добросердечные, но во всё остальном они выглядят и ведут себя как обычные дварфы.
!!!''Опциональное правило: Планарная живучесть''
Находясь на этом плане, существа не могут быть испуганными и отравленными, и обладают иммунитетом к болезням и ядам.
//"""Он лежал на спине на опалённых и тлеющих камнях, уставившись в дымное серое небо, освещаемое далёкими, скрытыми от глаз огнями. Вокруг камбиона море лавы изрыгало струи газа и пламени. Первичный План Огня.
Спасибо падшим, подумал Вок. Никогда не думал, что буду настолько счастлив вновь здесь очутиться."""//
<<AlignRight "— Томас М. Рейд, //Призрачная равнина//">>
Внутренние Планы окружают и охватывают Материальный План и его отражения, предоставляя сырую стихийную материю, из которой состоят все миры. Четыре Стихийных Плана — Воды, Воздуха, Земли и Огня — формируют кольцо вокруг Материального Плана, находясь при этом в бурлящем котле Стихийного Хаоса. Все эти планы связаны между собой, и пограничные регионы часто описывают как самостоятельные планы.
На внутреннем краю, где они ближе всего к Материальному Плану (в концептуальном, а не географическом смысле), четыре Стихийных Плана напоминают местность на Материальном Плане. Здесь присутствуют все четыре стихии, формируя землю, моря и небо. Однако доминирующая стихия проявляется в окружающей среде сильнее, демонстрируя свои качества.
Среди обитателей этого внутреннего кольца числятся ааракокры, эйзеры, гении, горгульи, дракочерепахи, ксорны, мефиты и саламандры. Некоторые из них родом с Материального Плана, но при наличии доступа к требуемой магии все они могут переходить на Материальный План и жить там.
Чем дальше от Материального Плана, тем чужероднее и враждебнее становятся Стихийные планы. Здесь, в отдалённых регионах, стихии существуют в своей чистейшей форме: огромные пространства плотной земли, пылающий огонь, кристально-чистая вода и чистейший воздух. Чужеродные субстанции здесь встречаются очень редко; в глубине Плана Земли очень мало воздуха, а в глубине Плана Огня почти невозможно найти почву под ногами. Эти области значительно менее гостеприимны к путникам с Материального Плана, чем пограничные регионы. Эти места очень слабо изучены, так что когда обсуждают План Огня, например, обычно имеют в виду именно пограничные участки.
Дальние области являются по большей части владениями стихийных духов, которых обычно называют не «существами», а «элементалями», включая Стихийных Князей Зла (предтеч, состоящих из чистой стихийной ярости) и стихийных духов, которых заклинатели помещают в водных аномалий, галеб дуров, големов, магминов и невидимых охотников. Этим стихийным существам на домашних планах не нужна ни пища, ни другие средства для существования, так как их насыщает стихийная энергия этих мест.
!!__''Стихийный Хаос''__
На самых дальних границах Стихийных Планов чистые стихии сливаются в бесконечном клокочущем месиве сталкивающихся энергий и материи, называемом Стихийным Хаосом. Здесь тоже встречаются элементали, но обычно они не задерживаются здесь надолго, предпочитая комфорт своих родных планов. Судя по имеющейся информации, есть жуткие гибриды элементалей, для которых родным миром является Стихийный Хаос, но таких существ редко видят на других планах.
!!__''План Воды''__
Воде дано течь, не порывами, как ветер, и не перепрыгивая, как огонь, а спокойно и ровно. Это ритм потока, нектар жизни, слёзы скорби и бальзам симпатии и лечения. При наличии времени, вода пробьёт всё на своём пути.
По небу над Планом Воды по дуге ходит тёплое солнце, восходящее из-за горизонта и туда же заходящее. Однако несколько раз в день небо затягивается облаками и идёт ливень, часто сопровождающийся грозами, после чего снова наступает ясная погода. Ночью небо украшено россыпями звёзд и северными сияниями.
План Воды — это бесконечное море, называемое ''Морем Миров'', усыпанное атоллами и островами, растущими из огромного кораллового рифа, раскинувшегося практически по всему дну. Бури, движущиеся над морем, иногда создают временные порталы на Материальный План и затягивают корабли на План Воды. Выжившие суда из бесчисленных миров плывут дальше, уже не надеясь вернуться домой.
Погода здесь бросается из крайности в крайность. Если не стоит штиль, значит, бушует ураган. Иногда сотрясения планов создают огромную волну, пробегающую по всему плану, захлёстывая острова и бросая корабли на рифы.
Жизнь процветает в верхних слоях Моря Миров, называемых ''Морем Света'', так как ниже солнечный свет уже не пробивается. Водные гуманоиды строят замки и крепости на коралловых рифах. Наместниками этих земель являются мариды, с радостью позволяющие младшим народам соперничать за территорию. Номинальный император маридов обитает в ''Цитадели десяти тысяч жемчужин'', шикарном дворце из кораллов, усыпанном жемчужинами.
Нижние глубины, куда не пробивается свет, называются ''Затемнёнными Глубинами''. Здесь обитают кошмарные существа, а жуткий холод и высокое давление означают быстрый конец для существ, привыкших к условиям Моря Света. Это царство принадлежит краке-нам и могучим левиафанам.
Любые клочки земли, возвышающиеся над поверхностью моря, становятся предметом раздора среди малочисленных дышащих воздухом обитателей этого плана. Связанные между собой плоты и корабли служат заменой настоящей твёрдой поверхности, если её не удаётся найти. Большая часть обитателей этого плана никогда не поднимается выше поверхности моря, а потому игнорирует этих жителей.
Одним из малочисленных настоящих островов этого плана является ''остров Ужаса''. Он соединяется с Материальным Планом частыми бурями, проносящимися по нему. Путники, знающие необычные потоки и течения этого плана могут свободно путешествовать между мирами, но эти бури разбивают об остров корабли, притащенные с Материального Плана.
Область Плана Воды, находящаяся у Болота Забвения (находящегося на Плане Земли), называется ''Иловыми Равнинами''. Здесь вода густа из-за почвы, потом переходит в грязную землю, а после становится огромным болотом между планами.
На противоположной стороне плана находится ''Море Льда'', граничащее с Вечной Мерзлотой. По ледяной воде плавают айсберги и льдины, населённые холодостойкими существами из Вечной Мерзлоты. Дрейфующие айсберги уносят этих существ глубоко в План Воды, угрожая кораблям и островам в тёплых водах.
''Вечная Мерзлота'', также называемая Планом Льда, формирует границу между Водой и Воздухом, и является бесконечным ледником, окутанным вечными бурями. План Льда пронизан ледяными пещерами, служащими домами для белых драконов, йети, реморазов, и прочих существ, любящих холод. Эти обитатели ведут непрестанные сражения в попытках доказать свою силу и просто выжить.
Опасные чудовища и жуткий холод делают Вечную Мерзлоту опасным местом для путешествий. Большая часть путников остаётся в воздухе, предпочитая сражаться с ветром и снегом, лишь бы не спускаться на ледник.
!!__''План Воздуха''__
Ключевой сущностью воздуха является движение, оживление и воодушевление. Воздух — это дыхание жизни, ветер перемен, свежий ветер, уносящий туман невежества и приверженности устаревшим идеям.
План Воздуха — это открытое пространство, где постоянно дуют ветры с разной силой. То тут, то там парят глыбы земли — это остатки провалившихся попыток вторжения обитателей Плана Земли. Эти глыбы служат домом для существ стихийного воздуха, и многие глыбы покрыты густой растительностью. Прочие существа живут на облаках, пропитанных достаточным количеством магии, чтобы быть твёрдыми, и выдерживать вес городов и замков.
На этом плане дрейфующие облака могут заслонять видимость в любом направлении. Здесь часто происходят бури, почти всегда в сопровождении грозы, но иногда буря переходит в мощный торнадо или ураган. Воздух здесь умеренной температуры, за исключением областей, граничащих с Планом Воды (там весьма холодно) и Планом Огня (там царит зной). Дождь и снег выпадают только в частях, близких к Плану Воды.
Большая часть Плана Воздуха представляет собой сложное переплетение воздушных ручьёв, потоков и ветров, называемых ''Лабиринтом Ветров''. Их скорость варьируется от лёгкого дуновения до воющих ураганов, способных разорвать существ на части. Даже самые опытные летающие существа должны осторожно перемещаться по этим потокам, летая по ветру, а не против него.
В некоторых местах Лабиринта Ветров находятся скрытые царства, попасть в которые можно только через определённую последовательность потоков ветра, и уже тем хорошо защищённые от вторжения чужаков. Одно из таких мест — прославленная ''Аакуа'', сияющий домен серебряных шпилей и цветущих садов, расположенный на плодородной глыбе земли. Герцоги Ветра Аакуы ориентированы на закон и добро, и они бдительно следят за бесчинствами стихийного зла и вмешательством Стихийного Хаоса. Им прислуживают ааракокры и малоизвестная раса, носящая название ваати.
Область Плана Воздуха, близкая с Великим Пожаром, называется Перешейками Сирокко. Горячие сухие ветра овевают земляные глыбы, превращая их в безжизненные скалы. Горгульи и их союзники с Плана Земли собираются здесь и совершают набеги на Аакуу.
Между Морем Огня (находящимся на Плане Огня) и ''Перешейками Сирокко'' царит огненная буря, которую называют ''Великим Пожаром'' или Планом Пепла. Завывающие ветра Плана Воздуха смешиваются с пепельными бурями и лавой с Плана Огня, создавая постоянный фронт бури — стену из пламени, дыма и золы. Толстый слой пепла блокирует обзор за пределами пары десятков футов, а мощные ветра ещё сильнее осложняют перемещение. Периодически встречаются сбившиеся в кучи груды пепла, и на этих парящих шарах укрываются разбойники и беглецы.
На другом краю этого плана, рядом с Вечной Мерзлотой (план льда, граничащий с Планом Воды), находится область ледяных ветров, называемая ''Пределом Мистралей''. Эти ветра гонят снежные бури в Вечную Мерзлоту и обратно, в самое сердце Плана Воздуха. Земляные глыбы в этих местах покрыты снегом и льдом.
!!__''План Земли''__
Земля символизирует стабильность, стойкость, решимость и традиции. Этот план расположен в кольце Стихийных Планов напротив Плана Воздуха, что отражает его противоположность практически всему, что олицетворяет воздух.
План Земли это горная цепь, возвышающаяся выше всех гор Материального Плана. Здесь нет своего солнца, и пики его высочайших гор не окружает воздух. Большинство гостей посещает этот план через пещеры, которыми пронизаны горы изнутри.
Самая большая пещера под горами, называемая Великой Мрачной Рытвиной, или Семикратным Лабиринтом, это столичный город дао, ''Город Самоцветов''. Дао очень гордятся своим богатством и отправляют во все стороны команды рабов на поиски новых месторождений руд и драгоценных камней. Благодаря их усилиям, все здания и важные предметы в городе изготовлены из драгоценных камней и металлов, включая тонкие инкрустированные самоцветами шпили, венчающие крыши большинства зданий. Город защищён мощным заклинанием, предупреждающим всех дао, если гость украдёт пусть даже самый маленький камушек. Воровство здесь карается смертью, причём наказание распространяется и на родственников негодяя.
Горы у Фонтанов Творения (находящихся на Плане Огня) называются ''Горнами''. В пещерах течёт лава, а воздух пропитан серой. Дао держат здесь кузницы и плавильные печи, в которых обрабатывают руду и куют изделия из драгоценных металлов.
Пограничный регион между планами Воды и Земли жуткое болото, где на густой грязи и слизи растут кривые деревья и жалящие лианы. Часто встречающиеся в ''Болоте Забвения'' (также называемом Планом Грязи) застойные озёра и пруды зарастают водорослями и скрывают в себе чудовищные рои комаров. Местные малочисленные поселения состоят из деревянных построек. Некоторые построены на платформах между деревьями, а некоторые стоят на сваях. Среди болотной грязи нет твёрдых участков, поэтому дома, построенные на сваях, рано или поздно всё равно тонут.
Говорят, что предмет, выброшенный в Болото Забвения, никто не сможет найти как минимум сто лет. Время от времени отчаявшиеся гости выбрасывают здесь артефакты, на какое-то время устраняя их из мультивселенной. В поисках этих предметов искателям приключений приходится сражаться с чудовищными насекомыми и каргами.
Область этого плана, граничащая с Болотом Забвения, называется ''Грязевыми Холмами''. Оползни постоянно уносят землю и камни в бездонное болото. Судя по всему, План Земли постоянно восстанавливает эту землю, выталкивая новый холм, когда старый превращается в ровное место.
!!__''План Огня''__
Огонь отражает энергию, страсть и перемены. Он может быть жестоким и разрушительным, как ифриты, но может также быть светом вдохновения, теплом сострадания и пламенем желания.
В зените золотистого неба Плана огня висит пылающее солнце, то растущее, то убывающее подобно луне, но с 24-часовым циклом. Цвет его разнится от раскалённобелого в полдень до тёмно-красного ночью, поэтому в самый тёмный час этот план погружён в красные сумерки. В полдень же его свет практически слепит. Большая часть дел в Латунном городе (смотрите ниже) происходит в более тёмные часы.
Погода на этом плане характеризуется яростными ветрами, несущими много пепла. Несмотря на то, что воздухом здесь можно дышать, существа, пришедшие с других планов, должны прикрывать рты и глаза от колющейся золы. Ифриты с помощью магии отгоняют пепельные бури от Латунного города, но во всех других местах этого плана ветер как минимум порывистый, иногда достигающий силы урагана.
Жара Плана Огня сопоставима с жаром пустыни Материального Плана, и потому представляет ту же самую угрозу путникам (смотрите «Чрезвычайная жара» в 5 главе). Чем дальше углубляешься в этот план, тем меньше встречается воды. За определённой гранью вода вообще не встречается, поэтому путники должны нести с собой запасы или создавать воду магией.
Большая часть Плана Огня это обширные ''Пепельные Пустоши'', чёрная зола и угли, пересечённые реками лавы. Скитающиеся банды саламандр сражаются здесь между собой, совершают набеги на заставы эйзеров и избегают ифритов. Пустыня усеяна древними руинами — остатками былых цивилизаций.
Длинная цепь вулканических гор, называющихся ''Фонтанами Творения'', служит домом эйзерам. Эти горные пики растут из Плана Земли, и, изгибаясь над Пепельными Пустошами, устремляются в сторону Плана Огня. Горы на границе этого плана также называются Планом Магмы. Здесь живут огненные великаны и красные драконы, а также существа с окрестных планов.
Потоки лавы из вулканов текут в сторону Плана Воздуха и формируют огромное лавовое озеро, называющееся ''Морем Огня'', по которому ифриты и эйзеры плавают на огромных латунных кораблях. Из этого моря торчат острова из обсидиана и базальта, усыпанные древними руинами и логовами мощных красных драконов. На берегу Моря Огня стоит ''Латунный город''.
!!!''Латунный город''
Возможно, самым известным местом на Внутренних Планах является Латунный город, стоящий на берегу Моря Огня. Это прославленный город ифритов, и витиеватые шпили и металлические стены отражают их величие и жестокий нрав. Из-за природы Плана Огня всё в этом городе выглядит покрытым танцующим пламенем, отражая кипучую энергию этого места.
Искатели приключений часто приходят сюда в поисках легендарной магии. Если некий магический предмет вообще можно где-то купить, то его наверняка можно найти и в Латунном городе, хотя ценой может стать нечто большее, чем просто золото. Ифритам нравится торговаться, особенно если получается одержать верх в переговорах. Некоторые магические болезни или яды можно вылечить только лекарствами с базара этого города.
Сердцем города является возвышающийся Угольный Дворец, где правит деспотичный султан ифритов, окружённый знатными ифритами и толпами рабов, охранников и льстецов.
//2 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, М (язык змеи и либо кусочек медовых сот, либо капля сладкого масла)
:''Длительность:'' Концентрация, вплоть до 8 часов
"""Вы внушаете определённый курс действий (ограниченный одной-двумя фразами) существу, видимому в пределах дистанции, способному слышать и понимать вас. Существа, которые не могут быть очарованы, обладают иммунитетом к этому эффекту. Внушение должно быть сформировано так, чтобы действие звучало разумным. Просьбы ударить себя мечом, броситься на копьё, сжечь себя, или как-то иначе причинить себе вред оканчивают заклинание.
Цель должна совершить спасбросок Мудрости. При провале она следует заданному курсу действий. Внушённые действия могут продолжаться всю длительность заклинания. Если внушённую деятельность можно выполнить за меньший срок, заклинание оканчивается, когда субъект оканчивает порученную задачу.
Вы можете также указать условие, которое запустит особое действие во время действия заклинания. Например, вы можете внушить рыцарю, чтобы он отдал своего боевого коня первому встреченному нищему. Если до окончания действия условие не будет выполнено, деятельность не совершается.
Если вы или кто-то из ваших спутников причиняете урон цели, заклинание оканчивается."""
//«Прежде чем попить из фонтана или бассейна, бросьте в него медную монету. Это маленькая цена за вашу жизнь»//.
<<AlignRight "— третье правило выживания в подземельях Мистика X">>
<<SizeButton "$:/Водная аномалия (B)""$:/Водная аномалия (S)">>
Водная аномалия является элементалем-защитником, связанным с определённым местом, заполненным водой, таким как бассейн или фонтан. Её змеевидное тело, невидимое, пока погружено в воду, становится заметным только когда она появляется, чтобы напасть, обвиваясь вокруг любого существа, кроме её призывателя и тех, кому разрешит находиться призыватель. Когда водная аномалия повержена, она становится неживой лужей воды.
;
:"""//''Добрые и злые аномалии.''// Как у большинства элементалей, у водной аномалии нет понятия добра или зла. Однако аномалия, связанная со священным или осквернённым источником воды, начинает черпать природу того места, становясь нейтрально-доброй или нейтрально-злой.
Нейтрально-добрая водная аномалия старается отпугнуть незваных гостей, а не убить их, в то время как нейтрально-злая с удовольствием убьёт их, и даже может предать своего призывателя. Водная аномалия теряет своё злое мировоззрение, если её источник очистить при помощи заклинания очищение пищи и питья ."""
://''Стихийная натура.''// Водной аномалии не нужен воздух, еда, питьё и сон.
<<Button "$:/Водная аномалия (Stats)""Стат-блок">>
//3 уровень, Некромантия, Жрец/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (бриллиант, стоящий 300 зм, расходуемый заклинанием)
:''Длительность:'' Мгновенная
Вы касаетесь существа, мёртвого не больше минуты. Это существо возвращается к жизни с 1 хитом. Это заклинание не может оживить существ, умерших от старости, а также не восстанавливает отсутствующие части тел.
Женщина, прикрываясь щитом и лязгая доспехами, устремляется в толпу гоблинов. Из-за её спины одетый в клёпанную кожу эльф осыпает врагов стрелами, выпуская их из своего изящного лука. Невдалеке от них полуорк выкрикивает приказы, указывая лучшее направление для атаки.
Дварф в кольчуге выставил свой щит перед компаньоном, отражая смертельный удар дубины огра. Его напарник, полуэльф в чешуйчатом доспехе, закрутил два своих скимитара в сверкающем вихре и двинулся в обход огра, отыскивая брешь в его защите.
Опытный гладиатор сражается на арене и хорошо знает, как использовать свои трезубец и сеть, чтобы опрокинуть противника и обойти его, вызывая ликование публики и получая тактическое преимущество. Меч его противника вспыхивает голубым светом и испускает сверкающую молнию.
Все эти герои — воины. Представители, возможно, самого разнообразного класса в мире D&D. Странствующие рыцари, военачальники-завоеватели, королевские чемпионы, элитная пехота, бронированные наёмники и короли разбоя — будучи воинами, все они мастерски владеют оружием, доспехами, и приёмами ведения боя. А ещё они хорошо знакомы со смертью — они несут её сами, и часто смотрят в её холодные глаза.
!!!__''Разносторонние специалисты''__
Воины владеют основами всех боевых стилей. Каждый воин может рубить топором, фехтовать рапирой, владеет длинным и двуручным мечом, может стрелять из лука и даже при некоторой сноровке способен поймать противника сетью. Помимо этого, воины хорошо знакомы с использованием щита и любых доспехов. Помимо общих знаний, каждый воин специализируется на определённом стиле боя. Некоторые концентрируются на стрельбе из лука, другие на сражении с оружием в каждой руке, а есть те, кто свои воинские способности усиливает заклинаниями. Сочетание широких общих навыков и углублённой специализации делает воинов непревзойдёнными на поле боя.
!!! __''Готовые к опасности''__
Не все члены городской стражи, деревенского ополчения или королевской армии являются воинами. Большинство из них это просто обученные солдаты, обладающие лишь основными воинскими навыками. Солдаты-ветераны, офицеры, обученные телохранители, посвящённые рыцари и похожие персоны, как правило, являются воинами.
Некоторые воины чувствуют потребность использовать свою подготовку в качестве искателей приключений. Исследование подземелий, убийство чудовищ, и другая опасная работа, обыденная для искателей приключений, является второй натурой воина, и не так сильно отличается от жизни, оставленной в прошлом. Риск здесь, возможно, и выше, но и награда значительно больше — например, воины в городском дозоре вряд ли могут найти меч язык пламени.
{{Таблица развития Воина}}
{{Создание Воина}}
!!''Воинские архетипы''
Разные воины используют разные подходы для совершенствования своих воинских способностей. Воинский архетип отражает выбранный вами подход.
<<Button "Мастер боевых искусств (Воин)" "Мастер боевых искусств">>
<<Button "Мистический рыцарь (Воин)" "Мистический рыцарь">>
<<Button "Чемпион (Воин)" "Чемпион">>
!!!__''Воинский архетип''__
На 3 уровне вы выбираете архетип, отражающий стиль и технику, к которым вы стремитесь. Выберите мастера боевых искусств, мистического рыцаря или чемпиона. Подробности этих архетипов приведены в конце описания класса. Выбранный вами архетип предоставляет умения на 3, 7, 10, 15 и 18 уровнях.
!!!''Волна''
//Оружие (трезубец), легендарное (требуется настройка существа, поклоняющегося божеству моря)//
Этот трезубец, находящийся под горой Белый Шлейф, — изысканное оружие, украшенное изображениями волн, раковин и морских существ. Для настройки на это оружие владелец должен поклоняться божеству моря, но Волна с радостью принимает и тех, кто только-только обратился в новую веру.
Вы получаете бонус +3 к броскам атаки и урона, совершённым этим магическим оружием. Если вы совершаете им критическое попадание, цель получает дополнительный урон некротической энергией, равный половине максимума её хитов.
Это оружие также действует как трезубец командования рыбами и оружие предупреждения.
Он может предоставить вам преимущества шапки подводного дыхания, пока вы держите его, и вы можете использовать его как куб силового поля, выбирая эффект самостоятельно, а не нажимая на грани куба.
;
:"""//''Разум.''// Волна — разумное нейтральное оружие с Интеллектом 14, Мудростью 10 и Харизмой 18. Она обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие может понимать язык Акван, а также говорить и читать на нём и телепатически общаться с владельцем. Оно также может говорить с водными животными, как будто под действием заклинания разговор с животными, используя телепатию, чтобы владелец был вовлечён в разговор."""
:"""//''Индивидуальность.''// Если Волна начинает беспокоиться, она начинает издавать какую-нибудь мелодию, от песни моряков до священного песнопения морского божества.
Волна фанатично желает обращать смертных в услужение морским богам, а неверных предавать смерти. Если владелец отказывается следовать целям оружия, возникает конфликт.
Трезубец привязан ностальгическими воспоминаниями к месту, в котором он был выкован, пустынному острову Громовая Кузня. Морской бог заточил здесь семью штормовых великанов, и те выковали Волну в знак не то преданности этому богу, не то восстания против него.
Волна тайно сомневается в своей природе и своём предназначении. Несмотря на всю преданность морским богам, она боится, что создана на погибель одному из морских богов, и что она не сможет предотвратить эту свою судьбу."""
//1 уровень, Воплощение, Бард/Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (15-футовый куб)
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""От вас исходит волна громовой силы. Все существа в кубе с длиной ребра 15 футов, исходящего от вас, должны совершить спасбросок Телосложения. При провале существо получает урон звуком 2к8 и толкается на 10 футов от вас. При успехе существо получает половину урона и не толкается.
Кроме того, незакреплённые предметы, оказавшиеся полностью в области эффекта, автоматически толкаются на 10 футов от вас эффектом заклинания, и заклинание издаёт громовой рокот, слышимый на расстоянии 300 футов."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше первого.
//Волшебная палочка, необычная (+1), редкая (+2) или очень редкая (+3) (требуется настройка заклинателем)//
Держа эту палочку в руке, вы получаете бонус к броскам атаки заклинаний, определяемый редкостью волшебной палочки. Кроме того, вы игнорируете укрытие на половину, когда совершаете атаки заклинаниями.
//Волшебная палочка, редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 или несколько зарядов, чтобы наложить ей заклинание молния (Сл спасброска 15). За 1 заряд вы накладываете это заклинание 3-го уровня. Вы можете увеличить уровень заклинания на 1 за каждый дополнительный используемый заряд.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, редкая (требуется настройка)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 заряд, чтобы сказать командное слово. В течение следующей минуты вы знаете направление к ближайшему существу, враждебному к вам и находящемуся в пределах 60 футов, но не расстояние до него. Палочка может чувствовать присутствие враждебных существ, которые эфирны, невидимы, замаскированы или прячутся, а также тех, кто и так видны. Эффект оканчивается, если вы перестаёте держать палочку.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, необычная//
У этой волшебной палочки 3 заряда. Если вы её держите, вы можете действием потратить 1 заряд, чтобы наложить ей заклинание обнаружение магии. Палочка ежедневно восстанавливает 1к3 заряда на рассвете.
//Волшебная палочка, редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 или несколько зарядов, чтобы наложить ей заклинание огненный шар (Сл спасброска 15). За 1 заряд вы накладываете это заклинание 3-го уровня. Вы можете увеличить уровень заклинания на 1 за каждый дополнительный используемый заряд.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 заряд, чтобы выпустить из её кончика тонкий синий луч в сторону существа, которое видите в пределах 60 футов. Цель должна преуспеть в спасброске Телосложения со Сл 15, иначе она станет парализованной на 1 минуту. В конце каждого своего хода цель может повторять спасбросок, оканчивая эффект на себе при успехе.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 заряд, чтобы наложить ей заклинание паутина (Сл спасброска 15).
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, очень редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 заряд, чтобы наложить ей заклинание превращение (Сл спасброска 15).
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, необычная//
У этой волшебной палочки 3 заряда. Если вы держите её, вы можете действием потратить 1 заряд, и если в пределах 30 футов от вас есть потайные двери или ловушки, то палочка завибрирует и укажет на ту, что находится ближе всего к вам.
Палочка ежедневно восстанавливает 1к3 заряда на рассвете.
//Волшебная палочка, редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов для использования описанными ниже свойствами. Она ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
;
:''Заклинания''. Если вы держите эту палочку, вы можете действием потратить часть зарядов, чтобы наложить одно из следующих заклинаний (Сл спасброска 17): удержание чудовища (5 зарядов) или удержание личности (2 заряда).
:''Помощь в освобождении:'' Если вы держите эту палочку, вы можете реакцией потратить 1 заряд, чтобы получить преимущество для спасброска, совершаемого для того, чтобы не быть парализованным или опутанным, или вы можете потратить 1 заряд, чтобы получить преимущество для проверки, совершаемой, чтобы вырваться из захвата.
//Волшебная палочка, необычная//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 или несколько зарядов, чтобы наложить ей заклинание волшебная стрела. За 1 заряд вы накладываете это заклинание 1-го уровня. Вы можете увеличить уровень заклинания на 1 за каждый дополнительный используемый заряд.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
//Волшебная палочка, редкая (требуется настройка)//
У этой волшебной палочки 7 зарядов для использования описанными ниже свойствами. Она ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
;
:''Приказ.'' Если вы держите эту палочку, вы можете действием потратить 1 заряд, чтобы приказать другому существу убежать или упасть, как заклинанием приказ (Сл спасброска 15).
:''Конус страха.'' Если вы держите эту палочку, вы можете действием потратить 2 заряда, чтобы кончик палочки испустил 60-футовый конус янтарного света. Все существа в конусе должны преуспеть в спасброске Мудрости со Сл 15, иначе они станут испуганными вами на 1 минуту. Будучи испуганным таким образом, существо обязано тратить ходы на то, чтобы переместиться максимально далеко от вас, и оно не может добровольно переместиться в пространство в пределах 30 футов от вас. Оно также не может совершать реакции. В качестве действия существо может использовать только Рывок или пытаться освободиться от эффекта, препятствующего его передвижению. Если двигаться некуда, существо может использовать действие Уклонение. В конце каждого своего хода существо может повторять спасбросок, оканчивая эффект на себе при успехе.
//Волшебная палочка, редкая (требуется настройка заклинателем)//
У этой волшебной палочки 7 зарядов. Если вы её держите, вы можете действием потратить 1 заряд и выбрать цель в пределах 120 футов. Цель должна быть существом, предметом или точкой в пространстве. Бросьте к100 и определите последствия с помощью таблицы.
Если эффект накладывает заклинание, Сл спасброска от него равна 15. Если обычно у этого заклинания есть дистанция в футах, то эта дистанция становится равной 120 футам.
Если эффект покрывает площадь, то вы должны сделать центром заклинания цель и включить её в качестве цели заклинания. Если эффект может воздействовать на несколько разных субъектов, Мастер случайным образом выбирает, кто станет целью.
Палочка ежедневно восстанавливает 1к6 + 1 заряд на рассвете. Если вы истратили последний заряд в палочке, бросьте к20. Если выпадет «1», палочка рассыплется в пыль и уничтожится.
<table>
<tr>
<th>к100</th>
<th>Эффект</th>
</tr>
<tr>
<td>01-05</td>
<td>Вы накладываете замедление.</td>
</tr>
<tr>
<td>06-10</td>
<td>Вы накладываете огонь фей.</td>
</tr>
<tr>
<td>11-15</td>
<td>Вы становитесь ошеломлённым до начала своего следующего хода и считаете, что только что произошло что-то невероятное.</td>
</tr>
<tr>
<td>16-20</td>
<td>Вы накладываете порыв ветра.</td>
</tr>
<tr>
<td>21-25</td>
<td>Вы накладываете обнаружение мыслей на выбранную цель. Если вы целились не в существо, то получаете урон психической энергией 1к6.</td>
</tr>
<tr>
<td>26-30</td>
<td>Вы накладываете зловонное облако.</td>
</tr>
<tr>
<td>31-33</td>
<td>Область в пределах 60 футов от цели заполнятся сильным ливнем. Эта область становится слабо заслонённой. Ливень идёт до начала вашего следующего хода.</td>
</tr>
<tr>
<td>34-36</td>
<td>В ближайшем свободном пространстве у цели появляется животное. Животное не находится под вашим контролем и действует так, как уместно. Бросьте к100, чтобы определить, кто появился. При результате 01-25 появляется носорог; при результате 26-50 появляется слон; при результате 51-100 появляется крыса. Характеристики животных смотрите в Бестиарии.</td>
</tr>
<tr>
<td>37-46</td>
<td>Вы накладываете молнию.</td>
</tr>
<tr>
<td>47-49</td>
<td>Область в пределах 30 футов заполняют 600 огромных бабочек. Это пространство становится сильно заслонённым. Бабочки остаются на 10 минут.</td>
</tr>
<tr>
<td>50-53</td>
<td>Вы увеличиваете цель, как если бы наложилиувеличение/уменьшение. Если на цель не действует это заклинание, или если вы целились не в существо, то целью становитесь вы.</td>
</tr>
<tr>
<td>54-58</td>
<td>Вы накладываете тьму.</td>
</tr>
<tr>
<td>59-62</td>
<td>На земле в пределах 60 футов от цели вырастает трава. Если трава там уже была, то она вырастает в десять раз больше своего обычного размера и остаётся такой 1 минуту.</td>
</tr>
<tr>
<td>63-65</td>
<td>Один предмет на выбор Мастера переносится на Эфирный План. Этот предмет никто не должен ни носить, ни нести, он должен находиться в пределах 120 футов от цели, и не должен превышать 10 футов ни по одному из линейных размеров.</td>
</tr>
<tr>
<td>66-69</td>
<td>Вы уменьшаетесь, как если бы наложили на себя увеличение/уменьшение.</td>
</tr>
<tr>
<td>70-79</td>
<td>Вы накладываете огненный шар.</td>
</tr>
<tr>
<td>80-84</td>
<td>Вы накладываете на себя невидимость.</td>
</tr>
<tr>
<td>85-87</td>
<td>На цели вырастают листья. Если в качестве цели вы выбрали точку в пространстве, то листья вырастают на ближайшем к этой точке существе. Если листья не оборвать, они побуреют и опадут через 24 часа.</td>
</tr>
<tr>
<td>88-90</td>
<td>Из кончика палочки линией длиной 30 футов и шириной 5 футов выстреливают 1к4 х 10 драгоценных камней, стоящих по 1 зм каждый. Каждый камень причиняет дробящий урон 1, и общий урон от камней поровну делится между всеми существами в этой линии.</td>
</tr>
<tr>
<td>91-95</td>
<td>От вас исходит 30-футовая вспышка переливающегося света. Вы и все существа в этой области, способные видеть, должны преуспеть в спасброске Телосложения со Сл 15, иначе ослепнете на 1 минуту. Существа могут повторять спасброски в конце каждого своего хода, оканчивая эффект на себе при успехе.</td>
</tr>
<tr>
<td>96-97</td>
<td>Кожа цели становится ярко-синей на 1к10 дней. Если вы выбрали точку в пространстве, то эффект действует на ближайшее к этой точке существо.</td>
</tr>
<tr>
<td>98-00</td>
<td>Если вы целились в существо, оно должно совершить спасбросок Телосложения со Сл 15. Если вы целились не в существо, то сами становитесь целью и должны совершить спасбросок. Если спасбросок провален на 5 или больше единиц, цель мгновенно превращается в камень. При просто проваленном спасброске цель становится опутанной и начинает превращаться в камень. Будучи опутанной этой магией, цель должна повторить спасбросок в конце своего следующего хода, становясь окаменевшей при провале или оканчивая эффект при успехе. Окаменение длится, пока цель не будет освобождена заклинанием высшее восстановление или подобной магией.</td>
</tr>
</table>
//Заговор, Вызов, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 минута
"""В точке, выбранной вами в пределах дистанции, появляется призрачная парящая рука. Рука существует, пока заклинание активно, или пока вы не отпустите её действием. Рука исчезает, если окажется более чем в 30 футах от вас, или если вы повторно используете это заклинание.
Вы можете действием контролировать руку. Вы можете с её помощью манипулировать предметами, открывать незапертые двери и контейнеры, убирать предметы в открытые контейнеры и доставать их оттуда, или выливать содержимое флаконов. При каждом использовании руки вы можете переместить её на 30 футов.
Рука не может совершать атаки, активировать магические предметы и переносить более 10 фунтов."""
//1 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы создаёте три светящихся дротика из магической силы. Каждый дротик попадает в существо на ваш выбор, видимое в пределах дистанции. Каждый дротик причиняет урон силовым полем 1к4 + 1. Все дротики атакуют одновременно, и вы можете направить их как в одно существо, так и в разных.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, заклинание создаёт по одному дополнительному дротику за каждый уровень ячейки выше первого.
Одетая в серебряные одежды, обозначающие её статус, эльфийка закрывает глаза, приглушает в своём сознании суматоху боя и начинает свой тихий напев. Движениями рук она сплетает перед собой заклинание и запускает крошечный шарик огня во вражеские ряды, где он взрывается потоками пламени, которые охватывают солдат.
Проверив и перепроверив свои наброски, человек рисует затейливый магический круг мелом на голом каменном полу, затем посыпает железным порошком все линии и изящные кривые. Когда круг готов, он начинает монотонно читать длинное заклинание. Внутри круга появляется проход, из которого тянет запахом серы из потустороннего мира.
Припав к полу на перекрёстке в подземелье, гном бросает небольшие костяшки с мистическими символами, бормоча над ними слова силы. Закрыв глаза, чтобы прочитать видения более чётко, он медленно кивает, затем открывает глаза и указывает на проход слева от себя.
Волшебники — адепты высшей маги, объединяющиеся по типу своих заклинаний. Опираясь на тонкие плетения магии, пронизывающей вселенную, волшебники способны создавать заклинания взрывного огня, искрящихся молний, тонкого обмана и грубого контроля над сознанием. Их магия вызывает чудовищ с других планов бытия, предсказывает будущее и обращает поверженных врагов в зомби. Их самые могущественные заклинания могут превращать одно вещество в другое, вызывать метеориты с небес и открывать порталы в другие миры.
!!!__''Адепты магии''__
Дикая и загадочная, разнообразная по форме и функциям, магия привлекает учеников, которые стремятся достичь мастерства в её тайнах. Некоторые хотят уподобиться богам, изменять саму реальность. И хотя для сотворения обычного заклинания требуется лишь произношение нескольких странных слов, совершение пары мимолётных жестов, а иногда щепотка или комок экзотических материалов, эти поверхностные проявления не могут показать опыт, достигнутый долгими часами ученичества и бессчётными часами исследований.
Волшебники живут и умирают со своими заклинаниями. Всё остальное вторично. Они учат новые заклинания, экспериментируя и становясь опытнее. Они также могут узнать их от других волшебников, из древних томов или свитков, и от древних существ (таких как феи), которые погружены в магию.
!!!__''Соблазн знаний''__
Жизнь волшебников редко бывает обыденной. Наиболее близки к простой жизни, вероятно, те из волшебников, которые работают знатоками или лекторами в библиотеке университета, обучая других секретам мультивселенной. Другие волшебники предлагают свои услуги в качестве прорицателей, служат в вооружённых силах, или проводят жизнь в преступлениях и стремлении к власти.
Но соблазн знаний и силы зовёт даже самых обделённых смелостью волшебников из безопасности их библиотек и лабораторий в разрушенные руины и потерянные города. Большинство волшебников считает, что их коллеги из древних цивилизаций знали секреты магии, которые были потеряны навек, и открывшие эти секреты смогут владеть силами, недоступными в нынешнем веке.
{{Таблица развития Волшебника}}
{{Создание Волшебника}}
//2 уровень, Иллюзия, Бард/Волшебник (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (кусочек медовых сот и порошок нефрита, стоящий как минимум 10 зм, расходуемые заклинанием)
:''Длительность:'' Пока не рассеется
"""Вы внедряете в предмет, находящийся в пределах дистанции, послание, которое будет произнесено, когда будут выполнены условия. Выберите видимый предмет, который не несёт и не носит другое существо. Произнесите послание, которое может состоять не более чем из 25 слов, хотя его можно произносить в течение 10 минут. Затем определите условие, выполнение которого заставит заклинание передать ваше послание.
Когда условие будет выполнено, на предмете появляется магический рот, зачитывающий послание вашим голосом с той же самой громкостью. Если у выбранного вами предмета есть рот или что-то похожее на рот (например, рот статуи), магический рот появляется на его месте, и кажется, что слова исходят оттуда. При накладывании заклинания вы можете сделать так, что заклинание окончится, передав сообщение, или же останется активным и будет повторять сообщение при каждом срабатывании условия.
Вызывающее срабатывание условие может быть как общим, так и детализированным, но должно основываться на зрительных или слышимых условиях, происходящих в пределах 30 футов от предмета. Например, вы можете заставить рот говорить, когда в пределах 30 футов от него пройдёт существо, или когда в пределах 30 футов от него зазвенит серебряный колокольчик."""
//2 уровень, Ограждение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (золотая пыль, стоящая как минимум 25 зм, расходуемая заклинанием)
:''Длительность:'' Пока не рассеется
"""Вы касаетесь закрытой двери, окна, ворот, сундука или другого входа, и он становится запертым. Вы и указанные при накладывании этого заклинания существа можете открывать предмет как обычно. Вы можете также установить пароль, произношение которого в пределах 5 футов от предмета подавляет заклинание на 1 минуту. В противном случае предмет не открывается, пока его не сломают, или пока заклинание не рассеют или не подавят. Накладывание открывания на предмет подавляет волшебный замок на 10 минут.
Находящийся под действием этого заклинания предмет гораздо сложнее взломать и открыть силой; Сл выламывания и взлома замков увеличивается на 10."""
//6 уровень, Некромантия, Волшебник//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (драгоценный камень, кристалл, реликварий или другой украшенный контейнер, стоящий как минимум 500 зм)
:''Длительность:'' Пока не рассеется
"""Ваше тело впадает в кататоническое состояние, так как душа покидает его и входит в контейнер, выбранный материальным компонентом. Пока ваша душа обитает в контейнере, вы воспринимаете своё окружение, как если бы находились в пространстве контейнера. Вы не можете перемещаться и использовать реакции. Единственное действие, которое вы можете совершать, это проецирование души на 100 футов от контейнера, чтобы либо вернуться в своё тело (окончив этим заклинание), либо попытаться овладеть телом другого гуманоида.
Вы можете попытаться овладеть гуманоидом, находящимся в пределах 100 футов от вас и видимым вами (нельзя овладевать существами, защищёнными заклинаниями защита от добра и зла и магический круг). Цель должна совершить спасбросок Харизмы. При провале ваша душа перемещается в тело цели, а её душа становится запертой в контейнере. При успехе цель сопротивляется вашим попыткам овладеть ею, и вы не можете повторно пытаться овладеть ею в течение 24 часов.
Овладев телом существа, вы начинаете его контролировать. Ваши игровые параметры заменяются параметрами существа, но вы сохраняете своё мировоззрение и значения Интеллекта, Мудрости и Харизмы. Вы сохраняете преимущества от своих классовых умений. Если у цели есть уровни в классах, вы не можете использовать её классовые умения.
Тем временем душа одержимого существа может воспринимать своё окружение из контейнера при помощи своих чувств, но не может перемещаться и не может совершать никаких действий.
Захватив тело, вы можете действием вернуться из него в контейнер, если он находится в пределах 100 футов, возвращая душу существа в его тело. Если тело носителя умирает, пока вы в нём находитесь, существо умирает, а вы должны совершить спасбросок Харизмы со Сл своего же заклинания. При успехе вы возвращаетесь в контейнер, если он находится в пределах 100 футов. В противном случае вы умираете.
Если контейнер уничтожается или заклинание оканчивается, ваша душа мгновенно возвращается в ваше тело. Если ваше тело находится далее чем в 100 футах, или если ваше тело мертво, когда вы пытаетесь в него вернуться, вы умираете. Если в контейнере, который был уничтожен, находилась душа другого существа, эта душа возвращается в своё тело, если оно живо и находится в пределах 100 футов. В противном случае это существо умирает.
Когда заклинание оканчивается, контейнер уничтожается."""
//2 уровень, Иллюзия, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок овечьей шерсти)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте иллюзию в сознании существа, видимого в пределах дистанции. Цель должна совершить спасбросок Интеллекта. При провале вы создаёте воображаемый предмет, существо или другое видимое явление на свой выбор, помещающееся в куб с длиной ребра 10 футов, и воспринимаемое только целью, пока действует заклинание. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
Иллюзия включает звуки, температуру и прочие раздражители, очевидные только для этого же существа.
Цель может действием исследовать иллюзию проверкой Интеллекта (Анализ) против Сл ваших заклинаний. Если проверка была успешной, цель понимает, что перед ней иллюзия, и заклинание оканчивается.
Пока цель находится под действием этого заклинания, она считает иллюзию настоящей. Она сама придумывает объяснения нелогичности взаимодействия с иллюзией. Например, попытавшись пройти по вымышленному мосту над провалом, она упадёт вниз. Если цель выживет, она всё равно будет считать, что мост существует, а пройти ей помешало что-то другое — её толкнули, она поскользнулась, или её сбил сильный порыв ветра.
Цель настолько уверена в существовании иллюзии, что даже будет получать от неё урон. Иллюзия в форме существа может атаковать цель. Иллюзия, выглядящая как огонь, бассейн с кислотой или лава, могут сжечь цель. Каждый раунд в ваш ход иллюзия может причинить цели урон психической энергией 1к6, если та находится в области иллюзии или в пределах 5 футов от иллюзии существа или опасности, способной причинять урон, например, атаковав. Цель воспринимает урон того вида, что соответствует цели."""
//4 уровень, Иллюзия, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы заглядываете в кошмары существа, видимого в пределах дистанции, и создаёте иллюзорное проявление его страхов, видимое только ему. Цель должна совершить спасбросок Мудрости. При провале цель становится испуганной до конца действия заклинания. В конце каждого своего хода, пока заклинание активно, цель должна преуспевать в спасброске Мудрости, иначе она получает урон психической энергией 4к10. При успехе заклинание заканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше четвёртого.
!!!''__Вор__''
Вы отточили навыки воровского искусства. Грабители, бандиты, карманники и прочие преступники, как правило, следуют этому архетипу, но его же выбирают и плуты, которые предпочитают думать о себе как о профессиональных искателях сокровищ, исследователях, посыльных и ищейках. В дополнение к улучшению ловкости и хитрости, вы узнаёте навыки, которые пригодятся во время изучения древних руин, чтения незнакомых языков, использования магических предметов, которые обычно вы не можете использовать.
!!!''Быстрые руки''
Начиная с 3 уровня, вы можете бонусным действием, предоставленным вашим Хитрым действием, совершить проверку Ловкости (Ловкость рук), используя воровские инструменты, чтобы обезвредить ловушку или вскрыть замок, или же совершить действие Использование предмета.
!!!''Форточник''
"""Когда вы выбираете этот архетип на 3 уровне, вы получаете возможность лазать быстрее, чем обычно; лазание больше не стоит вам дополнительного движения.
Кроме того, когда вы совершаете прыжок с разбега, расстояние, которое вы преодолеваете, увеличивается на число футов, равное вашему модификатору Ловкости."""
!!!''Высокая скрытность''
Начиная с 9 уровня вы совершаете с преимуществом проверки Ловкости (Скрытность), если в этом ходу перемещались не более чем на половину своей скорости.
!!!''Использование магических предметов''
На 13 уровне вы узнаёте достаточно о магических процессах, чтобы импровизировать при использовании предметов, даже если раньше вы не умели ими пользоваться. Вы игнорируете все требования класса, расы и уровня при использовании магических предметов.
!!!''Воровские рефлексы''
Когда вы получаете 17 уровень, вы обретаете большой опыт организации засад и быстрого отступления при опасности. Вы можете совершить два хода во время первого раунда боя. Совершите первый ход согласно своей нормальной инициативе, и второй ход с инициативой на 10 меньше. Вы не можете использовать это умение, если захвачены врасплох.
//Оружие (любой меч) очень редкое (требуется настройка)//
Вы получаете бонус +2 к броскам атаки и урона этим магическим оружием.
У меча есть 1к8 + 1 заряд. Если вы совершаете критическое попадание по существу, у которого меньше 100 хитов, оно должно преуспеть в спасброске Телосложения со Сл 15, иначе мгновенно умрёт, когда меч вырвет его жизненную силу из тела (конструкты и нежить обладают иммунитетом). Меч теряет 1 заряд, если существо умирает. Когда у меча не останется зарядов, он теряет это свойство.
!!!''Вор пяти судеб''
"""Вы можете один раз сотворить заклинание порча, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
!!!''__Воровской жаргон__''
"""Во время плутовского обучения вы выучили воровской жаргон, тайную смесь диалекта, жаргона и шифра, который позволяет скрывать сообщения в, казалось бы, обычном разговоре. Только другое существо, знающее воровской жаргон, понимает такие сообщения. Это занимает в четыре раза больше времени, нежели передача тех же слов прямым текстом.
Кроме того, вы понимаете набор секретных знаков и символов, используемый для передачи коротких и простых сообщений. Например, является ли область опасной или территорией гильдии воров, находится ли поблизости добыча, простодушны ли люди в округе, и предоставляют ли здесь безопасное убежище для воров в бегах."""
//7 уровень, Некромантия, Бард/Жрец//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (бриллиант, стоящий как минимум 1 000 зм, расходуемый заклинанием)
:''Длительность:'' Мгновенная
"""Вы касаетесь существа, мёртвого не больше ста лет, умершего не от старости, и не являющегося нежитью. Если его душа свободна и согласна, цель возвращается к жизни с полными хитами.
Это заклинание нейтрализует все яды и исцеляет немагические болезни, бывшие у существа в момент смерти. Однако это заклинание не снимает магические болезни, проклятья и подобные эффекты; если их не снять до накладывания этого заклинания, они снова начнут действовать, когда существо оживёт.
Это заклинание исцеляет все раны и восстанавливает отсутствующие части тела.
Возвращение к жизни — тяжёлое испытание. Цель получает штраф −4 ко всем броскам атаки, спасброскам и проверкам характеристик. Каждый раз, когда цель заканчивает длительный отдых, штраф уменьшается на 1, пока не исчезнет полностью.
Накладывание этого заклинания для оживления существа, мёртвого больше года, сильно выматывает вас. Пока вы не окончите продолжительный отдых, вы не можете накладывать заклинания, и совершаете с помехой все броски атаки, проверки характеристик и спасброски."""
//8 уровень, Вызов, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Кружащееся облако дыма с ярко-белыми огоньками появляется в сфере с радиусом 20 футов с центром на точке, находящейся в пределах дистанции. Облако огибает углы и является сильно заслонённой местностью. Оно существует, пока активно заклинание, или пока его не развеет умеренный или сильный ветер (как минимум 10 миль в час).
Когда облако появляется, все существа, находящиеся в нём, должны совершить спасбросок Ловкости. Существо получает урон огнём 10к8 при провале или половину урона при успехе. Существа должны также совершать этот спасбросок, когда впервые за ход входят в область заклинания или оканчивают там ход.
В начале каждого вашего хода облако перемещается на 10 футов прочь от вас в направлении, выбираемом вами."""
//3 уровень, Некромантия, Волшебник/Жрец//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (капля крови, кусочек плоти и щепотка костной пыли)
:''Длительность:'' Мгновенная
"""Это заклинание создаёт прислуживающую нежить. Выберите груду костей или труп гуманоида Среднего или Маленького размера в пределах дистанции. Ваше заклинание наделяет цель мерзким подобием жизни, делая из него существо-нежить. Цель становится скелетом, если вы выбирали кости или зомби, если вы выбрали труп (параметры есть у Мастера).
В каждый свой ход вы можете бонусным действием мысленно приказать существу, созданному этим заклинанием, если оно находится в пределах 60 футов от вас (если вы контролируете несколько существ, вы можете отдавать один и тот же приказ любому количеству из них одновременно). Вы решаете, какое действие совершит это существо, и куда оно переместится в следующем ходу, или вы можете отдать общий приказ, например, охранять комнату или коридор. Если вы не отдадите команду, существо будет всего лишь защищаться от врагов. Получив приказ, существо продолжает его выполнять, пока задача не будет выполнена.
Существо находится под вашим контролем 24 часа, после чего перестаёт слушаться команд. Для поддержания контроля ещё на 24 часа вы должны наложить это заклинание на него ещё раз до окончания 24-часового периода. Такое использование заклинания только поддерживает контроль над уже созданными существами, количество которых не может быть больше четырёх, и не оживляет новых."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, вы оживляете или продлеваете контроль над двумя дополнительными существами за каждый уровень ячейки выше третьего. Для каждого создаваемого существа требуется отдельная куча костей или труп.
!!!''Восходящий шаг''
"""//Требование: 9 уровень//
Вы можете неограниченно накладывать на себя заклинание левитация, не тратя ячейки заклинаний и материальные компоненты. """
//9 уровень, Вызов, Волшебник/Жрец/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (бриллиант, стоящий как минимум 5 000 зм)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте портал, соединяющий свободное пространство, видимое вами в пределах дистанции, с точным местом на другом плане существования. Портал представляет собой круглое отверстие, которое может быть диаметром от 5 до 20 футов. Вы можете ориентировать портал в любом направлении. Портал существует, пока заклинание активно.
На каждом плане у портала есть передняя и задняя сторона. Путешествовать через портал можно только проходя через его переднюю часть. Всё, что так проходит, мгновенно перемещается на другой план, появляясь в свободном пространстве рядом с порталом.
Божества и другие планарные правители могут предотвращать создание порталов этим заклинанием в их присутствии или где угодно в пределах их домена.
Когда вы накладываете это заклинание, вы можете назвать имя конкретного существа (псевдоним, титул или прозвище не подходят). Если это существо находится на другом плане, портал открывается непосредственно возле него, и это существо втягивается, оказываясь в ближайшем свободном пространстве с вашей стороны портала. Вы не получаете над ним никакого особого контроля, и оно может действовать так, как сочтёт нужным Мастер. Оно может уйти, может напасть на вас, а может помочь вам."""
"""В ситуации, когда важно отслеживать время, Мастер определяет, сколько времени понадобилось для той или иной задачи. В зависимости от контекста ситуации Мастер может использовать разные масштабы времени. В подземелье искатели приключений перемещаются в масштабе минут. Требуется примерно минута для того, чтобы прокрасться по коридору, ещё одна минута для поиска ловушек на двери в конце этого коридора и добрых десять минут для поиска в зале, раскинувшемся за этой дверью, чего-нибудь интересного или ценного.
В городе или дикой местности больше подходит масштаб часов. Искатели приключений, идущие к одинокой башне в сердце леса, пройдут в быстром темпе эти 24 километра менее чем за 4 часа.
Для длительных путешествий подходит масштаб дней. Следуя по дороге от Врат Балдура до Глубоководья, искатели приключений проводят четыре ничем не примечательных дня, после чего попадают в засаду гоблинов.
В бою и других стремительных ситуациях игра использует раунды, 6-секундные отрезки времени, описанные в главе 9."""
!!!__''Всплеск действий''__
"""Начиная со 2 уровня вы получаете возможность на мгновение преодолеть обычные возможности. В свой ход вы можете совершить одно дополнительное действие помимо обычного и бонусного действий.
Использовав это умение, вы должны завершить короткий или продолжительный отдых, чтобы получить возможность использовать его снова. Начиная с 17 уровня вы можете использовать это умение дважды, прежде чем вам понадобится отдых, но в течение одного хода его всё равно можно использовать лишь один раз."""
!!!__''Второе дыхание''__
"""Вы обладаете ограниченным источником выносливости, которым можете воспользоваться, чтобы уберечь себя. В свой ход вы можете бонусным действием восстановить хиты в размере 1к10 + ваш уровень воина.
Использовав это умение, вы должны завершить короткий либо продолжительный отдых, чтобы получить возможность использовать его снова."""
Люди — наиболее распространённый народ в D&D, но они проживают бок обок с дварфами, эльфами, полуросликами и другими бесчисленными фантастическими расами. Ваш персонаж принадлежит к одному из этих народов.
Не всякая разумная раса подходит для персонажа игрока. Стандартные группы искателей приключений в основном состоят из дварфов, эльфов, полуросликов и людей. Реже встречаются драконорождённые, полуэльфы, полуорки, гномы и тифлинги. Дроу, разновидность эльфов, тоже встречаются нечасто.
Выбор расы влияет на разные аспекты вашего персонажа. Он определяет основные качества, которые будут у вашего персонажа на протяжении всей его карьеры. Прежде чем выбрать расу, подумайте, каким персонажем вы бы хотели играть. Например, полурослик — отличный выбор для скрытного плута, из дварфов хорошо получаются стойкие воины, а эльф может быть знатоком магии.
Раса персонажа даёт не только увеличение характеристик и расовые особенности, но также предоставляет зацепки для создания истории персонажа. В описании каждой расы в этой главе содержится информация, которая поможет отыгрывать персонажа этой расы. Она включает в себя общие сведения о характере, внешнем виде, общественном укладе и преимущественном мировоззрении. Эти подробности — отправная точка для размышлений о вашем персонаже, искатели приключений могут существенно отличаться от среднего представителя своей расы. Для создания предыстории и личности персонажа стоит подумать, почему он не такой, как все.
!! __Расовые особенности__
В описание каждой расы входят расовые особенности, общие для всех её представителей. Следующие разделы встречаются в описании большинства рас:
!!! Увеличение характеристик
Каждая раса увеличивает одно или несколько значений характеристик.
!!! Возраст
В этом разделе указывается, в каком возрасте представитель той или иной расы считается взрослым, а также примерная продолжительность его жизни. Вы можете начать игру персонажем любого возраста, и это может послужить обоснованием некоторых значений его характеристик. Например, при игре очень молодым или старым персонажем, возраст может быть причиной низких значений Силы или Телосложения, в то время как зрелый возраст хорошо объясняет высокие показатели Мудрости и Интеллекта.
!!! Мировоззрение
Большинство рас имеют склонность к определённому мировоззрению, что и описано в данном разделе. Это никак не ограничивает вашего персонажа, но осознание, почему вопреки строго законопослушному обществу ваш дварф вырос хаотичным, поможет вам лучше вжиться в роль.
!!! Размер
Персонажи большинства рас считаются Средними. В эту категорию попадают существа ростом от 4 до 8 футов (от 122 до 244 сантиметров). Представители некоторых рас считаются Маленькими (от 2 до 4 футов [от 66 до 122 сантиметров] ростом), и из-за этого некоторые правила игры действуют на них по-другому. Самое важное отличие в размерах заключается в том, что существа Маленького размера испытывают трудности в сражении тяжёлым оружием, подробнее об этом написано в главе 6.
!!! Скорость
Скорость определяет, как далеко сможет продвинуться персонаж во время путешествия (смотрите главу 8) и сражения (смотрите главу 9).
!!! Языки
В зависимости от расы, ваш персонаж может говорить, читать и писать на определённых языках. Список языков, наиболее распространённых в мультивселеной D&D, приведён в главе 4.
!!! Разновидности
У некоторых рас есть разновидности. Их представители сочетают в себе качества основной расы с особенностями, присущими только этой разновидности. Отношения между представителями разных разновидностей одной расы могут существенно различаться в зависимости от расы и игрового мира. В Саге о Копье, например, горные и холмовые дварфы живут вместе и представляют собой два разных клана одного народа. В то же время в Забытых Королевствах они живут в разных странах и называются щитовыми и золотыми дварфами, соответственно.
Путешествия в дикой местности заставляют столкнуться с множеством угроз, а не с одними только чудовищами и разбойниками.
!!__''Погода''__
Можете самостоятельно выбрать погоду, подходящую вашей кампании, а можете совершить бросок по таблице, чтобы определить погоду в тот или иной день, внося коррективы за счёт местности и времени года
{{$:/Погода}}
!!!''Чрезвычайный холод''
При температуре ниже -17 градусов существо, находящееся на холоде, должно в конце каждого часа преуспевать в спасброске Телосложения со Сл 10, иначе оно получит одну степень истощения. Существа с сопротивлением или иммунитетом к урону холодом автоматически преуспевают в этом спасброске, равно как и тепло одетые существа (толстые куртки, варежки, и так далее) с существами, адаптировавшимся к холодному климату.
!!!''Чрезвычайная жара''
При температуре выше 37 градусов существо, находящееся на жаре без доступа к питьевой воде, должно в конце каждого часа преуспевать в спасброске Телосложения, иначе оно получит одну степень истощения. Сл равна 5 для первого часа, и увеличивается на 1 за каждый дополнительный час. Существа, носящие средние или тяжёлые доспехи, а также те, кто носит плотную одежду, совершают этот спасбросок с помехой. Существа с сопротивлением или иммунитетом к урону огнём автоматически преуспевают в этом спасброске, равно как и существа, адаптировавшиеся к жаркому климату.
!!!''Сильный ветер''
Сильный ветер накладывает помеху к броскам дальнобойных атак оружием и проверкам Мудрости (Внимательность), полагающимся на слух. Сильный ветер также гасит открытое пламя, рассеивает туман и делает полёт без помощи магии практически невозможным. Летающее существо при сильном ветре должно приземляться в конце каждого своего хода, иначе оно падает.
Сильный ветер в пустыне может создать песчаную бурю, которая накладывает помеху к проверкам Мудрости (Внимательность), полагающимся на зрение.
!!!''Обильные осадки''
Всё в области сильного дождя или снегопада считается слабо заслонённым, и существа в этой области совершают с помехой проверки Мудрости (Внимательность), полагающиеся на зрение. Сильный дождь также гасит открытое пламя и накладывает помеху на проверки Мудрости (Внимательность), полагающиеся на слух.
!!__''Большая высота''__
Путешествие на уровне 3 километра (10 000 футов) над уровнем моря и выше тяжело обходится существам, которым нужно дышать, из-за разреженного воздуха. Каждый час, в течение которого существо путешествует на большой высоте, считается за 2 часа при определении того, как долго оно может путешествовать.
Дышащие существа могут привыкнуть к большой высоте, проведя там 30 дней. Дышащие существа не могут привыкнуть к высоте более 6 километров (20 000 футов) над уровнем моря, если они не адаптированы от природы к такой высоте.
!!__''Опасности в дикой местности''__
В этом разделе приводятся несколько примеров опасностей, поджидающих искателей приключений в дикой местности.
Некоторые опасности, такие как скользкий лёд и бритвенная лоза, не требуют проверок характеристик для обнаружения. Другие, такие как осквернённая земля, не обнаружимы обычными чувствами. Остальные опасности, представленные здесь, можно опознать успешной проверкой Интеллекта (Природа). Используйте советы из главы 8 для определения Сл проверок обнаружения и определения опасности.
!!!''Бритвенная лоза''
Бритвенная лоза это растение, растущее в диких зарослях и живых изгородях. Оно цепляется за стены домов и прочие поверхности как любая другая лоза. У изгороди или участка 10 футов высотой, 10 футов шириной и 5 футов толщиной КД 11, 25 хитов и иммунитет дробящему, колющему урону и урону психической энергией.
Когда существо впервые за ход вступает в прямой контакт с бритвенной лозой, оно должно преуспеть в спасброске Ловкости со Сл 10, иначе оно получит рубящий урон 5 (1к10) от похожих на клинки шипов.
!!!''Зыбучий песок''
Яма с зыбучим песком занимает пространство примерно в 10 квадратных футов и обычно имеет глубину 10 футов. Когда существо входит в эту область, оно погружается на 1к4 + 1 фут и становится опутанным. В начале каждого своего хода оно погружается ещё на 1к4 фута. Пока существо не погрузилось полностью в песок, оно может пытаться высвободиться, совершая действием проверку Силы. Сл равна 10 плюс количество футов, на которое существо уже погрузилось в песок. Существо, полностью погрузившееся в песок, не может дышать (смотрите правила по удушению в Книге игрока).
Существо может вытянуть из зыбучего песка другое существо, находящееся в пределах его досягаемости, совершив действием проверку Силы. Сл равна 5 плюс количество футов, на которое цель уже погрузилась в песок.
!!!''Осквернённая земля''
Некоторые кладбища и катакомбы заполнены невидимыми следами древнего зла. Область осквернённой земли может быть любого размера, и заклинание обнаружение добра и зла может обнаруживать её в пределах своей дистанции.
Нежить, стоящая на осквернённой земле, совершает с преимуществом все спасброски.
Флакон святой воды очищает 10 квадратных футов осквернённой земли, политой им, а заклинание святилище очищает осквернённую землю, находящуюся в его области.
!!!''Скользкий лёд''
Скользкий лёд является труднопроходимой местностью. Когда существо впервые за ход перемещается по скользкому льду, оно должно преуспеть в спасброске Ловкости (Акробатика) со Сл 10, иначе упадёт ничком.
!!!''Тонкий лёд''
Тонкий лёд может выдержать 3к10 х 10 фунтов на 10 квадратных футов. Если общий вес на этой площади превышает предельный, лёд ломается. Все существа, стоящие в этой области, проваливаются сквозь лёд.
!!!''Холодная вода''
Существо может находиться в холодной воде количество минут, равное его значению Телосложения, после чего начинает получать негативные последствия. В конце каждой дополнительной минуты, проведённой в холо дной воде, существо должно преуспевать в спасброске Телосложения со Сл 10, иначе оно получит одну степень истощения. Существа с сопротивлением или иммунитетом к урону холодом автоматически преуспевают в этом спасброске, равно как и существа, адаптировавшиеся к проживанию в ледяной воде.
!!__''Сбор еды''__
Персонажи могут добывать пищу и воду, если отряд путешествует в нормальном или медленном темпе. Добывающий еду персонаж совершает проверки Мудрости (Выживание), когда вы просите его это сделать, а Сл зависит от наличия в регионе пищи и воды.
{{$:/Сл сбора еды}}
Если сбором еды занимаются несколько персонажей, каждый совершает отдельную проверку. При провале проверки персонаж ничего не находит. При успехе совершите бросок 1к6 + модификатор Мудрости персонажа, чтобы определить, сколько еды (в фунтах) он нашёл, а потом повторите этот же бросок для воды (в галлонах).
!!!''Еда и вода''
Требования к еде и воде, указанные в Книге игрока, указаны для персонажей. Лошади и прочие существа требуют иного количества пропитания, в зависимости от их размера. Потребность в воде удваивается, если стоит жаркая погода.
{{$:/Требования к еде и воде}}
!!__''Блуждания''__
Если искатели приключений не идут в дикой местности по тропе или чему-то аналогичному, они рискуют заблудиться. Ответственный за навигацию совершает проверки Мудрости (Выживание), когда вы считаете нужным, со Сл, зависящей от местности, как показано в приведённой таблице. Если отряд движется в медленном темпе, этот персонаж получает бонус +5 к проверке, а быстрый темп накладывает штраф -5. Если у отряда есть точная карта региона или они видят солнце или звёзды, персонаж совершает проверку с преимуществом.
Если проверка Мудрости (Выживание) была успешной, отряд перемещается в нужном направлении, не сбиваясь с курса. При провале проверки отряд по ошибке идёт в неправильном направлении. Ответственный за навигацию персонаж может повторить проверку, после того как отряд потратит 1к6 часов на повторный поиск пути.
{{$:/Навигация в дикой местности}}
1 уровень, Очарование, Паладин
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь вызвать существо на дуэль. Одно существо, которое вы видите в пределах дистанции, должно совершить спасбросок Мудрости. При провале существо притягивается к вам, следуя вашему божественному требованию. Пока заклинание активно, это существо совершает с помехой броски атаки по всем существам кроме вас, и должно совершать спасброски Мудрости каждый раз, когда пытается переместиться в пространство, находящееся более чем в 30 футах от вас; в случае успеха это заклинание не ограничивает перемещения цели в этот ход.
Заклинание оканчивается, если вы атакуете другое существо, если вы активируете заклинание, нацеленное на враждебное существо, но не на цель, если дружественное вам существо причиняет цели урон или накладывает на неё вредоносное заклинание, или если вы оканчиваете ход далее чем в 30 футах от цели."""
//4 уровень, Иллюзия, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы или существо, которого вы касаетесь, становитесь невидимым, пока активно заклинание. Всё, что цель носит и несёт, становится невидимым, пока находится у этой личности.
//5 уровень, Ограждение, Бард/Друид/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (бриллиантовая пыль, стоящая как минимум 100 зм, расходуемая заклинанием)
:''Длительность:'' Мгновенная
Вы наделяете существо, которого касаетесь, позитивной энергией, отменяющей ослабляющие эффекты. Вы можете уменьшить уровень истощения цели на 1, или окончить на ней один из следующих эффектов:
* Один эффект, делающий цель очарованной или окаменевшей
* Одно проклятье, включая настройку на проклятый магический предмет
* Любое уменьшение одной из характеристик цели
* Один эффект, уменьшающий максимум хитов цели
//2 уровень, Прорицание, Жрец (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (особые палочки, костяшки или фигурки с отметинами, стоящие как минимум 25 зм)
:''Длительность:'' Мгновенная
Подбрасывая инкрустированные камнями палочки, драконьи кости, раскладывая карты или используя другие инструменты для ворожбы, вы получаете знамение от иномировой сущности о результатах особого действия, которое вы планируете совершить в течение следующих 30 минут. Мастер выбирает одно из следующих возможных знамений:
* //Благо//, для хороших результатов
* //Горе//, для плохих результатов
* //Благо и горе//, для результатов, одновременно хороших и плохих
* //Ничто//, для результатов, которые и не хорошие и не плохие
"""Заклинание не принимает в расчёт обстоятельства, способные изменить исход, такие как накладывание дополнительных заклинаний или потерю или обретение спутников.
Если вы накладываете это заклинание несколько раз до завершения продолжительного отдыха, существует накопительный шанс 25 процентов за каждое использование, начиная со второго, что вы получите случайный ответ. Мастер совершает этот бросок скрытно."""
//3 уровень, Преобразование, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (кусок марли и клуб дыма)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы превращаете на время действия заклинания согласное существо, которого касаетесь, а также всё, что оно носит и несёт, в туманное облако. Заклинание оканчивается, если хиты существа опускаются до 0. Бестелесные существа не попадают под действие этого заклинания.
Пока цель находится в этой форме, единственной её скоростью перемещения становится скорость полёта 10 футов. Цель может входить в пространство других существ и оставаться там. Существо получает сопротивление к немагическому урону, и совершает с преимуществом спасброски Силы, Ловкости и Телосложения. Цель может проходить через небольшие отверстия, узкие щели, но жидкости для неё считаются твёрдыми поверхностями. Цель не может упасть и остаётся парить, даже если становится ошеломлённой или недееспособной.
Находясь в форме туманного облака, цель не может говорить и манипулировать предметами, и все предметы, которые она несёт или носит, нельзя ронять, использовать и вообще как-либо с ними взаимодействовать. Цель не может атаковать и накладывать заклинания."""
//1 уровень, Очарование, Бард/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Согласное существо, которого вы касаетесь, наполняется храбростью. Пока заклинание активно, существо получает иммунитет к состоянию испуга, и в начале каждого своего хода получает временные хиты, равные модификатору вашей базовой характеристики. Когда это заклинание оканчивается, цель теряет все временные хиты, оставшиеся от этого заклинания.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше первого.
<table class="SB">
<tr>
<th colspan="7">Гигантская муха</th>
</tr>
<tr>
<th colspan="7">Большой зверь, без мировоззрения</th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">11</td>
</tr>
<tr>
<th>Хиты</th>
<td colspan="6">19 (3к10 + 3)</td>
</tr>
<tr>
<th>Скорость</th>
<td colspan="6">30 фт., летая 60 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>13 (+1)</td>
<td>6 (–2)</td>
<td>16 (+3)</td>
<td>3 (–4)</td>
<td>6 (–2)</td>
<td>5 (–3)</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">тёмное зрение 60 фт., пассивная Внимательность 10</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">—</td>
</tr>
</table>
//4 уровень, Преобразование, Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы превращаете на время действия заклинания до десяти многоножек, трёх пауков, пяти ос или одного скорпиона, находящихся в пределах дистанции, в гигантские версии своих сородичей. Многоножка становится гигантской многоножкой, паук становится гигантским пауком, оса становится гигантской осой, а скорпион становится гигантским скорпионом.
Все существа повинуются вашим устным командам, и в бою они в каждом раунде действуют в ваш ход. Характеристики этих чудовищ есть у Мастера, и их действия и перемещения контролирует он.
Существо сохраняет гигантский размер всю длительность заклинания, пока его хиты не опустятся до 0, или пока вы не окончите действием эффект на нём.
Мастер может позволить вам выбирать другие цели. Например, если вы превращаете жука, его гигантская версия может обладать теми же характеристиками, что и гигантская оса."""
Вы — член гильдии ремесленников, знаток в какой-то области, связанный с другими мастеровыми. Вы крепко стоите на ногах в этом торгашеском мире, отделённые своим талантом и богатством от оков феодального строя. Когда-то вы учились у мастера, под опекой гильдии, и вот вы сами стали таким умельцем.
;
:''Владение навыками:'' Проницательность, Убеждение
:''Владение инструментами:'' Один вид ремесленных инструментов
:''Языки:'' Один на ваш выбор
;
:''Снаряжение:'' Один вид ремесленных инструментов, рекомендательное письмо из гильдии, дорожная одежда, поясной кошель с 15 зм
!!!''Специализация гильдии''
"""Обычно гильдии основывают в городах, достаточно больших для того, чтобы сразу несколько ремесленников занимались одним общим делом. Однако ваша гильдия может быть рассредоточенной сетью ремесленников, где каждый работает в своей деревне. Определите вместе с Мастером характер вашей гильдии. Можете выбрать специализацию гильдии из таблицы, а можете определить её случайным образом.
Будучи членом гильдии, вы знаете, как создавать готовые предметы из сырья (отражается вашим владением определённым инструментом), а также основы торговли и бизнеса. Вопрос лишь в том, отказались ли вы от торговли в пользу приключений или стараетесь успевать и там и там."""
<table>
<tr>
<th>к20</th>
<th>Специализация гильдии</th>
</tr>
<tr>
<td>1</td>
<td>Алхимики и аптекари</td>
</tr>
<tr>
<td>2</td>
<td>Гончары и мастера керамики</td>
</tr>
<tr>
<td>3</td>
<td>Жестянщики, проволочники и литейщики</td>
</tr>
<tr>
<td>4</td>
<td>Каллиграфы, писцы и нотариусы</td>
</tr>
<tr>
<td>5</td>
<td>Каменщики и камнерезы</td>
</tr>
<tr>
<td>6</td>
<td>Картографы, землемеры и чертёжники</td>
</tr>
<tr>
<td>7</td>
<td>Кожевенники, меховщики и дубильщики</td>
</tr>
<tr>
<td>8</td>
<td>Кузнецы и бронники</td>
</tr>
<tr>
<td>9</td>
<td>Металлурги и мастера обработки металла</td>
</tr>
<tr>
<td>10</td>
<td>Пивовары и виноделы</td>
</tr>
<tr>
<td>11</td>
<td>Плотники, кровельщики и штукатуры</td>
</tr>
<tr>
<td>12</td>
<td>Повара и пекари</td>
</tr>
<tr>
<td>13</td>
<td>Сапожники и чеботари</td>
</tr>
<tr>
<td>14</td>
<td>Стеклодувы и стекольщики</td>
</tr>
<tr>
<td>15</td>
<td>Столяры, бондари и лучных дел мастера</td>
</tr>
<tr>
<td>16</td>
<td>Судостроители и парусные мастера</td>
</tr>
<tr>
<td>17</td>
<td>Тележники и колёсных дел мастера</td>
</tr>
<tr>
<td>18</td>
<td>Ткачи и красильщики</td>
</tr>
<tr>
<td>19</td>
<td>Художники, иллюстраторы и маляры</td>
</tr>
<tr>
<td>20</td>
<td>Ювелиры и огранщики</td>
</tr>
</table>
!!!''Умение: Членство в гильдии''
"""Будучи авторитетным и уважаемым членом гильдии, вы можете пользоваться особыми преимуществами, предоставляемыми этим членством. Ваши товарищи по гильдии при необходимости предоставят вам жилище и питание, и даже оплатят ваши похороны. В некоторых городах у гильдий есть место для сбора, и там можно потенциально встретить покровителей, союзников и наёмников.
Гильдии часто обладают значительной политической властью. Если вас обвинят в преступлении, гильдия может помочь, если существует вероятность оправдательного приговора. Благодаря гильдии вы получаете доступ к влиятельным политикам, если состоите в гильдии на хорошем счёту. Для таких связей может потребоваться жертвование денег или магических предметов в казну гильдии.
Каждый месяц вы должны выплачивать гильдии 5 зм. Если вы пропустите платёж, вы должны вначале оплатить все долги, и только тогда восстановите своё доброе имя в гильдии."""
!!!''Персонализация''
Гильдейские ремесленники мало чем отличаются от обывателей, пока они не откладывают свои инструменты в сторону и не начинают карьеру искателя приключений. Они понимают ценность тяжёлого труда и важность общности, но они так же как другие подвержены грехам жадности и алчности.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я считаю, что всё, что делается, должно делаться правильно. Ничего не могу с этим поделать — я перфекционист.</td>
</tr>
<tr>
<td>2</td>
<td>Я сноб, свысока смотрящий на тех, кто не может оценить изящное искусство.</td>
</tr>
<tr>
<td>3</td>
<td>Мне всегда нужно знать, как всё вокруг устроено, и как нужно обращаться с другими.</td>
</tr>
<tr>
<td>4</td>
<td>У меня много остроумных афоризмов и есть пословицы на любой случай.</td>
</tr>
<tr>
<td>5</td>
<td>Я груб с теми, у кого нет моей тяги к честному и справедливому труду.</td>
</tr>
<tr>
<td>6</td>
<td>О своей профессии я могу говорить часами.</td>
</tr>
<tr>
<td>7</td>
<td>Я не могу легко расставаться с деньгами, и могу сколь угодно долго торговаться.</td>
</tr>
<tr>
<td>8</td>
<td>Благодаря работе я прославился, и хочу, чтобы все это ценили. Меня всегда потрясает, когда другие говорят, что не слышали обо мне.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Сообщество. Все цивилизованные народы обязаны укреплять сообщество и обеспечивать безопасность цивилизации. (Законный)</td>
</tr>
<tr>
<td>2</td>
<td>Великодушие. Талант был вручён мне, чтобы я использовал его на благо всего мира. (Добрый)</td>
</tr>
<tr>
<td>3</td>
<td>Свобода. Все должны быть свободны, чтобы жить так, как хочется им. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Жадность. Я просто занимаюсь этим из-за денег. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Народ. Я предан своему народу, а не идеям. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Стремление. Я усердно работаю над тем, чтобы стать в своём деле лучшим.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Мастерская, где я учился ремеслу, для меня — самое важное место в мире.</td>
</tr>
<tr>
<td>2</td>
<td>Я создал кое для кого удивительную работу, но посчитал его недостойным. Я всё ещё ищу того, кто окажется достоин её.</td>
</tr>
<tr>
<td>3</td>
<td>Я по гроб жизни обязан гильдии за то, что она сделала меня тем, кто я есть.</td>
</tr>
<tr>
<td>4</td>
<td>Богатство мне нужно для завоевания сердца возлюбленной.<br> </td>
</tr>
<tr>
<td>5</td>
<td>Когда-нибудь я вернусь в гильдию и докажу, что я лучший из всех.</td>
</tr>
<tr>
<td>6</td>
<td>Я мщу силам зла, которые уничтожили моё торговое дело и разрушили мою жизнь.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я сделаю всё что угодно, чтобы заполучить что-то редкое или очень ценное.</td>
</tr>
<tr>
<td>2</td>
<td>Мне всегда кажется, что меня пытаются обжулить.</td>
</tr>
<tr>
<td>3</td>
<td>Никто не должен знать, что я однажды украл деньги из казны гильдии.</td>
</tr>
<tr>
<td>4</td>
<td>Мне всегда мало того, что у меня есть — всегда нужно больше.</td>
</tr>
<tr>
<td>5</td>
<td>Я готов убить ради получения благородного титула.</td>
</tr>
<tr>
<td>6</td>
<td>Я ужасно завидую тем, кто может превзойти мой труд. Куда бы я ни пошёл, меня окружают конкуренты.</td>
</tr>
</table>
!!!''Разновидность гильдейского ремесленника: Гильдейский купец''
"""Вы можете состоять не в гильдии ремесленников, а в гильдии купцов, караванщиков и лавочников. Сами вы ничего не мастерите, но зарабатываете на жизнь, покупая и продавая творения чужих рук (или сырьё, необходимое ремесленникам). Ваша гильдия может быть большим торговым синдикатом (или семейством), с капиталовложениями по всему региону. Возможно, вы перевозите товары из одного места в другое, на корабле, в фургоне или караване, или покупаете их у бродячих торговцев и продаёте в своём маленьком магазинчике. В какой-то мере, жизнь странствующего торговца ближе к приключениям, чем жизнь ремесленника.
Вместо владения ремесленным инструментом вы можете овладеть инструментами навигатора или дополнительным языком. А вместо наличия ремесленных инструментов вы можете начать игру с мулом и телегой."""
//3 уровень, Иллюзия, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' С, М (зажжённая палочка благовоний или хрустальный сосуд, заполненный фосфоресцирующим материалом)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте хитрый разноцветный узор, переплетающийся в воздухе внутри куба с длиной ребра 30 футов, находящегося в пределах дистанции. Узор появляется на краткий миг и исчезает. Все существа в этой области, видящие узор, должны совершить спасбросок Мудрости. При провале существо становится очарованным на время действия заклинания. Будучи очарованным этим заклинанием, существо недееспособно, и его скорость равна 0.
Заклинание заканчивается для отдельного существа, если оно получает урон или если кто-то другой действием потрясёт его, чтобы вывезти из ступора."""
"""Ваш первый шаг в роли искателя приключений в D&D заключается в том, чтобы представить себе и создать собственного персонажа. Ваш персонаж является сочетанием игровой статистики, ролевых зацепок и вашего воображения. Вы выбираете расу (например, человек или полурослик) и класс (например, воин или волшебник). Вы также создаёте личность, внешность и предысторию своего персонажа. По завершении создания ваш персонаж станет вашим представителем в игре, вашим аватаром в мире D&D.
Перед тем как вы углубитесь в изучение шага 1, подумайте о том, каким искателем приключений вы хотите играть. Вы можете быть отважным воином, проворным плутом, пылким жрецом или эксцентричным волшебником. А, может быть, вы заинтересованы в создании нестандартного персонажа, такого как мускулистый плут, который предпочитает рукопашный бой, или меткий стрелок, который отстреливает противников издалека? Вам нравятся фэнтези произведения с участием дварфов и эльфов? Создайте персонажа одной из этих рас! Хотите, чтобы ваш персонаж был самым стойким искателем приключений за столом? Попробуйте классы варвар или паладин. Если вы не знаете с чего начать, посмотрите на иллюстрации в этой книге, чтобы найти то, что привлечёт ваш интерес.
Когда вы представили себе своего персонажа, следуйте описанным ниже шагам по порядку, принимая решения, которые будут отображать натуру создаваемого персонажа. Ваше представление о персонаже может эволюционировать с каждым сделанным вами выбором. Важно то, чтобы вы сели за стол с персонажем, которым хотите играть.
В этой главе мы используем термин ''лист персонажа'' для обозначения всего, что вы используете для описания своего персонажа, вне зависимости от того, официальный ли это лист персонажа (приведён в конце книги), какие-то виды цифровых записей или кусок тетрадного листа. Официальный лист персонажа D&D идеально подходит для начала, пока вы не узнаете, какая информация вам нужна и как её использовать во время игры."""
!! ''Создание Бруенора''
Каждый шаг создания персонажа включает пример, в котором игрок по имени Боб создаёт своего персонажа — дварфа Бруенора.
<<<
!!!''Быстрое создание''
Описание каждого класса в главе 3 включает в себя раздел, предлагающий варианты быстрого создания персонажа этого класса, включая распределение значений характеристик, предысторию, подходящую для класса и начальные заклинания.
<<<
!!! __''1. Выберите расу''__
"""Каждый персонаж принадлежит к одной из множества разумных гуманоидных рас мира D&D. Наиболее распространёнными расами игровых персонажей являются дварфы, эльфы, полурослики и люди. Некоторые расы также имеют ''подрасы'', например, горный дварф или лесной эльф. В главе 2 приводится больше информации об этих, а также других менее распространенных расах: драконорождённых, гномах, полуэльфах, полуорках и тифлингах.
Раса, которую вы выбрали, придаёт индивидуальность вашему персонажу, определяя характерную внешность и врождённые таланты, полученные через культуру и происхождение. Раса вашего персонажа даёт определённые расовые особенности, такие как: особые чувства, владение несколькими видами оружия или инструментов, владение одним или несколькими навыками, а также возможность использовать простейшие заклинания. Эти особенности иногда хорошо сочетаются со способностями некоторых классов (см. шаг 2). Например, особенности расы легконогих полуросликов делают их исключительными плутами, а высшие эльфы, как правило, становятся могущественными волшебниками. Иногда поступать не по шаблонам тоже может быть весело. Полуорк паладин и горный дварф волшебник, например, могут быть необычными, но запоминающимися персонажами.
Ваша раса также увеличивает одно или несколько значений характеристик, которые вы определите в шаге 3. Запишите эти улучшения и не забудьте учесть их позже.
Запишите особенности вашей расы на листе персонажа. Также обязательно отметьте ваши начальные языки и базовую скорость."""
!!! ''Создание Бруенора, шаг 1''
"""Боб сел за создание своего персонажа. Он решает, что грубый горный дварф— тот персонаж, которым он хочет играть. Он записывает все особенности расы дварфов в свой лист персонажа, включая его скорость — 25 футов и языки, которыми он владеет: Общий и Дварфский."""
!!!__ ''2. Выберите класс''__
"""Каждый искатель приключений — представитель какого-либо класса. Класс в общих чертах описывает призвание персонажа, таланты, которыми он обладает, и тактики, к которым он чаще всего прибегает, когда исследует подземелье, сражается с монстрами или участвует в напряжённых переговорах. Классы персонажей описаны в главе 3.
Ваш персонаж получает ряд преимуществ от выбранного вами класса. Множество этих преимуществ являются ''классовыми умениями'' — возможностями (включая чтение заклинаний), которые отличают вашего персонажа от представителей других классов. Вы также получаете перечень ''владения'' (умение пользоваться) доспехами, оружием, навыками, спасбросками и иногда инструментами. Владение определяет многое из того, что ваш персонаж может делать особенно хорошо: применять в бою определённые виды оружия или убедительно лгать.
На своём листе персонажа запишите все умения, которыми обладает ваш класс на 1 уровне."""
!!!'' Уровень''
Обычно персонаж начинает с 1 уровня и достигает новых уровней, завершая приключения и получая ''опыт''. На 1 уровне персонаж неопытен в мире приключений, хотя он мог быть солдатом или пиратом и вести опасную жизнь и раньше.
"""1 уровень означает для вашего персонажа вступление в жизнь искателя приключений. Если вы уже знакомы с игрой или если вы присоединяетесь к текущей кампании, ваш Мастер может решить, что вы начинаете с более высоким уровнем, предполагая, что ваш персонаж уже пережил несколько опасных приключений.
Запишите свой уровень на листе персонажа. Если вы начинаете не с 1 уровня, запишите дополнительные способности, которые предоставляет ваш класс. Также запишите свой текущий опыт. У персонажа 1 уровня 0 опыта. Персонаж более высокого уровня, как правило, начинает с минимальным значением опыта, необходимым для достижения этого уровня (смотрите «После 1 уровня» далее в этой главе)."""
!!! ''Хиты и Кость Хитов''
"""Хиты вашего персонажа определяют, насколько стойким является ваш персонаж в сражениях и других опасных ситуациях. Ваши хиты определяются вашей Костью Хитов.
На 1 уровне, у вашего персонажа 1 Кость Хитов, и вид этой кости определяется вашим классом. Вы начинаете с числом хитов, равным наибольшему возможному результату броска этой кости, как отмечено в описании вашего класса (вы также добавляете ваш модификатор Телосложения, который определите на шаге 3). Это число также является вашим ''максимальным значением хитов''.
Запишите число хитов вашего персонажа на своём листе персонажа. Также запишите вид Кости Хитов, которую использует ваш персонаж и число Костей Хитов, которое у него есть. После отдыха вы можете тратить Кости Хитов на восстановление хитов (смотрите «Отдых» в главе 8)."""
!!!''Бонус мастерства''
В таблице, которая находится в описании вашего класса, приведён бонус мастерства, который равен +2 для персонажа 1 уровня. Ваш бонус мастерства добавляется ко многим числам, которые вы будете записывать на свой лист персонажа:
* Броски атаки при использовании оружия, которым вы владеете
* Броски атаки заклинаний, которые вы активируете
* Проверки характеристик при использовании навыков, которыми вы владеете
* Проверки характеристик с инструментами, которыми вы владеете
* Спасброски, которыми вы владеете
* Сл спасбросков для заклинаний, которые вы активируете (объясняется для классов, способных творить заклинания)
"""Ваш класс определяет владение спасбросками, некоторыми навыками и инструментами (навыки описаны в главе 7, инструменты — в главе 5), и то, каким оружием вы владеете. Ваша предыстория, равно как и некоторые расы, даёт вам владение дополнительными навыками и инструментами. Обязательно запишите всё, чем вы владеете, а также бонус мастерства в свой лист персонажа.
Ваш бонус мастерства не может быть добавлен к одному броску костей или какому-либо числу более одного раза. Иногда ваш бонус мастерства может быть преобразован (увеличен или уменьшен вдвое), прежде чем будет прибавлен к броску. Если обстоятельства позволяют предположить, что ваш бонус мастерства добавляется больше одного раза к одному и тому же броску или должен быть умножен более одного раза, все-таки добавьте его только один раз, увеличьте или уменьшите вдвое только один раз."""
!!! ''Создание Бруенора, шаг 2''
"""Боб представляет себе Бруенора, несущегося в битву с топором в руке. Один рог на его шлеме отломлен. Он делает Бруенора воином и отмечает, чем он владеет, а также записывает классовые умения воина 1 уровня в свой лист персонажа.
Как воин 1 уровня, Бруенор имеет 1 Кость Хитов — к10 и начинает с числом хитов, равным 10 + модификатор Телосложения. Боб отмечает это и вписывает итоговое число после того, как определит показатель Телосложения Бруенора (смотрите шаг 3). Боб также отмечает бонус мастерства для персонажа 1 уровня, который равен +2."""
!!! __''3. Определите значения характеристик''__
"""Многое из того, что ваш персонаж способен сделать в игре, зависит от его шести характеристик: ''Силы, Ловкости, Телосложения, Интеллекта, Мудрости и Харизмы''.
У каждой характеристики есть значение, которое является числом, которое записывается в листе персонажа.
Использование шести характеристик в игре описывается в главе 7. Таблица «Сводка значений характеристик» содержит краткую информацию о том, на какие качества влияет каждая характеристика, расовые поправки характеристик, какая характеристика наиболее важна для каждого класса.
Вы генерируете шесть ''значений характеристик'' случайно. Бросьте четыре 6-гранных кости и запишите сумму трёх наибольших результатов на листке для заметок. Проделайте это ещё пять раз, чтобы у вас получилось 6 чисел. Если вы хотите сэкономить время или вам не нравится идея случайного определения значений характеристик, вы можете использовать следующие числа: 15, 14, 13, 12, 10, 8.
Теперь запишите каждое из шести полученных чисел рядом с каждой из шести характеристик вашего персонажа, чтобы присвоить значения Силе, Ловкости, Телосложению, Интеллекту, Мудрости и Харизме. После выбора расы значения характеристик изменятся, отметьте эти изменения в листе персонажа.
После распределения значений характеристик определите ''модификаторы характеристик'', используя таблицу «Значения и модификаторы характеристик». Для определения модификатора характеристики без обращения к таблице вычтите 10 из значения характеристики и разделите результат на 2, округляя до меньшего целого. Запишите модификаторы всех характеристик."""
!!! ''Значения и модификаторы характеристик''
|!Значение|!Модификатор|!Значение|!Модификатор|
| 1 | -5 | 16-17 | +3 |
| 2-3 | -4 | 18-19 | +4 |
| 4-5 | -3 | 20-21 | +5 |
| 6-7 | -2 | 22-23 | +6 |
| 8-9 | -1 | 24-25 | +7 |
| 10-11 | 0 | 26-27 | +8 |
| 12-13 | +1 | 28-29 | +9 |
| 14-15 | +2 | 30 | +10 |
<<<
!!!''Вариант: Настройка значений характеристик''
"""Если Мастер позволит, вы можете использовать этот вариант определения значений характеристик. Метод, описанный здесь, позволяет создать персонажа с набором характеристик, которые вы подбираете индивидуально.
Вы получаете 27 пунктов, которые распределяете между значениями характеристик. Цена каждого значения приведена в таблице «Цена значений характеристик». Например, значение 14 стоит 7 пунктов. 15 — наибольшее значение характеристики, которое вы можете получить в итоге, используя этот метод (перед применением расовых улучшений). Значение характеристики не может быть ниже 8.
Этот метод определения характеристик позволяет создать набор из трёх высоких и трёх низких значений (15, 15, 15, 8, 8, 8), или набор средних и выше среднего (13, 13, 13, 12, 12, 12), или другой набор значений между этими крайностями."""
!!! ''Цена значений характеристик''
|!Значение|!Цена|
|8|0|
|9|1|
|10|2|
|11|3|
|12|4|
|13|5|
|14|7|
|15|9|
<<<
!!! ''Сводка значений характеристик''
|!Сила|
|Показатель: Природный атлетизм, физическая сила|
|Важна для: Варвар, Воин, Паладин|
|Расовый бонус: Горный дварф (+2), Полуорк (+2), Драконорожденный (+2), Человек (+1)|
|!Ловкость|
|Показатель: Проворство, реакция, равновесие|
|Важна для: Монах, плут, следопыт|
|Расовый бонус: Эльф (+2), Полурослик (+2), Лесной гном (+1), Человек (+1)|
|!Телосложение|
|Показатель: Здоровье, выносливость, жизненная сила|
|Важна для: Все классы|
|Расовый бонус:Дварф (+2), Каменный гном (+1), Человек (+1), Крепкий полурослик (+1), Полуорк (+1)|
|!Интеллект|
|Показатель: Ясность ума, память, аналитические способности|
|Важна для: Волшебник|
|Расовый бонус: Гном (+2), Высший эльф (+1), Полуэльф (+1), Тифлинг (+1), Человек (+1)|
|!Мудрость|
|Показатель: Осведомлённость, интуиция, проницательность|
|Важна для: Друид, жрец|
|Расовый бонус: Холмовой дварф (+1), Человек (+1), Лесной эльф (+1)|
|!Харизма|
|Показатель: Уверенность, красноречие, лидерство|
|Важна для: Бард, колдун, чародей|
|Расовый бонус: Полуэльф (+2), Тифлинг (+2), Драконорождённый (+1), Дроу (+1), Человек (+1), Легконогий полурослик (+1)|
!!! ''Создание Бруенора, шаг 3''
"""
Боб решает использовать стандартный набор значений (15, 14, 13, 12, 10, 8) для характеристик Бруенора. Поскольку Бруенор воин, он присваивает наивысшее значение 15 Силе. Следующее значение (14) он присваивает Телосложению. Бруенор может быть бесшабашным воином, но Боб хочет, чтобы его дварф был старше, мудрее, а также был хорошим лидером, так что он выбирает подходящие значения Мудрости и Харизмы. После добавления расовых поправок (увеличение Телосложения и Силы на 2), значения характеристик Бруенора выглядят таким образом: Сила 17 (+3), Ловкость 10 (+0), Телосложение 16 (+3), Интеллект 8 (−1), Мудрость 13 (+1), Харизма 12 (+1).
Боб записывает итоговое значение хитов: 10 + модификатор Телосложения (+3), то есть 13 хитов.
"""
!!! __''4. Опишите вашего персонажа''__
После того как вы узнали основные игровые параметры своего персонажа, наступает время охарактеризовать его как личность. Ваш персонаж нуждается в имени. Потратьте несколько минут, размышляя о том, как он выглядит и как, в общих чертах, ведёт себя.
Используя информацию из [[главы 4|Глава 04: Личность и предыстория]], вы можете конкретизировать физические данные и личные качества персонажа. Выберите его ''мировоззрение'' (моральный компас, который руководит его решениями) и ''идеалы''. Глава 4 также поможет вам определить вещи, наиболее дорогие вашему персонажу и называемые ''привязанностями'', а также ''слабости'', которые однажды могут сломить его.
''Предыстория'' вашего персонажа описывает его родину, первоначальную специальность и место персонажа в мире D&D. Ваш Мастер может предложить дополнительные предыстории помимо тех, что включены в главу 4. Предыстория также может быть доработана, чтобы точнее подходить концепции вашего персонажа.
Предыстория даёт вашему персонажу особые умения и владение двумя навыками, а также может предоставлять знание дополнительных языков или владение некоторыми видами инструментов. Запишите эту информацию вместе с информацией о личности, которую вы разработали, в свой лист персонажа.
!!! ''Характеристики вашего персонажа''
"""
Обратите внимание на значения характеристик и расу вашего персонажа, когда придумываете его внешность и личность. Очень сильный персонаж с низким Интеллектом будет думать и вести себя совершенно иначе, чем очень умный персонаж с низкой Силой.
Например, высокое значение Силы обычно соответствует плотному или атлетичному телу, в то время как персонаж с низким значением Силы может быть худым или тучным.
Персонаж с высоким значением Ловкости, вероятно, будет гибким и стройным, в то время как персонаж с низким значением Ловкости может быть либо долговязым и неуклюжим, либо тяжёлым, с толстыми, как сардельки, пальцами.
Персонаж с высоким значением Телосложения обычно выглядит полным энергии, со здоровым блеском в глазах. Персонаж с низким значением Телосложения может быть болезненным или хилым.
Персонаж с высоким значением Интеллекта может быть очень любознательным и прилежным, в то время как персонаж с низким значением Интеллекта может разговаривать примитивно или легко забывать подробности.
Персонаж с высоким значением Мудрости проявляет рассудительность, сопереживание и имеет хорошее представление о происходящих вокруг событиях. Персонаж с низким значением Мудрости может быть рассеянным, безрассудным или забывчивым.
Персонаж с высоким значением Харизмы излучает уверенность, он привлекателен, имеет лидерские качества или способен запугать. Персонаж с низким значением Харизмы может быть воспринят как раздражающий, неубедительный или робкий.
"""
!!! ''Создание Бруенора, шаг 4''
"""
Боб заполняет некоторые общие характеристики Бруенора: его имя, его пол (мужской), его рост и вес и его мировоззрение (законно-добрый). Его высокие значения Силы и Телосложения предполагает здоровое и атлетичное тело, а его низкий Интеллект предполагает некоторую степень забывчивости.
Боб решает, что Бруенор происходит из знатного рода, но его клан был изгнан из родных земель, когда Бруенор был очень молод. Он вырос, работая кузнецом в отдалённых поселениях долины Ледяного Ветра. Но у Бруенора судьба героя: он должен вернуть свою родину, так что Боб выбирает предысторию народного героя для своего дварфа. Он отмечает особые умения персонажа, которые даёт ему эта предыстория, и то, чем он владеет.
У Боба есть довольно чёткое представление о личности Бруенора, так что он пропускает личные качества, предлагаемые в описании предыстории народного героя, отмечая вместо этого, что Бруенор заботливый, чувствительный дварф, который искренне любит своих друзей и союзников, но скрывает своё мягкое сердце за грубой, ворчливой манерой поведения. Он выбирает идеал из списка своей предыстории — справедливость, отмечая, что Бруенор считает, что никто не может быть выше закона.
Из предыстории становится очевидной привязанность Бруенора: он стремится забрать Мифриловый Зал — его родину — из лап теневого дракона, изгнавшего дварфов. Его слабость связана с его заботливой, чувствительной натурой — он благосклонен к сиротам и заблудшим душам, которые вызывают в нём жалость, даже когда это может быть не оправданно.
"""
!!! __''5. Выберите снаряжение''__
"""
Ваш класс и предыстория определяют ''начальное снаряжение'' вашего персонажа, включая оружие, доспех и другое оснащение искателя приключений. Запишите это снаряжение в лист персонажа. Все эти предметы подробно описаны в главе 5.
Вместо того чтобы брать оснащение, приводимое в описании класса и предыстории, вы можете купить своё начальное снаряжение. У вас есть ''золотые монеты'' (зм), количество которых зависит от вашего класса, как отмечено в главе 5. Там также приведены обширные списки снаряжения с ценами. Если желаете, вы можете бесплатно выбрать одну безделушку (смотрите таблицу [[«Безделушки»|10. Безделушки]] в конце главы 5).
Ваш показатель Силы ограничивает количество снаряжения, которое вы сможете носить с собой. Старайтесь не приобретать снаряжение общим весом (в фунтах), превышающим значение Силы в 15 раз. Глава 7 содержит больше информации о переносимой нагрузке.
"""
!!! ''Класс Доспеха''
Ваш ''Класс Доспеха'' (КД) определяет, насколько хорошо ваш персонаж избегает ранений в бою. На КД влияет надетый доспех, удерживаемый щит и модификатор Ловкости. Однако не все персонажи носят доспехи и щиты.
* Без доспеха и щита КД вашего персонажа равен 10 + модификатор Ловкости. Если ваш персонаж одет в доспех, снаряжён щитом или и тем и другим, рассчитайте ваш КД, используя правила главы 5. Запишите свой КД в лист персонажа.
* Ваш персонаж должен владеть доспехами и щитом, чтобы использовать их эффективно. Владение доспехами и щитом определяется классом. При ношении доспехов и щитов, которыми вы не владеете, накладываются определённые штрафы, как описано в главе 5.
* Некоторые заклинания и классовые умения позволяют вам рассчитывать ваш КД другим способом. Если у вас есть различные умения, позволяющие рассчитывать КД разными способами, вы сами выбираете, который из них будете использовать.
!!! ''Оружие''
"""
Для каждого оружия, которым обладает ваш персонаж, рассчитайте модификатор, используемый при атаке, и урон, причиняемый при попадании.
Совершая атаку оружием, вы бросаете к20, прибавляете ваш бонус мастерства (если вы владеете этим оружием) и соответствующий модификатор характеристики.
"""
* Для атак ''рукопашным оружием'' используйте модификатор Силы для расчёта бросков атаки и урона. Оружие, обладающее свойством «фехтовальное», такое как рапира, может использовать модификатор Ловкости, а не Силы.
* Для атак ''дальнобойным оружием'' используйте модификатор Ловкости для бросков атаки и урона. Оружие, обладающее свойством «метательное», такое как ручной топор, может использовать модификатор Силы, а не Ловкости.
!!! ''Создание Бруенора, шаг 5''
"""
Боб записывает начальное снаряжение, доставшееся ему от класса воина и предыстории народного героя. Его начальное снаряжение включает кольчугу и щит, которые в сочетании дают Бруенору Класс Доспеха 18.
Боб выбирает для Бруенора в качестве оружия боевой топор и два ручных топора. Его боевой топор — рукопашное оружие, так что Бруенор использует модификатор Силы для своих атак и при причинении урона. Его бонус атаки равен (+5). Это сумма модификатора Силы (+3) и бонуса мастерства (+2).
Боевой топор причиняет рубящий урон 1к8, и Бруенор добавляет модификатор Силы к урону, когда попадает по противнику, что в итоге даёт рубящий урон 1к8 + 3. Когда Бруенор метает ручной топор, у него получается такой же бонус атаки (ручной топор — метательное оружие, поэтому используется модификатор Силы для расчёта бросков атак и урона), и оружие причиняет рубящий урон 1к6 + 3.
"""
!!! __''6. Соберитесь вместе''__
Большинство персонажей D&D не работают в одиночку. Каждый персонаж играет определённую роль в ''отряде'' — группе искателей приключений, слаженно работающих для достижения общей цели. Работа в команде и сотрудничество значительно увеличивают шансы вашего отряда пережить многие опасности в мирах D&D. Поговорите с вашими игроками и Мастером, чтобы решить, знают ли ваши персонажи друг друга, как они встретились и какого рода задания может выполнять группа.
{{После 1-ого уровня}}
Посещение одного из величайших городов среди миров D&D: Глубоководья, Свободного Города мира Серого Ястреба, или даже сверхъестественного Сигила, Города Дверей, переполняет чувствами. Звучит речь на неисчислимом количестве различных языков. Запахи готовящейся еды на дюжинах различных кухонь смешиваются с запахами переполненных улиц и плохой санитарии. Строения бесчисленных архитектурных стилей отражают различное происхождение своих жителей.
А сами жители — существа разного размера, формы и цвета, в одеждах разнообразных ослепительных стилей и оттенков — представители множества различных рас: от миниатюрных полуросликов и крепких дварфов, до величественно-красивых эльфов, живущих среди людей различных этносов.
Есть и более экзотические расы, рассеянные среди более распространённых: здесь и массивные драконорождённые, прокладывающие путь через толпу, и пронырливые тифлинги, скрывающиеся в тени с недобрым озорством в глазах. Группа гномов смеётся над тем, как один из них запускает сложную деревянную игрушку, движущуюся саму по себе. Полуэльфы и полуорки живут и работают рядом с людьми, не принадлежа полностью ни к одной из рас своих родителей. И здесь же прячется от солнца одинокий дроу, беглец из подземных просторов Подземья, пытающийся выжить в мире, который боится его племени.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 02: Расы" "sort[order]">>
</div>
Искатели приключений — необычные существа, движимые жаждой жизненных потрясений, на которые другие никогда бы не осмелились. Это герои, вынужденные исследовать тёмные уголки мира и принимать испытания, которым большинство женщин и мужчин не смогли бы противостоять.
Класс является основным мерилом способностей вашего персонажа. Это больше чем профессия, это призвание вашего персонажа. Класс формирует ваше представление о мире и взаимодействие с ним, а также ваше отношение к другим существам и силам мультивселенной. Воин, например, может смотреть на мир прагматично, с точки зрения стратегии и манёвров, и видеть себя всего лишь пешкой в большой игре. Жрец напротив, может видеть себя в качестве усердного служителя разворачивающегося грандиозного плана божества, или назревающего конфликта между различными богами. У воина есть связи в организациях наёмников или войсках, а жрец может знать множество священников, паладинов и последователей, разделяющих его веру.
Ваш класс даёт вам целый ряд особых умений, таких как мастерство воина во владении оружием и доспехами, и заклинания волшебника. На низких уровнях ваш класс даёт вам только два или три умения, но при получении новых уровней вы получите новые, и ваши существующие умения улучшатся. Описание каждого класса в этой главе включает в себя таблицу с кратким перечнем всех преимуществ, которые вы получаете на каждом уровне, и подробное описание каждого умения.
Искатели приключений иногда развиваются сразу в нескольких классах. Плут может поменять жизненный путь и дать присягу паладина. Варвар может обнаружить скрытые магические способности и практиковаться в классе чародей, продолжая совершенствоваться как варвар. Эльфы известны тем, что сочетают военное мастерство с магической подготовкой и развиваются как воины и волшебники одновременно. Опциональные правила такого комбинирования классов называются мультиклассированием, и описаны в главе 6.
Двенадцать классов, перечисленные в таблице «Классы», встречаются почти во всех мирах D&D и определяют наиболее типичных искателей приключений.
Классы
|!Класс|!Описание|!Кость Хитов|!Основная характеристика|!Владение спасбросками|!Владение доспехами и оружием|
|[[Бард]]|Вдохновляющий заклинатель, черпающий мощь в музыке созидания|к8|Харизма|Ловкость и Харизма|Лёгкие доспехи, простое оружие, длинные мечи, короткие мечи, рапиры, ручные арбалеты|
|[[Варвар]]|Свирепый воин, способный впадать в боевую ярость|к12|Сила|Сила и Телосложение|Лёгкие и средние доспехи, щиты, простое и воинское оружие|
|[[Воин]]|Мастер сражения, опытный во владении различным оружием и доспехами|к10|Сила или Ловкость|Сила и Телосложение|Все доспехи, щиты, простое и воинское оружие|
|[[Волшебник]]|Учёный заклинатель, способный манипулировать структурой реальности|к6|Интеллект|Интеллект и Мудрость|Боевые посохи, дротики, кинжалы, лёгкие арбалеты, пращи|
|[[Друид]]|Проповедник Старой Веры, владеющий силами природы — лунным светом и ростом растений, огнём и молнией, и принимающий облик животных|к8|Мудрость|Интеллект и Мудрость|Лёгкие и средние доспехи (неметаллические), щиты (неметаллические), боевые посохи, булавы, дротики, дубинки, кинжалы, копья, метательные копья, пращи, серпы, скимитары|
|[[Жрец]]|Священнослужитель-заступник, владеющий божественной магией и состоящий на службе высших сил|к8|Мудрость|Мудрость и Харизма|Лёгкие и средние доспехи, щиты, простое оружие|
|[[Колдун]]|Обладатель магии, полученной посредством сделки с экстрапланарной сущностью|к8|Харизма|Мудрость и Харизма|Лёгкие доспехи, простое оружие|
|[[Монах]]|Мастер боевых искусств, использующий мощь тела в поисках физического и духовного совершенства|к8|Ловкость и Мудрость|Сила и Ловкость|Простое оружие, короткие мечи|
|[[Паладин]]|Святой воин, связанный духовным обетом|к10|Сила и Харизма|Мудрость и Харизма|Все доспехи, щиты, простое и воинское оружие|
|[[Плут]]|Мошенник, который использует хитрость и обман, чтобы одолеть препятствия и противников|к8|Ловкость|Ловкость и Интеллект|Лёгкие доспехи, простое оружие, длинные мечи, короткие мечи, рапиры, ручные арбалеты|
|[[Следопыт]]|Воитель, использующий боевое искусство и магию природы для борьбы с угрозами на окраинах цивилизации|к10|Ловкость и Мудрость|Сила и Ловкость|Лёгкие и средние доспехи, щиты, простое и воинское оружие|
|[[Чародей]]|Заклинатель, черпающий магию в себе, получив её в дар или как наследие|к6|Харизма|Телосложение и Харизма|Боевые посохи, дротики, кинжалы, лёгкие арбалеты, пращи|
Персонажи характеризуются не только расой и классом. Они — личности, с собственной историей, связями и возможностями, выходящими за определения классов и рас. Эта глава описывает детали, отличающие персонажей друг от друга, включая такие основы, как имя и физическое описание, правила предысторий и языков, личностные особенности и мировоззрение.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 04: Личность и предыстория" "sort[order]">>
</div>
Рынки городов заполнены самыми разнообразными покупателями и продавцами: тут и кузнецы дварфов, и эльфы резчики по дереву, и фермеры полуросликов и ювелиры гномов, не говоря уже о людях самых разных национальностей и культур. В самых больших городах продаётся практически всё, от плетёных корзин и тренировочных мечей до экзотических специй и изысканных нарядов.
Искателям же приключений важно наличие в продаже доспехов, оружия, рюкзаков, верёвок и подобных товаров, так как от хорошего снаряжения зависит выживание в подземельях и диких пустошах. Эта глава описывает обычные и экзотические товары, которые используются в приключениях.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 05: Снаряжение" "sort[order]">>
</div>
Комбинация характеристик, расы, класса и предыстории определяет способности вашего персонажа в игре, а придуманная вами личность отличает вашего персонажа от остальных. Даже в пределах расы и класса есть варианты, из которых можно сделать выбор. Эта глава для тех игроков, которые (с разрешения Мастера) хотят ещё сильнее подстроить персонажа под себя.
В этой главе представлены два опциональных набора правил по индивидуальной настройке персонажей: мультиклассирование и черты. Мультиклассирование позволяет комбинировать классы, а черты можно брать вместо увеличения характеристик при получении новых уровней. Будут ли доступны эти опции в вашей кампании, решает Мастер.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 06: Опции" "sort[order]">>
</div>
Физические и умственные способности любого существа можно описать с помощью шести характеристик:
* ''Сила,'' измеряющая физическую мощь
* ''Ловкость,'' измеряющая проворство
* ''Телосложение,'' измеряющая выносливость
* ''Интеллект,'' измеряющий рассудительность и память
* ''Мудрость,'' измеряющая внимательность и проницательность
* ''Харизма,'' измеряющая силу характера
"""Какой ваш персонаж, мускулистый и проницательный? Умный и очаровательный? Ловкий и стойкий? Значения характеристик помогают оценить эти качества — сильные стороны и недостатки существ.
Три основных броска игры — проверки характеристик, спасброски и броски атак — зависят от значений шести характеристик. Введение описывает основное правило совершения этих бросков: бросьте к20, добавьте модификатор, вычисленный с помощью одной из шести характеристик, и сравните сумму с целевым числом.
Эта глава описывает, как использовать проверки характеристик и спасброски, составляющие основную деятельность существ в игре. Правила по броскам атак описаны в главе 9."""
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 07: Использование характеристик" "sort[order]">>
</div>
"""Исследование древней Гробницы Ужаса, погоня на задворках Глубоководья, прорубание новой тропы в густых джунглях — вот из чего состоят приключения в D&D. Ваши персонажи в игре могут исследовать заброшенные руины и неисследованные земли, раскрывать тайны и зловещие заговоры, и убивать кошмарных чудовищ. И если всё сложится удачно, ваш персонаж выживет и получит заслуженную награду, после чего отправится в новое приключение.
Эта глава описывает основы жизни искателей приключений, от механики перемещений до сложных социальных взаимодействий. Здесь же есть правила отдыха, а также описание действий, возможных между приключениями.
Неважно, чем заняты искатели приключений: исследуют пыльное подземелье или распутывают сложные взаимоотношения королевских придворных, игра всегда ведётся в ритме, описанном ещё во введении этой книги:"""
* Мастер описывает ситуацию.
* Игроки сообщают, что они хотят совершить.
* Мастер описывает результат этих действий.
Обычно Мастер использует карты для отслеживания того, как далеко персонажи продвинулись в исследовании подземных коридоров или дикой местности. Среди его заметок есть легенды к картам, описывающие все особенные места и то, что искатели приключений могут там найти. Иногда время и действия искателей приключений меняют возможные события, и тогда Мастер может использовать вместо карты временную шкалу или диаграмму.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 08: Приключения" "sort[order]">>
</div>
"""Звук меча, бьющего по щиту. Жуткий звук когтей чудовищ, раздирающих доспех. Яркая вспышка света от шара пламени, расцветшего от заклинания волшебника. Резкий запах крови, перебиваемый вонью от чудовищ. Яростные рыки, триумфальные вопли, крики боли. Сражения в D&D хаотичные, смертельные и захватывающие.
Эта глава предоставляет правила, нужные для персонажей и чудовищ в сражении, будь то короткая стычка или длительное противостояние в подземелье или на поле боя. В этой главе обращение «вы» может быть адресовано как к игрокам, так и к Мастеру. Мастер контролирует чудовищ и неигровых персонажей, участвующих в сражении, а игроки контролируют искателей приключений. «Вы» также может означать персонажа или чудовища, находящегося под вашим контролем."""
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 09: Сражение" "sort[order]">>
</div>
Ваш мир — это окружение вашей кампании, место, в котором происходят приключения. Даже если вы используете уже готовый мир, такой как Забытые Королевства, он станет вашим, как только вы начнёте проводить в нём приключения, создадите персонажей, которые в нём живут, изменяя его на протяжении всей кампании. Эта глава полностью посвящена строительству вашего мира и созданию кампании, которую можно в нём провести.
<<list-links filter:"[tag[Глава 1: Ваш собственный мир]]">>
Магия пронизывает миры D&D, и чаще всего проявляется в виде заклинаний. В этой главе приводятся правила по использованию заклинаний. Персонажи разных классов по-разному изучают и подготавливают заклинания, чудовища тоже используют заклинания по-своему. Однако, какое бы происхождение не было у заклинания, оно подчиняется описанным ниже правилам.
<div class="tc-table-of-contents">
<<toc-selective-expandable "Глава 10: Использование заклинаний">>
</div>
Эта глава описывает самые распространённые заклинания миров D&D. Для удобства было сделано множества списков по различным параметрам.
* [[Заклинания по Классам]]
* [[Заклинания по Школам]]
* [[Заклинания по Уровням]]
* [[Заклинания, требующие Концентрации]]
* [[Заклинания со свойством Ритуал]]
Когда персонажи накопят силу, получив высокие уровни, их пути будут пролегать вне привычных измерений реальности: на планы существования, формирующие мультивселенную. Персонажи могут отправиться спасать друга из ужасных глубин Бездны, или совершить плавание по сияющим водам реки Океа-нус, оказаться с кружкой в руке рядом с дружелюбными великанами Асгарда, или взглянуть в лицо хаосу Лимбо, чтобы заключить сделку с иссохшим от старости мудрецом гитзераем.
Планы — это места, где царит странная и чаще всего опасная обстановка. Наиболее причудливые места даже в самых смелых снах не смогли бы привидеться обитателям реального мира. Планарные путешественники встречаются с невиданными ранее опасностями и чудесами. Путешественники могут прогуляться по улице из чистого пламени или оказаться на поле боя, где павшие воскресают с каждым восходом солнца.
<<list-links filter:"[tag[Глава 2: Создание мультивселенной]]" sort:"order">>
Создание приключений — это то, ради чего вообще стоит быть Мастером. Проектируя фантастические места и сцены с чудовищами, ловушки, головоломки и конфликты, вы сможете по полной выразить себя, ведь при разработке приключения вы командуете парадом, и вольны создавать его по своему усмотрению.
По сути, приключения — те же рассказы. Они содержат в себе черты таких жанров как роман, кино, комикс, или сериал. Комиксы и сериалы можно напрямую сравнить с приключениями — и те, и другие разделены на фрагменты, но сливаясь образуют большую общую историю. Если приключение — это один фрагмент или эпизод, то кампания — весь сериал в целом.
Вне зависимости от того, придумываете ли вы своё собственное приключение или используете опубликованное, в этой главе вы найдёте советы, которые помогут вам создать интересный и запоминающийся сюжет для игроков.
Создание приключения — это смешивание моментов исследования, социального взаимодействия и сражений в единое целое, которое должно отвечать потребностям ваших игроков и вашей кампании. И в то же время для хорошего приключения требуется нечто большее. В ходе игры повествование должно идти так, чтобы игроки почувствовали, что ваши приключения не просто несколько разрозненных игровых событий, а действительно связаны в единую историю.
<<list-links filter:"[tag[Глава 3: Создание приключений]]">>
Персонажи Мастера это по определению персонажи, находящиеся под управлением Мастера. ПМ могут быть врагами или союзниками, простыми обывателями или уникальными чудовищами. Сюда же входят тавернщики, старые волшебники, живущие в башнях на окраинах городов, рыцари смерти, уничтожающие королевства, и драконы, считающие золотые монеты в своих логовах.
Эта глава покажет, как в вашей игре сделать персонажей Мастера живыми. Советы по созданию блока статистики как у чудовищ смотрите в главе 9.
<<list-links filter:"[tag[Глава 4: Создание персонажей Мастера]]">>
Многие приключения в D&D привязаны к окружению подземелий. «Подземелье» это обширный термин, сюда входят огромные залы и склепы, подземные логова чудовищ, лабиринты со смертельными ловушками, естественные пещеры, протянувшиеся на мили, и разрушенные замки.
Однако не все приключения происходят в подземельях. Путешествие по Пустыне Одиночества или джунглям Острова Ужаса тоже может быть захватывающим приключением. На огромных просторах в небе парят драконы, ищущие добычу, орды хобгоблинов вырываются из крепостей, стараясь уничтожить соседей, огры отбирают у крестьян еду, а с верхушек деревьев спрыгивают чудовищные пауки.
В подземелье искатели приключений ограничены стенами и дверьми, а в дикой местности они могут идти практически в любом направлении. Отсюда и основное различие между подземельем и дикой местностью: в подземелье легче предсказать, куда пойдёт отряд искателей приключений, так как там у них меньше вариантов.
Деревни и города являются хранилищами цивилизации в опасном мире, но там тоже есть возможности для поиска приключений. Сцены с чудовищами маловероятны в черте города, но и там есть свои злодеи и опасности. Зло, ведь, принимает разные обличья, и городское окружение не всегда такое безопасное каким может показаться.
В этой главе приводится обзор этих трёх разновидностей окружающей среды, а также несколько необычных окружений, включая процесс создания локаций для приключения и множество таблиц для вдохновения.
<<list-links filter:"[tag[Глава 5: Окружающая среда]]">>
Кампания — это не просто серия приключений, она также включает происшествия в промежутках между ними: разного рода сторонние занятия персонажей помимо исследования дикой местности, разграбления подземелий и блужданий по мультивселенной в ходе выполнения какого-нибудь эпического задания.
Естественный ход кампании предполагает моменты затишья между приключениями, время, чтобы персонажи могли позаниматься личными делами и потратить заработанное золото. Это время даёт персонажам возможность немного глубже погрузиться в мир, делая свой вклад в то, что происходит вокруг них, и это, в свою очередь, может вовлечь их в дальнейшие приключения.
5 глава Книги игрока описывает расходы, которые персонаж делает для удовлетворения своих основных потребностей, в зависимости от выбранного образа жизни, от нищенского до аристократического. 8 глава описывает деятельность, которой можно заниматься во время простоя между приключениями. Настоящая глава заполняет пробелы, описывая затраты на существование, наём персонажей Мастера и различные дополнительные виды деятельности, которыми могут заняться персонажи. Начало главы также содержит варианты связывания разных приключений между собой, образуя единый ход событий.
<<list-links filter:"[tag[Глава 6: Между приключениями]]">>
Стремления искателей приключений могут быть различны: слава, знания и справедливость. Многие не прочь также заполучить нечто более осязаемое: богатство. Грозди золотых цепей, платиновые монеты, короны, украшенные драгоценными камнями, полированные скипетры, рулоны шёлковой ткани и могущественные магические предметы — все эти вещи ждут, когда их найдут неутомимые искатели приключений.
В этой главе подробно рассмотрены магические предметы и места их возможных находок, а также специальные награды, которые могут быть предоставлены взамен или в дополнение к магическим вещам и обычным сокровищам.
<<list-links "[tag[Глава 7: Сокровища]sort[title]]">>
Правила позволяют вам и игрокам приятно проводить время за столом. Именно правила служат вам, а не вы им. Однако существуют правила игры, и существуют правила проведения игры. Например, игроки должны знать, что что произойдёт, если один из них пропустит собрание. Они должны знать, нужно ли нести свои миниатюры, есть ли особые правила, которые вы решили использовать, и как быть с костями, вставшими на грань или закатившимися под стол. Всё это и многое другое объясняется в этой главе.
<<list-links "[tag[Глава 8: Проведение игр]sort[title]]">>
Вы, Мастер, не ограничены ни правилами Книги игрока, ни советами из этой книги, ни выбором чудовищ только из Бестиария. Вы можете отпустить своё воображение на волю. Эта глава содержит опциональные правила, которые можно использовать, чтобы изменить кампанию, а также руководства по созданию собственных материалов, таких как чудовища и магические предметы.
Опции из этой главы относятся к множеству различных частей игры. Некоторые являются изменениями правил, а другие привносят совершенно новые правила. Каждая опция раскрывает определённый жанр, стиль игры или и то, и другое. Старайтесь не вводить более двух опций за раз — так вы сможете чётко оценить их влияние на кампанию, после чего уже можно вводить другие.
Перед тем, как добавлять новое правило в кампанию, спросите себя:
* Это улучшит игру?
* Понравится ли это моим игрокам?
Если вы уверены, что ответ на оба вопроса — «да», то вы ничего не теряете, если попробуете. Попросите игроков предоставить отзыв и рассказать свои впечатления. Если правило или игровой элемент ничего в неё не привносят или не работают, как задумано, вы можете изменить их или вообще убрать. Вне зависимости от того, каков источник правила, помните, что правила работают для вас, а не наоборот.
Будьте осторожны, добавляя в игру что-либо, позволяющее персонажу концентрироваться одновременно более чем на одном эффекте, использовать более одной реакции или бонусного действия за раунд, или настраиваться более чем на три магические вещи одновременно. Правила и игровые элементы, которые изменяют правила концентрации, реакций, бонусных действий и настройки на магические предметы, могут сильно нарушить баланс или излишне усложнить игру.
<<list-links "[tag[Глава 9: Мастерская мастера]sort[title]]">>
!!!!''Глаз и Рука Векны''
//Чудесный предмет, артефакт (требуется настройка)//
Имя Векны почти всегда произносят шёпотом. В своё время он был одним из самых могущественных волшебников. Благодаря завоеваниям и тёмной магии он создал ужасную империю. Однако, несмотря на всю свою мощь, Векна оставался смертным. Он начал бояться смерти и предпринимать меры, чтобы максимально отдалить свой конец.
Оркус, демонический повелитель нежити, научил Векну ритуалу, который позволил жить в качестве лича Совершив его, тот стал могущественнейшим из всех личей. Несмотря на иссохшее и разлагающееся тело, Векна продолжил расширять свои владения. Характер его был таким ужасным, что подчинённые боялись произнести его имя. Он был Шепчущим, Владыкой Паучьего Трона, Неумирающим Королём и Владыкой Гниющей Башни.
Одни говорят, что полководец Векны, Кас, сам возжелал занять Паучий Трон, другие утверждают, что поднять восстание Каса уговорил меч, созданный его же владыкой. Какова бы ни была причина, но Кас окончил правление Неумирающего Короля в ужасном сражении, которое превратило башню Векны в горстку пепла. От Векны остались лишь одна рука и один глаз, жуткие артефакты, всё ещё воплощающие волю Шепчущего.
Глаз Векны и Руку Векны можно найти вместе, а можно по отдельности. Глаз выглядит как обычный глаз с кровоподтёками, вырванный из глазницы. Рука высохшая и мумифицированная.
Для того чтобы настроится на глаз, нужно вырвать свой собственный глаз и поместить артефакт в глазницу. Он сам прирастёт и останется с вами, пока вы не умрёте. Заняв своё место, глаз становится золотистым, но с вертикальным зрачком, как у кошки. Если глаз когда-нибудь изымут, вы умрёте.
Для того чтобы настроиться на руку, вы должны отрубить левую руку по запястью и приложить к обрубку артефакт. Рука сама прирастёт и станет полностью функционирующей. Если руку когда-нибудь отнимут, вы умрёте.
;
://''Случайные свойства.''// Глаз Векны и Рука Векны обладают несколькими свойствами, определяемыми случайным образом для каждого из них:
* 1 малое положительное свойство
* 1 основное положительное свойство
* 1 малое отрицательное свойство
://''Свойства Глаза.''// Ваше мировоззрение становится нейтрально-злым, и вы получаете следующие преимущества:
* Вы получаете истинное зрение.
* Вы можете действием начать видеть так, как если бы носили кольцо проникающего зрения. Вы можете окончить этот эффект бонусным действием.
* У Глаза есть 8 зарядов. Вы можете действием потратить 1 или несколько зарядов, чтобы наложить им одно из следующих заклинаний (Сл спасброска 18): корона безумия (1 заряд), подсматривание (2 заряда), подчинение чудовища (5 зарядов), разящее око (4 заряда) или распад (4 заряда). Глаз каждый день восстанавливает 1к4 + 4 заряда на рассвете. Каждый раз, когда вы накладываете глазом заклинание, существует 5-процентный шанс, что Векна вырвет вашу душу и пожрёт её, сделав ваше тело своей марионеткой. Если это произойдёт, вы становитесь персонажем Мастера.
://''Свойства Руки.''// Ваше мировоззрение становится нейтрально-злым, и вы получаете следующие преимущества:
* Ваша Сила становится равной 20, если только она не была больше 20.
* Все рукопашные заклинания, которые вы накладываете этой рукой, и все рукопашные атаки оружием, совершённые оружием, которое вы держите в этой руке, причиняют при попадании дополнительный урон холодом 2к8.
* У руки есть 8 зарядов. Вы можете действием потратить 1 или несколько зарядов, чтобы наложить ей одно из следующих заклинаний (Сл спасброска 18): замедление (2 заряда), перст смерти (5 зарядов), телепортация (3 заряда) или усыпление (1 заряд). Рука каждый день восстанавливает 1к4 + 4 заряда на рассвете. Каждый раз, когда вы накладываете этой рукой заклинание, она накладывает на вас заклинание внушение (Сл спасброска 18), требуя, чтобы вы совершили злой поступок. Она может требовать конкретное деяние, а может оставить выбор действия за вами.
://''Свойства Глаза и Руки.''// Если вы настроены одновременно на Глаз и на Руку, вы получаете следующие дополнительные преимущества:
* Вы получаете иммунитет к болезням и ядам.
* Использование проникающего зрения Глаза не подвергает вас истощению.
* Вы предчувствуете опасность, и если вы дееспособны, вы не можете быть захвачены врасплох.
* Если вы начинаете ход с как минимум 1 хитом, вы восстанавливаете 1к10 хитов.
* Если у существа есть скелет, вы можете попытаться превратить его кости в желе прикосновением Руки Векны. Вы совершаете действием рукопашную атаку по существу, к которому можете прикоснуться, используя на свой выбор бонус рукопашной атаки или для оружия или для заклинания. При попадании цель должна преуспеть в спасброске Телосложения со Сл 18, иначе её хиты опускаются до 0.
* Вы можете действием наложить заклинание исполнение желаний. Это свойство нельзя использовать повторно, пока не пройдёт 30 дней.
://''Уничтожение Глаза и Руки.''// Если Глаз Векны и Рука Векны приросли к одному и тому же существу, и это существо убивается Мечом Каса, и глаз и рука вспыхивают, превращаются в пепел и уничтожаются навсегда. Любые другие попытки уничтожить глаз и руку кажутся успешными, но артефакты восстанавливаются в одном из многочисленных тайных хранилищ Векны, где снова ждут, пока их найдут.
!!!''Глаза хранителя рун''
"""Вы можете читать любые письмена."""
!!!''Глас цепного мастера''
"""//Требование: умение Договор цепи//
Вы можете телепатически общаться со своим фамильяром и воспринимать всё чувствами фамильяра, пока вы находитесь на одном и том же плане существования. Кроме того, когда вы воспринимаете чувствами фамильяра, вы можете говорить через него своим собственным голосом, даже если фамильяр не способен говорить. """
!!''Глобальный взгляд''
Эта книга, Книга игрока и Бестиарий предоставляют базовые постулаты, на которых строятся миры D&D. Среди существующих миров D&D, миры Забытых Королевств, Серого Ястреба, Саги о Копье и Мистары практически не отклоняются от этих правил. И напротив, такие миры как Тёмное Солнце, Эберрон, Равенлофт, Спеллджаммер и Плейнскейп гораздо более индивидуальны и требуют дополнительной информации. Когда вы создаёте свой мир, вам решать, насколько он будет причудлив, и где среди всего этого разнообразия он будет находиться.
!!!__''Основные предположения''__
Правила игры основаны на следующих ключевых предположениях:
;
:''Боги наблюдают за миром.'' Боги реальны, и олицетворены в различных верованиях, где каждый бог претендует на власть над определённым аспектом мира, таким как война, леса или реки. Боги оказывают влияние на мир, даруя божественную магию своим последователям и посылая сигналы и предзнаменования, направляющие их. Последователь бога служит как его агент в мире. Агент следует идеалам своего бога и уничтожает его соперников. Некоторые могут отказаться от поклонения богам, но никто не может отрицать их существования.
://''Большая часть мира — дикая местность.''// Дикая местность повсюду. Города, конфедерации и королевства различных размеров усеивают мир, но вокруг их границ нетронутые пространства. Люди хорошо знают то место, в котором они живут. Они слышали истории о других местах от торговцев и путешественников, но никто не знает, что находится за горами или в глуши великого леса до тех пор, пока не побывали там.
://''Это древний мир.''// Империи появляются и исчезают, и мест, нетронутых их величием или разрухой, остаётся всё меньше и меньше. Война, время и естественные причины влияют на мир смертных, оставляя его наполненным местами приключений и загадок. Древние цивилизации и их знания сохранились в легендах, магических предметах и в развалинах. Хаос и зло часто сопровождает закат империи.
://''Конфликты влияют на мировую историю.''// Сильные личности пытаются оставить свой след в мире, и фракции единомышленников могут изменить ход истории. Фракциями могут быть религии, ведомые харизматичными пророками, королевства, управляемые прочными династиями, и неизвестные сообщества, которые хотят обуздать давно потерянную магию. Влияние таких фракций увеличивается или уменьшается, так как они конкурируют друг с другом за власть. Некоторые из них хотят сохранить мир и вступить в золотой век. Другие преследуют злые цели, желая править миром жёсткой рукой. Цели третьих разнятся от практических до эзотерических, таких как накопление материальных ценностей или воскрешение мёртвого бога. Но какими бы ни были их цели, эти фракции неизбежно сталкиваются, порождая конфликты, меняющие судьбу мира.
://''Этот мир магический.''// Практикующих магию относительно немного, но они оставляют свидетельства своего ремесла повсюду. Магия может быть, как безобидной и банальной, такой как лечебное зелье, так и гораздо более редкой и впечатляющей, такой как парящая башня или каменный голем, охраняющий городские врата. За пределами королевств тайники с магическими предметами охраняются волшебными ловушками, а магически сконструированные подземелья наполнены чудовищами, проклятыми магией или наделёнными магическими способностями.
!!!__''Это ваш мир''__
Создавая мир для своей кампании, полезно начать с описанных выше ключевых предположений и решить, что из них можно изменить в вашем мире. Последующие разделы этой главы посвящены каждому элементу и в подробностях разбирают, как наполнить ваш мир богами, фракциями и прочим.
Предположения, описанные выше — не догма. Они позволяют создавать захватывающие миры D&D, полные приключений, но это не единственный набор правил, который способен это сделать. Вы можете придумать интересную кампанию, изменяя один или несколько из этих ключевых предположений. Между прочим, некоторые из миров D&D так и устроены. Спросите себя: «Что если стандартные правила не работают в моём мире?»
;
://''Этот мир похож на наш.''// Что если магия настолько редка и опасна, что даже искатели приключений ограничены или вообще не имеют к ней доступа? Что если ваша кампания — это альтернативная версия истории нашего мира?
://''Этот мир новый.''// Что если ваш мир новый, и персонажи — первые в возможном списке героев? Искатели приключений могут быть защитниками великих империй, так каких как Нетерил и Кор-мантор в мире Забытых Королевств.
://''Этот мир исследован.''// Что если весь мир полностью открыт и размечен, вплоть до пояснений вроде: «Здесь живут драконы»? Что если великие империи покрывают большие участки местности с чётко определёнными границами? Пять Народов мира Эберрон когда-то были частью великой империи, и магические перемещения между их городами — обычное дело.
://''Чудовища — необычное явление.''// Что если чудовища редки и ужасающи? В мире Равенлофт огромные территории управляются чудовищными правителями. Люди живут в постоянном страхе перед этими тёмными владыками и их прихвостнями, но другие чудовища их редко беспокоят.
://''Магия повсюду.''// Что если каждый город управляется могущественным волшебником? Что если магазины, торгующие магическими предметами — обычное дело? Мир Эберрон превращает использование магии в каждодневную практику, тут магически парящие корабли везут путешественников из одного большого города в другой.
://''Боги населяют землю или полностью отсутствуют.''// Что если боги постоянно ходят по земле? Что если персонажи могут бросить им вызов и получить их силу? Или что если боги настолько равнодушны, что даже ангелы никогда не выходят на контакт со смертными? В мире Тёмного Солнца боги чрезвычайно удалены от людей, возможно, даже не существуют, а священники полагаются на стихийную силу для своей магии.
//2 уровень, Некромантия, Бард/Волшебник/Жрец/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' 1 минута
Вы можете ослепить врага или сделать его глухим. Выберите одно существо, которое видите в пределах дистанции, которое тут же совершает спасбросок Телосложения. В случае провала цель становится на время действия заклинания ослепшей или оглохшей (на ваш выбор). В конце каждого своего хода цель может совершать спасбросок Телосложения. В случае успеха заклинание оканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше второго.
//1 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
В следующий раз, когда вы попадёте атакой рукопашным оружием, пока активно это заклинание, ваша атака причиняет дополнительный урон психической энергией 1к6. Кроме того, если цель — существо, оно должно совершить спасбросок Мудрости, иначе оно станет испуганным до окончания действия заклинания. Существо может действием совершить проверку Мудрости против Сл ваших заклинаний, чтобы успокоиться и окончить это заклинание.
//"""Худощавый, с пшеничного цвета волосами, орехово-коричневой кожей и удивительно бирюзовыми глазами, Бюргел был вдвое ниже Аэрона, и должен был взобраться на табурет, чтобы посмотреть в глазок. Как большинство домов в Оубле, этот был построен для людей, и более мелкие жители справлялись с неудобствами, как могли.
Зато размеры апартаментов как раз позволяли Бюргелу разместить все его принадлежности гномьего размера. Передняя комната была его мастерской и вмещала невообразимое разнообразие инструментов: молотки, зубила, пилы, отмычки, разноцветные линзы, ювелирные лупы, банки с порошками и измельчёнными ингредиентами для сотворения заклинаний. Жирный серый кот, фамильяр мага, лежал, свернувшись на гримуаре. Он открыл жёлтые глаза, смерил Аэрона презрительным взглядом, затем снова заснул."""//"""
— Ричард Ли Байерс, Чёрный букет"""
Нескончаемый гул трудолюбия слышен там, где селятся сплочённые общества гномов. Гул пронзают и звуки погромче: то тут, то там раздаётся скрежет шестерней, отголоски взрыва, возгласы удивления или триумфа, и, особенно часто — звонкий смех. Гномы восторгаются жизнью, каждый миг наслаждаясь новым изобретением, открытием, исследованием, созиданием или шалостью.
!!! __''Задорный вид''__
Гномы очень энергичны, и кажется, что каждый сантиметр их крошечного тела излучает энтузиазм и жизнелюбие. В среднем гномы чуть выше 3 футов (90 сантиметров), и весят от 40 до 45 фунтов (от 18 до 20 килограмм). Их смуглые или коричневые лица обычно украшены широкими улыбками (над которыми нависают их выдающиеся носы), и их светлые глаза светятся возбуждением. Их русые волосы обычно торчат в разные стороны, словно выражая неослабевающий интерес ко всему на свете.
Индивидуальность гномов ярко выражается в их внешности. Гномы мужчины содержат свои бороды, в отличие от растрёпанных волос, аккуратно подстриженными, но часто расчёсывают их на несколько прядей, или придают забавную заострённую форму. Их одежда, обычно спокойных коричневых тонов, изящно украшена вышивкой, тиснением, или расшита драгоценными камнями.
!!! __''Приверженность восторженности''__
По мнению гномов, жизнь — замечательная штука, и они готовы до капли осушать такой источник наслаждения в течение трёх-пяти отмеренных им веков. Люди могут задаваться вопросом — как не умереть со скуки за столь длинную жизнь, эльфы долгие годы могут смаковать красоту окружающего их мира, и, похоже, лишь гномов беспокоит, что даже за столь щедро отпущенный срок им не удаётся переделать и пересмотреть всё, что хочется.
Разговаривают гномы так, будто их мысли не успевают выбираться из их голов. При этом даже когда они делятся идеями и мнениями на всевозможные темы, им удаётся внимательно выслушивать других, вставляя уместные возгласы удивления, и проявляя уважительные знаки внимания.
<<<
"""
''Всегда благодарные''
Редко можно встретить гнома, который был бы враждебным или злым, если он не перенёс тяжёлую травму. Гномы знают, что большинство рас не разделяют их чувство юмора, но они наслаждаются любой компанией, как и всем, что они делают.
"""
<<<
!!! __''Светлые норы''__
Гномы делают свои дома в холмистых, лесистых землях. Они живут под землёй, но больше любят свежий воздух, чем дварфы, наслаждаясь живой природой поверхности всякий раз, когда могут. Их дома хорошо скрыты с помощью хитроумных устройств и простых иллюзий. Желанные гости быстро оказываются в светлых тёплых норах. Те, кого не ждут, вряд ли смогут эти норы даже отыскать.
Гномы, поселившиеся в землях людей, как правило являются огранщиками драгоценных камней, инженерами, мудрецами или жестянщиками. Некоторые человеческие семьи держат гномов преподавателей, чтобы их воспитанники наслаждались сочетанием серьёзного обучения и радостного удовольствия. Гном может обучать несколько поколений одной и той же семьи в течение своей долгой жизни.
Хотя гномы любят шутки любого рода, особенно каламбуры и шалости, они также посвящают себя решению более серьёзных задач, которые они ставят перед собой. Многие гномы являются умелыми инженерами, алхимиками, жестянщиками и изобретателями. Они готовы к совершению ошибок и смеются над собой в процессе совершенствования своего дела, принимая смелые (иногда отчаянные) решения, и мечтая о большем.
!!! __''Имена гномов''__
Гномы любят имена, и большинство из них имеют по полдюжины имён или около того. Мать гнома, отец, старейшина клана, тёти и дяди: каждый даёт гному имя, а также различные прозвища, которые могут на долгое время прилипнуть, а могут и не прилипнуть. Имена гномов, как правило, являются вариациями имен предков или дальних родственников, хотя некоторые из них придумывают абсолютно новые. Когда гномы имеют дело с людьми и другими, кто «зажат» в именах, они используют не более трёх имен: личное имя, название клана и прозвище, выбирая среди них те, которые наиболее забавно звучат.
;Мужские имена:
:Алвин, Алстон, Боддинок, Брок, Бюргел, Варрин, Вренн, Гербо, Гимбл, Глим, Джебеддо, Димбл, Зук, Келлен, Намфудл, Оррин, Рундар, Сибо, Синдри, Фонкин, Фрюг, Элдон, Эрки
;Женские имена:
:Бимпноттин, Брина, Вейуокет, Донелла, Дувамил, Занна, Карамип, Карлин, Лилли, Лорилла, Лупмоттин, Маднаб, Никс, Нисса, Ода, Орла, Ройвин, Тана, Шамил, Эливик, Элиджобелл, Элла
;Названия кланов:
:Берен, Гаррик, Даергел, Мёрниг, Накл, Нингел, Раулнор, Тимберс, Турен, Фолькор, Шеппен
;Прозвища:
:Барсук, Босоног, Двазамок, Колотушка, Ку, Ним, Пеплосерд, Пивохлёб, Плащ, Пок, Самоцвет, Стамблдак, Фниппер
!!! __''Исследование мира''__
Любопытные и импульсивные гномы могут пуститься в приключения, чтобы увидеть мир или из любви к исследованиям. Будучи любителями драгоценных камней и других мелких предметов, некоторые гномы рассматривают приключения как быстрый, хоть и опасный, путь к богатству. Вне зависимости от того, что побудило их к приключениям, гномы, которые приняли этот образ жизни, получают от него столько удовольствия, сколько и от любой другой деятельности, которой они занимаются, иногда к великому неудовольствию своих товарищей по приключению.
!!!''__Особенности гномов__''
"""
Ваш персонаж-гном обладает следующими особенностями, общими для всех гномов.
''Увеличение характеристик. ''Значение вашего Интеллекта увеличивается на 2.
''Возраст.'' Гномы взрослеют с той же скоростью, что и люди, и вероятнее всего к 40 годам переходят к спокойной взрослой жизни. Они способны прожить от 350 до почти 500 лет.
''Мировоззрение.'' Гномы чаще всего добры. Стремящиеся к порядку обычно становятся мудрецами, инженерами, исследователями, учёными или изобретателями. Те, кто больше склонны к хаосу, становятся менестрелями, мошенниками, путешественниками или искусными ювелирами. Гномы добросердечны, и даже мошенники из них получаются скорее шутливые, чем злобные.
''Размер.'' Рост гномов между 3 и 4 футами (91 и 122 сантиметрами), а средний вес составляет 40 фунтов (18 килограмм). Ваш размер — Маленький.
''Скорость.'' Ваша базовая скорость перемещения равна 25 футам.
''Тёмное зрение.'' Привыкнув к жизни под землёй, вы обладаете превосходным зрением в темноте и при тусклом освещении. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Гномья хитрость.'' Вы совершаете с преимуществом спасброски Интеллекта, Мудрости и Харизмы против магии.
''Языки.'' Вы можете говорить, читать и писать на Общем и Гномьем языках. Гномий язык, использующий дварфский алфавит, хорошо известен благодаря техническим трактатам и каталогам знаний об окружающем мире.
''Разновидности.'' В мирах D&D встречаются два вида гномов — скальные и лесные гномы. Выберите один из этих видов.
"""
<<<
"""
''Глубинные гномы''
Третья подраса гномов, глубинные гномы (или свирфнеблины), живут маленькими общинами, разбросанными в Подземье. В отличие от дуэргаров и дроу, свирфнеблины такие же хорошие, как их родственники с поверхности. Тем не менее, их юмор и энтузиазм омрачены гнетущей окружающей средой, и их изобретательское мастерство в основном выражается в работе с камнем.
"""
<<<
!!!''Лесной гном''
"""
Лесные гномы обладают природными способностями к иллюзии, и унаследовали проворство и скрытность. В мирах D&D лесные гномы встречаются редко, и являются скрытным народом. Они собираются в спрятанные в глубинах лесов общины, и используют иллюзию и обман, чтобы укрыться от опасности или скрыть свой побег в случае обнаружения. Лесные гномы обычно дружелюбны с другими добрыми лесными народами, и считают эльфов и добрых фей своими главными союзниками. Эти гномы также дружат с мелкими лесными зверушками, которые предупреждают их об опасности.
''Увеличение характеристик.'' Значение вашей Ловкости увеличивается на 1.
''Природная иллюзия.'' Вы знаете заклинание малая иллюзия. Базовой характеристикой для его использования является Интеллект.
''Общение с маленькими зверями.'' С помощью звуков и жестов вы можете передавать простые понятия Маленьким или ещё меньшим зверям. Лесные гномы любят животных и часто держат белок, барсуков, кроликов, кротов, дятлов и других животных в качестве питомцев.
"""
!!!''Скальный гном''
"""
Скальные гномы выделяются своей изобретательностью и стойкостью. Большинство гномов в мирах D&D являются скальными, включая гномов-ремесленников из мира Саги о Копье.
''Увеличение характеристик.'' Значение вашего Телосложения увеличивается на 1.
''Ремесленные знания. ''При совершении проверки Интеллекта (История) применительно к магическому, алхимическому или технологическому объекту, вы можете добавить к проверке удвоенный бонус мастерства вместо обычного.
''Жестянщик.'' Вы владеете ремесленными инструментами (инструменты жестянщика). С их помощью вы можете, потратив 1 час времени и материалы на сумму в 10 зм, создать Крошечное механическое устройство (КД 5, 1 хит). Это устройство перестаёт работать через 24 часа (если вы не потратите 1 час на поддержание его работы). Вы можете действием разобрать его; в этом случае вы можете получить обратно использованные материалы. Одновременно вы можете иметь не более трёх таких устройств.
При создании устройства выберите один из следующих вариантов:
"""
;//Заводная игрушка.//
:Эта заводная игрушка изображает животное, чудовище или существо, вроде лягушки, мыши, птицы, дракона или солдатика. Поставленная на землю, она проходит 5 футов в случайном направлении за каждый ваш ход, издавая звуки, соответствующие изображаемому существу.
;//Зажигалка.//
:Это устройство производит миниатюрный огонёк, с помощью которого можно зажечь свечу, факел или костёр. Использование этого устройства требует действия.
;//Музыкальная шкатулка.//
:При открытии эта шкатулка проигрывает мелодию средней громкости. Шкатулка перестаёт играть если мелодия закончилась или если шкатулку закрыли.
//3 уровень, Вызов, Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (маринованное щупальце осьминога)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы открываете врата в межзвёздную тьму, область, населённую неизвестными кошмарами. Появляется сфера тьмы и холода с радиусом 20 футов, с центром на точке в пределах дистанции, существующая, пока активно заклинание. Эта пустота заполнена какофонией тихих шёпотов и хлюпающих шумов, которые слышно в пределах 30 футов. Никакой свет, ни магический, ни обычный, не может осветить эту местность, и существа, полностью находящиеся в этой области, ослеплены.
Пустота создаёт искажения в ткани пространства, и её местность является труднопроходимой. Все существа, начинающие ход в этой местности, получают урон холодом 2к6. Все существа, оканчивающие ход в этой местности, должны преуспеть в спасброске Ловкости, иначе получают урон кислотой 2к6, так как к ним прикасаются бледные потусторонние щупальца."""
//2 уровень, Воплощение, Друид//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (лист сумаха)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте горящий клинок в свободной руке. Этот клинок похож размерами и формой на скимитар, и он существует, пока заклинание активно. Если вы выпустите клинок из рук, он исчезает, но вы можете вернуть его в руку бонусным действием.
Вы можете действием совершить рукопашную атаку заклинанием. При попадании цель получает урон огнём 3к6.
Горящий клинок испускает яркий свет в пределах 10 футов и тусклый свет в пределах ещё 10 футов."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к6 за каждые два уровня ячейки выше 2.
В продаже имеются уже готовые приключения, если у вас нет ни времени, ни желания писать приключения самостоятельно, или если вы хотите сменить обстановку. Готовые приключения включают в себя заранее сгенерированный сценарий с картами, персонажами Мастера, чудовищами и сокровищами. Пример такого приключения есть в //''Стартовом наборе''// D&D.
Вы можете внести коррективы в готовое приключение, чтобы оно лучше подходило для вашей кампании и для ваших игроков. Например, вы можете заменить главного злодея приключения на кого-то, кого игроки уже встречали в вашей кампании, или добавить в предысторию приключения что-то, что втянет персонажей в сюжет настолько глубоко, что создателю приключения и не снилось.
Готовые приключения не рассчитаны на полную свободу действий для персонажей. Их основной плюс в том, что они позволяют вам сосредоточить всё своё внимание на освещении сюжетных событий.
Готовые приключения вдохновляют. Даже если вы не используете такое приключение, оно может дать вам идеи, или вы можете взять какую-то его часть и переделать её для своих нужд. Например, вы можете использовать карту храма, но населить его чудовищами на свой выбор, или использовать сцену с погоней оттуда в своей кампании.
//4 уровень, Воплощение, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 300 футов
:''Компоненты:'' В, С, М (щепотка пыли и несколько капель воды)
:''Длительность:'' Мгновенная
"""На землю в цилиндре с радиусом 20 футов и высотой 40 футов, с центром на точке в пределах дистанции, падают куски льда. Все существа в цилиндре должны совершить спасбросок Ловкости. Существо получает дробящий урон 2к8 и урон холодом 4к6 при провале, или половину этого урона при успехе.
Град превращает область воздействия в труднопроходимую местность до конца вашего следующего хода."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, дробящий урон увеличивается на 1к8 за каждый уровень ячейки выше четвёртого.
//1 уровень, Вызов, Следопыт//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
В следующий раз, когда вы попадёте по существу дальнобойной атакой оружием, пока активно это заклинание, из дальнобойного оружия или боеприпаса вылетит град шипов. В дополнение к обычному эффекту атаки, цель и все существа в пределах 5 футов от неё, должны совершить спасбросок Ловкости. При провале существо получает колющий урон 1к10, или половину этого урона при успехе.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше первого (до максимума 6к10).
//Чудесный предмет, необычный//
Эта закупоренная ёмкость булькает, если её потрясти, как будто в ней находится вода. Весит графин 2 фунта.
Вы можете действием откупорить графин и произнести одно из трёх ключевых слов, после чего из графина выливается указанное количество пресной или солёной воды (на ваш выбор). Вода прекращает литься в начале вашего следующего хода. У вас есть следующие варианты:
* «Ручей» производит 1 галлон воды.
* «Фонтан» производит 5 галлонов воды.
* «Гейзер» производит 30 галлонов воды, которая вырывается струёй 30 футов длиной и 1 фут шириной. Держа графин, вы можете бонусным действием нацелиться графином на существо, которое видите в пределах 30 футов от себя. Цель должна преуспеть в спасброске Силы со Сл 13, иначе получит дробящий урон 1к4 и будет сбита с ног. Вместо существа вы можете нацелиться на предмет, который никто не несёт и не носит, и который весит не больше 200 фунтов. Предмет или падает или толкается на 15 футов от вас.
//9 уровень, Вызов, Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Видимость
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Появляются клубящиеся облака с центром на точке, видимой вами, распространяющиеся в радиусе 360 футов. В этой области бьют молнии, грохочет гром и дует сильный ветер. Все существа, находящиеся под облаками (на расстоянии не больше 5 000 футов под облаком), когда те появляются, должны совершить спасбросок Телосложения. При провале существо получает урон звуком 2к6 и становится оглохшим на 5 минут.
Каждый раунд, в котором вы поддерживаете концентрацию на этом заклинании, гроза в ваш ход создаёт дополнительный эффект:
''//Раунд 2.//'' Из облаков выпадает кислотный дождь. Все существа и предметы под облаками получают урон кислотой 1к6.
//''Раунд 3.''// Вы создаёте шесть разрядов молний из облаков, ударяющих в шесть существ или предметов на ваш выбор под облаками. Существа и предметы не могут стать целью более одной молнии. Ударенное существо должно совершить спасбросок Ловкости. Существо получает урон электричеством 10к6 при провале, или половину этого урона при успехе.
//''Раунд 4.''// Из облаков выпадает град. Все существа под облаками получают дробящий урон 2к6.
//''Раунд 5–10.''// Под облаками бушует сильный ветер и идёт мокрый снег. Местность становится труднопроходимой и сильно заслонённой. Все находящиеся там существа получают урон холодом 1к6. Дальнобойные атаки оружием в этой местности невозможны. Ветер и дождь считаются сильным отвлекающим фактором при концентрации на заклинаниях. И наконец, порывы сильного ветра (скорость от 20 до 50 миль в час) автоматически рассеивают туман, испарения и подобные явления, как естественной, так и магической природы."""
//1 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
В первый раз, когда вы попадаете рукопашной атакой оружием, пока заклинание активно, ваше оружие издаёт громовой рокот, слышимый с расстояния 300 футов, и атака причиняет цели дополнительный урон звуком 2к6. Кроме того, если цель — существо, она должна преуспеть в спасброске Силы, иначе она будет оттолкнута на 10 футов от вас и сбита с ног.
"""
//«Ты опоздал, эльф!» — послышался знакомый грубый голос. Бруенор Батлхаммер встал на труп убитого им йети, не обращая внимания на то, что под ним корчился его эльфийский друг. Несмотря на испытываемые неудобства, Дриззт всё же был рад видеть этот большой нос и рыжую бороду. «Я так и знал, что ты вляпаешься в какую-нибудь историю и мне снова придётся тебя вытаскивать!».//
—Р. А. Сальваторе, Магический кристалл
"""
Полные древнего величия королевства и вырезанные в толще гор чертоги, удары кирок и молотков, раздающиеся в глубоких шахтах и пылающий кузнечный горн, верность клану и традициям и пылающая ненависть к гоблинам и оркам — вот вещи, объединяющие всех дварфов.
!!! __''Невысокие и крепкие''__
Смелые и выносливые дварфы известны как опытные воины, шахтёры, камнетёсы и металлурги. Хотя они и не превышают 5 футов (152 сантиметра) в высоту, дварфы настолько широкоплечие и плотные, что весят столько же, сколько превосходящий их в росте на 2 фута (60 сантиметров) человек. Их отвага и выносливость также не уступает представителям более высоких народов.
Кожа у дварфов бывает от тёмно-коричневой до светлой, с красным оттенком. Наиболее распространённые оттенки — светло-коричневый или смуглый, как разные виды земли. Их волосы, которые они носят длинными, но собранными в простые причёски, обычно чёрного, серого или коричневого цвета, но у дварфов с бледной кожей часто встречаются рыжие волосы. Дварфы мужчины очень ценят свои бороды и тщательно за ними ухаживают.
!!! __''Долгая память, долгие обиды''__
Дварфы могут жить более 400 лет, и старейшие из них часто помнят этот мир сильно отличным от нынешнего. К примеру, некоторые из старейших гномов цитадели Фелбарр (в мире Забытых Королевств) могут припомнить дни, когда более трёх веков назад орки завоевали их крепость и обрекли их на двухсот пятидесятилетние скитания. Такая долговечность даёт им особый взгляд на мир, которого лишены короткоживущие расы вроде людей и полуросликов.
Дварфы стойкие и выносливые, как горы, в которые они влюблены. Они стоически противостоят проходящим столетиям и почти не меняются. Они уважают традиции своих кланов, прослеживая их родословную до самого основания древнейших твердынь на рассвете молодого мира, и не отказываются от этих традиций с лёгкостью. Частью этих традиций является преданность богам дварфов, которые поощряют присущие дварфам идеалы: прилежный труд, сноровку в бою и любовь к кузнечному горну.
Дварфам присущи непреклонность и лояльность, верность своему слову, решительность в действиях, временами переходящие в упрямство. У многих дварфов сильно развито чувство справедливости, и они медленно прощают причинённое им зло. Зло причинённое одному дварфу, это зло, причиненное всему его клану. Таким образом, попытка отомстить одному дварфу может превратиться во вражду, захлестнувшую целый клан.
<<<
"""
''Недоверчивые''
Дварфы вполне сносно ладят с представителями других рас. «Разница между знакомым и другом — сто лет». Эта дварфская поговорка возможно и преувеличивает, но легко даёт понять, как сложно людям, и другим короткоживущим расам завоевать доверие дварфов.
''//Об эльфах:// ''«Неразумно полагаться на эльфов. Никогда не знаешь, что они способны сделать в следующий момент. Если дело доходит до драки, они могут как выхватить меч, так и спеть вам песенку. Они ветрены и легкомысленны, и только две вещи можно сказать наверняка. У них мало кузнецов, но те, что есть, отлично знают своё дело. И когда орки и гоблины устремляются со своих гор в очередной набег, лучше иметь эльфов в союзниках. Не так хорошо, как других дварфов, конечно, но никто не усомнится, что они ненавидят орков не меньше нашего».
''//О полуросликах://'' «Они, конечно, милый народец. Но покажите мне полурослика-героя. Империю. Победоносную армию полуросликов. Да хотя бы приличное сокровище, сделанное их руками. Ничего! Как вообще можно воспринимать их серьёзно?»
''//О людях://'' «Ты потратил время, чтобы узнать человека, а он взял и помер. Если повезёт, у него останется семья — дочка, или может внучка, или хоть кто-то, с руками и сердцем, достойными его. Как можно стать человеку другом и смотреть, как он умирает? Зато, если они что-то вбили себе в голову, они это получат, будь это сокровище дракона или же трон целой империи. Нельзя не восхищаться такой целеустремлённостью, даже несмотря на то, что чаще всего это приносит им проблемы».
"""
<<<
!!! __''Кланы и королевства''__
Королевства дварфов простираются глубоко под горами, где дварфы добывают драгоценные металлы и камни и куют чудесные вещи. Они любят красоту драгоценных металлов и ювелирных изделий, и у некоторых дварфов эта любовь может превратиться в алчность. Ценности, которые они не могут найти в своих горах, они получают благодаря торговле. Они не любят кораблей, и предприимчивые люди и полурослики часто ведут торговлю дварфскими товарами через водные пути. Благонадёжным представителям этих рас всегда рады в дварфских поселениях, хотя некоторые места там закрыты даже для них.
Главным элементом дварфского общества является клан, и дварфы очень высоко ценят социальное положение. Даже дварфы, живущие вдалеке от своих королевств, хранят свою принадлежность к клану, узнают относящихся к нему соплеменников и взывают к именам предков, произнося клятвы и выкрикивая проклятья. Лишение клана это худшая судьба, способная выпасть на участь дварфа.
Дварфы в чужих землях обычно работают ремесленниками, чаще всего оружейниками или ювелирами. Некоторые становятся наёмниками или телохранителями, очень ценимыми за их храбрость и преданности.
!!! __''Боги, золото, клан''__
Дварф, выбравший путь искателя приключений, может руководствоваться жаждой сокровищ — для личного пользования, для достижения определённой цели или даже ради альтруистического желания помочь другим. Другими может двигать божественное озарение, прямой приказ, или желание принести славу одному из дварфских божеств. Клан и предки тоже являются одними из сильнейших мотивов. Дварф может искать способ вернуть утерянную честь клана, отомстить древнему врагу или вновь обрести место в клане, откуда был изгнан. Или он может отправиться на поиски топора, утерянного предком на поле брани столетия назад.
!!! __''Имена дварфов''__
Имя дварфу даётся старейшиной клана согласно традиции. Каждое подходящее имя используется из поколения в поколение. Имя дварфа принадлежит клану, а не отдельному дварфу. Дварф, опорочивший своё имя, лишается его, и согласно законам, ему запрещается использовать любое другое дварфское имя.
;''Мужские имена:''
:Адрик, Альберих, Баренд, Баэрн, Броттор, Бруенор, Вондал, Вэйт, Гардаин, Даин, Даррак, Делг, Килдрак, Моргран, Орсик, Оскар, Рангрим, Рюрик, Таклинн, Торадин, Тордек, Торин, Травок, Траубон, Ульфгар, Фаргрим, Флинт, Харбек, Эберк, Эйнкиль
;''Женские имена:''
:Артин, Бардрин, Вистра, Гуннлода, Гурдис, Дагнал, Диеза, Илде, Катра, Кристид, Лифтраса, Мардред, Одхильд, Рисвин, Саннл, Торбера, Торгга, Фалкрунн, Финеллен, Хельджа, Хлин, Эльдет, Эмбер
;''Названия кланов:''
:Балдерк, Боевой Молот, Горунн, Данкил, Железный Кулак, Крепкая Наковальня, Ледяная Борода, Лодерр, Лютгер, Огненная Кузня, Рамнахейм, Стракелн, Торунн, Унгарт, Холдерхек
!!! __''Особенности дварфов''__
"""
Ваш персонаж дварф обладает рядом врождённых способностей, являющихся частью его природы.
''Увеличение характеристик.'' Значение вашего Телосложения увеличивается на 2.
''Возраст.'' Дварфы взрослеют с той же скоростью, что и люди, но считаются юными, пока не достигнут пятидесятилетнего возраста. В среднем, они живут свыше 350 лет.
''Мировоззрение.'' Большинство дварфов законопослушные, твёрдо верящие в преимущества хорошо организованного общества. Они также стремятся к добру, обладают развитым чувством справедливости и верят, что все заслуживают пользования преимуществами закона и порядка.
''Размер.'' Рост дварфов находится между 4 и 5 футами (122 и 152 сантиметрами), и весят они около 150 фунтов (68 килограмм). Ваш размер — Средний.
''Скорость.'' Ваша базовая скорость перемещения — 25 футов. Ношение тяжёлых доспехов не снижает вашу скорость.
''Тёмное зрение.'' Привыкнув к жизни под землёй, вы обладаете превосходным зрением в темноте и при тусклом освещении. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Дварфская устойчивость.'' Вы совершаете с преимуществом спасброски от яда, и вы получаете сопротивление к урону ядом (объясняется в главе 9).
''Дварфская боевая тренировка.'' Вы владеете боевым топором, ручным топором, лёгким и боевым молотами.
''Владение инструментами. ''Вы владеете ремесленными инструментами на ваш выбор: инструменты кузнеца, пивовара или каменщика.
''Знание камня.'' Если вы совершаете проверку Интеллекта (История), связанную с происхождением работы по камню, вы считаетесь владеющим навыком История, и добавляете к проверке удвоенный бонус мастерства вместо обычного.
''Языки.'' Вы разговариваете, читаете и пишете на Общем и Дварфском языках. Дварфский язык состоит из твёрдых согласных и гортанных звуков, и этот акцент будет присутствовать в любом языке, на котором дварф будет говорить.
''Разновидности. ''Два основных вида дварфов населяют миры D&D: холмовые дварфы и горные дварфы. Выберите один из этих видов.
"""
!!! ''Горный дварф''
"""
Будучи горным дварфом, вы являетесь сильным и выносливым, приспособленным к жизни в суровой местности. Вы довольно высоки (по дварфской мерке), и скорее светлокожи. Щитовые дварфы из северного Фаэруна, а также правящий клан хиларов и благородный клан деваров из Саги о Копье, всё это горные дварфы.
''Увеличение характеристик.'' Значение вашей Силы увеличивается на 2.
''Владение доспехами дварфов.'' Вы владеете лёгкими и средними доспехами.
"""
!!! ''Холмовой дварф''
"""
Будучи холмовым дварфом вы обладаете обострёнными чувствами, развитой интуицией и замечательной стойкостью. Золотые дварфы Фаэруна, в их могучем южном королевстве являются холмовыми дварфами, также как и изгнанные нейдары и свихнувшиеся клары из Кринна (мир Саги о Копье).
''Увеличение характеристик.'' Значение вашей Мудрости увеличивается на 1.
''Дварфская выдержка.'' Максимальное значение ваших хитов увеличивается на 1, и вы получаете 1 дополнительный хит с каждым новым уровнем.
"""
<<<
"""
''Дуэргары''
В глубоких городах Подземья живут дуэргары, или серые дварфы. Они совершают скрытные и жестокие налёты на поверхность, а пленных рабов продают другим расам Подземья. Серые дварфы обладают врождённой способностью становиться невидимыми и временно приобретать гигантские размеры.
"""
<<<
//Оружие (боевой молот), очень редкое (требуется настройка дварфом)//
Вы получаете бонус +3 к броскам атаки и урона, совершённым этим магическим оружием. Оно обладает свойством «метательное» с нормальной дистанцией 20 футов и максимальной дистанцией 60 футов. Если вы попадёте дальнобойной атакой этим оружием, оно причиняет дополнительный урон 1к8 или, если цель — великан, то 2к8. Сразу же после атаки оружие возвращается в вашу руку.
!!!''__Движение без доспехов__''
"""Начиная со 2 уровня ваша скорость увеличивается на 10 футов, если вы не носите доспехов и щит. Этот бонус увеличивается с ростом вашего уровня, как показано в таблице.
На 9 уровне вы получаете возможность в свой ход перемещаться по вертикальным поверхностям и по поверхности жидкости, не падая во время движения."""
//6 уровень, Преобразование, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (железный клинок и небольшая сумка со смесью из глины, перегноя и песка)
:''Длительность:'' Концентрация, вплоть до 2 часов
"""Выберите в пределах дистанции область с длиной стороны не больше 40 футов. Пока заклинание активно, вы можете менять поверхность земли, песка или глины. Вы можете увеличить или уменьшить высоту, создать или засыпать ров, поднять или сравнять стены, и даже формировать колонны. Высота таких изменений не может превышать половины самой большой стороны области. Таким образом, если вы воздействуете на квадрат с длиной стороны 40 футов, вы можете создать колонну высотой до 20 футов, поднять или опустить землю на расстояние до 20 футов, выкопать траншею глубиной до 20 футов, и так далее. Изменения вступают в силу в течение 10 минут.
В конце каждых 10 минут концентрации на этом заклинании вы можете выбрать новую область, чтобы подействовать на неё.
Из-за того, что трансформация местности происходит медленно, обычно, существа не могут попасть в плен или получить урон из-за движений почвы.
Это заклинание не может манипулировать естественным камнем и каменными строениями. Камни и строения сдвигаются, приспосабливаясь к новой местности. Если изменение местности сделает строение неустойчивым, оно может разрушиться.
Это заклинание также не действует на растения. Перемещаемая почва уносит с собой и растения."""
//8 уровень, Некромантия, Волшебник//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (алмаз, стоящий как минимум 1 000 зм, и как минимум 1 кубический дюйм плоти существа, расходуемый заклинанием, а также сосуд, стоящий как минимум 2 000 зм с запираемой крышкой и достаточно большой, чтобы вместить существо Среднего размера, например, огромная урна, гроб, яма в земле или кристаллический контейнер, заполненный солёной водой)
:''Длительность:'' Мгновенная
"""Это заклинание выращивает инертную копию живого существа, которое станет гарантией бессмертия. Этот клон формируется в запечатанном сосуде и вырастает до полного размера за 120 дней; вы можете сделать так, что двойник будет более молодой версией этого существа. Он остаётся инертным и будет оставаться таким сколько угодно, пока сосуд остаётся целым.
В любое время после того, как двойник будет готов, когда настоящее существо умирает, его душа переносится в двойника, при условии, что она свободна и хочет вернуться. Двойник физически идентичен оригиналу и обладает той же индивидуальностью, воспоминаниями и умениями, но у него нет снаряжения оригинала. Тело исходного существа, если оно ещё существует, остаётся инертным, и его впоследствии нельзя оживить, так как душа обитает в другом месте."""
"""Если вы в свой ход совершаете действие, это может быть одно из описанных ниже действий, действие, дарованное классом или особым умением, или импровизированное действие. У многих чудовищ есть разные варианты действий в блоках статистики.
Если вы описываете действие, не упомянутое в правилах, Мастер сообщает, возможно ли это действие, и какие проверки нужно совершить для определения успешности."""
!!!__''Атака''__
"""Чаще всего в бою совершается действие Атака, будь то удар мечом, стрельба из лука или драка на кулаках.
Этим действием вы совершаете одну рукопашную или дальнобойную атаку. Смотрите подробности в разделе [[«Совершение атаки»|04. Совершение атаки]].
Некоторые умения, такие как Дополнительная атака у воина, позволяют совершать несколько атак одним действием."""
!!!__''Засада''__
Если вы совершаете действие Засада, вы совершаете проверку Ловкости (Скрытность), пытаясь спрятаться, используя правила из [[главы 7|05. Использование характеристик]]. В случае успеха вы получаете определённые преимущества, описанные ниже в разделе «Невидимые атакующие и цели».
!!!__''Использование предмета''__
Обычно вы взаимодействуете с предметами во время других действий, например, вынимаете меч частью атаки, но если предмет требует действия для его использования, вы совершаете действие Использование предмета. Это действие также пригодится, если вы хотите в течение хода взаимодействовать сразу с несколькими предметами.
!!!__''Накладывание заклинания''__
Заклинатели, такие как волшебники и жрецы, а также многие чудовища, имеют доступ к заклинаниям, и могут очень эффективно использовать их в сражении. У каждого заклинания есть время накладывания, измеряющееся в действиях, минутах или даже часах. У большинства заклинаний время накладывания «1 действие», поэтому заклинатели часто тратят действие на сотворение заклинаний. Правила накладывания заклинаний смотрите в [[главе 10|Глава 10: Использование заклинаний]].
!!!__''Отход''__
Если вы совершаете действие Отход, то до конца текущего хода ваше перемещение не провоцирует атаки.
!!!__''Подготовка''__
Вы можете прыгнуть на врага, когда он будет проходить под вами, или подождать, пока не произойдёт определённое событие. Для этого вы совершаете в свой ход действие Подготовка, чтобы реакцией подействовать позже.
Во-первых, определите, какое воспринимаемое событие вызовет вашу реакцию. Затем выберите действие, либо перемещение, которое будет совершено. Примеры: «Если культист наступит на люк, я дёрну рычаг и открою его», «Если передо мной встанет гоблин, я отойду прочь».
Когда срабатывает условие, вы можете либо совершить свою реакцию до окончания действия, вызвавшего срабатывание, либо игнорировать срабатывание условия. Подготовленное действие можно совершить только до начала вашего следующего хода. Помните, что вы можете совершить только одну реакцию в раунд.
Если вы подготовили заклинание, вы накладываете его как обычно, но удерживаете энергию, пока не сработает условие. Для того чтобы заклинание можно было подготовить, у него должно быть время накладывания «1 действие», а удерживание магии требует концентрации (объясняется в [[главе 10|Глава 10: Использование заклинаний]]). Если концентрация прервана, заклинание тратится без всякого эффекта. Например, если вы концентрируетесь на заклинании паутина и подготавливаете волшебную стрелу, заклинание паутина заканчивается, и если вы получите урон до накладывания волшебной стрелы реакцией, ваша концентрация рискует прерваться.
!!!__''Поиск''__
Совершив действие Поиск, вы уделяете внимание поиску чего-то. В зависимости от характера ваших поисков, Мастер может призвать к проверке Мудрости (Внимательность) или Интеллекта (Анализ).
<<<
!!!''Импровизированное действие''
"""Ваши персонажи могут совершать действия, не описанные в этой главе, такие как выламывание дверей, запугивание врагов, поиски брешей в магической обороне или призывы к переговорам с врагами. Единственным ограничением будет ваше воображение и значения характеристик. Смотрите описания характеристик в главе 7 в поисках вдохновения для импровизации.
Когда вы описываете действие, не упомянутое в правилах, Мастер сообщает, возможно ли это действие, и какие проверки нужно совершить для определения успешности."""
<<<
!!!__''Помощь''__
"""Вы можете оказать помощь другому существу. Если вы совершаете действие Помощь, существо, которому вы помогаете, совершит свою следующую проверку характеристики для выполнения задачи с преимуществом, если она будет совершена до начала вашего следующего хода.
В качестве альтернативы, вы можете помочь дружественному существу атаковать другое существо, находящееся в пределах 5 футов от вас. Вы совершаете финт, отвлекаете цель или каким-то другим образом делаете атаку союзника более эффективной. Если ваш союзник атакует цель до начала вашего следующего хода, первый бросок атаки совершается с преимуществом."""
!!!__''Рывок''__
"""Если вы совершаете действие Рывок, вы получаете дополнительное перемещение в текущем ходу, равное вашей скорости после применения всех модификаторов. Например, если у вас скорость 30 футов, то совершив рывок, вы можете переместиться на 60 футов.
Все увеличения и уменьшения скорости изменяют точно так же и дополнительное перемещение. Например, если ваша скорость 30 футов уменьшена до 15 футов, то совершив рывок, вы можете переместиться на 30 футов."""
!!!__''Уклонение''__
Если вы совершаете действие Уклонение, вы сосредотачиваетесь на уклонении от атак. До начала вашего следующего хода все броски атаки по вам совершаются с помехой, если вы видите атакующего, и спасброски Ловкости вы совершаете с преимуществом. Вы теряете это преимущество, если становитесь недееспособным (объясняется в приложении А) или если ваша скорость падает до 0.
//8 уровень, Вызов, Волшебник/Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' С
:''Длительность:'' 1 час
"""Вы создаёте тёмную дверь на твёрдой плоской поверхности, которую вы видите в пределах дистанции. Дверь достаточно большая, чтобы существа Среднего размера могли свободно проходить через неё. Если дверь открыть, она будет вести в демиплан, который выглядит как пустая комната по 30 футов во всех измерениях, построенная из дерева или камня. Когда заклинание заканчивается, дверь исчезает, а существа и предметы, находящиеся в демиплане, остаются запертыми там, так как дверь исчезает и с другой стороны тоже.
Каждый раз, когда вы накладываете это заклинание, вы либо создаёте новый демиплан, либо соединяете дверь с демипланом, созданным предыдущим накладыванием этого заклинания. Кроме того, если вы знаете природу и содержимое демиплана, созданного этим заклинанием другого существа, вы можете соединить свою дверь с этим демипланом."""
//Доспех (латный), очень редкий (требуется настройка)//
Пока вы носите этот доспех, вы получаете бонус +1 к КД можете говорить на языке Бездны и понимаете этот язык. Кроме того, латные рукавицы с шипами этого доспеха делают ваши безоружные атаки руками магическим оружием, причиняющим рубящий урон с бонусом +1 к броскам атаки и урона и костью урона 1к8.
//''Проклятье.''// Надев этот проклятый доспех, вы не можете его снять, пока не станете целью заклинания снятие проклятья или подобной магии. Нося этот доспех, вы совершаете с помехой броски атаки по демонам и спасброски от заклинаний и особых умений демонов.
!!!__''Дикая магия''__
Ваша магия исходит от диких сил хаоса, лежащих в основе мироздания. Вы, возможно, подверглись воздействию грубой магии в той или иной форме. Возможно, она просочилась через портал, ведущий в Лимбо, Стихийные Планы или таинственный Дальний Предел. Может быть, вы были благословлены могущественной феей или отмечены демоном. Или ваша магия может быть случайностью вашего рождения, без очевидной причины. Вне зависимости от её происхождения, хаотическая магия бурлит внутри вас, готовая вырваться наружу.
!!!''Волна дикой магии''
Когда вы выбираете Дикую магию в качестве источника, ваше колдовство может вызвать волны дикой магии. Сразу после накладывания вами заклинания как минимум 1 уровня Мастер может попросить вас бросить к20. Если выпадает 1, бросьте кость по таблице «Волна дикой магии» для создания случайного магического эффекта. Волна может возникать только один раз за ход. Если эффект волны является заклинанием, он слишком непредсказуем, чтобы его можно было модифицировать метамагией. Если заклинание-эффект в обычных обстоятельствах требует концентрацию, то в данном случае оно не требует концентрацию и длится свою максимальную длительность.
!!!''Поток хаоса''
"""Начиная с 1 уровня вы можете манипулировать силами случая и хаоса, чтобы получить преимущество для одного броска атаки, проверки характеристики или спасброска. Сделав это, вы должны совершить продолжительный отдых, прежде чем вы сможете использовать это умение ещё раз.
В любой момент до того как вы восстановите это умение, сразу после использования вами заклинания чародея как минимум 1 уровня, Мастер может попросить вас бросить кость на эффект от Волны дикой магии. После этого вы восстанавливаете использование этого умения."""
!!!''Подчинение удачи''
Начиная с 6 уровня вы получаете возможность менять судьбу с помощью дикой магии. Когда другое существо, видимое вам, совершает бросок атаки, проверку характеристики или спасбросок, вы можете реакцией потратить 2 единицы чародейства и бросить 1к4. Результат броска станет бонусом или штрафом (на ваш выбор) к броску существа. Вы можете сделать это после броска существа, но до того, как начнут действовать эффекты от броска.
!!!''Контролируемый хаос''
На 14 уровне вы получаете толику контроля над Волнами дикой магии. Каждый раз, когда вы совершаете бросок по таблице дикой магии, вы можете совершить два броска и использовать любой из двух.
!!!''Разрушительные заклинания''
С 18 уровня разрушительная энергия ваших заклинаний увеличивается. Когда вы совершаете бросок урона от заклинания, и на одной из костей выпадает максимально возможное значение, выберите одну из этих костей и бросьте её ещё раз. Добавьте выпавшее значение к урону. Вы можете использовать это умение только один раз в ход.
<<Button "Таблица дикой магии""Таблица дикой магии">>
Между подземельями и поселениями мира вашей кампании лежат луга, леса, пустыни, горные цепи, океаны и прочие участки дикой местности, по которым можно перемещаться. Процесс создания реалистичной дикой местности может стать интересной частью игры, как для вас, так и для ваших игроков. При этом существует два подхода.
!!__''Подход с перемоткой путешествий''__
Иногда пункт назначения куда важнее самого путешествия. Если переход по дикой местности нужен для того, чтобы персонажи попали туда, где начнутся настоящие приключения, опишите кратко само путешествие, не совершая в процессе его проверки на то, будут ли происходить дополнительные сцены. Так же как в фильмах используют монтаж, чтобы не показывать долгие, хотя и трудные путешествия, вы можете парой фраз описать путешествие по дикой местности, чтобы игроки поняли, что произошло, и перешли к действиям.
Опишите путешествие как вам хочется, но помните о стремлении персонажей идти вперёд. «Вы прошли несколько миль и не встретили ничего интересного» звучит неплохо, но это менее интересно чем «Вы идёте на север под мелким моросящим дождиком. Примерно в полдень вы остановились отдохнуть под одиноким деревом. Там плут нашёл небольшой камень, похожий на ухмыляющееся лицо, но в целом ничего необычного не происходит». Секрет в том, что надо сосредоточиться на деталях, усиливающих нужный настрой, а не описывать всё подряд до последней травинки.
Обращайте внимание на необычные особенности местности: водопады, каменные выступы, с которых открывается захватывающий вид над макушками деревьев, участки горелого или вырубленного леса, и так далее. Опишите также приметные запахи и звуки, такие как рык далёкого чудовища, запах горящей древесины или аромат цветов в эльфийском лесу.
В дополнение к выразительному описанию, визуальные картины помогут лучше понять, как проходило путешествие персонажей. Поиски в Интернете могут дать вам захватывающие ландшафты (кстати, можете искать именно по этой фразе), как реальные, так и фантастические. Путешествие должно напомнить игрокам, что их персонажи находятся в фэнтезийном мире. Периодически разбавляйте описания магическими элементами. В лесу могут жить крохотные дракончики вместо птиц, а деревья могут быть увешаны огромной паутиной или в них может течь жуткий светящийся зелёным сок. Используйте такие элементы аккуратно; чрезвычайно чужеродный ландшафт может нарушить погружение игроков в мир. Одного фантастического элемента среди обычного во всех других отношениях ландшафта будет вполне достаточно.
Используйте ландшафт для установки настроения и тона вашего приключения. В одном лесу тесно растущие деревья могут кронами отрезать свет и словно бы следить за проходящими мимо искателями приключений. В другом солнечный свет может играть на каждом листике лиан, обвивающих стволы деревьев. Признаки разложения — трухлявые деревья, дурно пахнущая вода и камни, поросшие скользким коричневым мхом — могут быть сигналом, что искатели приключений подобрались к месту злой силы, которое либо является их пунктом назначения, либо может подсказать, какие опасности стоит ожидать.
У разных мест могут быть свои уникальные особенности. Например, в Лесу Духов и Паучьей Роще могут расти разные деревья, может быть разная флора и фауна, разная погода и разные таблицы случайных встреч.
И наконец, переход по дикой местности можно описать красочнее, если обратить внимание на погоду. «Следующие три дня вы идёте по болоту» звучит не так эффектно как «Следующие три дня вы с трудом продираетесь сквозь грязь глубиной по колено — первые два дня и ночь под проливным дождём, и ещё один день под палящим солнцем, сопровождаемые роем голодных насекомых».
!!__''Подход с описанием каждого часа''__
Иногда путешествие заслуживает такого же внимания, что и пункт назначения. Если особенности самого путешествия занимают в вашем приключении важное место, и вы не хотите их опускать, простого описания путешествия будет мало; вам понадобится знать походный строй отряда и держать под рукой готовые сцены.
Пусть игроки определят свой походный строй (подробности в Книге игрока). Персонажи в первом ряду и те, кто отвечают за ориентирование, первыми могут заметить достопримечательности и особенности местности. Персонажи в последнем ряду обычно отвечают за то, чтобы к отряду никто не подкрался сзади. Поощряйте персонажей в средних рядах делать что-нибудь, а не просто слепо следовать за теми, кто идёт впереди. В Книге игрока приводятся варианты действий, такие как рисование карты и сбор еды.
Путешествие по дикой местности это обычно комбинация из запланированных и случайных сцен. Для запланированных сцен могут потребоваться карты мест, где они происходят, например, руины, мост через пропасть или какое-то другое запоминающееся место. Случайные сцены обычно не так сильно привязаны к конкретным местам. Чем меньше сцен вы подготовите заранее, тем больше придётся полагаться на случайные сцены, чтобы путешествие было интересным. Смотрите в главе 3 советы по созданию таблиц случайных встреч и определению того, когда совершать проверки.
Чтобы сцены в дикой местности не стали скучными, убедитесь, что они начинаются и заканчиваются по-разному. Другими словами, если дикая местность это сцена, а приключение — постановка, продумайте для каждой сцены свои декорации, и попытайтесь поставить их так, чтобы они отличались друг от друга, а игрокам было интересно. Если в одном случае на отряд нападают спереди, в следующий раз на них могут напасть сверху или сзади. Если в сцене присутствуют скрытные и осторожные чудовища, персонаж, заботящийся о вьючных животных отряда, может первым узнать о присутствии чудовищ, когда пони занервничает и начнёт махать хвостом. Если в сцене присутствует шумное чудовище, у отряда может появиться возможность спрятаться или организовать засаду. Одна группа чудовищ может напасть, только лишь увидев искателей приключений, а другая может позволить пройти мимо, если им дадут еду.
Награждайте игроков за поиски во время путешествия, подбрасывая то, что можно обыскать. Сломанные статуи, следы, заброшенные стоянки и прочие находки сделают ваш мир реалистичнее и могут намекнуть на предстоящие сцены или события, либо же предоставить зацепки для будущих приключений.
Путешествие по дикой местности может занять несколько игровых собраний. С другой стороны, если путешествие занимает много времени, но сцен там нет, используйте подход с перемоткой путешествий, чтобы заполнить разрыв между сценами.
!!!''__Дикие чувства__''
"""На 18 уровне вы получаете сверхъестественные чувства, которые помогут вам сражаться с существами, которых вы не можете увидеть. Когда вы атакуете существо, которое не видите, ваша неспособность видеть не накладывает помеху броскам атаки по нему.
Вам также известно о местонахождении всех невидимых существ в пределах 30 футов от вас, при условии, что они не скрыты от вас, и вы не ослеплены и не оглушены."""
!!!''__Дикий инстинкт__''
"""С 7 уровня ваши инстинкты настолько обостряются, что вы совершаете с преимуществом броски инициативы.
Кроме того, если вы были захвачены врасплох в начале боя, и вы не являетесь недееспособным, вы можете в первом ходу действовать нормальным образом, но только если вы впадёте в ярость раньше всех других действий в этом ходу."""
!!!__''Дикий облик''__
Начиная со 2 уровня вы можете действием принять при помощи магии облик любого зверя, которого вы видели. Вы можете использовать это умение два раза, восстанавливая его после короткого или продолжительного отдыха.
Уровень друида определяет, в каких зверей можно превращаться. Например, на 2 уровне можно превращаться в животное с показателем опасности не более 1/4, без скорости полёта и плавания.
!!!''Облик животного''
<table class="tg">
<tr>
<th class="tg-amwm">Уровень</th>
<th class="tg-yw4l">Макс. ПО</th>
<th class="tg-yw4l">Ограничения</th>
<th class="tg-yw4l">Пример</th>
</tr>
<tr>
<td class="tg-yw4l">2</td>
<td class="tg-yw4l">1/4</td>
<td class="tg-yw4l">Без скорости плавания и полета</td>
<td class="tg-yw4l">Волк</td>
</tr>
<tr>
<td class="tg-yw4l">4</td>
<td class="tg-yw4l">1/2</td>
<td class="tg-yw4l">Без скорости полета</td>
<td class="tg-yw4l">Крокодил</td>
</tr>
<tr>
<td class="tg-yw4l">8</td>
<td class="tg-yw4l">1</td>
<td class="tg-yw4l">---</td>
<td class="tg-yw4l">Гигантский орел</td>
</tr>
</table>
"""В облике животного можно оставаться число часов, равное половине уровня друида (округляя в меньшую сторону). Затем друид возвращается в нормальный облик, если только не потратит ещё одно использование Дикого облика. Можно вернуться в нормальный облик досрочно, бонусным действием. Бессознательный, доведённый до 0 хитов или мёртвый друид сразу возвращается в нормальный облик.
Когда вы превращены, действуют следующие правила:"""
* Все игровые параметры берутся из параметров зверя, но сохраняются мировоззрение, личность и значения Интеллекта, Мудрости и Харизмы. Также у вас остаются владения навыками и спасбросками, в дополнение к таковым нового облика. Если квалификация есть и у вас и у зверя, но у него бонус выше, используется бонус зверя. Легендарные действия и действия в логове недоступны.
* Когда вы превращены, вы принимаете хиты и Кость Хитов зверя. Вернувшись в нормальный облик, ваши хиты будут такими же, как до превращения. Однако если вы вернулись в свой облик из-за опускания хитов до 0, «лишний» урон переносится на нормальный облик. Например, если вы в облике зверя получили урон 10, имея при этом 1 хит, то вы возвращаетесь в нормальный облик и получаете 9 урона. Если этот урон не довёл хиты персонажа до 0, он не теряет сознание.
* Вы не можете накладывать заклинания, а речь и действия, требующие рук, могут быть ограничены видом зверя. Превращение не прерывает вашу концентрацию на уже сотворённых заклинаниях и не мешает совершать действия, являющиеся частью заклинания, такие как в случае заклинания призыв молнии.
* Вы сохраняете преимущества от всех умений класса, расы и прочих источников, и можете пользоваться ими, если этому не препятствует новый физический облик. Однако недоступны особые чувства, такие как тёмное зрение, если только их нет у зверя.
* Вы сами определяете, какое снаряжение останется лежать на земле, какое сольётся с новым обликом, а какое будет надето. Мастер решает, какое снаряжение может носить животное, чтобы оно действовало как обычно. Снаряжение не меняет форму и размер под новый облик, и если не подходит новому облику, оно должно остаться на земле или слиться с новым обликом. Слившееся с обликом снаряжение не работает, пока вы опять не примете свой облик.
!!!''__Дикий чемпион__''
К 20 уровню вы становитесь воплощением силы дикой природы. Значение Силы и Телосложения увеличивается на 4. Максимальное значение для этих характеристик теперь 24.
//1 уровень, Очарование, Бард//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Вы шёпотом пропеваете нестройную мелодию, которую слышит только выбранное вами существо в пределах дистанции, и которая причиняет ему жуткую боль. Цель должна совершить спасбросок Мудрости. В случае провала она получает урон психической энергией 3к6 и должна немедленно реакцией переместиться прочь от вас на расстояние, равное своей скорости. Существо не будет входить в очевидно опасные места, такие как огонь или яма. При успешном спасении цель получает половину урона и не должно отходить. Глухое существо автоматически преуспевает в спасброске.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше первого.
//5 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (яичная скорлупа и перчатка из змеиной кожи)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте мерцающую руку Большого размера из полупрозрачного силового поля в свободном пространстве, которое видите в пределах дистанции. Рука существует, пока активно заклинание, и она перемещается по вашей команде, подражая движениям вашей собственной руки.
Эта рука является предметом, у которого КД 20, а количество хитов равно максимуму ваших хитов. Когда хиты руки опускаются до 0, заклинание оканчивается. У руки Сила 26 (+8), а Ловкость 10 (+0). Рука не заполняет своё пространство.
Когда вы накладываете это заклинание, а также в последующие ходы, но уже бонусным действием, вы можете перемещать руку на 60 футов и создавать ей один из следующих эффектов:
//''Могучая длань.''// Рука пытается толкнуть существо, находящееся в пределах 5 футов от неё, в выбранном вами направлении. Совершите проверку Силы руки, противопоставленную проверке Силы (Атлетика) цели. Если цель Среднего размера или меньше, вы совершаете проверку с преимуществом. В случае успеха рука толкает цель на 5 футов плюс количество футов, равное модификатору базовой характеристики, умноженному на 5. Рука перемещается вместе с целью, оставаясь в пределах 5 футов от неё.
//''Преграждающая длань.''// Рука встаёт между вами и выбранным вами существом, пока вы не отдадите руке другую команду. Рука перемещается так, что находится между вами и целью, предоставляя вам от цели укрытие на половину. Цель не может пройти сквозь пространство руки, если её значение Силы не больше значения Силы руки. Если значение Силы у цели больше, чем у руки, она может подойти к вам сквозь руку, но пространство руки для цели считается труднопроходимой местностью.
//''Сжатый кулак.''// Рука ударяет одно существо или предмет в пределах 5 футов от себя. Совершите рукопашную атаку заклинанием за руку, используя свои параметры. При попадании цель получает урон силовым полем 4к8.
//''Сжимающая длань.''// Рука пытается схватить существо с размером Огромное или меньше, находящееся в пределах 5 футов от неё. При проверке захвата вы используете значение Силы руки. Если размер цели Средний или меньше, вы совершаете проверку с преимуществом. Пока рука держит цель в захвате, вы можете бонусным действием сдавливать её рукой. Цель при этом получает дробящий урон 2к6 + модификатор вашей базовой характеристики."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, за каждый уровень ячейки выше пятого урон от сжатого кулака увеличивается на 2к8, а урон от сжимающей длани увеличивается на 2к6.
//3 уровень, Воплощение, Друид/Жрец/Паладин/Следопыт/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 час
"""Из точки, выбранной вами в пределах дистанции, распространяется сфера света с радиусом 60 футов. Сфера излучает яркий свет и тусклый свет в пределах ещё 60 футов.
Если выбранная вами точка находится на предмете, который вы держите, несёте или носите, свет исходит из предмета и перемещается вместе с ним. Если полностью накрыть источник света непрозрачным предметом, например, чашей или шлемом, свет будет заблокирован.
Если часть зоны этого заклинания накрывает зону тьмы, созданной заклинанием с уровнем не выше 3, заклинание, создавшее тьму, рассеивается."""
!!!''Договор гримуара''
"""Ваш покровитель дарует вам гримуар, который называется «Книга теней». Выберите 3 заговора из списков любых классов. Пока книга с вами, вы можете применять эти заговоры неограниченно. Они не учитываются при подсчёте максимального числа заговоров, которые вы можете знать, и считаются для вас заклинаниями колдуна.
Если вы теряете книгу, вам нужно провести ритуал длительностью в 1 час, чтобы получить новую от своего покровителя. Вы можете провести этот ритуал во время короткого или продолжительного отдыха. Предыдущая книга при этом уничтожается. Книга обращается в прах при вашей смерти."""
!!!''Договор клинка''
"""Вы можете действием создать оружие договора в своей пустой руке. Вы сами выбираете форму этого рукопашного оружия каждый раз, когда создаёте (смотрите варианты оружия в главе 5). Вы получаете владение этим оружием, пока используете его. Оружие считается магическим при определении преодоления сопротивления и иммунитета от немагических атак и урона.
Оружие договора исчезает, если оно в течении 1 минуты находится дальше 5 футов от вас. Оно также исчезает, если вы используете это умение ещё раз, отзываете оружие (действие не требуется), или умираете. Вы можете трансформировать одно магическое оружие в своё оружие договора, проведя специальный ритуал, держа это оружие. Ритуал совершается 1 час, его можно провести во время короткого отдыха. Впоследствии вы можете отозвать оружие, помещая его между измерениями. Оно будет появляться в руке, когда вы будете в дальнейшем создавать оружие договора. Вы не можете сделать это с артефактом или разумным оружием. Оружие перестаёт быть оружием договора, когда вы умираете, выполняете часовой ритуал с другим оружием или когда вы исполните ритуал длиной в час для того, чтобы разорвать связь. Оружие материализуется у ваших ног, если в момент разрыва связи оно находилось между измерениями."""
!!!''Договор цепи''
"""Вы узнаёте заклинание поиск фамильяра и можете использовать его как ритуал. Это заклинание не учитывается при подсчёте числа заклинаний, которые вы можете знать.
Когда вы накладываете это заклинание, вы можете выбрать одну из обычных форм для вашего фамильяра, либо одну из особых форм: бес, квазит, псевдодракон или спрайт.
Кроме того, когда вы совершаете действие Атака, вы можете вместо одной своей атаки позволить атаковать один раз фамильяру. При этом он совершает свою атаку реакцией."""
!!!__''Домен бури''__
Боги, чьи портфолио включают домен бури — в том числе Талос, Амберли, Корд, Зебоим, Поглотитель, Зевс и Тор — правят бурями, морями и небесами. Среди них боги грома и молний, боги землетрясений, некоторые боги огня и насилия, физической силы и бесстрашия. В некоторых пантеонах боги этого домена правят другими божествами, и известны скорым судом, заканчивающимся ударом молнии. В пантеонах мореходов боги этого домена являются божествами океана и покровителями моряков. Боги бури отправляют своих жрецов внушать страх простым смертным, либо наставляя людей на праведный путь, либо заставляя их приносить жертвы, чтобы избежать божественного гнева.
''Заклинания домена бури''
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>волна грома, туманное облако</td>
</tr>
<tr>
<td>3</td>
<td>дребезги, порыв ветра</td>
</tr>
<tr>
<td>5</td>
<td>метель, призыв молнии</td>
</tr>
<tr>
<td>7</td>
<td>власть над водами, град</td>
</tr>
<tr>
<td>9</td>
<td>нашествие насекомых, разрушительная волна</td>
</tr>
</table>
!!!''Бонусное владение''
На 1 уровне вы осваиваете владение воинским оружием и тяжёлыми доспехами.
!!!''Гнев бури''
"""Кроме того, на 1 уровне вы можете громогласно покарать атакующих. Если существо в пределах 5 футов от вас, которое вы можете видеть, успешно попадает по вам атакой, вы можете реакцией заставить существо совершить спасбросок Ловкости. Существо получает урона звуком или электричеством (по вашему выбору) 2к8, если провалит спасбросок, и половину этого урона если преуспеет.
Вы можете использовать это умение количество раз, равное вашему модификатору Мудрости (минимум 1 раз). Вы восстанавливаете все потраченные применения, когда завершаете продолжительный отдых."""
!!!''Божественный канал: Разрушительный гнев''
"""Начиная со 2 уровня вы можете использовать Божественный канал, чтобы овладеть могуществом бури с необузданной свирепостью.
Когда вы совершаете бросок урона звуком или электричеством, вы можете использовать Божественный канал, чтобы причинить максимальный урон вместо броска."""
!!!''Удар грома''
На 6 уровне, когда вы причиняете урон электричеством существу с размером Большое или меньше, вы также можете оттолкнуть его на 10 футов от себя.
!!!''Божественный удар''
На 8 уровне вы получаете способность наполнять удары своего оружия божественной энергией. Один раз в каждый свой ход, когда вы попадаете по существу атакой оружием, вы можете причинить цели дополнительный урон звуком 1к8. Когда вы достигаете 14 уровня, дополнительный урон возрастает до 2к8.
!!!''Рождённый бурей''
На 17 уровне у вас появляется скорость полёта, равная вашей текущей наземной скорости передвижения, когда вы не под землёй и не в помещении.
!!!__''Домен войны''__
Война имеет много проявлений. Она может сделать героев из обычных людей. Она может быть отчаянной и ужасающей, с проявлениями жестокости и трусости, затмевающими примеры мастерства и бесстрашия. В любом случае, боги войны следят за воинами и вознаграждают за великие свершения. Жрецы таких богов отличаются в битве, вдохновляя остальных сражаться или призывая к насилию в своих молитвах. Среди богов войны есть чемпионы чести и рыцарства (такие как Торм, Хиронеус и Кири-Джолит), а также боги разрушения и мародёрства (такие как Эритнул, Ярость, Груумш и Арес) и боги завоеваний и покорения (такие как Бэйн, Хекстор и Маглубиет). Другие боги войны (такие как Темпус, Ника и Нуада) занимают более нейтральную позицию, содействуя войне во всех её проявлениях и поддерживая воинов в любых обстоятельствах.
''Заклинания домена войны''
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>божественное благоволение, щит веры</td>
</tr>
<tr>
<td>3</td>
<td>божественное оружие, магическое оружие</td>
</tr>
<tr>
<td>5</td>
<td>духовные стражи, мантия крестоносца</td>
</tr>
<tr>
<td>7</td>
<td>каменная кожа, свобода перемещения</td>
</tr>
<tr>
<td>9</td>
<td>небесный огонь, удержание чудовища</td>
</tr>
</table>
!!!''Бонусное владение''
На 1 уровне вы осваиваете владение воинским оружием и тяжёлыми доспехами.
!!!''Боевой священник''
"""Начиная с 1 уровня ваш бог наделяет вас воодушевлением, когда вы вступаете в битву. Когда вы используете действие Атака, вы можете совершить одну атаку оружием бонусным действием.
Вы можете использовать это умение количество раз, равное вашему модификатору Мудрости (минимум 1 раз). Вы восстанавливаете все потраченные использования, когда завершаете продолжительный отдых."""
!!!''Божественный канал: Направленный удар''
Начиная со 2 уровня вы можете использовать Божественный канал, чтобы нанести удар со сверхъестественной точностью. Когда вы совершаете бросок атаки, вы можете использовать Божественный канал, чтобы получить бонус +10 к броску. Вы можете решить, применять ли это умение, после того как увидите результат броска, но до того как Мастер скажет, попала атака или промахнулась.
!!!''Божественный канал: Благословение бога войны''
С 6 уровня, если существо в пределах 30 футов от вас совершает бросок атаки, вы можете реакцией предоставить этому существу бонус +10 к броску, использовав Божественный канал. Вы можете решить, применять ли это умение, после того как увидели результат броска, но до того как Мастер скажет, попала атака или промахнулась.
!!!''Божественный удар''
На 8 уровне вы получаете способность наполнять удары своего оружия божественной энергией. Один раз в каждый свой ход, когда вы попадаете по существу атакой оружием, вы можете причинить цели дополнительный урон 1к8 того же вида, что и у оружия. Когда вы достигаете 14 уровня, дополнительный урон увеличивается до 2к8.
!!!''Воплощение битвы''
На 17 уровне вы получаете сопротивление к дробящему, колющему и рубящему урону от немагического оружия.
!!!__''Домен жизни''__
Домен жизни сосредоточен на трепещущей позитивной энергии — одной из фундаментальных сил вселенной, которая поддерживает жизнь. Боги жизни способствуют жизнеспособности и здоровью, исцеляя больных и раненых, заботясь о нуждающихся, и отгоняя нежить и силы смерти. Почти любое не злое божество может претендовать на влияние в этом домене, особенно божества земледелия (такие как Чонтиа, Аравай и Деметра), боги солнца (такие как Латандер, Пелор и Ра-Хорахти), боги исцеления и выносливости (такие как Ильматер, Мишакаль, Аполлон и Диан Кехт) и боги домашнего очага и общин (такие как Гестия, Хатор и Болдрей).
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>благословение, лечение ран</td>
</tr>
<tr>
<td>3</td>
<td>божественное оружие, малое восстановление</td>
</tr>
<tr>
<td>5</td>
<td>возрождение, маяк надежды</td>
</tr>
<tr>
<td>7</td>
<td>защита от смерти, страж веры</td>
</tr>
<tr>
<td>9</td>
<td>множественное лечение ран, оживление</td>
</tr>
</table>
!!!''Бонусное владение''
На 1 уровне вы осваиваете владение тяжёлыми доспехами.
!!!''Поборник жизни''
Начиная с 1 уровня ваши лечащие заклинания становятся более эффективными. Каждый раз, когда вы используете заклинание 1 уровня или выше, восстанавливающее хиты существу, это существо восстанавливает дополнительно число хитов, равное 2 + уровень заклинания.
!!!''Божественный канал: Сохранение жизни''
"""Начиная со 2 уровня, вы можете использовать Божественный канал, чтобы лечить тяжёлые ранения.
Вы действием демонстрируете свой священный символ и призываете целительную энергию, которая может восстановить число хитов, равное вашему уровню жреца, умноженному на пять. Выберите любых существ в пределах 30 футов от себя и распределите эти хиты между ними. Это умение не может восстановить существу хиты выше половины от его максимума. Вы не можете использовать это умение на нежити и конструктах."""
!!!''Благословенный целитель''
Начиная с 6 уровня заклинания лечения, которые вы накладываете на других, также лечат и вас. Когда вы творите заклинание 1 уровня или выше, которое восстанавливает хиты другому существу, вы восстанавливаете число хитов, равное 2 + уровень заклинания.
!!!''Божественный удар''
На 8 уровне вы получаете способность наполнять удары своего оружия божественной энергией. Один раз в каждый свой ход, когда вы попадаете по существу атакой оружием, вы можете причинить цели дополнительный урон излучением 1к8. Когда вы достигаете 14 уровня, дополнительный урон возрастает до 2к8.
!!!''Высшее исцеление''
Начиная с 17 уровня, если вы должны бросить одну или несколько костей, чтобы восстановить заклинанием хиты, вы для каждой кости используете максимальное значение. Например, вместо восстановления существу 2к6 хитов, вы восстанавливаете 12.
!!!__''Домен знания''__
Боги знаний — в том числе Огма, Боккоб, Гилеан, Ауреон и Тот — ценят образованность и понимание прежде всего. Некоторые учат собирать знания и делать их доступными в библиотеках и университетах, или развивать практические знания ремёсел и изобретений. Некоторые божества копят знания и хранят их в тайне для себя. А некоторые обещают своим последователям, что они получат огромную власть, если раскроют тайны мультивселенной. Последователи этих богов изучают эзотерические знания, собирают старые фолианты, исследуют тайные уголки земли, и изучают всё, что смогут. Некоторые боги развивают практические знания ремесла и изобретения, в том числе боги-кузнецы Гонд, Реоркс, Онатар, Морадин, Гефест и Гоибниу.
''Заклинания домена знаний''
<table>
<thead>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>опознание, приказ</td>
</tr>
<tr>
<td>3</td>
<td>внушение, гадание</td>
</tr>
<tr>
<td>5</td>
<td>необнаружимость, разговор с мёртвыми</td>
</tr>
<tr>
<td>7</td>
<td>магический глаз, смятение</td>
</tr>
<tr>
<td>9</td>
<td>знание легенд, наблюдение</td>
</tr>
</tbody>
</table>
!!!''Благословение знаний''
"""На 1 уровне вы можете выучить два языка на свой выбор. Вы также получаете владение двумя навыками из следующего списка: История, Магия, Природа, Религия.
Ваш бонус мастерства удваивается для всех проверок характеристик при использовании этих навыков."""
!!!''Божественный канал: Знания веков''
Начиная со 2 уровня вы можете использовать Божественный канал, чтобы получить доступ к источнику знаний. Вы действием выбираете навык или инструмент. На 10 минут вы осваиваете владение выбранным навыком или инструментом.
!!!''Божественный канал: Чтение мыслей''
"""На 6 уровне вы можете использовать свой Божественный канал, чтобы читать мысли существ. Затем вы можете использовать доступ к разуму существа, чтобы командовать им.
Выберите действием одно существо, которое вы можете видеть, находящееся в пределах 60 футов от вас. Это существо должно совершить спасбросок Мудрости. Если существо преуспело, вы не можете использовать это умение на нём, пока не завершите продолжительный отдых.
Если существо проваливает спасбросок, вы можете прочитать его поверхностные мысли (то, что у него на уме, его текущие эмоции и то, о чём оно активно думает), когда оно находится в пределах 60 футов от вас. Этот эффект длится в течение 1 минуты.
В течение этого времени вы можете действием окончить этот эффект, накладывая на существо заклинание внушение, не тратя ячейку заклинания. Цель автоматически проваливает спасбросок от этого заклинания."""
!!!''Могущественное колдовство''
Начиная с 8 уровня вы добавляете модификатор Мудрости к урону, который причиняете заговорами жреца.
!!!''Видения прошлого''
"""Начиная с 17 уровня вы можете вызывать видения прошлого, связанные с предметом, который вы держите, или находящимся вокруг вас окружением. Вы проводите не менее 1 минуты медитируя и молясь, а затем получаете призрачные туманные видения последних событий. Вы можете медитировать таким образом количество минут, равное вашему значению Мудрости, и должны поддерживать концентрацию в течение этого времени, как если бы вы творили заклинание.
После того как вы использовали это умение, вы не можете его использовать повторно, пока не окончите короткий или продолжительный отдых.
Чтение предмета. Удерживая предмет во время медитации, вы получаете видение предыдущего владельца этого предмета. После медитации в течение 1 минуты вы узнаёте, как владелец приобрёл и потерял предмет, а также самое последнее значимое событие с участием предмета и его владельца. Если предмет принадлежал другому существу в недавнем прошлом (в пределах количества дней, равного значению вашей Мудрости), вы можете потратить 1 дополнительную минуту на каждого владельца, чтобы узнать ту же информацию о нём.
Чтение окрестностей. Пока вы медитируете, вы наблюдаете видения последних событий, произошедших в непосредственной близости (комната, улица, туннель, поляна и тому подобное в пределах куба с длиной ребра 50 футов), на протяжении количества прошедших дней, равного значению вашей Мудрости. За каждую минуту медитации вы узнаёте об одном значимом событии, начиная с самого последнего. Значимые события обычно связаны с сильными эмоциями, например, битвами и предательствами, свадьбами и убийствами, родами и похоронами. Однако они могут также включать в себя более обыденные события, которые, тем не менее, важны в текущей ситуации."""
!!!__''Домен обмана''__
Боги обмана, такие как Тимора, Бешаба, Олидаммара, Странник, Гарл Златоблеск и Локи — интриганы и подстрекатели, которые постоянно бросают вызов принятому порядку среди богов и смертных. Это покровители воров, негодяев, азартных игроков, мятежников и освободителей. Их жрецы представляют разрушительные силы мира, пронзающие гордость, высмеивающие тиранов, крадущие у богатых, освобождающие пленных и попирающие бессмысленные традиции. Прямому противостоянию они предпочитают уловки, проделки, обман и воровство.
Заклинания домена обмана
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>бесследное передвижение, отражения</td>
</tr>
<tr>
<td>3</td>
<td>мерцание, рассеивание магии</td>
</tr>
<tr>
<td>5</td>
<td>переносящая дверь, превращение</td>
</tr>
<tr>
<td>7</td>
<td>изменение памяти, подчинение личности</td>
</tr>
<tr>
<td>9</td>
<td>небесный огонь, удержание чудовища</td>
</tr>
</table>
!!!''Благословение обманщика''
Когда вы выбираете этот домен на 1 уровне, вы можете действием коснуться согласного существа, отличного от вас, чтобы позволить ему совершать с преимуществом проверки Ловкости (Скрытность). Это благословение длится 1 час, или вы не используете это умение снова.
!!!''Божественный канал: Двуличность''
"""Начиная со 2 уровня вы можете использовать Божественный канал, чтобы создать иллюзорную копию себя.
Вы действием создаёте идеальную иллюзию себя, которая существует в течение 1 минуты, или пока вы не потеряете концентрацию (как если бы вы концентрировались на заклинании). Иллюзия появляется в свободном пространстве, которое вы можете видеть в пределах 30 футов от себя. Бонусным действием в свой ход вы можете переместить иллюзию на расстояние до 30 футов в пространство, которое вы можете видеть, но иллюзия должна оставаться в пределах 120 футов от вас.
На протяжении действия умения вы можете творить заклинания, как если бы вы находились в пространстве иллюзии, но вы должны использовать собственные чувства. Кроме того, когда и вы и ваша иллюзия находитесь в пределах 5 футов от существа, которое может видеть иллюзию, вы совершаете броски атаки по этому существу с преимуществом, так как иллюзия отвлекает его."""
!!!''Божественный канал: Плащ теней''
Начиная с 6 уровня вы можете использовать Божественный канал, чтобы исчезать.
Вы действием становитесь невидимым до конца своего следующего хода. Вы становитесь видимым, если атакуете или накладываете заклинание.
!!!''Божественный удар''
На 8 уровне вы получаете способность наполнять удары своего оружия ядом — это дар вашего божества. Один раз в каждый свой ход, когда вы попадаете по существу атакой оружием, вы можете причинить цели дополнительный урон ядом 1к8. Когда вы достигаете 14 уровня, дополнительный урон возрастает до 2к8.
!!!''Улучшенная двуличность''
На 17 уровне вы можете создать до четырёх копий себя, вместо одной, когда вы используете Двуличность. Бонусным действием в свой ход вы можете переместить любое количество копий на 30 футов, максимальная дистанция от вас не должна превышать 120 футов.
!!!__''Домен природы''__
Боги природы столь же разнообразны, как и сама дикая природа, от непостижимых богов глубоких лесов (таких как Сильванус, Обад-Хай, Числев, Балинор и Пан) до дружелюбных божеств, отождествляемых с родниками и рощами (таких как Эльдат). Друиды, почитающие природу в целом, могут служить одному из этих божеств, практикуя таинственные обряды и читая почти забытые молитвы на собственном тайном языке. Но многие из этих богов имеют также жрецов, героев, которые выполняют более активную роль в продвижении интересов конкретного бога природы. Эти жрецы могут охотиться на злых чудовищ, портящих лесные угодья, благословлять урожай верующих, или иссушать посевы тех, кто прогневал их богов.
Заклинания домена природы
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>дубовая кора, шипы</td>
</tr>
<tr>
<td>3</td>
<td>рост растений, стена ветров</td>
</tr>
<tr>
<td>5</td>
<td>подчинение зверя, цепкая лоза</td>
</tr>
<tr>
<td>7</td>
<td>древесный путь, нашествие насекомых</td>
</tr>
<tr>
<td>9</td>
<td>небесный огонь, удержание чудовища</td>
</tr>
</table>
!!!''Послушник природы''
На 1 уровне вы изучаете один заговор друида на свой выбор. Вы также получаете владение одним из следующих навыков: Выживание, Природа, Уход за животными.
!!!''Бонусное владение''
На 1 уровне вы осваиваете владение тяжёлыми доспехами.
!!!''Божественный канал: Очарование животных и растений''
"""Начиная со 2 уровня вы можете использовать Божественный канал, чтобы очаровать животных и растения.
Вы действием демонстрируете свой священный символ и называете имя своего божества. Все звери и растительные существа, которые могут видеть вас, и находятся в пределах 30 футов от вас, должны совершить спасбросок Мудрости. Если существо провалит спасбросок, оно становится очарованным вами на 1 минуту, или пока не получит урон. Пока существо очаровано, оно дружелюбно к вам и другим существам, которых вы укажете."""
!!!''Сдерживание стихий''
Начиная с 6 уровня, когда вы или существо в пределах 30 футов от вас получает урон звуком, кислотой, огнём, холодом или электричеством, вы можете реакцией предоставить существу сопротивление этому виду урона.
!!!''Божественный удар''
На 8 уровне вы получаете способность наполнять удары своего оружия божественной энергией. Один раз в каждый свой ход, когда вы попадаете по существу атакой оружием, вы можете причинить цели дополнительный урон огнём, холодом или электричеством (на ваш выбор) 1к8. Когда вы достигаете 14 уровня, дополнительный урон возрастает до 2к8.
!!!''Мастер природы''
На 17 уровне вы получаете способность командовать животными и растительными существами. Пока существа очарованы вашим умением Очарование животных и растений, вы можете бонусным действием в свой ход устно указать, что каждое из них будет делать в свой следующий ход.
!!!__''Домен света''__
Боги света — в том числе Хельм, Латандер, Фолтус, Бранчала, Серебряное Пламя, Беленус, Аполлон и Ра-Хорахти — представляют идеалы возрождения и обновления, истины, бдительности и красоты, часто используя символ солнца. Некоторые из этих богов сами изображаются как солнце или возничий, ведущий солнце через небо. Другие — как неутомимые часовые, чьи глаза пронзают любую тень и видят любой обман. Некоторые являются божествами красоты и артистизма, которые учат, что искусство — это средство совершенствования души. Жрецы бога света — просветлённые души, исполненные сиянием и силой проницательности своего божества, отгоняющие прочь ложь и испепеляющие тьму.
Заклинания домена света
<table>
<tr>
<th rowspan="2">Уровень жреца</th>
<th rowspan="2">Заклинания</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>палящий луч, пылающий шар</td>
</tr>
<tr>
<td>3</td>
<td>дневной свет, огненный шар</td>
</tr>
<tr>
<td>5</td>
<td>огненная стена, страж веры</td>
</tr>
<tr>
<td>7</td>
<td>наблюдение, небесный огонь</td>
</tr>
<tr>
<td>9</td>
<td>небесный огонь, удержание чудовища</td>
</tr>
</table>
!!!''Дополнительный заговор''
При выборе этого домена на 1 уровне вы получаете заговор свет, если ещё не имели его раньше.
!!!''Защищающая вспышка''
"""Кроме того, начиная с 1 уровня, вы можете создать божественный свет между собой и атакующим противником. Если вы атакованы видимым вами существом, находящимся в пределах 30 футов, вы можете реакцией создать помеху его броску атаки, вызывая перед атакующим вспышку света, до того как он попадёт или промажет. Существа, которые не могут быть ослеплены, обладают иммунитетом к этому умению.
Вы можете использовать это умение количество раз, равное вашему модификатору Мудрости (минимум один раз). Вы восстанавливаете все потраченные использования, когда завершаете продолжительный отдых."""
!!!''Божественный канал: Сияние рассвета''
"""Начиная со 2 уровня вы можете использовать Божественный канал, чтобы призывать солнечный свет, прогоняющий тьму и причиняющий урон излучением врагам.
Вы действием демонстрируете свой священный символ, и вся магическая тьма в пределах 30 футов от вас рассеивается. Кроме того, все враждебные существа в пределах 30 футов от вас должны совершить спасбросок Телосложения. Существа получают урон излучением, равный 2к10 + ваш уровень жреца в случае провала, и половину этого урона в случае успешного спасброска. Существа с полным укрытием от вас не подвержены воздействию."""
!!!''Улучшенная вспышка''
Начиная с 6 уровня вы можете использовать умение Защищающая вспышка, когда существо, которое вы можете видеть в пределах 30 футов от себя, атакует не вас, а другое существо.
!!!''Могущественное колдовство''
Начиная с 8 уровня вы добавляете модификатор Мудрости к урону, который причиняете заговорами жреца.
!!!''Корона света''
Начиная с 17 уровня вы можете действием создать ауру солнечного света, которая существует 1 минуту или пока вы не рассеете её ещё одним действием. Вы испускаете яркий свет в радиусе 60 футов и тусклый свет в радиусе ещё 30 футов. Ваши противники, находящиеся на ярком свету, совершают с помехой спасброски от любых заклинаний, причиняющих урон огнём или излучением.
__''Жрец: Домен смерти''__
Домен смерти сфокусирован вокруг сил, причиняющих смерть, а также негативной энергии, создающей нежить. Такие божества как Чемош, Мир-кул и Ви Джае — покровители некромантов, рыцарей смерти, личей, владык мумий и вампиров.
Боги домена смерти также воплощают убийство (Анубис, Баал и Пайремиус), боль (Иуз и Ловиатар), болезни и яды (Инкабулос, Талона и Моргион), а также подземный мир (Аид и Хель).
{{$:/Заклинания домена смерти}}
!!!''Бонусное владение''
Жрец выбравший этот домен, на 1 уровне осваивает владение воинским оружием.
!!!''Жнец''
На 1 уровне жрец изучает один заговор из школы Некромантии из списка любого класса. Когда этот жрец накладывает заговор школы Некромантии, в обычных условиях нацеливающийся только на одно существо, это заклинание может нацелиться на двух существ, находящихся в пределах дистанции и при этом в пределах 5 футов друг от друга.
!!!''Божественный канал: Касание смерти''
Начиная со 2 уровня, жрец может использовать Божественный канал для уничтожения касанием чужой жизненной силы.
Когда жрец попадает по существу рукопашной атакой, он может использовать Божественный канал, чтобы причинить цели дополнительный урон некротической энергией, равный 5 + его удвоенный уровень жреца.
!!!''Неизбежное разрушение''
Начиная с 6 уровня, способность жреца проводить негативную энергию улучшается. Урон некротической энергией, причиняемый заклинаниями жреца и Божественным каналом, игнорируют сопротивление урону некротической энергией.
!!!''Божественный удар''
На 8 уровне жрец получает способность наполнять удары своего оружия некротической энергией. Один раз в каждый свой ход, когда жрец попадает по существу атакой оружием, он может причинить цели дополнительный урон некротической энергией 1к8. Когда он достигает 14 уровня, дополнительный урон возрастает до 2к8.
!!!''Улучшенный жнец''
Начиная с 17 уровня, когда жрец накладывает заклинание школы Некромантии с 1 по 5 уровень, нацеливающееся только на одно существо, это заклинание может нацелиться на двух существ, находящихся в пределах дистанции и при этом в пределах 5 футов друг от друга. Если заклинание уничтожает материальные компоненты, жрец должен предоставить по полному набору для каждой цели.
!!!''__Дополнительная атака__''
Начиная с 5 уровня, если вы в свой ход совершаете действие Атака, вы можете совершить две атаки вместо одной.
!!!''__Дополнительная атака__''
"""Начиная с 5 уровня, если вы в свой ход совершаете действие Атака, вы можете совершить две атаки вместо одной.
Количество атак увеличивается до трёх на 11 уровне этого класса, и до четырёх на 20 уровне."""
Опциональные правила из этого раздела относятся к использованию значений характеристик.
!! __''Кость мастерства''__
Это опциональное правило заменяет бонус мастерства персонажа на бросок кости мастерства, добавляя тем самым больше случайности в игровой процесс, и делая сам факт наличия владения менее надёжным фактором для персонажа. Вместо того чтобы просто добавить бонус мастерства к проверке характеристики, броску атаки или спасброску, персонаж бросает кость. Приведённая ниже таблица показывает, какая именно кость соответствует уровню персонажа.
Если некое умение персонажа, например, Компетентность у плута, позволяет ему использовать удвоенный бонус мастерства, игрок бросает кость мастерства два раза, а не один.
Это правило предназначено для персонажей игроков и ПМ, имеющих уровень, но не для чудовищ, у которых уровней нет.
!!!!''Кость мастерства''
<table>
<tr>
<th>Уровень</th>
<th>Бонус мастерства</th>
<th>Кость</th>
</tr>
<tr>
<td>1-4</td>
<td>+2</td>
<td>1к4</td>
</tr>
<tr>
<td>5-8</td>
<td>+3</td>
<td>1кб</td>
</tr>
<tr>
<td>9-12</td>
<td>+4</td>
<td>1к8</td>
</tr>
<tr>
<td>13-16</td>
<td>+5</td>
<td>1k10</td>
</tr>
<tr>
<td>17-20</td>
<td>+6</td>
<td>1к12</td>
</tr>
</table>
!!__''Вариации навыков''__
Навыки диктуют условия, в которых персонаж может добавить свой бонус мастерства к проверке характеристики. Навыки определяют эти обстоятельства, отсылая к тому или иному аспекту какой-либо из шести характеристик. Например, Акробатика и Скрытность это два различных аспекта Ловкости, и персонаж может специализироваться в одном из них или же сразу в обоих.
Однако же, вы можете обойтись без навыков и использовать один из приведённых ниже вариантов правил. Выберите, какой именно более всего отвечает духу вашей кампании.
!!!''Мастерство в проверке характеристик''
При этом варианте персонаж не получает владений навыками. Вместо этого персонаж владеет использованием двух характеристик: одной, связанной с его классом, и второй, определяемой его предысторией. Приведённая ниже таблица предлагает варианты для различных классов, а характеристику, связанную с предысторией, определяете вы сами. Начиная с 1 уровня персонаж добавляет свой бонус мастерства ко всем проверкам этих характеристик.
!!!!''Владение характеристикой в зависимости от класса''
<table>
<tr>
<th>Класс</th>
<th>Проверка характеристики</th>
</tr>
<tr>
<td>Бард</td>
<td>Любая</td>
</tr>
<tr>
<td>Варвар</td>
<td>Сила, Ловкость или Мудрость</td>
</tr>
<tr>
<td>Воин</td>
<td>Сила, Ловкость или Мудрость</td>
</tr>
<tr>
<td>Волшебник</td>
<td>Интеллект или Мудрость</td>
</tr>
<tr>
<td>Друид</td>
<td>Интеллект или Мудрость</td>
</tr>
<tr>
<td>Жрец</td>
<td>Интеллект, Мудрость или Харизма</td>
</tr>
<tr>
<td>Колдун</td>
<td>Интеллект или Харизма</td>
</tr>
<tr>
<td>Монах</td>
<td>Сила, Ловкость или Интеллект</td>
</tr>
<tr>
<td>Паладин</td>
<td>Сила, Мудрость или Харизма</td>
</tr>
<tr>
<td>Плут</td>
<td>Ловкость, Интеллект, Мудрость или Харизма</td>
</tr>
<tr>
<td>Следопыт</td>
<td>Сила, Ловкость или Мудрость</td>
</tr>
<tr>
<td>Чародей</td>
<td>Интеллект или Харизма</td>
</tr>
</table>
Умение Компетентность в этом случае работает несколько иначе, чем при использовании обычных правил. На 1 уровне вместо выбора двух навыков персонаж, обладающий этим классовым умением, выбирает одну характеристику, которой он и будет владеть. Выбор этой характеристики заменяет выбор сразу обоих навыков. Если персонаж получит владение ещё одним навыком, то вместо этого он выбирает ещё одну характеристику, проверки которой он будет совершать с бонусом мастерства.
Это правило удаляет навыки из игры и не даёт возможности персонажам сильно отличаться друг от друга. Например, персонажу уже не будет смысла делать упор на убеждении или запугивании: он просто одинаково хорошо владеет и тем, и другим.
!!!''Владение за счёт предыстории''
При этом опциональном правиле у персонажей нет ни владения навыками, ни владения инструментами. То, что в обычных обстоятельствах предоставляет персонажу владение навыком или инструментом, не приносит никаких преимуществ. Вместо этого персонаж может добавлять бонус мастерства к проверкам характеристик при обстоятельствах, в которых его персонаж, согласно предыстории, привык действовать. Финальное решение о том, применима ли в данном случае предыстория, принимает Мастер.
Например, игрок, у которого персонаж обладает предысторией «благородный», может резонно заявить, что его бонус мастерства должен применяться при проверке Харизмы, когда он пытается заполучить аудиенцию у короля. Игрока надо попросить описать парой фраз, почему в данной ситуации ему помогает его предыстория. Не просто «Я — благородный», а «Перед тем как выйти на тропу приключений, я три года был послом своей семьи при дворе, так что это привычное для меня дело».
Эта простая с виду система сильно полагается на то, что игроки будут развивать истории своих персонажей. И не позволяйте возникать бесконечным спорам о том, применим ли в данной ситуации бонус мастерства персонажа. Если игрок не порет откровенную чушь об уместности его предыстории, согласитесь, и вознаградите его за старания.
Если у персонажа есть умение Компетентность, то вместо выбора навыков и инструментов, которые будут получать преимущества от этого умения, игрок определяет обстоятельства своей предыстории, в которых он получает всё те же преимущества. В примере с всё тем же персонажем, игрок может решить применить Компетентность к «ситуациям, когда важны придворные манеры и этикет», а также к «выявлению тайных заговоров, которые придворные плетут друг против друга».
!!!''Владение за счёт черт характера''
При этом опциональном правиле у персонажей нет владения навыками. Вместо этого персонаж добавляет бонус мастерства к проверкам характеристик, непосредственно связанным с положительными чертами характера. Например, персонаж с чертой характера «Я ничего не планирую заранее, но прекрасно разбираюсь с проблемами по мере их возникновения» может применить бонус когда пытается провернуть импровизированный трюк, чтобы выбраться из неприятной ситуации. При создании персонажа игроку следует создать как минимум четыре положительные черты характера.
Если на проверку характеристики оказывает влияние отрицательная черта характера, эта проверка совершается с помехой. Например, отшельник с отрицательной чертой характера «Я часто погружаюсь в свои мысли, забывая о том, что меня окружает» может совершать с помехой проверки характеристик, совершённые для обнаружения скрывающихся существ.
Если у персонажа есть умение Компетентность, игрок может применить его преимущество не на навыки и инструменты, а на черты характера, связанные с проверками характеристик. Если персонаж получает владение новым навыком или инструментом, он вместо этого получает новую положительную черту характера.
Эта система полагается на проработку игроками персонализации своих персонажей. Убедитесь, что черты характера — и положительные и отрицательные — вступают в игру с примерно одинаковой частотой. Не позволяйте игрокам обходиться положительной чертой характера, которая применима в любой ситуации, и брать отрицательные черты характера, которые не применимы практически никогда.
Если хотите, можете привязать к этой системе также идеалы, привязанности и слабости.
!!__''Очки героизма''__
Очки героизма хорошо подходят для эпического фэнтези и кампаний по мифам, в которых персонажи больше похожи на супергероев, чем обычные искатели приключений.
С этим опциональным правилом каждый персонаж начинает с 5 очками героизма на первом уровне. Каждый раз при увеличении уровня персонаж теряет все имеющиеся очки и получает новое количество, равное 5 + половина уровня персонажа.
Игрок может использовать очки при бросках атаки, проверке характеристик и спасбросках. Игрок может использовать очко после того, как бросок сделан, но до того, как применён его результат. Использование очка позволяет игроку бросить к6 и добавить его результат к результату броска к20, что, возможно, изменит результат броска с провала на успех. Игрок может использовать только 1 очко героя на бросок.
Кроме того, если персонаж проваливает спасбросок от смерти, игрок может использовать 1 очко героизма, чтобы превратить провал этого спасброска в успех.
!!__''Новые характеристики: Честь и Здравомыслие''__
Если вы ведёте кампанию, основанную на кодексе чести или постоянном риске безумия, рассмотрите возможность добавления одной или сразу двух новых характеристик: Честь и Здравомыслие. Эти характеристики работают так же, как и шесть стандартных, с исключениями, указанными ниже.
Вот как можно добавить эти характеристики при создании персонажа:
* Если ваши игроки используют стандартный набор характеристик, добавьте в набор по одному значению «11» для каждой добавляемой опциональной характеристики.
* Если ваши игроки используют опциональную систему настройки значений характеристик, добавьте к сумме по 3 очка за каждую добавляемую опциональную характеристику.
* Если ваши игроки определяют значение своих характеристик случайным образом, пусть бросят кости и для дополнительных характеристик.
Если вам понадобится совершить спасбросок Чести или Здравомыслия для чудовища, у которого нет таких характеристик, можете использовать Харизму вместо Чести и Мудрость вместо Здравомыслия.
!!!''Честь''
Если ваша кампания проходит в культуре, где жёсткий кодекс чести — часть повседневной жизни, вы можете использовать Честь как инструмент измерения приверженности персонажа такому кодексу. Он хорошо вписывается в мир, вдохновлённый азиатскими культурами, например, Кара-Тур в Забытых Королевствах. Характеристика Честь также хорошо подходит кампаниям, вращающимся вокруг рыцарских орденов.
Честь измеряет не только приверженность персонажа кодексу, но и глубину понимания этого кодекса. Значение Чести также может отражать то, как другие воспринимают честь персонажа. У персонажа с высокой Честью обычно будет репутация, о которой известно другим, особенно тем, у кого тоже высокая Честь.
В отличие от других характеристик, Честь не может быть увеличена, когда позволяется увеличивать обычные характеристики. Вместо этого вы можете увеличивать (или уменьшать) Честь персонажа в зависимости от его действий. В конце каждого приключения, если вы считаете, что действия персонажа хорошо отражали содержание его кодекса чести, вы можете увеличить его Честь на 1 Как и все другие характеристики, Честь не может быть больше 20 или меньше 1
://''Проверки Чести.''// Проверки Чести могут использоваться в ситуациях социального взаимодействия, так же как и Харизма, когда понимание персонажем подобающих правил поведения является определяющим фактором того, каким будет результат социального взаимодействия.
:Вы также можете требовать совершения проверки Чести, когда персонаж находится в одной из следующих ситуаций:
* Персонаж не уверен, как следует действовать, сохраняя честь
* Персонаж сдаётся, при этом пытаясь сохранить лицо
* Персонаж пытается определить значение Чести другого персонажа
* Персонаж старается соблюдать правила этикета в деликатной социальной ситуации
* Персонаж хочет использовать свою благочестивую или бесчестную репутацию, чтобы повлиять на кого-то
://''Спасброски Чести.''// Спасброски Чести вступают в игру в ситуациях, когда персонаж может непреднамеренно сделать что-то позорящее. Можно требовать совершения спасброска Чести в следующих ситуациях:
* Избежание случайного нарушения этикета
* Сопротивление желанию ответить на оскорбления врага
* Опознание попытки врага обманом заставить персонажа поступить бесчестно
!!!''Здравомыслие''
Вы можете использовать характеристику Здравомыслие, если ваша кампания вращается вокруг сущностей с совершенно чуждой и невыразимой натурой, как Великий Ктулху, чьи силы и приспешники могут сломить разум персонажа.
Персонаж с высоким Здравомыслием остаётся уравновешен даже перед лицом безумных обстоятельств, в то время как персонаж с низким Здравомыслием легко ломается при столкновении со сверхъестественным ужасом, выходящим за рамки нормы.
://''Проверки здравомыслия.''// Вы можете попросить персонажей совершить проверку Здравомыслия вместо проверки Интеллекта, чтоб вспомнить сведения о чужеродных безумных существах из вашей кампании, чтобы расшифровать написанное сумасшедшим или чтобы выучить заклинание из книги с запрещённым знанием. Кроме того, вы можете просить о проверке Здравомыслия, когда персонаж занимается следующими действиями:
* Расшифровка текста, написанного на таком чуждом языке, что это грозит свести персонажа с ума
* Преодоление долгосрочных эффектов безумия
* Понимание чужеродной магии, не использующей стандартные подходы
://''Спасброски Здравомыслия.''// Вы можете попросить совершить спасбросок Здравомыслия, когда персонаж сталкивается с риском безумия, например, в следующих ситуациях:
* Первая встреча с существами из Дальнего Предела или других чужеродных миров
* Прямой контакт с разумом чужеродного существа
* Эффект заклинаний, воздействующих на психическую устойчивость, таких как опция «безумие» заклинания знак
* Нахождение на демиплане, построенном на чужеродных законах физики
* Сопротивление эффекту, наложенному атакой или заклинанием, причиняющим урон психической энергией
:Проваленный спасбросок Здравомыслия приводит к кратковременному, долговременному или бессрочному безумию, как описано в главе 8. Каждый раз, когда персонаж получает долговременное или бессрочное безумие, его Здравомыслие уменьшается на 1 Заклинание высшее восстановление может восстановить потраченное из-за этого Здравомыслие, и персонаж может увеличивать Здравомыслие при увеличении уровня.
//1 уровень, Ограждение, Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (чашка воды)
:''Длительность:'' 1 час
Вас окружает защитное магическое поле, проявляющееся в виде призрачной изморози, покрывшей вас и ваше снаряжение. Вы получаете 5 временных хитов на период действия заклинания. Если существо попадает по вам рукопашной атакой, пока у вас есть эти хиты, оно получает урон холодом 5.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, и временные хиты и урон холодом увеличиваются на 5 за каждый уровень ячейки выше первого.
//Доспех (чешуйчатый), очень редкий (требуется настройка)//
Этот доспех изготавливается из чешуи определённого дракона. Иногда драконы сами собирают сброшенные чешуйки и дарят их гуманоидам. В других случаях успешные охотники тщательно выделывают и хранят шкуры убитых драконов. В любом случае, доспехи из чешуи драконов высоко ценятся.
Пока вы носите этот доспех, вы получаете бонус +1 к КД совершаете с преимуществом спасброски от Ужасающей внешности и оружия дыхания драконов, а также обладаете сопротивлением к одному виду урона, зависящему от вида дракона, чья чешуя была использована для изготовления доспеха (смотрите таблицу).
Кроме того, вы можете действием сосредоточиться, чтобы с помощью магии определить расстояние и направление до ближайшего дракона в пределах 30 миль, вид которого совпадает с видом дракона, чья чешуя была использована для изготовления доспеха. Это особое действие нельзя повторно совершать до следующего рассвета.
<table>
<tr>
<th>Дракон</th>
<th>Сопротивление</th>
<th>Дракон</th>
<th>Сопротивление</th>
</tr>
<tr>
<th>Белый</th>
<td>Холод</td>
<th>Латунный</th>
<td>Огонь</td>
</tr>
<tr>
<th>Бронзовый</th>
<td>Электричество</td>
<th>Медный</th>
<td>Кислота</td>
</tr>
<tr>
<th>Зелёный</th>
<td>Яд</td>
<th>Серебряный</th>
<td>Холод</td>
</tr>
<tr>
<th>Золотой</th>
<td>Огонь</td>
<th>Синий</th>
<td>Электричество</td>
</tr>
<tr>
<th>Красный</th>
<td>Огонь</td>
<th>Чёрный</th>
<td>Кислота</td>
</tr>
</table>
//Доспех (лёгкий, средний или тяжёлый), необычный//
Пока вы носите этот доспех, вы обладаете скоростью плавания, равной скорости вашей ходьбы. Кроме того, каждый раз, когда вы начинаете ход, находясь под водой и с 0 хитов, вы поднимаетесь к поверхности на 60 футов. Данный доспех искусно декорирован различными мотивами с изображениями рыб и морских раковин.
//Доспех (латный), легендарный (требуется настройка)//
Вы получаете сопротивление к немагическому урону, пока носите этот доспех. Кроме того, вы можете действием получить иммунитет к немагическому урону на 10 минут или пока вы не снимете этот доспех. Вы не можете повторно использовать это особое действие до следующего рассвета.
//Доспех (лёгкие, средний, тяжёлый), редкий (требуется настройка)//
Вы получаете сопротивление к одному из видов урона, пока носите этот доспех. Мастер выбирает вид урона сам или случайным образом, из представленных ниже вариантов.
<table>
<tr>
<th>к10</th>
<th>Вид урона</th>
<th>к10</th>
<th>Вид урона</th>
</tr>
<tr>
<th>1</th>
<td>Звук</td>
<th>6</th>
<td>Психическая энергия</td>
</tr>
<tr>
<th>2</th>
<td>Излучение</td>
<th>7</th>
<td>Силовое поле</td>
</tr>
<tr>
<th>3</th>
<td>Кислота</td>
<th>8</th>
<td>Холод</td>
</tr>
<tr>
<th>4</th>
<td>Некротическая энергия</td>
<th>9</th>
<td>Электричество</td>
</tr>
<tr>
<th>5</th>
<td>Огонь</td>
<th>10</th>
<td>Яд</td>
</tr>
</table>
!!!''Доспех теней''
"""Вы можете неограниченно накладывать на себя заклинание доспехи мага, не тратя ячейки заклинаний и материальные компоненты."""
//Доспех (латы), редкий (требуется настройка)//
Когда вы надеваете этот доспех, вы получаете сопротивление к одному из следующих видов урона: дробящий, колющий или рубящий. Мастер определяет вид урона самостоятельно или случайным образом.
//''Проклятье.''// Этот доспех проклят, но это становится понятно только когда на него используется заклинание опознание или когда вы настраиваетесь на него. Настройка на доспех проклинает вас до тех пор, пока вы не станете целью заклинания снятие проклятья или похожей магии. Снятие до-спеха не прекращает проклятье. Пока вы прокляты, вы получаете уязвимость к двум оставшимся видам урона, исключая тот, к которому доспех даёт сопротивление.
//Доспех (лёгкий, средний или тяжёлый), редкий (+1), очень редкий (+2) или легендарный (+3)//
Вы получаете бонус к КД, пока носите этот доспех. Бонус определяется редкостью доспеха.
Миры D&D — широкий гобелен, сотканный из разнообразных культур, где каждая находится на своём технологическом уровне. Поэтому искателям приключений могут попасться самые разнообразные доспехи, от кожаных курток и кольчуг до дорогих лат. Таблица «Доспехи» приводит характеристики самых распространённых доспехов, разделённых на три категории: лёгкие, средние и тяжёлые. Многие воители дополняют доспехи щитом.
Таблица «Доспехи» показывает стоимость, вес и прочие свойства самых распространённых доспехов в мирах D&D.
<<<
!!!''Вариант: Подгонка снаряжения''
"""В большинстве кампаний можно носить и использовать любое найденное снаряжение в рамках здравого смысла. Например, грузный полуорк не сможет втиснуться в кожаный доспех полурослика, а гном запутается в мантии облачного великана.
Мастер может усилить этот реализм. Например, доспех, изготовленный под одного человека, не подойдёт другому без значительных изменений, и униформа стражника может выглядеть заметно чужеродной, если искатель приключений оденет её для маскировки.
По этим дополнительным правилам когда искатели приключений находят доспех, одежду или другой похожий предмет, предназначенный для носки, им нужно посетить изготовителя доспехов, портного, кожевника или другого специалиста, который подгонит этот предмет для них. Стоимость этой работы составляет от 10 до 40 процентов от рыночной стоимости предмета. Мастер может определить стоимость методом 1к4 × 10 или самостоятельно решить, какую назначить цену, основываясь на итоговой сумме."""
<<<
"""//''Владение доспехами.''// Кто угодно может напялить доспех или пристегнуть щит к руке. Но только тот, кто знает, как носить доспех, может носить его эффективно. Ваш класс даёт владение некоторыми видами доспехов. Если вы носите доспех, которым не владеете, вы совершаете с помехой все проверки характеристик, спасброски и броски атаки, использующие Силу или Ловкость, и вы не можете накладывать заклинания.
//''Класс Доспеха (КД).''// Доспех защищает владельца от атак. Надетый доспех (и щит) определяет базовый Класс Доспеха.
//''Тяжёлые доспехи.''// Более тяжёлые доспехи мешают владельцу свободно и тихо перемещаться. Если в колонке доспеха написано «Сил 13» или «Сил 15», этот доспех уменьшает скорость владельца на 10 футов, если его значение Силы меньше указанного.
//''Скрытность.''// Если в колонке доспеха написано «Помеха», владелец совершает проверки Ловкости (Скрытность) с помехой.
//''Щиты.''// Щит изготавливается из дерева или металла, и несётся одной рукой. Использование щита увеличивает КД на 2. Вы получаете преимущество только от одного щита одновременно."""
!!''Доспехи''
<table>
<tr>
<th>Доспех</th>
<th>Стоимость</th>
<th>Класс Доспеха (КД)</th>
<th>Сила</th>
<th>Скрытность</th>
<th>Вес</th>
</tr>
<tr>
<th colspan="6">Лёгкий доспех</th>
</tr>
<tr>
<td>Стёганный</td>
<td>5 зм</td>
<td>11 + модификатор Лов</td>
<td>—</td>
<td>Помеха</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Кожаный</td>
<td>10 зм</td>
<td>11 + модификатор Лов</td>
<td>—</td>
<td>—</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Проклёпанная кожа</td>
<td>45 зм</td>
<td>12 + модификатор Лов</td>
<td>—</td>
<td>—</td>
<td>13 фнт.</td>
</tr>
<tr>
<th colspan="6">Средний доспех</th>
</tr>
<tr>
<td>Шкурный</td>
<td>10 зм</td>
<td>12 + модификатор Лов (макс. 2)</td>
<td>—</td>
<td>—</td>
<td>12 фнт.</td>
</tr>
<tr>
<td>Кольчужная рубаха</td>
<td>50 зм</td>
<td>13 + модификатор Лов (макс. 2)</td>
<td>—</td>
<td>—</td>
<td>20 фнт.</td>
</tr>
<tr>
<td>Чешуйчатый</td>
<td>50 зм</td>
<td>14 + модификатор Лов (макс. 2)</td>
<td>—</td>
<td>Помеха</td>
<td>45 фнт.</td>
</tr>
<tr>
<td>Кираса</td>
<td>400 зм</td>
<td>14 + модификатор Лов (макс. 2)</td>
<td>—</td>
<td>—</td>
<td>20 фнт.</td>
</tr>
<tr>
<td>Полулаты</td>
<td>750 зм</td>
<td>15 + модификатор Лов (макс. 2)</td>
<td>—</td>
<td>Помеха</td>
<td>40 фнт.</td>
</tr>
<tr>
<th colspan="6">Тяжёлый доспех</th>
</tr>
<tr>
<td>Колечный</td>
<td>30 зм</td>
<td>14</td>
<td>—</td>
<td>Помеха</td>
<td>40 фнт.</td>
</tr>
<tr>
<td>Кольчуга</td>
<td>75 зм</td>
<td>16</td>
<td>Сил 13</td>
<td>Помеха</td>
<td>55 фнт.</td>
</tr>
<tr>
<td>Наборный</td>
<td>200 зм</td>
<td>17</td>
<td>Сил 15</td>
<td>Помеха</td>
<td>60 фнт.</td>
</tr>
<tr>
<td>Латы</td>
<td>1,500 зм</td>
<td>18</td>
<td>Сил 15</td>
<td>Помеха</td>
<td>65 фнт.</td>
</tr>
<tr>
<th colspan="6">Щит</th>
</tr>
<tr>
<td>Щит</td>
<td>10 зм</td>
<td>+2</td>
<td>—</td>
<td>—</td>
<td>6 фнт.</td>
</tr>
</table>
!!!__''Лёгкий доспех''__
"""Лёгкие доспехи, изготовленные из лёгких и тонких материалов, предпочитают ловкие искатели приключений, поскольку те предоставляют защиту, и при этом не ограничивают подвижность. Если вы носите лёгкий доспех, вы при определении Класса Доспеха добавляете модификатор Ловкости к базовому числу, предоставленному доспехом.
//''Стёганый.''// Стёганый доспех состоит из прошитых слоёв ткани и ватина.
//''Кожаный.''// Нагрудник и плечи этого доспеха изготовлены из кожи, вываренной в масле. Остальные части доспеха сделаны из более мягких и гибких материалов.
//''Проклёпанная кожа.''// Изготовленный из крепкой, но гибкой кожи проклёпанный доспех усилен тесно расположенными шипами или заклёпками."""
!!!__''Средний доспех''__
"""Средние доспехи предлагают лучшую защиту, чем лёгкие, но немного ограничивают перемещение. Если вы носите средний доспех, вы при определении Класса Доспеха к базовому числу, предоставленному доспехом, добавляете модификатор Ловкости, но не более +2.
//''Шкурный.''// Этот грубый доспех состоит из толстых мехов и шкур. Обычно их носят племена варваров, злые гуманоиды и прочие народы, у которых нет инструментов и материалов для создания более качественных доспехов.
//''Кольчужная рубаха.''// Сделанная из переплетённых металлических колец кольчужная рубаха носится между слоями одежды или кожи. Этот доспех предоставляет умеренную защиту торса и заглушает звон колец внешним покрытием.
//''Чешуйчатый доспех.''// Этот доспех состоит из кожаных куртки и поножей (а также, возможно, отдельной юбки), покрытых перекрывающимися кусочками металла, похожими на рыбную чешую. В комплект входят рукавицы.
//''Кираса.''// Этот доспех состоит из подогнанного металлического панциря, носимого с подкладкой из кожи. Несмотря на то, что руки и ноги остаются практически без защиты, этот доспех хорошо защищает жизненно важные органы, оставляя владельцу относительную подвижность.
//''Полулаты.''// Полулаты состоят из сформированных металлических пластин, покрывающих большую часть тела владельца. В них не входит защита для ног кроме простых поножей, закреплённых кожаными ремнями."""
!!!__''Тяжёлый доспех''__
"""Из всех видов доспехов, тяжёлые доспехи предоставляют лучшую защиту. Эти комплекты доспехов покрывают всё тело и созданы для защиты от самых разных атак. Их вес и нагрузку могут выдержать только самые тренированные воители.
Тяжёлый доспех не позволяет добавлять к Классу Доспеха модификатор Ловкости, но и не даёт штраф, если модификатор Ловкости отрицательный.
//''Колечный доспех.''// Это кожаный доспех с нашитыми на него толстыми кольцами. Эти кольца усиливают доспех от ударов мечей и топоров. Колечный доспех хуже кольчуги, и обычно его носят только те, кто не могут позволить себе доспех получше.
//''Кольчуга.''// Изготовленная из переплетающихся металлических колец кольчуга включает также слой стёганой ткани, надеваемой под низ, дабы предотвратить натирание и смягчать удары. В комплект входят рукавицы.
//''Наборный доспех.''// Этот доспех состоит из узких вертикальных металлических пластин, приклёпанных к кожаной подложке, носимой поверх слоя ватина. Соединения защищаются кольчужным полотном.
//''Латы.''// Латы состоят из сформированных металлических пластин, покрывающих всё тело. В комплект лат входят рукавицы, тяжёлые кожаные сапоги, шлем с забралом, и толстый слой ватина. Ремешки и пряжки распределяют вес по всему телу."""
!!! __''Надевание и снятие доспехов''__
"""Время, нужное для надевания и снятия доспехов, зависит от их вида.
Надевание. Столько времени требуется для надевания доспеха. Вы получаете КД от доспеха только если потратили нужное время на его надевание.
Снимание. Столько времени требуется на снятие доспеха. Если вам помогают, уменьшите время вдвое."""
<table>
<tr>
<th>Вид</th>
<th>Надевание</th>
<th>Снятие</th>
</tr>
<tr>
<td>Лёгкий доспех</td>
<td>1 минута</td>
<td>1минута</td>
</tr>
<tr>
<td>Средний доспех</td>
<td>5 минут</td>
<td>1 минута</td>
</tr>
<tr>
<td>Тяжёлый доспех</td>
<td>10 минут</td>
<td>5 минут</td>
</tr>
<tr>
<td>Щит</td>
<td>1 действие</td>
<td>1 действие</td>
</tr>
</table>
//1 уровень, Ограждение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (кусочек выделанной кожи)
:''Длительность:'' 8 часов
Вы касаетесь согласного существа, не носящего доспех, и на время действия заклинания его окутывает защитное магическое поле. Базовый КД существа становится равен 13 + его модификатор Ловкости. Заклинание оканчивается, если цель надевает доспех или вы оканчиваете его действием.
//"""
Её отец не двигаясь стоял на первой из трёх ступенек, ведущих вниз от портала. Чешуйки на его лице стали бледнее по краям, но Безродный Мехен всё ещё выглядел так, будто мог бы побороть лютого медведя. Его привычные изношенные доспехи сменила чешуйчатая броня фиолетового оттенка с ярким серебристым рисунком. Ещё на его рукаве был герб, знак какого-то чужого дома. Меч за его спиной был тот же, что он носил до того, как нашёл близнецов у ворот Аруш Ваема.
Фаридэ научилась читать, что скрывается за выражением лица её отца; этот навык ей посчастливилось усвоить. Человек, не способный даже заметить движение её глаз, смог бы увидеть в лице Мехена Безродного только полное безразличие. Но она многое могла сказать по сдвигу чешуек, изгибу гребня, очертаниям глаз и его оскалу.
Но сейчас чешуя была абсолютно неподвижна, и даже Фаридэ не видела в его лице ничего, кроме безразличия дракона."""//"""
— Эрин М. Эванс, Соперник
"""
Рождённые драконами, о чём говорит их название, драконорождённые идут гордо подняв голову по миру, который встречает их со страхом и непониманием. Сформированные драконьими богами или самими драконами, драконорождённые первоначально вылупились из драконьих яиц как новая раса, сочетающая в себе лучшие качества драконов и гуманоидов. Некоторые драконорождённые являются верными слугами истинных драконов, другие образуют ряды солдат в великих войнах, а некоторые ищут свою судьбу, не найдя себе призвания.
!!! ''__Гордый драконий род__''
Драконорождённые выглядят как драконы, стоящие на задних лапах и принявшие гуманоидную форму, потеряв при этом крылья и хвост. Первые из них обладали чешуёй оттенков, присущих драконам разных видов, но поколения непрерывного скрещивания привели к появлению единого цвета. Их маленькие, аккуратные чешуйки обычно цвета меди или латуни, иногда с алым, золотым, медно-зелёным или рыжим оттенком. Они высоки и крепки, часто достигая шести с половиной футов (двух метров) в высоту и обладая весом свыше 300 фунтов (130 килограмм). Их крепкие, четырёхпалые конечности снабжены пальцами, не уступающими по прочности когтям.
Кровь определённых видов драконов чрезвычайно сильна в представителях некоторых кланов. Эти драконорождённые часто гордятся тем, что цвет их чешуи близок к цвету их прародителей — ярко красный, зелёный, синий или белый, глянцево-чёрный или блестяще-золотой, серебряный, латунный, медный или бронзовый.
!!! ''__Самодостаточные кланы__''
Для каждого драконорождённого его клан важнее собственной жизни. Они ставят свою преданность и уважение клану выше всего, даже богов. Каждый поступок драконорождённого отражается на чести его клана, и тот, кто опозорил свой клан, может быть изгнан. Каждый драконорождённый знает своё место и свои обязанности в клане, и долг чести заставляет их придерживаться этого места.
Постоянное стремление к самосовершенствованию отражает самодостаточность всей расы драконорождённых в целом. Они ценят мастерство и совершенство во всём, к чему прикладывают усилия. Драконорождённые ненавидят проигрывать, и они приложат все возможные силы к достижению цели, прежде чем откажутся от неё. Они часто делают достижение мастерства в каком-либо навыке целью всей своей жизни. Представители других рас, разделяющие эти взгляды, могут легко завоевать уважение среди драконорождённых.
Однако, несмотря на стремление к самодостаточности, они понимают, что в трудной ситуации без помощи бывает не обойтись. Но лучший источник помощи это твой клан. А если помощь требуется всему клану, то они скорее обратятся к другому клану драконорождённых, чем к представителям других рас, или даже к помощи богов.
!!! ''__Имена драконорождённых__''
Драконорождённые получают личные имена при рождении, но в знак уважения они на первое место ставят название клана. Детское имя или прозвище обычно используется среди представителей одного выводка как неофициальное. Такое имя может указывать на некоторое событие из жизни драконорождённого или его привычку.
;Мужские имена:
:Арджхан, Баласар, Бхараш, Гхеш, Донаар, Крив, Медраш, Мехен, Надарр, Панджед, Патрин, Рхогар, Тархун, Торинн, Хескан, Шамаш, Шединн
;Женские имена:
:Акра, Бири, Даар, Джхери, Кава, Коринн, Мисханн, Нала, Перра, Райанн, Сора, Сурина, Тхава, Уаджит, Фариде, Хавилар, Харанн
;Детские имена:
:Кривоухий, Липучка, Праведник, Скалолаз, Фанатик, Щитогрыз
;Названия кланов:
:Версисатургиеш, Даардендриан, Делмирев, Драчедандион, Кепешкмолик, Керрилон, Кимбатуул, Клестинсиаллор, Линксакасендалор, Мястан, Неммонис, Нориксиус, Офиншталажир, Прексижандилин, Турнурот, Фенкенкаьрадон, Шестенделиат, Яржерит
<<<
"""
''Необычные расы''
Драконорождённые и все последующие расы из этого раздела являются необычными. Они существуют не во всех мирах D&D, и даже там, где они присутствуют, они распространены гораздо меньше, чем дварфы, люди, полурослики и эльфы.
В многонациональных городах мультивселенной D&D большинство обитателей вряд ли заинтересуется представителем даже самой экзотической расы, Но в маленьких городках и деревнях всё по-другому. Обычные люди не привыкли видеть представителей таких рас, и будут вести себя соответственно.
''Гномы.'' Гномы не выглядят опасными, и могут хорошей шуткой быстро разрушить подозрения. Обычные люди относятся к ним с любопытством, если никогда их прежде не видели, и вряд ли будут враждебны к ним.
''Драконорождённые.'' Легко предположить, что драконорождённые это чудовища, особенно если цвет их чешуи выдаёт их родство с цветными драконами. Однако пока драконорождённый не начинает дышать огнём и сеять разрушение, большинство людей скорее проявят интерес, чем открытый страх.
''Полуорки.'' Принято считать, что полуорки агрессивны и легко впадают в ярость, так что люди ведут себя осторожно в присутствии незнакомого полуорка. Торговцы могут тайком прятать наиболее ценные или хрупкие товары при появлении полуорка, и люди потихоньку покидают таверны, опасаясь возможной драки.
''Полуэльфы.'' Несмотря на то, что большинство людей никогда не видели полуэльфа, каждый знает, что они существуют. Появление незнакомого полуэльфа скорее сопровождается перешёптыванием и бросаемыми исподтишка взглядами, чем открытой заинтересованностью или враждебностью.
''Тифлинги.'' Если полуорков встречают с обоснованными опасениями, то тифлинги вызывают сверхъестественный страх. Зло оставило такой ясный отпечаток на их внешности, что многие полагают, будто тифлинги могут оказаться настоящими чертями прямо из Девяти Преисподних. Люди делают ограждающие от зла знаки при их приближении, переходят на другую сторону улицы или запирают двери при их приближении.
"""
<<<
!!! ''__Особенности драконорождённых__''
"""
Ваше драконье наследие проявляется в ряде качеств, общих для всех драконорождённых.
''Увеличение характеристики.'' Значение вашей Силы увеличивается на 2, а значение Харизмы увеличивается на 1.
''Возраст.'' Юные драконорождённые растут быстро. Они начинают ходить через час после вылупления, к трём годам достигают роста и сложения 10-летнего человека, и становятся взрослыми в 15. Живут они примерно до 80 лет.
''Мировоззрение.'' Драконорождённые склонны к крайностям, сознательно выбирая ту или иную сторону во вселенской борьбе добра и зла (представленных, соответственно Багамутом и Тиамат). Большинство драконорождённых добры, но те, кто принял сторону Тиамат, могут быть чрезвычайно жестокими.
''Размер.'' Драконорождённые выше и тяжелее людей, их рост около 6 футов (2 метров) и вес около 250 фунтов (115 килограмм). Ваш размер — Средний.
Скорость. Ваша базовая скорость перемещения составляет 30 футов.
''Наследие драконов. ''Вы получаете драконье наследие. Выберите тип дракона из таблицы «Наследие драконов». Вы получаете оружие дыхания и сопротивление к урону соответствующего вида, как указано в таблице.
''Оружие дыхания.'' Вы можете действием выдохнуть разрушительную энергию. Ваше наследие драконов определяет размер, форму и вид урона вашего выдоха.
Когда вы используете оружие дыхания, все существа в зоне выдоха должны совершить спасбросок, вид которого определяется вашим наследием. Сложность этого спасброска равна 8 + ваш модификатор Телосложения + ваш бонус мастерства. Существа получают урона 2к6 в случае проваленного спасброска, или половину этого урона, если спасбросок был успешен. Урон повышается до 3к6 на 6 уровне, до 4к6 на 11, и до 5к6 на 16 уровне.
После использования оружия дыхания вы не можете использовать его повторно, пока не завершите короткий либо продолжительный отдых.
''Сопротивление урону.'' Вы получаете сопротивление к урону того вида, который указан в вашем наследии драконов.
''Языки.'' Вы можете говорить, читать и писать на Общем и Драконьем языках. Драконий язык считается одним из старейших и часто используется во время изучения магии. Этот язык звучит грубо для большинства других существ, и содержит много твёрдых согласных и шипящих звуков.
"""
!!! ''Наследие драконов''
|!Дракон|!Вид урона|!Оружие дыхания|
|Белый|Холод|15-футовый конус (спас. Тел.)|
|Бронзовый|Электричество|Линия 5 на 30 футов (спас. Лов.)|
|Зелёный|Яд|15-футовый конус (спас. Тел.)|
|Золотой|Огонь|15-футовый конус (спас. Лов.)|
|Красный|Огонь|15-футовый конус (спас. Лов.)|
|Латунный|Огонь|Линия 5 на 30 футов (спас. Лов.)|
|Медный|Кислота|Линия 5 на 30 футов (спас. Лов.)|
|Серебряный|Холод|15-футовый конус (спас. Тел.)|
|Синий|Электричество|Линия 5 на 30 футов (спас. Лов.)|
|Чёрный|Кислота|Линия 5 на 30 футов (спас. Лов.)|
<<<
!!!''Дракониды''
В мире Саги о Копье последователи злой богини Такхизис узнали тёмный ритуал, позволяющий им осквернять яйца металлических драконов, создавая злых драконорождённых, называемых драконидами. Вот пять видов драконидов, соответствующие пяти видам металлических драконов, сражавшихся на стороне Такхизис в Войне Копья: аураки (золотые), баазы (латунные), бозаки (бронзовые), капаки (медные) и сиваки (серебряные). Вместо оружия дыхания они обладают уникальными магическими способностями.
<<<
//2 уровень, Воплощение, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусочек слюды)
:''Длительность:'' Мгновенная
"""Громкий звонкий звук исходит из выбранной вами точки в пределах дистанции. Все существа в сфере с радиусом 10 футов с центром на этой точке должны совершить спасбросок Телосложения. При провале существо получает урон звуком 3к8, или половину этого урона при успехе. Существа, изготовленные из неорганической материи, такой как камень, кристалл или металл, совершают этот спасбросок с помехой.
Немагические предметы, которые не несут и не носят, тоже получают урон, если находятся в области заклинания."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше второго.
//5 уровень, Вызов, Друид/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы получаете способность входить в дерево и перемещаться через него в другое дерево того же вида, находящееся в пределах 500 футов. Оба дерева должны быть живыми, и размер обоих должен быть не меньше вашего. Вы должны использовать 5 футов перемещения, чтобы войти в дерево. Вы мгновенно узнаёте местоположение всех других деревьев этого вида в пределах 500 футов, и частью этого же перемещения можете либо перейти в одно из этих деревьев, либо выйти из дерева, в котором вы находитесь. Вы появляетесь в пространстве на свой выбор в пределах 5 футов от текущего дерева, используя ещё 5 футов перемещения. Если у вас не осталось перемещения, вы появляетесь в пределах 5 футов от дерева, в которое входили.
Вы можете использовать эту перемещающую способность один раз в раунд, пока активно заклинание. Каждый ход вы должны заканчивать вне дерева."""
//6 уровень, Вызов, Волшебник (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (сапфир стоимостью 1 000 зм)
:''Длительность:'' Пока не рассеется
"""Вы касаетесь предмета, весящего не более 10 фунтов, и достигающего в длину не более 6 футов. Заклинание оставляет невидимую метку на его поверхности и невидимое название предмета на сапфире, использованном в качестве материального компонента. При каждом использовании этого заклинания вы должны использовать новый сапфир.
В любой момент впоследствии вы можете действием произнести название предмета и раздавить сапфир. Предмет мгновенно появляется в вашей руке, вне зависимости от расстояния и планов, разделяющих вас, а заклинание оканчивается.
Если этот предмет несёт или держит другое существо, уничтожение сапфира не переносит предмет к вам, но вы узнаёте, кто им сейчас владеет, и где это существо сейчас примерно находится.
Рассеивание магии и аналогичные эффекты, успешно наложенные на сапфир, оканчивают эффект заклинания."""
//Заговор, Очарование, Бард/Волшебник/Колдун/Следопыт/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' С, М (небольшое количество грима, наносимое на лицо при накладывании этого заклинания)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Пока заклинание активно, вы совершаете с преимуществом все проверки Харизмы, направленные на одно выбранное вами существо, не враждебное по отношению к вам. Когда заклинание оканчивается, существо понимает, что вы влияли на её отношение с помощью магии, и становится враждебным по отношению к вам. Существо, склонное к насилию, может напасть на вас. Другие могут требовать другого возмездия (решает Мастер), в зависимости от отношений, сложившихся между вами.
//1 уровень, Очарование, Бард/Друид/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (кусочек пищи)
:''Длительность:'' 24 часа
Это заклинание позволяет убедить зверя, что вы не намерены причинять ему вред. Выберите зверя, которого вы видите в пределах дистанции. Он должен видеть и слышать вас. Если у зверя Интеллект не меньше 4, заклинание проваливается. В противном случае зверь должен преуспеть в спасброске Мудрости, иначе он станет очарованным на время действия заклинания. Если вы или один из ваших спутников причинит цели вред, заклинание окончится.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете воздействовать на одного дополнительного зверя за каждый уровень ячейки выше первого.
Вскидывая вверх сучковатый посох из остролиста, эльф вызывает буйство небесной стихии и обрушивает разряды молний на орков, посмевших угрожать его лесу огнём.
Затаившись высоко в кроне дерева, человек в облике леопарда смотрит из джунглей на чужеродную архитектуру храма Злой Стихии Воздуха и пристально наблюдает за действиями культистов.
Рубя клинком из чистого пламени, полуэльф бросается в гущу армии скелетов, чтобы уничтожить кощунственную магию, возвратившую им извращённое подобие жизни.
Призывая стихии или подражая животным, друиды воплощают незыблемость, приспособляемость и гнев природы. Они ни в коем случае не владыки природы — вместо этого друиды ощущают себя частью её неодолимой воли.
!!!''__Сила природы__''
Выше чего-либо другого друиды почитают природу. Именно она является источником всех их заклинаний и магических способностей, непосредственно или через природное божество. Многие предпочитают духовный путь конечного единения с природой, но есть и те, кто служат богам диких просторов, животных или стихий. Длящиеся испокон веков обычаи друидов также называют Старой Верой, противопоставляя их поклонению в храмах и у алтарей.
Заклинания друидов воздействуют через животных и окружающую природу. Это сила клыка и когтя, солнца и луны, огня и бури. Также друиды учатся принимать облик животных, и некоторые настолько углубляются в это умение, что родному облику предпочитают звериный.
!!!''__Сохранение равновесия__''
Для друидов природа представляет собой шаткое равновесие. Воздух, земля, огонь и вода — те четыре стихии, что составляют основу мира — должны уравновешивать друг друга. Если одна из стихий обретёт превосходство, сам мир может прекратить существование, притянутый стихийным измерением и разорванный на элементарные составляющие. Чтобы не допустить этого, друиды противостоят сектам Стихийного Зла и всем, кто стремится наделить любую из стихий превосходящей силой.
Также друидов заботит тонкое экологическое равновесие, необходимое флоре и фауне, и готовность цивилизованных поселений жить в гармонии с природой, а не противопоставлять себя ей. Жестокость природы — часть естественного порядка вещей, однако друиды не терпят всё чужеродное, включая аберрации (иллитиды и бехолдеры) и нежить (зомби и вампиры). Иногда друиды совершают вылазки на таких существ, особенно если те приближаются к их территориям.
Священная земля и области нетронутой природы нередко охраняются друидом. Впрочем, при достаточной угрозе естественному равновесию или подзащитной земле друид может перейти к активной борьбе с напастью, ступив на путь искателя приключений.
{{Таблица развития Друида}}
{{Создание Друида}}
!!!__''Друидический язык''__
Вы знаете Друидический язык — тайный язык друидов. Вы можете на нём говорить и оставлять тайные послания. Вы и все, кто знают этот язык, автоматически замечаете эти послания. Другие замечают присутствие послания при успешной проверке Мудрости (Внимательность) со Сл 15, но без помощи магии не могут расшифровать его.
<<<
!!!''Друиды и боги''
"""Некоторые друиды напрямую поклоняются силам природы, однако большинство посвящает себя служению одному из природных божеств, широко представленных в мультивселенной (примеры есть в списке богов в [[приложении Б|6. Приложение Б: Боги мультивселенной]]). Традиции поклонения этим богам часто считаются более древними, чем церкви и жречество в цивилизованных регионах. В мире Серого Ястреба, в частности, религия друидов также называется Старой Верой и распространена среди фермеров, охотников, лесников, рыбаков и прочих, чья жизнь тесно связана с природой. Она включает поклонение Природе как таковой, но также и почитание Беори, Матери Орта, и культы Обад-Хая, Элонны и Улы.
В мирах Серого Ястреба и Забытых Королевств круги друидов обычно не связаны поклонением одному какому-либо богу. Например, в Забытых Королевствах в одном и том же круге могут состоять друиды Майликки, Сильвануса, Чонтии, Эльдат и даже грозных Богов Гнева — Амберли, Малара, Ориль и Талоса. Коллективно этих богов часто называют Первым Кругом как самых почитаемых у друидов. Любой друид знает их наперечёт и считает всех, даже жестоких, достойными поклонения.
В Эберроне друиды придерживаются анимистических убеждений, никак не связанных с Верховными Владыками, Тёмной Шестёркой или любой другой религией. Друиды верят, что у всего живого и у всех естественных явлений — солнца, луны, ветра, огня, даже самого мира — есть дух, а друидическая магия — способ обращения к этим духам и управления ими. Однако у разных течений друидизма разные представления об отношениях духов между собой и с цивилизацией. Например, Скованные Ясенем считают тайную магию извращением природного порядка, Дети Зимы преклоняются перед силами смерти, а Хранители Врат стерегут древние учения, останавливающие вторжение в мир аберраций."""
<<<
//Заговор, Преобразование, Друид//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (омела, лист клевера и дубинка или боевой посох)
:''Длительность:'' 1 минута
Дерево дубинки или боевого посоха, который вы держите, наполняется силой природы. Пока заклинание активно, вы можете использовать свою базовую характеристику вместо Силы для бросков рукопашной атаки и урона при использовании этого оружия, и кость урона становится равной к8. Если оружие не было магическим, оно становится им. Заклинание оканчивается, если вы наложите его ещё раз или выпустите оружие из рук.
//2 уровень, Преобразование, Друид/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (пригоршня дубовой коры)
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы касаетесь согласного существа. Пока заклинание активно, кожа цели становится грубой и похожей внешне на кору дуба, а КД не может быть ниже 16, вне зависимости от надетых доспехов.
//3 уровень, Вызов, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (15-футовый радиус)
:''Компоненты:'' В, С, М (символ веры)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы вызываете духов, защищающих вас. Пока заклинание активно, они заполняют пространство в пределах 15 футов от вас. Если вы добрый или нейтральный, они могут выглядеть как ангелы или феи (на ваш выбор). Если вы злой, они могут выглядеть исчадиями.
Когда вы активируете это заклинание, вы можете указать любое количество существ, видимых вами, на которых и будет действовать это заклинание. Скорость этих существ в этой области уменьшена вдвое, и когда такое существо впервые за ход входит в область или начинает там ход, оно должно совершить спасбросок Мудрости. При провале существо получает урон излучением 3к8 (если вы добрый или нейтральный) или урон некротической энергией 3к8 (если вы злой). При успехе существо получает половину урона."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше третьего.
!!!''Дьявольский взгляд''
"""Вы можете нормально видеть в темноте, как магической, так и немагической, на расстоянии 120 футов. """
!!!__''Единицы чародейства''__
Вы получаете 2 единицы чародейства, и их становится больше на более высоких уровнях. У вас не может быть этих единиц больше, чем указанно в таблице для вашего уровня. Вы восстанавливаете все использованные единицы чародейства по окончании продолжительного отдыха.
!!!''Жаждущий клинок''
"""//Требование: 5 уровень, умение Договор клинка//
Вы можете атаковать своим оружием договора два раза вместо одного, когда в свой ход используете действие Атака."""
//Чудесный предмет, редкий//
Если в этой латунной жаровне горит огонь, вы можете действием произнести командное слово и призвать огненного элементаля, как если бы наложили заклинание призыв элементаля. Жаровню нельзя использовать повторно, пока не наступит следующий рассвет.
Весит жаровня 5 фунтов.
//Жезл, очень редкий (требуется настройка)//
У этого жезла ребристое навершие, и он обладает следующими свойствами:
;
://''Бдительность.''// Пока вы держите жезл, вы совершаете с преимуществом проверки Мудрости (Внимательность) и проверки инициативы.
://''Заклинания.''// Пока вы держите этот жезл, вы можете действием наложить им одно из следующих заклинаний: видение невидимого, обнаружение болезней и яда или обнаружение добра и зла.
://''Защитная аура.''// Вы можете действием воткнуть рукоятку жезла в землю, после чего навершие будет испускать яркий свет в пределах 60 футов и тусклый свет в пределах ещё 60 футов. Находясь в области яркого света, вы и все дружественные вам существа получаете бонус +1 к КД и спасброскам, а также можете чувствовать местоположение всех невидимых враждебных существ, тоже находящихся в области яркого света.
Навершие жезла перестаёт светиться, оканчивая эффект, через 10 минут, или когда какое-нибудь существо действием выдернет его из земли. Это свойство нельзя использовать повторно до следующего рассвета.
//Жезл, очень редкий//
Если вы держите этот жезл, вы можете действием активировать его. После этого жезл мгновенно телепортирует вас и до 199 других согласных существ, которых вы видите, в райское место между планами. Вы сами определяете вид этого райского места. Это может быть тихий сад, уютная лужайка, шумная таверна, огромный дворец, тропический остров, фантастический карнавал, или что вы ещё придумаете. Вне зависимости от внешнего облика, там хватает воды и пищи для пропитания всех гостей. Всё остальное, с чем можно взаимодействовать в этом месте, существует только там. Например, цветок, сорванный в саду, исчезнет, если его вынести наружу.
За каждый час, проведённый в райском месте, посетитель восстанавливает хиты, как если бы он потратил 1 Кость Хитов. Кроме того, существа не стареют, находясь в раю, хотя время течёт как обычно. Посетители могут находиться в этом месте не больше 200 дней, разделённых на число присутствующих существ (округляя в меньшую сторону).
Когда отведённое время заканчивается или вы действием оканчиваете эффект, все посетители возвращаются в места, которые они занимали до активации жезла, или в свободном пространстве, ближайшем к прошлому местонахождению. Жезл нельзя использовать повторно, пока не пройдёт 10 дней.
//Жезл, легендарный (требуется настройка)//
У этого жезла ребристое навершие, и он функционирует как магическая булава, предоставляющая бонус +3 к броскам атаки и урона, совершённым им. У жезла есть свойства, связанные с шестью кнопками, расположенными вдоль ручки, а также три дополнительных свойства.
;
://''Шесть кнопок.''// Вы можете нажать одну из шести кнопок бонусным действием. Эффект кнопки длится, пока вы не нажмёте другую кнопку, или пока не нажмёте эту же кнопку ещё раз, что возвращает жезл в обычную форму.
;
:Если вы нажмёте ''кнопку 1'', жезл становится языком пламени, так как из ручки появляется пламенный клинок.
;
:Если вы нажмёте ''кнопку 2'', навершие разойдётся в стороны, становясь двумя полукружьями, а жезл становится магическим боевым топором, предоставляющим бонус +3 к броскам атаки и урона, совершённым им.
;
:Если вы нажмёте ''кнопку 3'', навершие разойдётся в стороны, из него появится наконечник копья, а рукоятка удлиняется, становясь 6футовым древком. Так жезл становится магическим копьём, предоставляющим бонус +3 к броскам атаки и урона, совершённым им.
;
:Если вы нажмёте ''кнопку 4'', жезл превратится в шест для лазания с длиной до 50 футов, на ваш выбор. На поверхностях, твёрдых как гранит, в основании появляется шип, а на верхней части три крюка, надёжно закрепляющие шест. Через 1 фут в стороны от шеста отходят 3-дюймовые горизонтальные перекладины, превращая его в подобие лестницы. Шест может выдержать до 4000 фунтов. Больший вес или отсутствие надёжной опоры возвращают жезл в обычную форму.
;
:Если вы нажмёте ''кнопку 5'', жезл превратится в переносной таран, предоставляющий использующему его бонус +10 к проверкам Силы, совершённым для выламывания дверей, разлома баррикад и прочих препятствий.
;
:Если вы нажмёте ''кнопку 6'', жезл возвращается в обычную форму или же сохраняет её, но при этом начинает указывать на северный магнитный полюс. Ничего не произойдёт, если эту функцию использовать в месте, где нет магнитного полюса. Жезл также даёт вам знание примерной глубины под землёй или же наоборот, высоты над землёй.
;
://''Вытягивание жизни.''// Если вы попадаете по существу рукопашной атакой, используя этот жезл, вы можете заставить цель совершить спасбросок Телосложения со Сл 17. При провале цель получит дополнительный урон некротической энергией 4к6, а вы восстановите количество хитов, равное половине этого урона некротической энергией. Это свойство нельзя использовать повторно до следующего рассвета.
://''Паралич.''// Если вы попадаете по существу рукопашной атакой, используя этот жезл, вы можете заставить цель совершить спасбросок Силы со Сл 17. При провале цель становится парализованной на 1 минуту. Цель может повторять спасброски в конце каждого своего хода, оканчивая эффект при успехе. Это свойство нельзя использовать повторно до следующего рассвета.
://''Испуг.''// Если вы держите этот жезл, вы можете действием заставить всех существ, которых видите в пределах 30 футов от себя, совершить спасбросок Мудрости со Сл 17. При провале цель становится испуганной вами на 1 минуту. Испуганная цель может повторять спасброски в конце каждого своего хода, оканчивая эффект на себе при успехе. Это свойство нельзя использовать повторно до следующего рассвета.
//Жезл, легендарный (требуется настройка друидом, жрецом или паладином)//
У этого жезла есть 5 зарядов. Если вы держите его, вы можете действием наложить им одно из следующих заклинаний: полное исцеление (тратит 1 заряд) или воскрешение (тратит 5 зарядов).
Жезл ежедневно восстанавливает 1 заряд на рассвете. Если заряды жезла уменьшаются до 0, бросьте к20. Если выпадет «1», жезл исчезнет во вспышке света.
//Жезл, очень редкий (требуется настройка)//
Держа этот жезл, вы можете реакцией поглотить заклинание, нацеленное только на вас, и не имеющее зоны воздействия. Эффект поглощённого заклинания отменяется, а его энергия — но не само заклинание — сохраняется в жезле. Уровень поглощённой энергии равен уровню заклинания, с которым оно накладывалось. Жезл за весь свой срок существования может впитать не более 50 уровней энергии. Когда жезл впитает 50 уровней энергии, больше он никогда не сможет их поглощать, и если вы станете целью заклинания, которое жезл мог бы поглотить, жезл никак не отреагирует.
Когда вы настраиваетесь на жезл, вы узнаёте, сколько уровней энергии успел впитать жезл, и сколько энергии хранится в нём на данный момент.
Если вы — заклинатель, и держите этот жезл, вы можете превратить хранящуюся в нём энергию в ячейки заклинаний для накладывания подготовленных или известных вам заклинаний. Вы можете создавать ячейки с уровнем не больше тех, что уже есть у вас, и при этом не больше 5 уровня. Вместо своих ячеек вы используете хранящуюся в жезле энергию, во всём же остальном накладываете заклинание как обычно. Например, вы можете использовать 3 уровня энергии, хранящейся в жезле, в качестве ячейки заклинания 3 уровня.
В найденном жезле уже хранится 1к10 уровней энергии. Жезл, не способный больше поглощать заклинания, в котором не осталось энергии, перестаёт быть магическим.
//Жезл, редкий (требуется настройка)//
Вы можете действием продемонстрировать жезл и потребовать послушания от всех существ на ваш выбор, видимых вами в пределах 120 футов от себя. Каждая цель должна преуспеть в спасброске Мудрости со Сл 15, иначе она станет очарованной вами на 8 часов. Будучи очарованным из-за этого эффекта, существо считает вас своим истинным предводителем. Получив урон от вас или ваших спутников, или получив приказ, противоречащий её природе, цель перестаёт быть очарованной этим эффектом. Жезл нельзя использовать повторно до следующего рассвета.
//Жезл, необычный (+1), редкий (+2) или очень редкий (+3) (требуется настройка колдуном)//
Держа этот жезл, вы получаете бонус к броскам атаки заклинаниями колдуна и Сл спасбросков от ваших заклинаний колдуна. Размер бонуса определяется редкостью жезла.
Кроме того, вы можете действием восстановить одну ячейку заклинания колдуна, если держите этот жезл. Вы не можете использовать это свойство повторно, пока не окончите продолжительный отдых.
//Жезл, редкий (требуется настройка)//
Этот изготовленный дроу жезл — магическое оружие, оканчивающееся тремя эластичными щупальцами. Держа этот жезл в руке, вы можете действием направить каждое щупальце, чтобы оно атаковало существо в пределах 15 футов от вас. Каждое щупальце совершает бросок рукопашной атаки с бонусом +9. При попадании щупальце причиняет дробящий урон 1к6. Если вы попали по одной цели всеми тремя щупальцами, она должна совершить спасбросок Телосложения со Сл 15. При провале на 1 минуту скорость существа уменьшается вдвое, оно получает помеху для спасбросков Ловкости и не может совершать реакции. Более того, в каждом своём ходу оно может или совершать действие или бонусное действие, но не то и другое одновременно. В конце каждого своего хода оно повторяет спасбросок, оканчивая эффект на себе при успехе.
//Чудесный предмет, легендарный//
У этой железной бутылки латунная пробка. Вы можете действием произнести командное слово фляги и выбрать целью существо, которое видите в пределах 60 футов от себя. Если цель родом не с того плана существования, на котором вы находитесь, она должна преуспеть в спасброске Мудрости со Сл 17, иначе будет заточена во фляге. Если цель раньше уже была заточена такой флягой, спасбросок она совершает с преимуществом. Заточённое существо остаётся во фляге, пока не будет выпущено. Во фляге может одновременно находиться только одно существо. Заточённое существо не обязано ни дышать, ни есть, ни спать, и оно не стареет.
Вы можете действием вынуть пробку фляги и выпустить существо, находящееся в ней. Оно будет дружественно относиться к вам и вашим спутникам в течение 1 часа и повинуется вашим командам в течение этого времени. Если вы не отдаёте ему команд или отдаёте команду, которая весьма вероятно закончится его смертью, оно будет обороняться, но не будет совершать других действий. В конце этого периода существо действует согласно своему обычному характеру и мировоззрению.
Заклинание опознание показывает, находится ли во фляге существо, но единственный способ определить вид существа это вскрытие фляги. В найденной фляге уже может находиться существо, определённое Мастером самостоятельно или случайным образом.
<table>
<tr>
<th>к100</th>
<th>Содержимое</th>
<th>к100</th>
<th>Содержимое</th>
</tr>
<tr>
<th>01-50</th>
<td>Пустая</td>
<th>77-78</th>
<td>Элементаль (любой)</td>
</tr>
<tr>
<th>51</th>
<td>Арканалот</td>
<th>79</th>
<td>Гитъянки рыцарь</td>
</tr>
<tr>
<th>52</th>
<td>Камбион</td>
<th>80</th>
<td>Гитцерай зерт</td>
</tr>
<tr>
<th>53-54</th>
<td>Дао</td>
<th>81-82</th>
<td>Невидимый охотник</td>
</tr>
<tr>
<th>55-57</th>
<td>Демон (вид 1)</td>
<th>83-84</th>
<td>Марид</td>
</tr>
<tr>
<th>58-60</th>
<td>Демон (вид 2)</td>
<th>85-86</th>
<td>Меззолот</td>
</tr>
<tr>
<th>61-62</th>
<td>Демон (вид 3)</td>
<th>87-88</th>
<td>Ночная карга</td>
</tr>
<tr>
<th>63-64</th>
<td>Демон (вид 4)</td>
<th>89-90</th>
<td>Никалот</td>
</tr>
<tr>
<th>65</th>
<td>Демон (вид 5)</td>
<th>91</th>
<td>Планетар</td>
</tr>
<tr>
<th>66</th>
<td>Демон (вид 6)</td>
<th>92-93</th>
<td>Саламандра</td>
</tr>
<tr>
<th>67</th>
<td>Дэв</td>
<th>94-95</th>
<td>Слаад (любой)</td>
</tr>
<tr>
<th>68-69</th>
<td>Дьявол (старший)</td>
<th>96</th>
<td>Солар</td>
</tr>
<tr>
<th>70-72</th>
<td>Дьявол (младший)</td>
<th>97-98</th>
<td>Суккуб/инкуб</td>
</tr>
<tr>
<th>73-74</th>
<td>Джинн</td>
<th>99</th>
<td>Ультролот</td>
</tr>
<tr>
<th>75-76</th>
<td>Ифрит</td>
<th>00</th>
<td>Зорн</td>
</tr>
</table>
//Чудесный предмет, редкий//
Это ржавая железная сфера диаметром 3 дюйма, весящая 1 фунт. Вы можете действием произнести командное слово и бросить сферу в существо с размером не больше Огромного, которое видите в пределах 60 футов от себя. В полёте сфера распадается на отдельные металлические ленты.
Совершите бросок дальнобойной атаки с бонусом броска атаки, равным модификатору Ловкости плюс ваш бонус мастерства. При попадании цель становится опутанной, пока вы не произнесёте командное слово ещё раз бонусным действием. После повторного произношения командного слова или промаха атаки ленты сжимаются и снова становятся сферой.
Любое существо, в том числе и опутанное, может действием совершить проверку Силы со Сл 20, чтобы порвать ленты. При успехе предмет уничтожается, а удерживаемое существо освобождается. При провале все дальнейшие попытки этого существа автоматически проваливаются в течение 24 часов.
Железные ленты нельзя использовать повторно до следующего рассвета.
//Чудесный предмет, необычный (требуется настройка заклинателем)//
Если эта жемчужина находится у вас, вы можете действием произнести командное слово и восстановить одну использованную ячейку заклинания. Если уровень потраченной ячейки 4 или больше, вы получите ячейку 3 уровня. Вы не можете повторно использовать жемчужину до следующего рассвета.
//Оружие (любое), редкое//
Если у вас при броске атаки этим магическим оружием выпадает «20», цель получает дополнительный урон 7 того вида, который причиняет это оружие.
//Доспех (щит), очень редкий (требуется настройка)//
Если вы держите этот щит, вы можете бонусным действием произнести командное слово, чтобы он ожил. Щит поднимается в воздух и парит в вашем пространстве, защищая так, как если бы вы его использовали, но ваши руки при этом свободны. Щит остаётся живым 1 минуту, пока вы не окончите эффект бонусным действием или пока вы не станете недееспособным или не умрёте, после чего щит падает на землю или в вашу руку, если она свободна.
!!!''Животная речь''
"""Вы можете неограниченно накладывать заклинание разговор с животными, не тратя ячейки заклинаний."""
//2 уровень, Прорицание, Друид/Следопыт (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' С
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы касаетесь согласного зверя. Пока заклинание активно, вы можете действием посмотреть глазами этого зверя и услышать то, что слышит он. Эффект продолжается, пока вы не переключитесь действием обратно на свои чувства. Воспринимая чувствами зверя, вы пользуетесь преимуществами всех его особых чувств, хотя для своего окружения вы считаетесь ослеплённым и оглохшим.
Воздев руки и глаза к небу и запев молитву, эльф начинает сиять внутренним светом, который проливается на боевых товарищей и лечит их.
Распевая песнь славы, дварф широко размахивает своим топором, прорубаясь через ряды орков, выступивших против него, крича хвалу богам с каждым павшим врагом.
Посылая проклятье на силы нежити, женщина поднимает свой священный символ, из которого льётся свет, отбрасывающий зомби, толпящихся около её спутников.
Жрецы являются посредниками между миром смертных и далёкими мирами богов. Настолько же разные, насколько боги, которым они служат, жрецы воплощают работу своих божеств. В отличие от обычного проповедника, жрец наделён божественной магией.
!!!''__Целители и воители__''
Божественная магия, как следует из названия, является силой богов, источающейся из них в мир. Жрецы являются проводниками этой энергии, проявляющейся в виде чудотворных эффектов. Боги не дают такую власть всем, кто обращается к ним, но только тем, кто избран выполнять высокое призвание.
Использующие божественную магию не полагаются на обучение или тренировки. Жрец может разучить шаблонные молитвы и древние ритуалы, но способность читать заклинания зависит от преданности и интуитивного ощущения воли божества.
Жрецы сочетают полезную магию исцеления и вдохновения союзников с заклинаниями, которые вредят и препятствуют врагам. Они могут вызвать страх и ужас, наложить проклятье или болезни, отравить, и даже призвать пламя с небес, чтобы уничтожить своих противников. Встретившись с грешниками, которым поможет только удар булавой по голове, жрецы полагаются на свою боевую подготовку, что позволяет им вступить в ближний бой с силами богов на своей стороне.
!!!''__Божественные посредники__''
Не каждый послушник или священнослужитель в храме или святилище является жрецом. Некоторые проповедники призваны к простой жизни служащего в храме, выполняя волю своих богов посредством молитвы и жертв, а не с помощью магии и силы оружия. В некоторых городах духовенство занимает политические должности, или рассматривается как трамплин для более высоких должностей, и вообще не общаются с богом. Истинные жрецы — редкость в большинстве иерархий.
Если жрец обращается к жизни искателя приключений, то, как правило, из-за того, что его бог требует этого. Преследуя цели богов, часто попадаешь в опасные ситуации вне стен цивилизаций, приходится карать зло и искать святые реликвии в древних гробницах. Многие жрецы также должны защищать последователей своих божеств, что может означать сражение с неистовыми орками, ведение переговоров о мире между воюющими государствами, или закрытие портала, через который в мир может пройти князь демонов.
Большинство странствующих жрецов поддерживает некоторую связь с храмами и орденами, разделяющими их веру. Храм может попросить помощи у жреца, а высший священник вправе просто потребовать её.
{{Таблица развития Жреца}}
{{Создание Жреца}}
//1 уровень, Очарование, Бард/Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (маленькие пирожные и перо, которым нужно махать в воздухе)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Существо на ваш выбор, видимое в пределах дистанции, воспринимает всё невероятно смешным, и корчится от смеха, если заклинание на него действует. Цель должна преуспеть в спасброске Мудрости, иначе она падает ничком, становится недееспособной, и в течение действия заклинания не может встать. Существа со значением Интеллекта 4 и меньше не попадают под действие этого заклинания.
В конце каждого своего хода, и каждый раз при получении урона цель может совершать новый спасбросок Мудрости. Спасбросок совершается с преимуществом, если он был вызван получением урона. При успехе заклинание оканчивается."""
//2 уровень, Преобразование, Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' футов
:''Компоненты:'' В, С, М (как минимум четыре стрелы или арбалетных болта)
:''Длительность:'' 8 часов
"""Вы втыкаете четыре немагических боеприпаса — стрелы или арбалетные болты — в землю в пределах дистанции и накладываете на них заклинание, защищающее область. Пока заклинание активно, каждый раз, когда другое существо кроме вас впервые за ход оказывается в пределах 30 футов от боеприпасов или оканчивает там ход, один боеприпас вылетает и атакует его. Существо должно преуспеть в спасброске Ловкости, иначе оно получит колющий урон 1к6. Боеприпас при этом уничтожается. Заклинание заканчивается, когда кончаются боеприпасы.
Накладывая это заклинание, вы можете указать любых существ, которых это заклинание будет игнорировать."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, количество боеприпасов увеличивается на два за каждый уровень ячейки выше второго.
!!!''Завораживающий шёпот''
"""//Требование: 7 уровень//
Вы можете один раз сотворить заклинание принуждение, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
<<list-links filter:"[tag[cantrip]]">>
//6 уровень, Иллюзия, Бард/Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (кусок овечьей шерсти и порошок нефрита, стоящий как минимум 25 зм)
:''Длительность:'' Пока не рассеется
"""Вы создаёте иллюзию предмета, существа или другого видимого явления в пределах дистанции, активирующуюся при выполнении особых условий. Пока условия не выполнены, иллюзия будет неразличима. Она должна помещаться в куб с длиной ребра 30 футов, и вы при накладывании заклинания определяете, как иллюзия будет себя вести, и какие звуки она будет издавать. Заготовленные действия могут длиться до 5 минут.
Когда указанное вами условие будет выполнено, иллюзия проявляется и выполняет описанные вами действия. Как только иллюзия закончит действовать, она исчезает и остаётся спящей 10 минут. После этого иллюзия может быть снова активирована.
Условие может быть простым или замысловатым, но оно должно основываться на видимом или слышимом событии, способном произойти в пределах 30 футов от области. Например, вы можете создать иллюзию себя, появляющегося и предупреждающего тех, кто попытается открыть дверь с ловушкой, или же иллюзия может проявляться только когда существо произносит правильное слово или фразу.
Физическое взаимодействие с образом даёт понять, что это иллюзия, потому что сквозь него всё проходит. Существа, исследующие образ действием, могут определить, что это иллюзия, совершив успешную проверку Интеллекта (Анализ) против Сл ваших заклинаний. Если существо распознаёт иллюзию, оно может видеть сквозь неё, и издаваемые ей звуки тоже становятся незначащими."""
<<list-links filter:"[tag[1lvl]]">>
<<list-links filter:"[tag[2lvl]]">>
<<list-links filter:"[tag[3lvl]]">>
<<list-links filter:"[tag[4lvl]]">>
<<list-links filter:"[tag[5lvl]]">>
<<list-links filter:"[tag[6lvl]]">>
<<list-links filter:"[tag[7lvl]]">>
<<list-links filter:"[tag[8lvl]]">>
<<list-links filter:"[tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[brd]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[brd]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[brd]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[brd]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[brd]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[brd]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[brd]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[brd]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[brd]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[brd]tag[9lvl]]">>
<<list-links filter:"[tag[brdlist]]">>
Заговоры
<<list-links filter:"[tag[wiz]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[wiz]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[wiz]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[wiz]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[wiz]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[wiz]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[wiz]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[wiz]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[wiz]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[wiz]tag[9lvl]]">>
<$macrocall
$name="toc-tabbed-internal-nav"
tag="wizlist"
selectedTiddler="$:/temp/toc/selectedTiddler"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
<evoc class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/evocation">></evoc>
<conjur class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/conjuration">></conjur>
Заговоры
<<list-links filter:"[tag[drd]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[drd]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[drd]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[drd]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[drd]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[drd]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[drd]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[drd]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[drd]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[drd]tag[9lvl]]">>
<div class="tc-table-of-contents">
<<toc-tabbed-internal-nav "drdlist">>
</div>
Заговоры <<list-links filter:"[tag[$:/Cantrip Cleric]]">>
Первый уровень <<list-links filter:"[tag[$:/Cleric 1lvl]]">>
Второй уровень <<list-links filter:"[tag[$:/Cleric 2lvl]]">>
Третий уровень <<list-links filter:"[tag[$:/Cleric 3lvl]]">>
Четвертый уровень <<list-links filter:"[tag[$:/Cleric 4lvl]]">>
Пятый уровень <<list-links filter:"[tag[$:/Cleric 5lvl]]">>
Шестой уровень <<list-links filter:"[tag[$:/Cleric 6lvl]]">>
Седьмой уровень <<list-links filter:"[tag[$:/Cleric 7lvl]]">>
Восьмой уровень <<list-links filter:"[tag[$:/Cleric 8lvl]]">>
Девятый уровень <<list-links filter:"[tag[$:/Cleric 9lvl]]">>
<div class="tc-table-of-contents">
<<toc-tabbed-internal-nav "clrlist">>
</div>
!!!''__Заклинания зверя__''
С 18 уровня персонаж может творить в диком облике заклинания друида. Будучи зверем, вы можете исполнить соматический и вербальный компоненты заклинания друида, но не можете обеспечить материальные компоненты.
<illu class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/illusion">></illu>
Заговоры
<<list-links filter:"[tag[wlc]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[wlc]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[wlc]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[wlc]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[wlc]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[wlc]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[wlc]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[wlc]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[wlc]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[wlc]tag[9lvl]]">>
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "wlclist">></div>
<necro class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/Necromancy">></necro>
<abjur class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/abjuration">></abjur>
<ench class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/enchantment">></ench>
Заговоры
<<list-links filter:"[tag[pal]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[pal]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[pal]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[pal]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[pal]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[pal]tag[5lvl]]">>
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "pallist">></div>
* [[Заклинания Барда]]
* [[Заклинания Волшебника]]
* [[Заклинания Друида]]
* [[Заклинания Жреца]]
* [[Заклинания Колдуна]]
* [[Заклинания Паладина]]
* [[Заклинания Следопыта]]
* [[Заклинания Чародея]]
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "listbylvl">></div>
* [[Заговоры]]
* [[Заклинания 1 уровня]]
* [[Заклинания 2 уровня]]
* [[Заклинания 3 уровня]]
* [[Заклинания 4 уровня]]
* [[Заклинания 5 уровня]]
* [[Заклинания 6 уровня]]
* [[Заклинания 7 уровня]]
* [[Заклинания 8 уровня]]
* [[Заклинания 9 уровня]]
* [[Заклинания школы Воплощения]]
* [[Заклинания школы Вызова]]
* [[Заклинания школы Иллюзии]]
* [[Заклинания школы Некромантии]]
* [[Заклинания школы Ограждения]]
* [[Заклинания школы Очарования]]
* [[Заклинания школы Преобразования]]
* [[Заклинания школы Прорицания]]
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/transmutation">></div>
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "$:/divination">></div>
Заговоры
<<list-links filter:"[tag[rgr]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[rgr]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[rgr]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[rgr]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[rgr]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[rgr]tag[5lvl]]">>
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "rgrlist">></div>
Заговоры
<<list-links filter:"[tag[ritual]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[ritual]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[ritual]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[ritual]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[ritual]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[ritual]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[ritual]tag[6lvl]]">>
Заговоры
<<list-links filter:"[tag[sor]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[sor]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[sor]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[sor]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[sor]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[sor]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[sor]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[sor]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[sor]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[sor]tag[9lvl]]">>
<div class="tc-table-of-contents"><<toc-tabbed-internal-nav "sorlist">></div>
Заговоры
<<list-links filter:"[tag[evoc]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[evoc]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[evoc]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[evoc]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[evoc]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[evoc]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[evoc]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[evoc]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[evoc]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[evoc]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[conjur]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[conjur]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[conjur]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[conjur]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[conjur]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[conjur]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[conjur]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[conjur]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[conjur]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[conjur]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[illu]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[illu]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[illu]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[illu]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[illu]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[illu]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[illu]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[illu]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[illu]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[illu]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[necro]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[necro]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[necro]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[necro]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[necro]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[necro]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[necro]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[necro]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[necro]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[necro]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[abjur]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[abjur]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[abjur]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[abjur]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[abjur]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[abjur]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[abjur]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[abjur]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[abjur]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[abjur]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[ench]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[ench]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[ench]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[ench]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[ench]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[ench]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[ench]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[ench]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[ench]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[ench]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[trans]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[trans]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[trans]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[trans]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[trans]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[trans]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[trans]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[trans]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[trans]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[trans]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[divin]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[divin]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[divin]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[divin]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[divin]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[divin]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[divin]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[divin]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[divin]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[divin]tag[9lvl]]">>
Заговоры
<<list-links filter:"[tag[concentration]tag[cantrip]]">>
Первый уровень
<<list-links filter:"[tag[concentration]tag[1lvl]]">>
Второй уровень
<<list-links filter:"[tag[concentration]tag[2lvl]]">>
Третий уровень
<<list-links filter:"[tag[concentration]tag[3lvl]]">>
Четвертый уровень
<<list-links filter:"[tag[concentration]tag[4lvl]]">>
Пятый уровень
<<list-links filter:"[tag[concentration]tag[5lvl]]">>
Шестой уровень
<<list-links filter:"[tag[concentration]tag[6lvl]]">>
Седьмой уровень
<<list-links filter:"[tag[concentration]tag[7lvl]]">>
Восьмой уровень
<<list-links filter:"[tag[concentration]tag[8lvl]]">>
Девятый уровень
<<list-links filter:"[tag[concentration]tag[9lvl]]">>
//3 уровень, Преобразование, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (капля патоки)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы изменяете время для шести существ на ваш выбор, находящихся в кубе с длиной ребра 40 футов в пределах дистанции. Все цели должны преуспеть в спасброске Мудрости, иначе они попадут под действие заклинания на время его длительности.
Скорость попавшего под действие существа уменьшатся вдвое, оно получает штраф −2 к КД и спасброскам Ловкости, и оно не может совершать реакции. В свой ход оно может использовать либо действие, либо бонусное действие, и не может использовать сразу оба. Вне зависимости от умений и магических предметов, оно не может в свой ход совершать более одной рукопашной или дальнобойной атаки.
Если существо попытается активировать заклинание со временем накладывания 1 действие, бросьте к20. Если выпадет «11» или больше, заклинание не вступит в силу до его следующего хода, и в том ходу оно должно будет использовать действие для завершения заклинания. Если оно этого не сделает, заклинание будет потрачено.
Существо, находящееся под действием этого заклинания, совершает новые спасброски Мудрости в конце каждого своего хода. При успехе эффект для него оканчивается."""
//7 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (крошечный шарик из гуано летучей мыши и серы)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Из вашего указательного пальца вылетает луч жёлтого света, концентрирующийся в светящемся шарике в пределах дистанции. Когда заклинание оканчивается, либо из-за того, что вы теряете концентрацию, либо когда вы сами это решите, шарик взрывается с гулким рокотом вспышкой пламени, огибающего углы. Все существа в сфере с радиусом 20 футов с центром в этой точке должны совершить спасбросок Ловкости. При провале существо получает урон огнём, равный сумме накопленного урона, или половине этого урона в случае успеха.
Базовый урон этого заклинания 12к6. В конце каждого вашего хода, пока шарик не сдетонировал, урон увеличивается на 1к6.
Если светящегося шарика кто-то коснётся до того как он взорвётся, коснувшееся существо должно совершить спасбросок Ловкости. При провале заклинание мгновенно оканчивается, а шарик взрывается. При успешном спасении существо может отбросить шарик на 40 футов. Ударившись о существо или твёрдый предмет, шарик взрывается, оканчивая заклинание.
Огонь причиняет урон предметам и воспламеняет горючие предметы, которые никто не несёт и не носит."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 8 уровня или выше, базовый урон увеличивается на 1к6 за каждый уровень ячейки выше седьмого.
//Чудесный предмет, необычный (требуется настройка)//
Эти меховые сапоги очень плотные и тёплые. Пока вы их носите, вы получаете следующие преимущества:
* Вы получаете сопротивление к урону холодом.
* Вы игнорируете труднопроходимую местность, созданную льдом или снегом.
* Вы нормально выносите такую низкую температуру как -50 °F (-45 °C), без дополнительной тёплой одежды. Если вы одеты очень тепло, то можете переносить температуру до -100 °F (-73 °C).
//6 уровень, Ограждение, Жрец (ритуал)//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (немного святой воды, редкие благовония и толчёный рубин, стоящий как минимум 1 000 зм)
:''Длительность:'' 1 день
"""Вы создаёте защиту от магического перемещения, покрывающую до 40 000 квадратных футов пола и 30 футов над полом. Пока заклинание активно, существа не могут телепортироваться в эту область и использовать порталы, например, созданные заклинанием [[врата|Врата]], чтобы входить в эту область. Это заклинание предотвращает и перемещения между планами, поэтому защищает от перемещений с Астрального Плана, Эфирного Плана, из Страны Фей, Царства Теней, а также от заклинания уход в иной мир.
Кроме того, это заклинание причиняет урон всем существам вида, выбираемого вами при его накладывании. Выберите один или несколько видов существ: исчадия, небожители, нежить, феи и элементали. Когда существо выбранного вида впервые за ход входит в пространство заклинания или начинает в нём ход, оно получает урон излучением или некротической энергией 5к10 (вид урона выбираете вы при накладывании заклинания).
Когда вы накладываете это заклинание, можете указать пароль. Существо, произносящее пароль при входе в эту местность, не получает урон от этого заклинания.
Пространство этого заклинания не может перекрываться с пространством другого заклинания запрет. Если вы накладываете заклинание запрет каждый день в течение 30 дней в одном и том же месте, заклинание длится, пока не будет рассеяно, и материальные компоненты последнего накладывания тратятся."""
//5 уровень, Некромантия, Друид/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' 7 дней
"""Ваше касание вызывает болезнь. Совершите рукопашную атаку заклинанием по существу, находящемуся в пределах вашей досягаемости. При попадании вы заражаете существо болезнью, выбранной из приведённого ниже списка.
В конце каждого своего хода цель должна совершать спасбросок Телосложения. После провала трёх таких спасбросков эффект болезни будет длиться столько же, сколько заклинание, а существо перестаёт совершать спасброски. Преуспев в трёх спасбросках, существо выздоравливает, и заклинание заканчивается.
Поскольку это заклинание вызывает у цели настоящую болезнь, все эффекты, исцеляющие болезни и влияющие на течение болезней, применимы.
//''Воспаление разума.''// Сознание существа лихорадит. Существо совершает с помехой проверки и спасброски Интеллекта, и в бою существо ведёт себя так, будто находится под действием заклинания смятение.
//''Гниение плоти.''// Плоть существа начинает разлагаться. Существо совершает с помехой проверки Харизмы и получает уязвимость ко всем видам урона.
//''Грязевая лихорадка.''// Грязевая лихорадка охватывает тело существа. Существо совершает с помехой проверки Силы, спасброски Силы и броски атаки, использующие Силу.
//''Припадок.''// Существо сотрясают неостановимые судороги. Существо совершает с помехой проверки Ловкости, спасброски Ловкости и броски атаки, использующие Ловкость.
//''Склизкая смерть.''// Существо начинает неконтролируемо кровоточить. Существо совершает с помехой проверки и спасброски Телосложения. Кроме того, каждый раз, когда цель получает урон, она становится ошеломлённой до конца своего следующего хода.
//''Слепотуха.''// Боль заволакивает сознание существа, а его глаза становятся молочно-белыми. Существо совершает с помехой проверки и спасброски Мудрости, и становится ослеплённым."""
//9 уровень, Ограждение, Волшебник/Колдун//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (рисунок или резная статуэтка, изображающая цель, и особый компонент, зависящий от выбранной версии заклинания, стоящий как минимум 500 зм за каждую Кость Хитов цели)
:''Длительность:'' Пока не будет рассеяно
"""Вы создаёте магические оковы, удерживающие существо, видимое вами в пределах дистанции. Цель должна преуспеть в спасброске Мудрости, иначе она станет скованной заклинанием; при успехе цель получает иммунитет к этому заклинанию, если вы будете накладывать его повторно. Находясь под действием этого заклинания, существо не обязано дышать, есть и пить, и оно не стареет. Заклинания школы Прорицания не могут найти или почувствовать цель.
При накладывании этого заклинания вы выбираете один из следующих видов заточения:
''Захоронение.'' Цель становится заточённой глубоко под землёй в сфере из магической силы, достаточно большой, чтобы цель могла в ней поместиться. Ничто не может проникнуть сквозь эту сферу, и никакие существа не могут при помощи телепортации или путешествий между планами проникнуть внутрь или наружу.
Особым компонентом для этой версии заклинания является небольшая мифриловая сфера.
''Миниатюризация.'' Цель уменьшается до высоты 1 дюйм (2,5 сантиметра), и становится заточённой в драгоценном камне или подобном предмете. Свет проходит через камень как обычно (что позволяет цели видеть, а другим существам видеть её), но больше сквозь него ничто не проходит, даже за счёт телепортации и планарных путешествий. Пока заклинание активно, этот камень нельзя ни разрезать, ни сломать.
Особым компонентом для этой версии заклинания является большой прозрачный драгоценный камень, такой как корунд, алмаз или рубин.
''Ограждённая тюрьма.'' Заклинание переносит цель в крохотный демиплан, защищённый от телепортации и планарных путешествий. Это может быть лабиринт, клетка, башня, или другое подобное укреплённое строение или местность.
Особым компонентом для этой версии заклинания является миниатюрная копия тюрьмы, изготовленная из нефрита.
''Оцепенение.'' Цель засыпает, и её нельзя разбудить. Особым компонентом для этой версии заклинания являются редкие снотворные травы.
''Сковывание.'' Цель удерживают на месте толстые цепи, крепко связанные с землёй, удерживающие цель на месте. Цель опутана, пока заклинание активно, и в это время она не может перемещаться и каким-либо образом быть перемещённой.
Особым компонентом для этой версии заклинания является тонкая цепочка из драгоценного металла.
''Окончание заклинания.'' Во время накладывания этого заклинания, какую бы версию вы не выбрали, вы можете указать условие, оканчивающее заклинание и отпускающее цель. Условие может быть простым или замысловатым, но Мастер должен признать условие разумным и вероятным. Условия могут основываться на имени существа, его личности, или его божестве, но во всём остальном должны полагаться на обозримые действия или качества, и не должны основываться на таких неосязаемых факторах как уровень, класс или хиты.
Заклинание рассеивание магии может окончить это заклинание только если будет наложено заклинанием 9 уровня, нацеливаясь либо на тюрьму, либо на особый компонент, использовавшийся для её создания.
Вы можете использовать конкретный особый компонент для создания только одной тюрьмы одновременно. Если вы активируете это заклинание ещё раз, используя тот же компонент, предыдущая цель тут же освобождается."""
!!!__''Защита без доспехов''__
Если вы не носите доспехов, ваш Класс Доспеха равен 10 + модификатор Ловкости + модификатор Телосложения. Вы можете использовать щит, не теряя этого преимущества.
!!!''__Защита без доспехов__''
Начиная с 1 уровня, если вы не носите ни доспех, ни щит, ваш Класс Доспеха равен 10 + модификатор Ловкости + модификатор Мудрости.
//1 уровень, Ограждение, Волшебник/Жрец/Колдун/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (святая вода или порошок серебра и железа, расходуемые заклинанием)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пока заклинание активно, одно согласное существо, которого вы коснулись, защищено от определённого вида существ: аберрации, исчадия, небожители, нежить, феи или элементали.
Защита предоставляет несколько преимуществ. Существа выбранного вида совершают с помехой броски атаки по цели. Цель также не может быть очарована, испугана и одержима ими. Если цель уже очарована, испугана или одержима таким существом, цель совершает последующие спасброски от таких эффектов с преимуществомю"""
//Заговор, Ограждение, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' 1 раунд
Вы протягиваете руку и рисуете в воздухе ограждающий знак. Вы получаете до конца своего следующего хода сопротивление дробящему, колющему и рубящему урону, причинённому атаками оружием.
//4 уровень, Ограждение, Жрец/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' 8 часов
"""Вы касаетесь существа и даруете ему некоторую защиту от смерти.
Когда хиты цели впервые опускаются до 0 из-за получения урона, хиты цели опускаются всего лишь до 1, и заклинание заканчивается.
Если заклинание ещё действует, а цель попадает под действие эффекта, убивающего её мгновенно, не причиняя урона, то этот эффект игнорируется, и заклинание заканчивается."""
//3 уровень, Ограждение, Волшебник/Друид/Жрец/Следопыт/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
Пока заклинание активно, согласное существо, которого вы коснулись, получает сопротивление к одному виду урона на ваш выбор: звук, кислота, огонь, холод или электричество.
//2 уровень, Ограждение, Друид/Жрец/Паладин/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' 1 час
"""Вы касаетесь существа. Если оно отравлено, вы нейтрализуете яд. Если на цель действуют несколько ядов, вы нейтрализуете тот, о котором знаете, либо же один случайным образом выбранный яд.
Пока заклинание активно, цель совершает с преимуществом спасброски от отравленного состояния и получает сопротивление к урону ядом."""
//Оружие (любой меч) легендарное (требуется настройка)//
Вы получаете бонус +3 к броскам атаки и урона этим магическим оружием.
В первый раз в каждом своём ходу, когда вы атакуете этим оружием, вы можете перевести весь бонус или его часть в бонус к КД а не броскам атаки и урона. Например, вы можете уменьшить бонус к броскам атаки и урона до +1, но получить +2 к КД Изменённые бонусы действуют до начала вашего следующего хода, но вы должны держать этот меч, чтобы получать от него бонус к КД.
//Зелье, редкое//
Когда вы выпиваете это зелье, вы получаете эффект заклинания газообразная форма (концентрация не требуется) на 1 час, или пока вы бонусным действием не прервёте его. Пузырёк с этим зельем как будто содержит туман, перетекающий, словно вода.
//Зелье, редкое//
После того, как вы выпили это зелье, вы на 1 час получаете 10 временных хитов. Кроме того, в течение этого часа вы находитесь под эффектом заклинания благословление (концентрация не требуется). Это синее зелье пузырится и парит, словно оно находится в состоянии закипания.
//Зелье, очень редкое//
После того как вы выпьете это зелье, ваш физический возраст уменьшается на 1к6 + 6 лет, при минимуме в 13 лет. Каждый раз, когда вы в дальнейшем будете пить зелья долголетия, существует накопительный штраф 10 процентов, что вместо этого вы постареете на 1к6 + 6 лет. В янтарной жидкости плавают хвост скорпиона, клык гадюки, мёртвый паук и крохотное сердце, которое вопреки всему всё ещё бьётся. Эти ингредиенты исчезают, когда зелье откупоривают.
//Зелье, необычное//
После того как вы выпили это зелье, вы можете в течение одного часа неограниченно накладывать заклинание дружба с животными (Сл спасброска 13). При взбалтывании этой мутной жидкости вы видите рыбью чешую, кошачьи когти, беличью шерсть и прочие фрагменты.
//Зелье, очень редкое//
Если вы выпьете это зелье, оно устранит всё имеющееся у вас истощение, а также все болезни и яды, действующие на вас. В течение следующих 24 часов вы восстанавливаете максимум хитов за каждую использованную Кость Хитов. Алая жидкость этого зелья периодически пульсирует, напоминая биение сердца.
//Зелье, обычное//
Когда вы выпиваете это зелье, вы получаете на 1 час скорость лазания, равную вашей скорости ходьбы. В течение этого времени вы совершаете с преимуществом проверки Силы (Атлетика), совершённые, чтобы лезть. Зелье представляет собой трёхцветную жидкость. Коричневый, серебряный и серый слои структурой напоминают рисунок на камне и не смешиваются между собой, как бы вы ни трясли пузырёк.
//Зелье, редкость варьируется//
Вы восстанавливаете хиты, когда выпиваете это зелье. Количество восстанавливаемых хитов зависит от редкости зелья, как показано в таблице «зелья лечения». Вне зависимости от силы зелья оно представляет собой красную жидкость, сверкающую при встряхивании.
<table>
<tr>
<th>Зелье...</th>
<th>Редкость</th>
<th>Хитов восстанавливает</th>
</tr>
<tr>
<td>лечения</td>
<td>Обычное</td>
<td>2к4 + 2</td>
</tr>
<tr>
<td>большого лечения</td>
<td>Необычное</td>
<td>4к4 + 4</td>
</tr>
<tr>
<td>отличного лечения</td>
<td>Редкое</td>
<td>8к4 + 8</td>
</tr>
<tr>
<td>превосходного лечения</td>
<td>Очень редкое</td>
<td>10к4 + 20</td>
</tr>
</table>
//Зелье, очень редкое//
Контейнер с этим зельем выглядит пустым, но на вес чувствуется, что он всё же содержит жидкость. Выпив её, вы становитесь невидимым на 1 час. Всё, что вы несёте и носите, становится невидимым вместе с вами. Эффект оканчивается преждевременно, если вы атакуете или наложите заклинание.
//Зелье, редкое//
В течение 1 минуты после того, как вы выпили это зелье, вы обладаете сопротивлением ко всем видам урона. Это густое как сироп зелье выглядит как расплавленное железо.
//Зелье, необычное//
После того, как вы выпили это зелье, вы можете бонусным действием выдохнуть огонь на цель, находящуюся в пределах 30 футов от вас. Цель должна совершить спасбросок Ловкости со Сл 13, получая урон огнём 4к6 при провале или половину этого урона при успехе. Эффект заканчивается после того, как вы трижды используете огненное дыхание, или по истечении 1 часа.
Зелье представляет собой оранжевую мерцающую жидкость, над которой стелется дымок, выходящий наружу каждый раз, когда вы откупориваете пробку.
//Зелье, необычное//
Вы можете дышать под водой в течение 1 часа после того, как выпьете это зелье. В мутно-зелёной жидкости, пахнущей морем, плавают небольшие пузырьки, похожие на медуз.
//Зелье, очень редкое//
Выпив это зелье, вы на 1 час получаете скорость полёта, равную вашей скорости ходьбы, и можете парить. Если вы находитесь в воздухе, когда зелье теряет силу, вы падаете, если не обладаете другими средствами, позволяющими оставаться в полёте. Прозрачная жидкость этого зелья парит у горлышка пузырька, и в ней плавают молочно-белые примеси.
//Зелье, редкость варьируется//
Когда вы выпиваете это зелье, значение вашей Силы изменяется на один час. Это новое значение зависит от того, силой какого именно великана, вы будете обладать (смотрите таблицу ниже). Зелье не оказывает на вас никакого эффекта в том случае, если значение вашей Силы уже равно этому значению или превосходит его.
В прозрачной жидкости этого зелья плавают обрезки ногтей великана соответствующего вида. Зелье силы морозного великана и зелье силы каменного великана обладают одинаковым эффектом.
<table>
<tr>
<th>Тип великана</th>
<th>Сила</th>
<th>Редкость</th>
</tr>
<tr>
<td>Холмовой великан</td>
<td>21</td>
<td>Необычное</td>
</tr>
<tr>
<td>Ледяной/каменный великан</td>
<td>23</td>
<td>Редкое</td>
</tr>
<tr>
<td>Огненный великан</td>
<td>25</td>
<td>Редкое</td>
</tr>
<tr>
<td>Облачный великан</td>
<td>27</td>
<td>Очень редкое</td>
</tr>
<tr>
<td>Грозовой великан</td>
<td>29</td>
<td>Легендарное</td>
</tr>
</table>
//Зелье, очень редкое//
Когда вы выпьете это зелье, вы получите на 1 минуту эффект заклинания ускорение (концентрация не требуется). В жёлтой жидкости этого зелья видны чёрные полоски, и она перемешивается сама собой.
//Зелье, необычное//
Когда вы выпиваете это зелье, вы получаете сопротивление к одному виду урона на 1 час. Мастер сам выбирает вид урона или определяет его случайным образом из приведённых ниже вариантов.
<table>
<tr>
<th>к10</th>
<th>Вид урона</th>
<th>к10</th>
<th>Вид урона</th>
</tr>
<tr>
<th>1</th>
<td>Звук</td>
<th>6</th>
<td>Психическая энергия</td>
</tr>
<tr>
<th>2</th>
<td>Излучение</td>
<th>7</th>
<td>Силовое поле</td>
</tr>
<tr>
<th>3</th>
<td>Кислота</td>
<th>8</th>
<td>Холод</td>
</tr>
<tr>
<th>4</th>
<td>Некротическая энергия</td>
<th>9</th>
<td>Электричество</td>
</tr>
<tr>
<th>5</th>
<td>Огонь</td>
<th>10</th>
<td>Звук</td>
</tr>
</table>
//Зелье, необычное//
Когда вы выпиваете это зелье, вы получаете на 1к4 часа эффект «увеличение» заклинания увели-чение/уменьшение (концентрация не требуется). Маленький красный шарик в этой жидкости непрерывно расширяется, окрашивая прозрачную жидкость вокруг, и тут же сжимается вновь. Тряска пузырька не прерывает этот процесс.
//Зелье, редкое//
Когда вы выпиваете это зелье, вы получаете на 1к4 часа эффект «уменьшение» заклинания увели-чение/уменьшение (концентрация не требуется).
Маленький красный шарик в этой жидкости непрерывно сжимается до размера бусины и тут же расширяется, окрашивая прозрачную жидкость вокруг, после чего сжимается вновь. Тряска пузырька не прерывает этот процесс.
//Зелье, редкое//
Когда вы выпиваете это зелье, вы получаете эффект заклинания обнаружение мыслей (Сл спасброска 13). На вид это густое, фиолетовое зелье, с плавающим в нём небольшим овальным облачком.
//Зелье, необычное//
Эта смесь выглядит, пахнет и обладает таким же вкусом, что и зелье лечения или другое полезное зелье. Однако, это самый настоящий яд, чья истинная природа скрыта магией иллюзий. Заклинание опознание раскрывает этот обман.
Если вы всё же выпьете это зелье, вы получаете урон ядом 3к6 и должны преуспеть в спасброске Телосложения со Сл 13, иначе станете отравленным. В начале каждого вашего хода, пока вы отравлены этим зельем, вы получаете урон ядом 3к6. В конце каждого своего хода вы можете повторять спасбросок. В случае успеха каждый урон ядом в последующих раундах будет уменьшен на 1к6. Яд прекращает действие, когда его урон станет равным нулю.
//Зелье, редкое//
Выпив это зелье, вы получаете эффект заклинания подсматривание. В желтоватой жидкости зелья плавают глазные яблоки, но они исчезают, когда пузырёк открывают.
//8 уровень, Воплощение, Друид/Жрец/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 500 футов
:''Компоненты:'' В, С, М (щепотка земли, кусочек камня и комочек глины)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте сейсмические возмущения в точке на земле, которую видите в пределах дистанции. Пока заклинание активно, на земле в круге с радиусом 100 футов от этой точки ощущаются интенсивные толчки, сотрясающие существ и строения, находящиеся там.
Местность в этой области становится труднопроходимой. Все существа, находящиеся на земле и концентрирующиеся при этом, должны совершить спасбросок Телосложения. При провале концентрация существа нарушается.
Когда вы накладываете это заклинание, а также в конце каждого хода, когда вы на нём концентрируетесь, все существа, находящиеся на земле в области заклинания, должны совершать спасброски Ловкости. При провале существо сбивается с ног.
У этого заклинания могут быть другие эффекты, зависящие от местности, на усмотрение Мастера.
//''Трещины.''// В области заклинания в начале вашего хода, следующего за тем, в котором вы наложили это заклинание, появляются трещины. Появляется 1к6 трещин в местах, определённых Мастером. Каждая 1к10 × 10 футов глубиной, 10 футов в ширину, а длиной от одного края заклинания до другого. Существо, стоящее в месте, где должна появиться трещина, должно преуспеть в спасброске Ловкости, иначе упадёт внутрь. Успешно спасшееся существо перемещается вместе с одним из краёв трещины.
Трещины, открывающиеся под зданиями, заставляют их автоматически обрушиться (смотрите ниже).
//''Здания.''// Толчки причиняют дробящий урон 50 строениям, находящимся в контакте с землёй, когда вы накладываете это заклинание, а также в начале каждого вашего хода, пока заклинание активно. Если хиты здания опускаются до 0, оно обрушивается, и потенциально может причинить урон существам. Существо, находящееся в пределах половины высоты здания, должно совершить спасбросок Ловкости. При провале существо получает дробящий урон 5к6, сбивается с ног и погребается под завалами, после чего для высвобождения требуется проверка Силы (Атлетика) со Сл 20, совершённая действием. Мастер может корректировать Сл, в зависимости от характера обломков. При успешном спасении существо получает половину урона, не сбивается с ног и не погребается."""
//Чудесный предмет, очень редкий//
Если на это 4-футовое в высоту зеркало посмотреть опосредованно, на его поверхности будут видны слабые изображения существ. Зеркало весит 50 фунтов, и у него КД 11, 10 хитов и уязвимость к дробящему урону. Когда его хиты опускаются до 0, оно разлетается вдребезги и уничтожается.
Если зеркало висит на вертикальной поверхности, и вы находитесь в пределах 5 футов от него, вы можете действием произнести командное слово и активировать его. Оно остаётся активированным, пока вы вновь не произнесёте командное слово действием.
Все существа кроме вас, видящие своё отражение в активированном зеркале, находясь в пределах 30 футов от него, должны преуспеть в спасброске Харизмы, иначе будут похищены вместе со всем, что несли и носили, в одной из двенадцати межпространственных ячеек. Этот спасбросок совершается с преимуществом, если существо знает природу зеркала, а конструкты автоматически преуспевают в этом спасброске.
Межпространственная ячейка является бесконечным простором, заполненным густым туманом, уменьшающим видимость до 10 футов. Существо, заключённое в ячейке зеркала, не стареет, и ему не нужно есть, пить и спать. Существо, заключённое в ячейке, может сбежать, используя магию, разрешающую планарное перемещение. В противном случае существо находится в ячейке, пока не освободится.
Если зеркало похищает существо, но все двенадцать ячеек уже заняты, зеркало освобождает одно из похищенных существ, определённое случайным образом, и похищает нового пленника. Освобождённое существо появляется в свободном пространстве в пределах обзора зеркала, но спиной к нему. Если зеркало будет разбито, все заключённые в нём существа освобождаются и появляются в свободных клетках рядом с ним.
Находясь в пределах 5 футов от зеркала, вы можете действием назвать имя одного существа, заключённого в нём, или номер конкретной ячейки. Названное существо или существо, находящееся в названной ячейке, появляется как образ на поверхности зеркала. После этого вы с ним можете общаться как обычно.
Точно так же, вы можете действием произнести второе командное слово и освободить одно существо, похищенное зеркалом. Освободившееся существо появляется со всем снаряжением в свободном пространстве, ближайшем к зеркалу, спиной к нему.
//Заговор, Очарование, Бард//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Вы испускаете на существо, видимое в пределах дистанции, поток оскорблений вперемешку с тонкой магией. Если цель слышит вас (при этом она не обязана вас понимать), она должна преуспеть в спасброске Мудрости, иначе получит урон психической энергией 1к4, и следующий бросок атаки до конца своего следующего хода совершит с помехой.
Урон этого заклинания увеличивается на 1к4, когда вы достигаете 5 уровня (2к4), 11 уровня (3к4) и 17 уровня (4к4).
<<SizeButton "$:/Злобоглаз зомби (Бехолдер-зомби) (B)""$:/Злобоглаз зомби (Бехолдер-зомби) (S)">>
{{$:/Злобоглаз зомби (Бехолдер-зомби) (Stats)}}
!!!__''Особенности''__
;
:__''Стойкость нежити.''__ Если урон опускает хиты зомби до 0, он совершает спасбросок Телосложения со Сл 5+полученный урон, если только это не был урон излучением или урон от критического попадания. При успехе хиты зомби опускаются до 1.
!!!!__''Действия''__
;
://''Укус.''// Рукопашная атака оружием: +3 к попаданию, досягаемость 5 фт., одна цель. Попадание: Колющий урон 14 (4к6).
://''Луч из глаз.''// Зомби использует случайным образом выбранный магический луч из глаз, выбирая цель, видимую в пределах 60 футов.
:://1. Парализующий луч.// Целевое существо должно преуспеть в спасброске Телосложения со Сл 14, иначе станет парализованным на 1 минуту. Цель может повторять этот спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе.
:://2. Луч страха.// Целевое существо должно преуспеть в спасброске Мудрости со Сл 14, иначе станет испуганным на 1 минуту. Цель может повторять этот спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе.
:://3. Луч бессилия.// Целевое существо должно совершить спасбросок Телосложения со Сл 14, получая урон некротической энергией 36 (8к8) при провале, или половину этого урона при успехе.
::"""//4. Луч расщепления.// Если цель — существо, оно должно преуспеть в спасброске Ловкости со Сл 14, иначе получит урон силовым полем 45 (10к8). Если этот урон снижает хиты существа до 0, его тело становится кучкой серой пыли.
Если цель — немагический предмет или творение магической силы с размером не больше Большого, она расщепляется без спасброска. Если цель — немагический предмет или творение магической силы с размером Огромный или больше, этот луч расщепляет объём куба с длиной ребра 10 футов"""
//3 уровень, Вызов, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (тухлое яйцо или несколько гнилых листьев капусты)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте сферу с радиусом 20 футов жёлтого тошнотворного газа с центром на точке в пределах дистанции. Это облако обходит углы, и его пространство — сильно заслонённая местность. Облако держится в воздухе, пока активно заклинание.
Все существа, находящиеся полностью в облаке в начале своего хода, должны совершить спасбросок Телосложения от яда. При провале существо теряет своё действие, так как его тошнит и его голова кружится. Существа, которые не обязаны дышать, а также обладающие иммунитетом к ядам, автоматически преуспевают в этом спасброске.
Умеренный ветер (как минимум 10 миль в час) рассеивает облако через 4 раунда. Сильный ветер (как минимум 20 миль в час) рассеивает его через 1 раунд."""
Своими действиями злодеи создают героям работу. 3 глава поможет определить подходящего злодея для ваших приключений, а в этом разделе вы сможете снабдить их злобными планами, методами и уязвимыми местами. Можете черпать вдохновение в приложенных таблицах.
<<Button "$:/План злодея""План злодея">>
<<Button "$:/Методы злодея""Методы злодея">>
<<Button "$:/Тайные уязвимости злодея""Тайные уязвимости злодея">>
Поиск и использование уязвимостей злодея могут принести игрокам большую пользу, несмотря на то, что умный злодей попытается свои уязвимости скрыть. У лича, например, есть филактерий — магическое вместилище его души — который он очень хорошо прячет. Только уничтожив филактерий, персонажи гарантированно уничтожат лича.
!!''Знай своих игроков''
"""Успешность игры строится на вашем умении развлекать других игроков за игровым столом. В то время как их роль — создавать персонажей (протагонистов кампании), вдыхать в них жизнь, и помогать выстраивать кампанию вокруг действий их персонажей, ваша роль — держать игроков (и себя) заинтересованными и погружёнными в мир, который вы создали, и давать их персонажам делать потрясающие вещи.
Знание того, что вашими игрокам нравится больше всего в игре, поможет вам создать и провести приключение, которое им понравится, и которое они запомнят. Как только вы поймёте, что каждый игрок любит больше всего, вы можете перестроить ваше приключение так, чтобы оно удовлетворяло пожеланиям ваших игроков настолько, насколько это возможно, что, безусловно, повысит их заинтересованность в продолжении игры."""
!!!__''Актёр''__
"""Игроки, которым нравится отыгрывать и вживаться в своего персонажа. Им нравятся социальные взаимодействия с ПМ, чудовищами и другими членами отряда.
Вовлекайте игроков, которым нравится отыгрывать..."""
* давая им возможность развивать особенности и предысторию своего персонажа.
* давая им регулярно взаимодействовать с ПМ.
* добавляя ролевые элементы в сражения.
* вводя элементы из предыстории их персонажей в приключения.
!!!__''Боец''__
"""Игрок, который любит фэнтези сражения, такие как избивание до полусмерти злодеев и чудовищ. Они ищут любой возможности начать бой, отдавая предпочтение решительным действиям вместо тщательного обсуждения.
Вовлекайте игроков, которым нравится сражаться."""
* создавая неожиданные боевые ситуации.
* ярко описывая урон, который их персонажи причиняют своими атаками или заклинаниями.
* добавляя боевые сцены с большим количеством слабых чудовищ.
* перемежая социальные взаимодействия и исследования сражениями.
!!!__''Исследователь''__
"""Игроки, которые любят исследовать, и хотят узнать, какие чудеса мир фэнтези готов для них предложить. Они хотят узнать, что находится за следующим углом или холмом. Им также нравится находить скрытые подсказки и сокровища.
Вовлекайте игроков, которым нравится исследовать.."""
* оставляя зацепки, которые намекают на будущие события.
* давая им находить что-то, когда они тратят время на поиски.
* обеспечивая богатое описание интересной местности, и используя интересные карты и реквизит.
* давая чудовищам секреты, которые можно раскрыть или особенности, которые можно изучить.
!!!__''Мыслитель''__
"""Игроки, которые хотят решать задачи, такие как раскрытие мотивации ПМ, распутывание махинаций злодеев, решение головоломок и продумывание планов.
Вовлекайте игроков, которым нравится размышлять..."""
* создавая сцены с акцентом на решении задач.
* награждая планирование или тактику внутриигровыми преимуществами.
* время от времени позволяя легко выиграть с помощью отлично продуманного плана.
* создавая ПМ со сложными мотивами.
!!!__''Оптимизатор''__
"""Игроки, которым нравится оптимизировать возможности своих персонажей. Они любят улучшать до максимума боевые возможности своих персонажей, получая новые уровни, новые возможности и магические предметы. Они никогда не упустят возможности продемонстрировать всю мощь своего персонажа.
Вовлекайте игроков, которым нравится оптимизировать.."""
* открывая быстрый доступ к новым умениям и заклинаниям.
* используя желаемые магические предметы как приманку для новых приключений.
* добавляя сражения, в которых они могут полностью себя проявить.
* обеспечивая хорошие награды, такие как опыт, за небоевые сцены.
!!!__''Подстрекатель''__
"""Игроки, которые любят подстрекать к действиям. Нетерпеливые. Им просто необходимо, чтобы что-то происходило, даже если это влечёт за собой риск и опасность. Они лучше устремятся навстречу опасности и примут последствия, чем будут сидеть и скучать.
Вовлекайте игроков, которым нравится подстрекать.."""
* разрешая им влиять на их окружение.
* добавляя вещи в приключения, чтобы искушать их.
* позволяя их действиям приводить персонажей в сложные ситуации.
* добавляя сражения с персонажами, которые такие же смелые и непредсказуемые, как и они.
!!!__''Рассказчик''__
"""Игроки, которые любят рассказывать и хотят внести свой вклад в повествование. Они любят, когда их персонажи глубоко погружены в раскрывающуюся историю, и они любят сцены, которые связаны между собой и расширяют общий сюжет.
Вовлекайте игроков, которым нравится рассказывать.."""
* делая предыстории их персонажей частью основной сюжетной линии кампании.
* подготавливая сцены так, чтобы они хоть как-то раскрывали сюжет.
* делая так, чтобы действия их персонажей влияли на будущие события.
* давая ПМ идеалы, привязанности и слабости, которые могут использовать искатели приключений.
//7 уровень, Ограждение, Бард/Волшебник/Жрец//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (ртуть, фосфор и толчённые алмаз с опалом, общей стоимостью как минимум 1 000 зм, расходуемые заклинанием)
:''Длительность:'' Пока не рассеется или не сработает
"""Когда вы накладываете это заклинание, вы рисуете губительный знак на любой поверхности (такой как пол, стена или стол) или внутри предмета, который можно закрыть, чтобы скрыть знак (например, в книге, свитке или сундуке). Если вы выбрали поверхность, знак может покрыть площадь не больше 10 футов диаметром. Если вы выбрали предмет, он должен оставаться на месте; если предмет перенесут более чем на 10 футов от того места, где было активировано это заклинание, знак будет сломан, и заклинание окончится, не сработав.
Знак практически невидим, для его обнаружения требуется успешная проверка Интеллекта (Анализ) против Сл ваших заклинаний.
При накладывании заклинания вы определяете, что вызовет срабатывание знака. Для знаков, написанных на поверхности, чаще всего используют касание или наступание на знак, снятие другого предмета, закрывающего знак, приближение к нему на определённое расстояние, или манипулирование предметом, содержащим его. Для знаков, написанных внутри предмета, чаще всего используют открывание предмета, приближение к нему на определённое расстояние, осмотр или прочтение знака.
Вы можете уточнить условие, чтобы заклинание активировалось только при определённых условиях или в зависимости от физических характеристик существа (таких как рост и вес), или его вида (например, можно выставить защиту от карг или от перевёртышей). Вы можете также определить существ, которые не будут активировать знак, например, тех, кто произнесёт пароль.
Когда вы рисуете знак, выберите из приведённого списка один эффект. Сработав, знак вспыхивает, заполняя на 10 минут сферу с радиусом 60 футов тусклым светом, после чего заклинание оканчивается. Все существа, находящиеся в сфере, когда знак активируется, становятся целью эффекта заклинания, так же как существа, впервые за ход входящие в сферу или оканчивающие в ней ход.
//''Безнадёжность.''// Все цели должны совершить спасбросок Харизмы. При провале цель охватывается отчаянием на 1 минуту. В это время она не может атаковать и нацеливаться на существ вредоносными умениями, заклинаниями и прочими магическими эффектами.
//''Безумие.''// Все цели должны совершить спасбросок Интеллекта. При провале цель становится безумной на 1 минуту. Безумное существо не может совершать действия, не понимает ничего, что говорят другие существа, не может читать, и произносит только неразборчивую чушь. Мастер контролирует его перемещения, которые весьма хаотичны.
//''Боль.''// Все цели должны совершить спасбросок Телосложения, становясь недееспособными от мучительной боли на 1 минуту при провале.
//''Ошеломление.''// Все цели должны совершить спасбросок Мудрости, становясь ошеломлёнными на 1 минуту при провале.
//''Разногласие.''// Все цели должны совершить спасбросок Телосложения. При провале цель спорит и ругается с другими существами в течение 1 минуты. В это время она не способна осмысленно общаться и совершает броски атаки и проверки характеристик с помехой.
//''Смерть.''// Все цели должны совершить спасбросок Телосложения, получая урон некротической энергией 10к10 при провале, или половину этого урона при успехе.
//''Сон.''// Все цели должны совершить спасбросок Мудрости, теряя сознание на 10 минут при провале. Существо пробуждается, если получает урон или если кто-то действием потрясёт его или даст пощёчину.
//''Страх.''// Все цели должны совершить спасбросок Мудрости, становясь испуганными на 1 минуту при провале. Будучи испуганной, цель бросает всё, что держит, и должна в каждом своём ходу перемещаться как минимум на 30 футов от знака, если это возможно."""
!!!''Знак дурного предзнаменования''
"""//Требование: 5 уровень//
Вы можете один раз сотворить заклинание проклятие, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
//5 уровень, Прорицание, Бард/Волшебник/Жрец//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (благовония, стоящие как минимум 250 зм, расходуемые заклинанием, и четыре пластинки из слоновой кости, стоящие как минимум 50 зм каждая)
:''Длительность:'' Мгновенная
"""Назовите или опишите личность, место или вещь. Заклинание создаёт в вашем сознании краткое описание важных знаний о данном предмете. Это могут быть текущие разговоры, забытые истории, или даже тайные знания, никогда не выходящие за рамки определённого круга посвящённых. Если названный предмет не обладает легендарной значимостью, вы не получаете информацию. Чем больше информации о выбранном предмете у вас уже есть, тем точнее и детальнее будет полученная вами информация.
Полученная информация правдива, но может быть завуалирована. Например, если вы нашли таинственный топор, заклинание может выдать такую информацию: «Горе злодею, коснувшемуся этого топора, ибо даже древко его способно отрубить руки негодяю. Только истинный Сын Камня, почитатель и любимец Морадина, может пробудить истинную силу этого топора, и то только если назовёт священное слово Рудногг»."""
"""У каждой из характеристик существа есть значение — число, означающее степень её развитости. Значение характеристики отражает не только врождённые способности, но также пройдённую тренировку и знание деятельности, связанной с этой характеристикой.
Значение 10 или 11 — среднестатистический средний уровень, но искатели приключений и многие чудовища намного превосходят эти числа. Обычно максимум, чего достигают обычные жители, это значение 18. Искатели приключений не могут поднять значения характеристик выше 20, но у чудовищ и божественных созданий встречаются значения под 30.
У каждой характеристики есть также модификатор, зависящий от значения, и попадающий в диапазон от −5 (для значения «1») до +10 (для значения «30»). В приведённой таблице указаны модификаторы характеристик для всех возможных значений характеристик, от 1 до 30."""
''Значения и модификаторы характеристик''
<table>
<tr>
<th>Значение</th>
<th>Модификатор</th>
<th>Значение</th>
<th>Модификатор</th>
</tr>
<tr>
<td>1</td>
<td>−5</td>
<td>16–17</td>
<td>+3</td>
</tr>
<tr>
<td>2–3</td>
<td>−4</td>
<td>18–19</td>
<td>+4</td>
</tr>
<tr>
<td>4–5</td>
<td>−3</td>
<td>20–21</td>
<td>+5</td>
</tr>
<tr>
<td>6–7</td>
<td>−2</td>
<td>22–23</td>
<td>+6</td>
</tr>
<tr>
<td>8–9</td>
<td>−1</td>
<td>24–25</td>
<td>+7</td>
</tr>
<tr>
<td>10–11</td>
<td>+0</td>
<td>26–27</td>
<td>+8</td>
</tr>
<tr>
<td>12–13</td>
<td>+1</td>
<td>28–29</td>
<td>+9</td>
</tr>
<tr>
<td>14–15</td>
<td>+2</td>
<td>30</td>
<td>+10</td>
</tr>
</table>
"""Для определения модификатора характеристики без обращения к таблице вычтите 10 из значения характеристики, а разницу разделите на 2 (округляя в меньшую сторону).
Из-за того, что модификаторы характеристик влияют практически на все броски атаки, проверки характеристик и спасброски, они используются в игре гораздо чаще, чем значения."""
//«После смерти Бика мы сотворили над его телом за клинание восставший труп. Это было за бавно, пока зомби не начал вонять, поэтому мы облили его маслом и отправили в костёр. Бик, наверное, оценил бы шутку».//
<<AlignRight "— Фонкин Ноддипик, друг">>
Откуда-то из темноты слышатся гортанные стоны. В поле зрения появляется шатающееся тело, подволакивающее распухшую ногу и тянущее изломанные руки. Зомби с лёгкостью убьют всех, кто не успеет избежать их объятий.
;
:"""//''Тёмные слуги.''// Зловещая некромантия заставляет мёртвых подниматься в виде зомби, выполняющих без страха и сомнения то, что прикажет их создатель. Они двигаются неровной, дёргающейся походкой, одетые в гниющие остатки того, в чём их похоронили, окружая себя зловонным запахом разложения.
Большинство зомби создаётся из гуманоидных останков, однако подобием жизни могут быть наполнены плоть и кости любого живого существа. Обычно для этого используется заклинание из арсенала некромантии. Некоторые зомби могут подниматься самостоятельно, когда тёмная магия окутывает какое-либо пространство. Единожды поднятое как зомби, существо не сможет больше вернуться к жизни, разве что кроме как посредством могущественной магии, например, заклинания воскрешение.
У зомби нет никакого осознания бывшего себя, его разум лишён мыслей и фантазии. Без приказа зомби будет просто стоять на месте и гнить, пока рядом не окажется кто-то, кого можно убить. Магия, поднявшая зомби, наполняет его злом, поэтому оставленный без цели, он атакует любое живое существо, столкнувшееся с ним."""
://''Отвратительные тела.''// Зомби появляются такими, какими они были при жизни, демонстрируя раны, от которых умерли. Однако магия, которая создаёт этих ужасных существ, требует времени. Мёртвые воины могут подняться на поле боя, выпотрошенные и раздутые, после нескольких дней на солнце. Грязный мертвец, бывший когда-то крестьянином, может прорыть себе путь из земли,покрытый личинками и червями. Зомби может бытьвынесен прибоем или восстать посреди болота, разбухший и воняющий, после многих недель, проведённых в воде.
:"""//''Безмозглые солдаты.''// Зомби выбирают самый кратчайший путь к своему врагу, неспособные оценить препятствия на пути, тактику и опасный ландшафт. В стремлении достичь своего врага, находящегося на другом берегу, они могут войти в бурлящую реку, где их размажет о камни. Чтобы убить противника, стоящего внизу, зомби могут выйти в открытое окно. Они бездумно шагнут в полыхающий огонь, колодец с кислотой, и напрямки пойдут через поле, усеянное шипами.
Они могут следовать простым приказам и отличать друзей от врагов, но их способности ограничены волочением ног туда, куда укажут, убивая всех врагов на пути. Зомби обычно вооружены тем, что использовали, и не будут поднимать выпавшее оружие и другие инструменты, пока им не прикажут."""
://''Натура нежити.''// Зомби не нужен воздух, еда, питьё и сон.
<<NavMacro "Зомби (существо)""''Зомби''">>
<<NavMacro "Огр зомби (существо)""''Огр зомби''">>
<<NavMacro "Злобоглаз зомби (Бехолдер-зомби) (существо)""''Злобоглаз зомби (Бехолдер-зомби)''">>
<<SizeButton "$:/Зомби (B)""$:/Зомби (S)">>
{{$:/Зомби (Stats)}}
!!!!__''Особенности''__
;
://''Стойкость нежити.''// Если урон опускает хиты зомби до 0, он совершает спасбросок Телосложения со Сл 5+полученный урон, если только это не был урон излучением или урон от критического попадания. При успехе хиты зомби опускаются до 1.
!!!!__''Действия''__
;
://''Размашистый удар.''// Рукопашная атака оружием: +3 к попаданию, досягаемость 5 фт., одна цель. Попадание: Дробящий урон 4 (1к6+1).
!!!__''Избранный враг''__
"""Начиная с 1 уровня у вас есть значительный опыт изучения, отслеживания, охоты и даже общения с определённым видом врагов.
Выберите вид избранного врага: аберрации, великаны, драконы, звери, исчадия, конструкты, монстры, небожители, нежить, растения, слизи, феи или элементали. В качестве альтернативы вы можете выбрать в качестве избранных врагов две гуманоидные расы (например, гноллов и орков).
Вы совершаете с преимуществом проверки Мудрости (Выживание) для выслеживания избранных врагов, а также проверки Интеллекта для вспоминания информации о них.
Когда вы получаете это умение, вы также обучаетесь одному из языков, на котором говорит ваш избранный враг, если он вообще умеет говорить.
Вы дополнительно выбираете по одному избранному врагу и языку, связанному с ним, на 6 и 14 уровнях. Получая уровни, ваш выбор должен отражать чудовищ, с которыми вы уже сталкивались во время приключений."""
Миры Материального Плана бесконечно разные. Больше всего известны те, что за долгие годы опубликованы в качестве официальных игровых миров D&D. Если ваша кампания происходит в одном из этих миров, этот мир всё равно принадлежит вам, и ваша версия этого мира может значительно отличаться от той, что выпущена издательством.
;
:''На Ториле'' (мир героического фэнтези Забытых Королевств) фантастические города и королевства покоятся среди останков древних империй и давно исчезнувших стран. Мир огромен, а его подземелья хранят тайны истории. Кроме центрального континента, Фаэруна, на Ториле есть регионы Аль-Кадим, Кара-Тур и Мацтика
;
:''На Орте'' (мир меча и магии Грейхока) таких героев как Бигби и Морденкайнен ведёт жадность и амбиции. Центром региона Фланаэсс является Свободный Город Грейхок, город негодяев и архимагов, кишащий приключениями. Злой полубог Иуз правит на севере кошмарным царством, угрожающим всей цивилизации.
;
:''На Кринне'' (мир эпичного фэнтези Саги о Копье) возвращение богов омрачилось восстанием королевы злых драконов Такхизис и её войск, погрузивших континент Ансалон в войну.
;
:''На Атхасе'' (мир меча и магии Тёмного Солнца) капля воды может стоить больше человеческой жизни. Боги покинули этот пустынный мир, в котором правят деспотичные короли-чародеи, а металл редок и стоит очень дорого.
;
:''На Эберроне'' (мир героического фэнтези Эбер-рон) окончилась ужасная война, сменившаяся холодной войной, подпитываемой политическими интригами. На континенте Кхорвайр магия обыденна, отмеченные драконами дома соперничают друг с другом за власть, а стихийные транспортные средства позволяют отправиться в любой уголок исследованного мира.
;
:''На Эбринисе'' (мир героического фэнтези Birthright) наследники, род которых восходит к богам, соперничают за власть на континенте Церилия. Монархи, прелаты, главы гильдий и великие волшебники разбираются с возникающими перед ними, как перед правителями, задачами, и при этом борются с жуткими чудищами, рождёнными от крови злого божества.
;
:''На Мистаре'' (мир героического фэнтези, зародившийся в первых изданиях D&D) сталкиваются разнообразные культуры, дикие чудища и воюющие империи. Мир также формируется вмешательством Бессмертных — бывших искателей приключений, достигнувших практически божественного статуса.
//4 уровень, Ограждение, Волшебник/Жрец/Колдун/Паладин/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (неприятный для цели предмет)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь послать одно существо, которое видите в пределах дистанции, на другой план существования. Цель должна преуспеть в спасброске Харизмы, иначе будет изгнана.
Если цель родом с того плана существования, на котором находитесь вы, вы изгоняете её в безопасный демиплан. Находясь там, цель недееспособна. Она остаётся там, пока активно заклинание, после чего возвращается в пространство, из которого исчезла, или ближайшее свободное пространство, если то место занято.
Если цель родом не с того плана существования, на котором находитесь вы, цель изгоняется с негромким хлопком, возвращаясь на свой родной план. Если заклинание окончится раньше чем через 1 минуту, цель возвращается в пространство, из которого исчезла, или ближайшее свободное пространство, если то место занято. В противном случае цель не возвращается."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше четвёртого.
//5 уровень, Ограждение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
В следующий раз, когда вы попадёте по существу атакой оружием, пока активно это заклинание, ваше оружие покрывается силовым полем, и атака причиняет цели дополнительный урон силовым полем 5к10. Кроме того, если эта атака опустила хиты цели до 50 или ниже, вы изгоняете её. Если цель родом не с того плана существования, на котором сейчас находитесь вы, цель исчезает, возвращаясь на свой родной план. Если цель родом с того плана, на котором находитесь вы, она исчезает в безопасном демиплане. Находясь там, цель недееспособна. Она остаётся там, пока активно заклинание, после чего возвращается в пространство, из которого исчезла, или ближайшее свободное пространство, если то место занято.
//4 уровень, Преобразование, Волшебник//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы превращаете сырьё в готовое изделие из этого материала. Например, вы можете создать деревянный мост из нескольких деревьев, верёвку из груды пеньки, или одежду изо льна или шерсти.
Выберите сырьё, которое видите в пределах дистанции. Вы можете создать предмет Большого или меньшего размера (помещающийся в куб с длиной ребра 10 футов, или восемь соединённых кубов с длиной ребра 5 футов), при условии, что сырья хватит. Если вы работаете с металлом, камнем или другой минеральной материей, создаваемый предмет не может быть больше Среднего размера (должен помещаться в один куб с длиной ребра 5 футов). Качество предметов, изготавливаемых этим заклинанием, напрямую зависит от качества сырья.
Этим заклинанием нельзя создавать и изменять существ и магические предметы. Вы также не можете создавать с его помощью предметы, обычно требующие высокого мастерства, такие как ювелирные изделия, оружие, стекло или доспех, если только вы не владеете ремесленным инструментом, необходимым для создания таких предметов."""
//5 уровень, Очарование, Бард/Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь изменить воспоминания другого существа. Одно существо, которое вы видите, должно совершить спасбросок Мудрости. Если вы с ним сражаетесь, оно совершает спасбросок с преимуществом. При провале цель становится очарованной вами на время действия заклинания. Очарованная цель недееспособна и не осознаёт окружение, но всё ещё может слышать вас. Если она получит урон или станет целью другого заклинания, это заклинание оканчивается, и воспоминания цели не изменяются.
Пока длится это очарование, вы можете повлиять на воспоминание цели, произошедшее за последние 24 часа и длящееся не больше 10 минут. Вы можете полностью стереть память об этом событии, позволить цели вспомнить всё с потрясающей точностью, изменить детали этого события, или заменить это воспоминание на что-то совершенно иное.
Вы должны произнести цели её новые воспоминания, и она должна понимать ваш язык, чтобы изменённые воспоминания заняли место. Её сознание само заполнит пробелы в деталях вашего описания. Если заклинание оканчивается до того как вы закончите описывать новые воспоминания, память существа не будет затронута. В противном случае изменённые воспоминания вступают в силу в конце действия заклинания.
Изменённая память не обязательно будет влиять на поведение существа, особенно если она противоречит его наклонностям, мировоззрению или вере. Нелогичная изменённая память, такая как внедрение воспоминаний о том, как существу нравится купаться в кислоте, отбрасываются, как дурной сон. Мастер может посчитать, что изменённая память слишком абсурдная, чтобы влиять на существо в значительной степени.
Заклинания снятие проклятья и высшее восстановление, наложенные на цель, восстанавливают её истинную память."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, вы можете изменить воспоминания о событиях, произошедших до 7 дней назад (6 уровень), 30 дней назад (7 уровень), 1 года назад (8 уровень), или в любой момент в жизни существа (9 уровень).
//7 уровень, Преобразование, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 100 футов
:''Компоненты:'' В, С, М (магнетит и железные опилки)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Это заклинание обращает гравитацию в цилиндре с радиусом 50 футов и высотой 100 футов с центром на точке в пределах дистанции. Все существа и предметы, не прикреплённые к полу, падают вверх до верхушки цилиндра, когда вы накладываете это заклинание. Существо может совершить спасбросок Ловкости, чтобы схватиться за закреплённый предмет, и тем самым избежать падения.
Если в процесс падения на пути встречается твёрдый предмет (такой как потолок), ударившиеся об него существа и предметы получают обычный урон как от падения вниз. Если существо или предмет достигают верха, ничего не встретив, они остаются там, немного покачиваясь, на период действия заклинания.
В конце длительности заклинания существа и предметы падают вниз."""
//4 уровень, Преобразование, Волшебник/Друид/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (мягкая глина, из которой делается грубая копия желаемого каменного предмета)
:''Длительность:'' Мгновенная
Вы касаетесь каменного предмета с размером не больше Среднего, или камня, не превышающего ни по одному из измерений более 5 футов, и придаёте ему любую форму. Так, например, вы можете превратить большой камень в оружие, статую или гроб, или создать небольшой проход в стене, если эта стена толщиной меньше 5 футов. Вы можете также скорректировать каменную дверь или её обрамление, чтобы запереть наглухо. У создаваемого вами предмета могут быть две дверные петли и щеколда, но более мелкие механические детали невозможны.
//7 уровень, Преобразование, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (смесь порошков из бриллианта, изумруда, рубина и сапфира, стоящая как минимум 5 000 зм, расходуемая заклинанием)
:''Длительность:'' Пока не рассеется
"""При помощи этого заклинания согласное существо или предмет можно защитить на время действия заклинания от обнаружения. Когда вы накладываете это заклинание и касаетесь цели, она становится невидимой, и не может стать целью заклинаний школы Прорицания, а также не обнаруживается сенсорами, созданными заклинаниями школы Прорицания.
Если цель — существо, оно входит в состояние приостановленной жизнедеятельности. Время для него не течёт, и оно не стареет.
Вы можете определить условия, при которых заклинание окончится. Это может быть что угодно, но оно должно произойти в пределах 1 мили от цели. Примерами могут стать «через 1000 лет» и «когда проснётся тараск». Это заклинание также оканчивается, если цель получает урон."""
//Чудесный предмет, редкость варьируется (требуется настройка бардом)//
Инструмент бардов это прекрасный образец музыкального инструмента, во всём превосходящий обычные аналоги. Есть семь разновидностей таких инструментов, каждый назван в честь одной из легендарных коллегий бардов. В приведённом списке указаны заклинания, общие для всех инструментов, а также заклинания, специфичные для каждого инструмента, а также редкость этих инструментов. Существо, пытающееся играть на инструменте, не будучи настроенным на него, должно преуспеть в спасброске Мудрости со Сл 15, иначе получит урон психической энергией 2к4.
Вы можете действием сыграть на инструменте и наложить одно из его заклинаний. После того как инструмент использован для наложения заклинания, он не может повторно накладывать это заклинание до следующего рассвета. Заклинания используют вашу базовую характеристику и Сл спасбросков от ваших заклинаний.
Если вы использовали инструмент для накладывания заклинания, которое делает цель очарованной при провале спасброска, цель совершает этот спасбросок с помехой. Этот эффект применяется вне зависимости от того, использовали ли вы инструмент в качестве источника заклинания или в качестве заклинательной фокусировки.
<table>
<tr>
<th>Все</th>
<td colspan="2">Защита от добра и зла, левитация, невидимость, полёт плюс заклинания, перечисленные для конкретного инструмента</td>
</tr>
<tr>
<th>Арфа Анструт</th>
<td>Очень редкая</td>
<td>Власть над погодой, лечение ран (5 уровень), терновая стена</td>
</tr>
<tr>
<th>Лютня Досс</th>
<td>Необычная</td>
<td>Дружба с животными, защита от энергии (только огонь), защита от яда</td>
</tr>
<tr>
<th>Мандолина Канаит</th>
<td>Редкая</td>
<td>Защита от энергии (только электричество), лечение ран (3 уровень), рассеивание магии</td>
</tr>
<tr>
<th>Лира Кли</th>
<td>Редкая</td>
<td>Изменение формы камня, огненная стена, стена ветров</td>
</tr>
<tr>
<th>Арфа Оллава</th>
<td>Легендарная</td>
<td>Власть над погодой, смятение, огненная буря</td>
</tr>
<tr>
<th>Бандура Фоклучан</th>
<td>Необычная</td>
<td>Дубинка, огонь фей, опутывание, разговор с животными</td>
</tr>
<tr>
<th>Цитра Мак-Фуирмид</th>
<td>Необычная</td>
<td>Дубовая кора, лечение ран, туманное облако</td>
</tr>
</table>
Инструменты помогают делать что-то, что без них сделать нельзя, например, создавать или чинить вещи, подделывать документы и вскрывать замки. Ваши раса, класс, предыстории и черты могут давать владение некоторыми инструментами. Владение инструментом позволяет добавлять бонус мастерства к проверкам характеристик, сделанным при использовании этих инструментов. Использование инструментов не привязано к какой-то одной характеристике, так как владение инструментом отражает широкие познания в его использовании. Например, Мастер может попросить вас совершить проверку Ловкости для вырезания мелких деталей инструментом резчика по дереву, или проверку Силы для вырезания чего-то из очень твёрдого дерева.
!!''Инструменты''
<table>
<tr>
<th>Предмет</th>
<th>Стоимость</th>
<th>Вес</th>
</tr>
<tr>
<td>Воровские инструменты</td>
<td>25 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Инструменты навигатора</td>
<td>25 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Инструменты отравителя</td>
<td>50 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Инструменты ювелира</td>
<td>25 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Набор для грима</td>
<td>25 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Набор для фальсификации</td>
<td>15 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Набор травника</td>
<td>5 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<th colspan="3">Инструменты ремесленников</th>
</tr>
<tr>
<td>Инструменты алхимика</td>
<td>50 зм</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Инструменты гончара</td>
<td>10 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Инструменты жестянщика</td>
<td>50 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Инструменты каллиграфа</td>
<td>10 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты каменщика</td>
<td>10 зм</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Инструменты картографа</td>
<td>15 зм</td>
<td>6 фнт.</td>
</tr>
<tr>
<td>Инструменты кожевника</td>
<td>5 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты кузнеца</td>
<td>20 зм</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Инструменты пивовара</td>
<td>20 зм</td>
<td>9 фнт.</td>
</tr>
<tr>
<td>Инструменты плотника</td>
<td>8 зм</td>
<td>6 фнт.</td>
</tr>
<tr>
<td>Инструменты повара</td>
<td>1 зм</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Инструменты резчика по дереву</td>
<td>1 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты сапожника</td>
<td>5 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты стеклодува</td>
<td>30 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты ткача</td>
<td>1 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Инструменты художника</td>
<td>10 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<th colspan="3">Музыкальные инструменты</th>
</tr>
<tr>
<td>Барабан</td>
<td>6 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Виола</td>
<td>30 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Волынка</td>
<td>30 зм</td>
<td>6 фнт.</td>
</tr>
<tr>
<td>Лира</td>
<td>30 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Лютня</td>
<td>35 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Рожок</td>
<td>3 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Свирель</td>
<td>12 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Флейта</td>
<td>2 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Цимбалы</td>
<td>25 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Шалмей</td>
<td>2 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<th colspan="3">Игровой набор</th>
</tr>
<tr>
<td>Драконьи шахматы</td>
<td>1 зм</td>
<td>1/2 фнт.</td>
</tr>
<tr>
<td>Карты</td>
<td>5 см</td>
<td>—</td>
</tr>
<tr>
<td>Кости</td>
<td>1 см</td>
<td>—</td>
</tr>
<tr>
<td>Ставка трех драконов</td>
<td>1 зм</td>
<td>—</td>
</tr>
</table>
"""//''Воровские инструменты.''// В этот набор инструментов входят небольшой напильник, набор отмычек, небольшое зеркальце на длинной ручке, ножницы и пара щипчиков. Владение этими инструментами позволяет добавлять бонус мастерства ко всем проверкам характеристик, сделанным для отключения ловушек и взлома замков.
//''Игровой набор. ''//Игры могут состоять из разных предметов, включая кости и колоды карт. В таблице указаны примеры игр, но есть и другие наборы. Если вы владеете игровым набором, вы можете добавлять бонус мастерства к проверкам характеристик, совершаемым во время игры. Для каждой игры требуется отдельное владение.
//''Инструменты навигатора.''// Эти инструменты используются для навигации в море. Владение инструментами навигатора позволяет прокладывать курс корабля и пользоваться морскими картами. Кроме того, эти инструменты позволяют вам добавлять бонус мастерства к проверкам характеристик, совершённым, чтобы не потеряться в море.
//''Инструменты отравителя.''// В набор отравителя входят флаконы, химикаты и прочее снаряжение, необходимое для создания ядов. Владение этим набором позволяет вам добавлять бонус мастерства к проверкам характеристик, совершённым для создания и использования ядов.
//''Инструменты ремесленников.''// В эти особые наборы входят инструменты, необходимые для ремесла и торговли. В таблице приведены примеры самых распространённых наборов, каждый из которых связан со своим ремеслом. Владение инструментами ремесленника позволяет добавлять бонус мастерства к проверкам характеристик, совершённым при использовании инструментов в ремесле. Для каждого набора инструментов требуется отдельное владение.
//''Музыкальные инструменты.''// Самые популярные музыкальные инструменты указаны в таблице. Если вы владеете определённым музыкальным инструментом, вы можете добавлять бонус мастерства к проверкам характеристик, совершённым во время игры на нём. Бард может использовать музыкальный инструмент в качестве фокусировки для заклинаний, как описано в главе 10. Для каждого музыкального инструмента нужно отдельное владение.
//''Набор для грима.''// Этот набор косметики, красителей для волос и бутафории позволяет изменять ваш внешний облик. Владение этим набором позволяет добавлять бонус мастерства к проверкам характеристик, совершённым для визуальной маскировки.
//''Набор для фальсификации.''// В этой небольшой коробке лежат разные бумаги и пергаменты, ручки и чернила, печати и куски воска, золотая и серебряная фольга, и прочие припасы, необходимые для создания убедительных подделок документов. Владение этим набором позволяет добавлять бонус мастерства к проверкам характеристик, совершённым при создании поддельных документов.
//''Набор травника.''// В этот набор входят разнообразные инструменты, такие как ножницы, ступка и пестик, а также мешочки и флаконы, используемые травниками при создании снадобий и зелий. Владение этим набором позволяет добавлять бонус мастерства к проверкам характеристик, совершённым при опознании и использовании трав. Кроме того, владение этим набором требуется для создания противоядия и зелья лечения."""
Информаторы это персонажи с тесными связями с одним или несколькими персонажами игроков. Они не отправляются на поиски приключений, но могут предоставить информацию, слухи, помощь или профессиональный совет, безвозмездно или за плату. Некоторые предыстории в Книге игрока приводят примеры информаторов для начинающих искателей приключений, а позже, во время приключений, персонажи найдут более полезных информаторов.
Всё, что нужно для простого информатора, это имя и пара деталей, но потратьте время на создание дополнительных деталей, если информатор будет встречаться очень часто, особенно если он когда-нибудь станет союзником или врагом. Как минимум, продумайте цели такого информатора и то, как эти цели отразятся на игре.
!!__''Покровители''__
Покровитель это информатор, нанимающий искателей приключений, предоставляющий помощь или награду, а также дающий задания и зацепки для приключений. В большинстве случаев покровитель заинтересован в успехе искателей приключений, и его не нужно просить помогать.
Покровителем может быть отошедший от дел искатель приключений, ищущий молодых героев для уничтожения надвигающейся угрозы, или мэр, знающий, что городская стража не справится с драконом, требующим дань. Шериф становится покровителем, когда предлагает награду на кобольдов, терроризирующих пригород, равно как и дворянин, который хочет, чтобы его заброшенный особняк очистили от чудовищ.
//Заговор, Преобразование, Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Пошептавшись с духами природы, вы создаёте один из следующих эффектов в пределах дистанции:
* Вы создаёте крохотный безвредный ощутимый эффект, предсказывающий погоду в текущем месте в течение следующих 24 часов. Это может быть золотистый шарик, означающий ясную погоду, облачко, означающее дождь, снежинка, и так далее. Эффект длится 1 раунд.
* Вы мгновенно заставляете цветок распуститься, семечко прорасти, или почку раскрыться.
* Вы создаёте мгновенный безвредный ощутимый эффект, такой как падающие листья, порыв ветра, звук маленького животного, или слабый запах скунса. Эффект должен находиться в кубе с длиной ребра 5 футов.
* Вы мгновенно зажигаете или тушите свечу, факел или небольшой костёр.
//9 уровень, Вызов, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Мгновенная
"""Исполнение желаний это самое мощное заклинание, которое могут накладывать смертные. Высказав вслух свои пожелания, вы можете изменить основы мироздания.
Это заклинание может дублировать эффекты любого заклинания с уровнем не больше 8. Вы не обязаны выполнять требования этих заклинаний, включая стоимость дорогих компонентов. Заклинание просто начинает оказывать свой эффект.
В качестве альтернативы, вы можете создать один из следующих эффектов на свой выбор:"""
* Вы создаёте один предмет, стоящий до 25 000 зм, не являющийся волшебным. Этот предмет не может превышать ни в одном измерении 300 футов, и он появляется в свободном пространстве, видимом вами, на земле.
* Вы позволяете до двенадцати другим существам, видимым вами, восстановить все хиты, и вы оканчиваете все действующие на них эффекты, описанные в заклинании высшее восстановление.
* Вы даруете до десяти существам, видимым вами, сопротивление к выбранному вами виду урона.
* Вы даруете до десяти существам, видимым вами, иммунитет к одному заклинанию или другому магическому эффекту на 8 часов. Например, вы можете даровать себе и всем своим спутникам иммунитет к вытягивающей жизнь атаке лича.
* Вы отменяете одно недавно произошедшее событие, заставив перебросить любой бросок, совершённый в последнем раунде (включая ваш последний ход). Реальность будет сформирована заново, согласно новому результату. Например, заклинание исполнение желаний может отменить успешный спасбросок противника, его критическое попадание, или проваленный спасбросок друга. Вы можете даровать помеху или преимущество к броску, и можете либо выбрать новый результат, либо оставить старый.
"""Вы можете попытаться получить эффект, отличный от приведённых примеров. Максимально точно передайте желание Мастеру. Мастер обладает широкой свободой выбора при вынесении суждения о том, что произошло; чем больше желание, тем больше вероятность того, что что-то пойдёт не так. Это заклинание может просто провалиться, желаемый эффект может осуществиться лишь частично, или же вы можете претерпеть непредвиденные последствия из-за формулировки желания. Например, желание, чтобы злодей был мёртв, может зашвырнуть вас вперёд во времени, фактически, выводя вас из игры. Желание получить легендарный магический предмет или артефакт может мгновенно перенести вас к его текущему обладателю.
Перенапряжение от дублирования этим заклинанием другого заклинания ослабляет вас. Получив это ослабление, каждый раз до окончания продолжительного отдыха, когда вы накладываете заклинание, вы получаете урон некротической энергией 1к10 за каждый уровень этого заклинания. Этот урон никак нельзя отменить или уменьшить. Кроме того, ваша Сила на 2к4 дня опускается до 3, если она была больше 3. За каждый день, в течение которого вы только отдыхаете и не делаете ничего кроме лёгкой деятельности, оставшееся время сокращается на 2 дня. Кроме того, если вы пережили это ослабление, существует 33-процентный шанс, что вы больше никогда не сможете накладывать исполнение желаний."""
!!!__''Использование заклинаний''__
Вы научились изменять ткань реальности в соответствии с вашими волей и музыкой. Ваши заклинания являются частью вашего обширного репертуара; это магия, которой вы найдёте применение в любой ситуации. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных барду.
!!!''Заговоры''
Вы знаете два заговора из списка доступных для барда на ваш выбор. При достижении более высоких уровней вы выучите новые, в соответствии с колонкой «известные заговоры».
!!!''Ячейки заклинаний''
"""Таблица «Бард» показывает, сколько ячеек заклинаний у вас есть для заклинаний 1 и других уровней. Для использования заклинания вы должны потратить ячейку соответствующего, либо превышающего уровня. Вы восстанавливаете все потраченные ячейки в конце продолжительного отдыха.
Например, если вы знаете заклинание 1 уровня лечение ран, и у вас есть ячейки 1 и 2 уровней, вы можете использовать его с помощью любой из этих ячеек."""
!!!''Известные заклинания первого и более высоких уровней''
"""Вы знаете четыре заклинания 1 уровня на свой выбор из списка доступных барду.
Колонка «известные заклинания» показывает, когда вы сможете выучить новые заклинания. Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний. Например, когда вы достигнете 3 уровня в этом классе, вы можете выучить одно новое заклинание 1 или 2 уровня.
Кроме того, когда вы получаете новый уровень в этом классе, вы можете одно из известных вам заклинаний барда заменить на другое из списка барда, уровень которого тоже должен соответствовать имеющимся ячейкам заклинаний."""
!!!''Базовая характеристика заклинаний''
При накладывании заклинаний бард использует свою Харизму. Ваша магия проистекает из сердечности и душевности, которую вы вкладываете в исполнение музыки и произнесение речей. Вы используете Харизму в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете Харизму при определении Сл спасбросков от ваших заклинаний, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Харизмы
:''Модификатор броска атаки'' = бонус мастерства + модификатор Харизмы
!!!''Исполнение ритуалов''
Вы можете исполнить любое известное вам заклинание барда в качестве ритуала, если заклинание позволяет это.
''Фокусировка заклинания''
Вы можете использовать ваш музыкальный инструмент (смотрите в главе 5) в качестве фокусировки для ваших заклинаний барда.
!!!''__Использование заклинаний__''
Являясь учеником тайной магии, вы обладаете книгой, содержащей заклинания, показывающие первые проблески вашей истинной силы. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных волшебнику.
!!!''Заговоры''
На 1 уровне вы знаете три заговора на ваш выбор из списка заклинаний волшебника. Вы узнаёте дополнительные заговоры волшебника на более высоких уровнях, как показано в колонке «известные заговоры».
!!!''Книга заклинаний''
На 1 уровне у вас есть книга заклинаний, содержащая шесть заклинаний волшебника 1 уровня по вашему выбору. Заговоры в ней не хранятся.
<<<
{{Книга заклинаний (Волшебник)}}
<<<
!!!''Подготовка и сотворение заклинаний''
"""Таблица «Волшебник» показывает, какое количество ячеек для сотворения заклинаний у вас есть на первом и более высоких уровнях. Для сотворения одного из этих заклинаний вы должны потратить ячейку заклинаний того же уровня или выше, что и само заклинание. Вы восстановите все потраченные ячейки, когда завершите продолжительный отдых.
Вы подготавливаете список заклинаний волшебника, доступных для сотворения. При этом вы выбираете число заклинаний волшебника из своей книги заклинаний, равное модификатору Интеллекта + уровень волшебника (минимум одно заклинание). Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний.
Например, если вы волшебник 3 уровня, то у вас есть четыре ячейки заклинаний 1 уровня и две ячейки 2 уровня. При Интеллекте 16 ваш список подготовленных заклинаний может включать в себя шесть заклинаний 1 или 2 уровня, в любой комбинации, выбранных из вашей книги заклинаний. Если вы подготовили заклинание 1 уровня волшебная стрела, вы можете сотворить его, используя ячейку 1 уровня или ячейку 2 уровня. Сотворение заклинания не удаляет его из списка подготовленных заклинаний."""
Вы можете изменить список подготовленных заклинаний, когда завершаете продолжительный отдых. Подготовка нового списка заклинаний волшебника требует времени, проведённого в изучении книги заклинаний и запоминания слов и жестов, которые вы должны совершить, чтобы сотворить заклинание: не менее 1 минуты за уровень заклинания для каждого заклинания в вашем списке.
!!!''Базовая характеристика заклинаний''
При создании заклинаний волшебник использует Интеллект, так как вы узнаёте свои заклинания специальными исследованиями и запоминанием. Вы используете Интеллект в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Интеллекта при определении Сл спасбросков от ваших заклинаний волшебника, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Интеллекта
:''Модификатор броска атаки'' = бонус мастерства + модификатор Интеллекта
!!!''Ритуальное колдовство''
Вы можете сотворить заклинание волшебника как ритуал, если у этого заклинания есть ключевое слово «ритуал», и оно есть в вашей книге заклинаний. Вам не нужно иметь это заклинание подготовленным.
!!!''Фокусировка заклинания''
Вы можете использовать магическую фокусировку (смотрите в главе 5) в качестве заклинательной фокусировки для заклинаний волшебника.
!!!''Известные заклинания первого и более высоких уровней''
Каждый раз, когда вы получаете уровень волшебника, вы можете добавить два заклинания волшебника по вашему выбору в книгу заклинаний. Уровень этих заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний. Во время приключений вы можете найти другие заклинания, которые сможете добавить в книгу заклинаний (смотрите врезку «Ваша книга заклинаний»).
!!!__''Использование заклинаний''__
Для сотворения заклинаний друиды пользуются сакральной эссенцией самой природы, облачая в неё свою волю. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных друиду.
!!!''Заговоры''
На 1 уровне вы знаете два заговора на ваш выбор из списка заклинаний друида. Вы узнаёте дополнительные заговоры друида на более высоких уровнях, как показано в колонке «известные заговоры».
!!!''Подготовка и сотворение заклинаний''
"""Таблица «Друид» показывает, какое количество ячеек для сотворения заклинаний у вас есть на первом и более высоких уровнях. Для сотворения одного из этих заклинаний вы должны потратить ячейку заклинания того же уровня или выше, что и само заклинание. Вы восстановите все потраченные ячейки, когда завершите продолжительный отдых.
Вы подготавливаете список заклинаний друида, доступных для сотворения. При этом вы выбираете число заклинаний друида из списка заклинаний друида, равное модификатору Мудрости + уровень друида (минимум одно заклинание). Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний.
Например, если вы друид 3 уровня, то у вас есть четыре ячейки заклинаний 1 уровня и две ячейки 2 уровня. При Мудрости 16 ваш список подготовленных заклинаний может включать в себя шесть заклинаний 1 или 2 уровня, в любой комбинации. Если вы подготовили заклинание 1 уровня лечение ран, вы можете сотворить его, используя ячейку 1 уровня или ячейку 2 уровня. Сотворение заклинания не удаляет его из списка подготовленных заклинаний.
Вы можете изменить список подготовленных заклинаний, когда завершаете продолжительный отдых. Подготовка нового списка заклинаний друида требует времени, проведённого в молитвах и медитации: не менее 1 минуты за уровень заклинания для каждого заклинания в вашем списке."""
!!!''Базовая характеристика заклинаний''
Друидические заклинания творятся с помощью Мудрости, поскольку требуют веры и близости с природой. Вы используете Мудрость в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Мудрости при определении Сл спасбросков от ваших заклинаний друида, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Мудрости
:''Модификатор броска атаки'' = бонус мастерства + модификатор Мудрости
!!!''Ритуальное колдовство''
Вы можете сотворить заклинание друида как ритуал, если у этого заклинания есть ключевое слово «ритуал», и оно подготовлено вами.
!!!''Фокусировка заклинания''
Вы можете использовать фокусировку друидов (смотрите в главе 5) в качестве заклинательной фокусировки для заклинаний друида.
!!!''__Использование заклинаний__''
Будучи проводником божественной силы, вы можете творить заклинания жреца. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных жрецу.
!!!''Заговоры''
На 1 уровне вы знаете три заговора на свой выбор из списка заклинаний жреца. Вы узнаёте дополнительные заговоры жреца на более высоких уровнях, как показано в колонке «известные заговоры».
!!!''Подготовка и сотворение заклинаний''
"""Таблица «Жрец» показывает, какое количество ячеек для сотворения заклинаний у вас есть на первом и более высоких уровнях. Для сотворения одного из этих заклинаний вы должны потратить ячейку заклинаний того же уровня или выше, что и само заклинание. Вы восстановите все потраченные ячейки, когда завершите продолжительный отдых.
Вы подготавливаете список заклинаний жреца, доступных для сотворения. При этом вы выбираете число заклинаний жреца, равное модификатору Мудрости + уровень жреца (минимум одно заклинание). Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний.
Например, если вы жрец 3 уровня, то у вас есть четыре ячейки заклинаний 1 уровня и две ячейки 2 уровня. При Мудрости 16 ваш список подготовленных заклинаний может включать в себя шесть заклинаний 1 или 2 уровня, в любой комбинации. Если вы подготовили заклинание 1 уровня лечение ран, вы можете сотворить его, используя ячейку 1 уровня или ячейку 2 уровня. Сотворение заклинания не удаляет его из списка подготовленных заклинаний.
Вы можете изменить список подготовленных заклинаний, когда завершаете продолжительный отдых. Подготовка нового списка заклинаний жреца требует времени, проведённого в молитвах и медитации: не менее 1 минуты за уровень заклинания для каждого заклинания в вашем списке."""
!!!''Базовая характеристика заклинаний''
При создании заклинаний жрец использует Мудрость. Сила ваших заклинаний исходит от вашей преданности своему божеству. Вы используете Мудрость в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Мудрости при определении Сл спасбросков от ваших заклинаний жреца, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Мудрости
:''Модификатор броска атаки'' = бонус мастерства + модификатор Мудрости
!!!''Ритуальное колдовство''
Вы можете сотворить заклинание жреца как ритуал, если у этого заклинания есть ключевое слово «ритуал», и оно подготовлено вами.
!!!''Фокусировка заклинания''
Вы можете использовать священный символ (смотрите в главе 5) в качестве заклинательной фокусировки для заклинаний жреца.
!!!''__Использование заклинаний__''
Получая 2 уровень, вы узнаёте, как черпать божественную магию посредством медитации и молитв, чтобы творить заклятья подобно жрецу. Смотрите общие правила о заклинаниях в главе 10 и список заклинаний паладина в главе 11.
!!!''Подготовка и сотворение заклинаний''
"""Таблица «Паладин» демонстрирует, какое количество ячеек для сотворения заклинаний у вас есть. Для сотворения одного из этих заклинаний вы должны потратить ячейку заклинаний того же уровня или выше, что и само заклинание. Вы восстановите все потраченные ячейки, когда завершите продолжительный отдых.
Вы подготавливаете список заклинаний паладина, доступных для сотворения. При этом вы выбираете число заклинаний паладина из списка заклинаний паладина, равное модификатору Харизмы + половина уровня паладина, округляя в меньшую сторону (минимум одно заклинание). Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний.
Например, если вы паладин 5 уровня, то у вас есть четыре ячейки заклинаний 1 уровня и две ячейки 2 уровня. При Харизме 14 ваш список подготовленных заклинаний может включать в себя четыре заклинания 1 или 2 уровня, в любой комбинации. Если вы подготовили заклинание 1 уровня лечение ран, вы можете сотворить его, используя ячейку 1 уровня или ячейку 2 уровня. Сотворение заклинания не удаляет его из списка подготовленных заклинаний.
Вы можете изменить список подготовленных заклинаний, когда завершаете продолжительный отдых. Подготовка нового списка заклинаний паладина требует времени, проведённого в молитвах и медитации: не менее 1 минуты за уровень заклинания для каждого заклинания в вашем списке."""
!!!''Базовая характеристика заклинаний''
Заклинания паладина творятся с помощью Харизмы, так как их мощь проистекает из силы ваших убеждений. Вы используете Харизму в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Харизмы при определении Сл спасбросков от ваших заклинаний паладина, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Харизмы
:''Модификатор броска атаки'' = бонус мастерства + модификатор Харизмы
!!!''Фокусировка заклинания''
Вы можете использовать священный символ (смотрите в главе 5) в качестве заклинательной фокусировки для заклинаний паладина.
!!!__''Использование заклинаний''__
Получив 2 уровень, вы обучаетесь использованию волшебной сущности природы для сотворения заклинаний подобно друиду. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных следопыту.
!!!''Ячейки заклинаний''
"""Таблица «Следопыт» показывает, какое количество ячеек заклинаний у вас есть на первом и более высоких уровнях. Для сотворения одного из этих заклинаний вы должны потратить ячейку заклинаний того же уровня или выше, что и само заклинание. Вы восстановите все потраченные ячейки, когда завершите продолжительный отдых.
Например, если вы знаете заклинание 1 уровня дружба с животными, и у вас есть ячейки 1 и 2 уровней, вы можете сотворить заклинание дружба с животными с помощью любой из этих ячеек."""
!!!''Известные заклинания первого и более высоких уровней''
"""Вы знаете два заклинания 1 уровня на свой выбор из списка доступных следопыту.
Колонка «известные заклинания» показывает, когда вы сможете выучить новые заклинания. Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний. Например, когда вы достигнете 5 уровня в этом классе, вы можете выучить одно новое заклинание 1 или 2 уровня.
Кроме того, когда вы получаете новый уровень в этом классе, вы можете одно из известных вам заклинаний следопыта заменить на другое из списка следопыта, уровень которого тоже должен соответствовать имеющимся ячейкам заклинаний."""
!!!''Базовая характеристика заклинаний''
При создании заклинаний следопыт использует Мудрость, так как магия отображает вашу взаимосвязь с природой. Вы используете Мудрость в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете Мудрость при определении Сл спасбросков от ваших заклинаний, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Мудрости
:''Модификатор броска атаки'' = бонус мастерства + модификатор Мудрости
!!!''__Использование заклинаний__''
Определённое событие в вашем прошлом или в жизни ваших родителей или предков оставило на вас неизгладимый отпечаток, связав вас с магией. Ваши заклинания питает некий источник магии, какого бы происхождения он не был. Смотрите общие правила о заклинаниях в главе 10 и список заклинаний чародея в главе 11.
!!!''Заговоры''
На 1 уровне вам известны четыре заговора, которые вы выбираете из списка заклинаний чародея. Вы обучаетесь дополнительным заговорам чародея на свой выбор по мере роста в уровнях, как это показано в колонке «известные заговоры».
!!!''Ячейки заклинаний''
"""Таблица «Чародей» показывает, сколько ячеек заклинаний у вас есть для заклинаний 1 и других уровней. Для использования заклинания вы должны потратить ячейку соответствующего, либо превышающего уровня. Вы восстанавливаете все потраченные ячейки по окончании продолжительного отдыха.
Например, если вы знаете заклинание 1 уровня огненные ладони, и у вас есть ячейки 1 и 2 уровней, вы можете использовать его с помощью любой из этих ячеек."""
!!!''Известные заклинания первого и более высоких уровней''
"""Вы знаете два заклинания 1 уровня на свой выбор из списка заклинаний чародея.
Колонка «известные заклинания» показывает, когда вы сможете выучить новые заклинания. Уровень заклинаний не должен превышать уровень самой высокой имеющейся у вас ячейки заклинаний. Например, когда вы достигнете 3 уровня в этом классе, вы можете выучить одно новое заклинание 1 или 2 уровня.
Кроме того, когда вы получаете новый уровень в этом классе, вы можете одно из известных вам заклинаний чародея заменить на другое из списка чародея, уровень которого тоже должен соответствовать имеющимся ячейкам заклинаний."""
!!!''Базовая характеристика заклинаний''
Вы используете Харизму для сотворения заклинаний чародея. Мощь заклинаний зависит от вашей способности проецировать свою волю в реальность. Вы используете Харизму в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете Харизму при определении Сл спасбросков от ваших заклинаний, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Харизмы
:''Модификатор броска атаки'' = бонус мастерства + модификатор Харизмы
!!!''Фокусировка заклинания''
Вы можете использовать магическую фокусировку (смотрите в главе 5) в качестве фокусировки для заклинаний чародея.
Если игрок хочет что-нибудь сделать, часто можно позволить ему преуспеть, не обращаясь к значениям его характеристик. Например, персонажу не нужно совершать проверку Ловкости, чтобы пересечь пустую комнату, или проверку Харизмы, чтобы заказать кружку эля. Просите совершить проверку только если есть значительные последствия провала
Если сомневаетесь, совершать ли бросок, задайте себе два вопроса:
* Может, эта задача слишком проста, и провал просто невозможен?
* Может, задача настолько невыполнима (например, попытка попасть в луну выстрелом из лука), что просто невозможна?
Если на оба вопроса вы ответили «нет», можно совершать бросок костей. В приведённых ниже разделах приводятся рекомендации о том, как определять, нужна ли проверка характеристики, бросок атаки или спасбросок; как назначать Сл; когда проверки совершаются с преимуществом или помехой; и прочие связанные темы.
!!__''Проверки характеристик''__
Проверка характеристики совершается, чтобы узнать, сможет ли персонаж преуспеть в выполнении запланированной задачи. В Книге игрока есть примеры того, для чего используется каждая из характеристик. Приведённая ниже таблица резюмирует этот материал для более удобного использования.
!!!''Многочисленные проверки характеристик''
Бывает, что персонаж проваливает проверку характеристики и хочет повторить её. В некоторых ситуациях это возможно, вопрос лишь в затрачиваемом на это времени. При наличии времени и возможности совершать повторные проверки персонаж рано или поздно преуспеет. Для ускорения вычислений считайте, что персонаж потратит на это в десять раз больше времени, чем обычно. Однако никакое количество повторных проверок не позволит персонажу превратить невыполнимую задачу в выполнимую.
Иногда провал проверки характеристики делает невозможным совершение той же проверки, чтобы выполнить ту же задачу. Например, плут может попытаться обмануть городского стражника, сказав, что искатели приключений — агенты короля, находящиеся под прикрытием. Если плут проиграет состязание своей Харизмы (Обман) с Мудростью (Проницательность) стражника, та же самая ложь уже не сработает. Персонажи могут придумать другой способ обойти стражника или попытаться так же обмануть другого стражника у других ворот. Вы при этом можете решить, что первый провал сделает эту проверку ещё более сложной.
!!!!''Проверки характеристик''
<table>
<tr>
<th>Характеристика </th>
<th>Используется для...</th>
<th>Пример использования</th>
</tr>
<tr>
<td>Сила </td>
<td>Физическая сила и атлетизм</td>
<td>Вышибание двери, перемещение валуна, блокирование двери железным шипом</td>
</tr>
<tr>
<td>Ловкость </td>
<td>Проворство, реакция и равновесие</td>
<td>Попытка прокрасться мимо стража, ходьба по узкому выступу, избавление от оков</td>
</tr>
<tr>
<td>Телосложение </td>
<td>Выносливость и здоровье</td>
<td>Долгий бег, удерживание в руке раскалённого металла, победа в соревновании, кто больше выпьет</td>
</tr>
<tr>
<td>Интеллект </td>
<td>Память и рассудок</td>
<td>Вспоминание информации, разгадывание зацепок, расшифровка тайных посланий</td>
</tr>
<tr>
<td>Мудрость </td>
<td>Восприимчивость и сила воли</td>
<td>Обнаружение спрятавшегося существа, распознание лжи</td>
</tr>
<tr>
<td>Харизма</td>
<td>Влияние на других и уверенность в своих силах<br></td>
<td>Убеждение существа что-либо сделать, управление толпой, убедительная ложь</td>
</tr>
</table>
<<<
!!!''Проверка Интеллекта против проверки Мудрости''
Если вы сомневаетесь, что попросить совершить, проверку Интеллекта или Мудрости, когда персонаж может что-то заметить, оцените высокие значения и той и другой характеристики.
Персонаж с высокой Мудростью, но низким Интеллектом, осознаёт своё окружение, но не может его интерпретировать. Персонаж может заметить, что на части стены нет пыли, но он не обязательно поймёт, что здесь находится потайная дверь.
И наоборот, персонаж с высоким Интеллектом и низкой Мудростью будет рассеянным, но умным. Персонаж может не заметить чистое место на стене, но если у него спросят мнение, он сразу сделает предположение, почему там нет грязи.
Проверки Мудрости позволяют персонажам замечать то, что находится вокруг (стена чистая), а проверки Интеллекта отвечают на вопрос, что это может означать (возможно, там потайная дверь).
<<<
!!!''Состязание''
Состязание это разновидность проверки характеристики, когда два существа соперничают друг с другом. Используйте состязание, когда персонаж пытается сделать что-то, что или противостоит стараниям другого существа или сводит на нет усилия этого другого существа. При состязании результаты проверок характеристик сравниваются друг с другом, а не с целевым числом.
Если вы объявляете состязание, вы выбираете характеристики, которые будут использованы сторонами. Например, если существо пытается скрыться, его Ловкость состязается с Мудростью другого существа. А если два существа борются на руках или одно держит дверь, а второе толкает её, оба используют Силу.
!!__''Броски атаки''__
Призывайте совершать броски атаки, если существо пытается попасть по другому существу или предмету атакой, особенно если эту атаку может отклонить доспех или щит, или если у цели есть укрытие. Вы можете также совершать броски атаки в небоевых ситуациях, например, при состязании лучников или при игре в дартс.
!!__''Спасброски''__
Спасбросок это мгновенный ответ на опасный эффект, и он практически никогда не совершается как акт доброй воли. Спасбросок совершается если с персонажем происходит что-то опасное, но у него ещё есть шанс избежать вреда. В этом отличие спасброска от проверки характеристики. Последний совершается когда персонаж что-то активно пытается совершить, а спасбросок это мгновенная реакция на что-то, что совершает кто-то другой.
Чаще всего спасбросок совершается, когда некий эффект — заклинание, умение чудовища или ловушка — прямым текстом призывают его совершить, описывая, какой именно спасбросок совершить, и приводя Сл.
В других случаях могут возникнуть ситуации, в которых спасбросок тоже будет уместен, в частности, если персонаж подвергается вредоносному эффекту, который нельзя отклонить доспехом или щитом. Вы сами решаете, какая характеристика при этом будет использоваться. В таблице «спасброски» приводятся некоторые идеи.
!!!!''Спасброски''
<table>
<tr>
<th>Характеристика</th>
<th>Применяется для...</th>
</tr>
<tr>
<td>Сила</td>
<td>Противостояния силе, которая вас физически перемещает или сковывает</td>
</tr>
<tr>
<td>Ловкость</td>
<td>Уклонения от опасностей</td>
</tr>
<tr>
<td>Телосложение</td>
<td>Противостояния болезням, ядам и другим опасностям, подрывающим жизненные силы</td>
</tr>
<tr>
<td>Интеллект</td>
<td>Разоблачения иллюзий и сопротивления ментальным нападениям, которые можно отразить логикой или памятью</td>
</tr>
<tr>
<td>Мудрость</td>
<td>Сопротивления эффектам, которые очаровывают, пугают или как-то иначе влияют на вашу волю</td>
</tr>
<tr>
<td>Харизма</td>
<td>Противостояния эффектам, таким как одержимость, которые подрывают вашу личность или перемещают вас на другой план существования</td>
</tr>
</table>
!!__''Сложность''__
Вы должны устанавливать Сложность для проверок характеристик и спасбросков, если правила или текст приключения не приводят готовые цифры. Иногда вы можете даже изменить заранее предопределённую Сл. В такой ситуации подумайте, насколько трудновыполнима задача, и выберите соответствующую Сл из приведённой таблицы.
<table>
<tr>
<th>Задача</th>
<th>Сл</th>
<th>Задача</th>
<th>Сл</th>
</tr>
<tr>
<td>Очень лёгкая</td>
<td>5</td>
<td>Сложная</td>
<td>20</td>
</tr>
<tr>
<td>Лёгкая</td>
<td>10</td>
<td>Очень сложная</td>
<td>25</td>
</tr>
<tr>
<td>Умеренная</td>
<td>15</td>
<td>Практически невыполнимая</td>
<td>30</td>
</tr>
</table>
Числа, представленные для каждой категории, взяты приблизительно, чтобы их можно было легко запомнить, и вы не открывали эту книгу каждый раз, когда вам нужно определить Сл задачи. Вот несколько советов по использованию категорий Сл во время игры:
Если вы решили, что нужна проверка характеристики, вряд ли задачу можно назвать очень лёгкой. Кто угодно может выполнить задачу со Сл 5, практически ничем не рискуя. Если обстоятельства не мешают, позвольте персонажам преуспевать в таких задачах, не совершая проверок.
Затем спросите себя: «Какая это задача, лёгкая, умеренная или сложная?» Даже если вы всегда будете использовать в качестве Сл только числа 10, 15 и 20, ваша игра пройдёт прекрасно. Помните, что персонаж со значением «10» нужной характеристики без учёта бонуса мастерства будет преуспевать в лёгких задачах примерно в 50 процентах случаев. Умеренная задача требует для выполнения высокой характеристики или высокого бонуса мастерства, а сложная задача требует и того, и другого. Не повредит также удача в бросках к20.
Если вы считаете, что задача очень сложна, можете использовать более высокую Сл, но делайте это осторожно, и всегда принимайте в расчёт уровень персонажей. Задача со Сл 25 будет очень сложной для низкоуровневых персонажей, но станет немного проще после 10 уровня. Проверка со Сл 30 практически невыполнима для большинства низкоуровневых персонажей. Даже персонажу 20 уровня, с характеристикой 20 и бонусом мастерства, понадобится выкинуть «19-20», чтобы преуспеть в задаче с такой Сл.
!!!''Вариант: Автоматический успех''
Иногда непредсказуемость броска к20 приводит к абсурдным ситуациям. Предположим, что есть дверь, которую можно выбить успешной проверкой Силы со Сл 15. Воин с Силой 20 может из-за плохого броска едва пошатнуть дверь. Однако после этого плут с Силой 10 выбрасывает «20» и срывает дверь с петель.
Если такая ситуация вас беспокоит, попробуйте давать некоторым проверкам автоматические успехи. При этом опциональном правиле персонаж автоматически преуспевает в проверках характеристики, чья Сл не превышает значение нужной характеристики, уменьшенное на 5. В приведённом выше примере воин автоматически вышиб бы дверь. Это правило не распространяется на состязания, спасброски и броски атаки.
Владение навыком или инструментом тоже позволяет автоматически преуспевать в проверках. Если к проверке характеристики персонажа прибавляется бонус мастерства, он автоматически преуспевает, если Сл не превышает 10. Если у персонажа как минимум 11 уровень, проверка преуспевает, если у неё Сл не превышает 15.
Обратной стороной такого подхода является предсказуемость. Например, как только характеристика персонажа становится равной 20, её проверки со Сл 15 и меньше будут автоматически успешными. Умные игроки будут назначать на задачи персонажей с максимальным значением характеристик. Если вы захотите риска, вы установите более высокую Сл. Однако при этом вы лишь усугубите проблему, от которой пытались избавиться: более высокая Сл потребует больших значений на костях, то есть проверки ещё больше станут зависеть от удачи.
!!!''Владение''
Когда просите игрока совершить проверку характеристики, подумайте, можно ли в данной ситуации применить владение навыком или инструментом. Игрок сам может спросить, применимо ли одно из его владений.
Чтобы вам было проще принять решение, подумайте, может ли персонаж научиться выполнять эту задачу лучше благодаря тренировкам и практике. Если ответ — «нет», то можете сказать, что бонус не применим. Однако, если ответ — «да», назначьте соответствующий проверке навыки или инструмент, владение которыми поможет отразить эти тренировки и практику.
!!!''Навыки''
Владение навыком представляет сосредоточенность персонажа на одном из проявлений характеристики. Ловкость характеризует самые разносторонние качества, но из всего этого многообразия персонаж может особенно хорошо прятаться, и это будет отображено владением навыком Скрытность. Если этот навык используется при проверке характеристики, скорее всего, это будет Ловкость.
При некоторых обстоятельствах вы можете решить, что владение навыком может давать бонус при проверке другой характеристики. Например, вы можете решить, что плывущий с острова на побережье персонаж должен совершить проверку Телосложения (а не Силы), потому что расстояние очень большое. Этот персонаж владеет навыком Атлетика, который покрывает и плавание, поэтому вы позволяете добавить бонус мастерства к проверке характеристики. В сущности, будет совершена проверка Телосложения (Атлетика), а не проверка Силы (Атлетика).
Игроки часто спрашивают, могут ли они применить владение навыком при проверке характеристики. Если игрок приводит хорошую причину, по которой тренировки и врождённые таланты помогают его персонажу в этой проверке, соглашайтесь, так вы наградите его за креативное мышление.
!!!''Инструменты''
Навык владения инструментом позволяет вам применять бонус мастерства при проверках характеристик, совершённых с использованием этого инструмента. Например, персонаж, владеющий инструментами плотника, может добавлять бонус мастерства к проверкам Ловкости, совершённым для создания деревянной флейты, проверкам Интеллекта, совершённым для создания деревянной потайной двери, и проверкам Силы, совершённым для создания требушета Однако бонус мастерства не будет применяться к проверкам характеристик, совершённым для признания деревянной конструкции неустойчивой, а также для определения того, подлинна ли та или иная вещь, так как инструмент при этом не используется.
!!!''Спасброски и броски атаки''
Персонажи либо владеют спасбросками и атаками, либо не владеют. Если владение есть, бонус мастерства применяется всегда.
!!__''Преимущество и помеха''__
Преимущества и помехи — самые полезные инструменты Мастера. Они отражают временные обстоятельства, способные оказать влияние на шансы персонажа преуспеть в выполнении задачи. Преимущество это также отличный способ наградить игрока, который проявил чрезвычайную изобретательность.
Персонажи часто получают преимущества и помехи благодаря особым умениям, действиям, заклинаниям и прочим особенностям класса и предыстории. В остальных случаях вы сами решаете, есть ли обстоятельства, положительно или отрицательно влияющие на бросок, и выдаёте либо преимущество, либо помеху.
;Вы можете давать преимущество когда...
* Обстоятельства, не связанные с врождёнными способностями персонажа, дают ему фору.
* Что-то в окружении увеличивает шансы персонажа на успех.
* Игрок проявляет исключительную изобретательность или хитрость в выполнении или описании задачи.
* Предыдущие действия (самого персонажа или другого существа) увеличили его шансы на успех.
;Вы можете давать помеху когда...
* Обстоятельства как-то вредят процессу.
* Что-то в окружении уменьшает шансы на успех (при условии, что этот же фактор не накладывает штраф к совершаемому броску).
* Какая-то часть плана или описания уменьшает шансы на успех.
Из-за того, что преимущества и помехи отменяют друг друга, нет смысла подсчитывать, сколько именно факторов влияют положительно или отрицательно.
Представьте, например, волшебника, бегущего по коридору подземелья от злобоглаза. За углом впереди два огра устраивают ему засаду. Услышит ли волшебник огров? Вы смотрите на пассивное значение Мудрости (Внимательность) и оцениваете все имеющиеся факторы.
Волшебник бежит, и не может внимательно следить за всем, что происходит впереди. Это даёт помеху к проверке характеристики. Однако огры шевелили опускную решётку и шумели воротом, что даёт волшебнику преимущество. В результате персонаж совершает проверку Мудрости и без помехи и без преимущества, и вам больше не нужно рассматривать никакие другие факторы. Прошлые сцены с засадами огров, тот факт, что в ушах волшебника всё ещё стоит звон от заклинания волна грома, наложенного им на злобоглаза, общий уровень шума в подземелье — всё это больше не имеет значения.
!!__''Вдохновение''__
Награда вдохновением это эффективный способ поощрить отыгрыш и риск. Как уже объяснено в Книге игрока, вдохновение даёт персонажу конкретное преимущество: позволяет совершить с преимуществом одну проверку характеристики, бросок атаки или спасбросок. Помните, что у персонажа не может быть больше одного вдохновения одновременно.
!!!''Награда вдохновением''
Считайте вдохновение приправой, улучшающей кампанию. Кто-то из Мастеров отказывается использовать вдохновение, а кто-то считает его основной частью игры. Помните следующее золотое правило: вдохновение должно делать игру приятной для всех. Награждайте вдохновением, когда игроки совершают действия, делающие игру более захватывающей, весёлой или запоминающейся.
Стандартный подход: награждайте вдохновением каждого персонажа по одному разу за собрание. Потом можете чаще или реже, как будет удобно вам.
Выдача вдохновения в качестве награды побуждает игроков к особому поведению. Подумайте о своём стиле вождения и предпочтениях вашей группы. Что у вас сделает игру более интересной? Какие действия подходят жанру или стилю вашей кампании? Ответы на эти вопросы позволят определить, за что выдавать вдохновение.
:''//Отыгрыш//.'' Награда вдохновением за отыгрыш подходит для большинства групп. Награждайте игрока, когда его персонаж делает нечто уместное для персонажа с его чертами характера, слабостями и привязанностями. Действия персонажа должны быть достойными внимания. Они могут продвигать сюжет, подвергать искателей приключений опасности, или смешить всех, кто пришёл на игру. В сущности, вы награждаете игрока за отыгрыш, который делает игру приятнее для всех.
:Учитывайте стиль отыгрыша каждого игрока, и пытайтесь не отдавать предпочтение только лишь одному такому стилю. Например, Элисон может говорить с акцентом и изображать манеры своего персонажа, а Пол стесняется отыгрывать и предпочитает просто описывать настроение и действия своего персонажа. Ни один из этих стилей не лучше другого. Вдохновение поощряет игроков стараться, и если их честно за это награждать, игра станет лучше для всех.
://''Героизм.''// Можете награждать вдохновением за риск, на который игроки отправляют персонажей. Воин не каждый день прыгает с балкона, чтобы приземлиться среди стаи голодных упырей, и вы можете наградить этот его отчаянный манёвр вдохновением. Такая награда подскажет игрокам, что вы хотите от них залихватского сражения.
:Этот подход хорош для героических кампаний с отчаянными действиями. В таких кампаниях можно разрешить тратить вдохновение уже после броска к20, а не до него. Так вдохновение станет шансом избежать провала — и гарантией того, что будет сыграно когда персонаж действительно может потерпеть неудачу. Такая гарантия делает рискованную тактику менее пугающей.
://''Награда за победу.''// Некоторые Мастера предпочитают минимально влиять на ход кампании. Награда вдохновением требует от Мастера вынесения суждения, но вы, возможно, в своей кампании позволяете всё решать броскам костей. Если это так, то можете выдавать вдохновение за достижение важных целей в сюжете, и это будет символизировать прилив энергии и уверенности.
:При такой модели выдавайте вдохновение всем в отряде, когда персонажи побеждают важного врага, претворяют в жизнь хитрый план или преодолевают в ходе кампании серьёзное препятствие.
://''Эмуляция жанра.''// Вдохновение это удобный инструмент для поощрения за определённые действия. При таком подходе попробуйте сделать основные мотивы жанра кампании чертами характера, слабостями и привязанностями, применимыми ко всем персонажам. Например, в кампании в стиле нуар, у персонажей может быть дополнительная слабость «Я не могу отказать в помощи тому, кого я нахожу привлекательным, несмотря ни на какие предупреждения о том, что это опасно». Если персонажи согласятся помочь подозрительной, но очень соблазнительной дворянке и попадают в путину интриг и предательств, наградите их вдохновением.
:Точно так же, персонажи в сюжете, навеянном хоррором, не могут не остаться переночевать в доме с привидениями, чтобы узнать его тайны. А ещё они ходят по одному, даже если это противопоказано. Если отряд разделится, можете дать каждому персонажу по вдохновению.
:Здравомыслящий человек не станет ввязываться в интриги дворян и будет избегать дома с привидениями, но в фильмах в стиле нуар или хоррор нет места здравомыслию; мы имеем дело с героями конкретного сюжета. При таком подходе создайте список основных элементов вашего жанра и дайте его игрокам. Прежде чем кампания начнётся, обсудите этот список, чтобы убедиться, что вы с группой друг друга понимаете, и они принимают элементы вашего жанра.
://''Игроки и вдохновение.''// Помните, что игрок может передать своё вдохновение другому игроку. В некоторых группах вдохновение с самого начала считается общим ресурсом, и решение, использовать ли его, принимается коллективно. Лучше всего позволить игрокам передавать вдохновение как они посчитают нужным, но вы можете обсудить с ними описанные выше рекомендации, особенно если вы пытаетесь придерживаться в игре конкретного жанра.
!!!''Когда выдавать вдохновение?''
Подумайте, когда вы выдаёте вдохновение. Одни Мастера выдают вдохновение в ответ на действия. Другие выдают за принятие определённых решений, когда у игроков есть выбор. У обоих подходов есть свои сильные и слабые стороны. Если дожидаться действия, игра будет течь ровно, но игроки до последнего не будут знать, принесут ли их решения им вдохновение. Это также означает, что игрок не сможет потратить вдохновение в том действии, которое его и принесло, если только вы не позволите это сделать задним числом или не выдадите быстро, до того как сделаны броски. Этот метод подходит для групп, которые сосредоточены на погружении и главенстве игроков, когда Мастер немного отступает и позволяет игрокам делать то, что им захочется.
Если вы скажите игрокам, какие их действия принесут вдохновение, это внесёт ясность, но может сложиться впечатление, что вы манипулируете игроками или делаете выбор за них. Если вдохновение выдавать перед действиями, это будет удобно для групп, в которых эмулируется определённый жанр сюжета, а также групп, в которых свобода персонажа менее важна, чем целостная и красивая история.
Однако начать мы советуем с того, чтобы выдавать вдохновение после действий, особенно если это у вас первая кампания или вы играете с новой группой. Такой подход меньше всего прерывает ход игры и не позволяет игрокам думать, что вы ими манипулируете.
!!!''Отслеживание вдохновения''
Обычно игроки записывают на листах персонажа, есть ли у них вдохновение, либо же вы можете выдавать им покерные фишки или другие жетоны. В качестве альтернативы, вы можете выдавать особую кость к20, символизирующий вдохновение. Тратя вдохновение, игрок бросит эту кость и тем возвращает её вам. Если игрок передаёт вдохновение кому-то другому, передаётся и кость к20.
!!!''Игнорирование вдохновения''
Вдохновение может не подходить вашей кампании. Некоторым Мастерам кажется, что оно увеличивает метаигровое мышление, а другие считают, что героизм, отыгрыш и прочие составляющие игры — награда сами по себе, и они не нуждаются в таких поощрениях как вдохновение.
Если решите игнорировать вдохновение, скажите об этом игрокам. Это хороший вариант для суровых кампаний и кампаний, в которых Мастер играет второстепенную роль арбитра правил.
!!!''Вариант: Вдохновение дарят только игроки''
Вы, как Мастер, ответственны в игре за множество разных составляющих. Вы можете забыть об отслеживании вдохновения и не выдать его вовремя. Это опциональное правило позволяет игрокам взять контроль над выдачей вдохновения. Во время каждого собрания каждый игрок может один раз дать вдохновение другому игроку. При этом игроки могут следовать рекомендациям по выдаче вдохновения, с которыми согласны все в группе.
Такой подход облегчает вашу жизнь и даёт игрокам шанс наградить друг друга за хорошую игру. Вам всё равно нужно следить, чтобы вдохновение дарили честно.
Этот метод подходит группам, сосредоточенным на сюжете. Он не будет работать, если игроки будут использовать его лишь для получения преимущества в переломных ситуациях, не награждая за отыгрыш и действия, важные для группы.
Можете позволить игрокам дарить более одного вдохновения за собрание. В этом случае первый раз за собрание игрок дарит вдохновение как обычно. Каждый последующий раз, когда он дарит вдохновение, вы тоже получаете вдохновение, которое можете потратить, чтобы преимущество получил кто-то из врагов персонажей игроков. У вас может быть сколько угодно вдохновения, полученного таким способом, и всё ваше вдохновение переходит на следующее собрание.
!!__''Развязка и последствия''__
Вы определяете последствия бросков атак, проверок характеристики и спасбросков. В большинстве случаев тут всё просто. Если атака попала, она причиняет урон. Если существо провалило спасбросок, оно подвергается вредоносному эффекту. Если проверка характеристики не меньше установленной Сл, проверка успешна.
Вы, как Мастер, можете добавить успехам и провалам подробностей и глубины, чтобы они были не похожи один на другой.
!!!''Цена победы''
Цена провала может быть суровой, но неприятные последствия могут быть и тогда, когда персонаж едва-едва справился. Если персонажу не хватило до успеха всего 1 или 2, можете позволить ему преуспеть, но ценой осложнений и последствий. Вот примеры таких осложнений:
* Персонаж смог обойти защиту хобгоблина и ударить его мечом, но тот ударяет щитом и обезоруживает персонажа.
* Персонаж всё-таки уклоняется от огненного шара, но падает ничком.
* Персонаж не смог запугать кобольда, но тот всё равно выдаёт важную тайну, хотя и предупреждает громким криком об опасности других чудовищ.
* Несмотря на соскользнувшую ногу, персонаж всё же взбирается на утёс, но обнаруживает, что верёвка, за которую держится его товарищ внизу, вот-вот порвётся.
Если вы накладываете такую цену на успех, делайте препятствия и осложнения, меняющие ситуацию приключения. В обмен на успех игроки получают дополнительные трудности. Можете использовать эту же технику, если результат персонажа идеально равен установленной Сл, что изменит последствия, казалось бы, обычного успеха.
!!!''Степени провала''
Иногда проваленная проверка характеристики может иметь разные последствия в зависимости от степени провала. Например, персонаж, проваливший проверку обезвреживания сундука, может случайно активировать ловушку, если провалит проверку на 5 и более единиц, а менее разгромный провал просто не даст обезвредить ловушку. Попробуйте добавить такие же градации и к другим проверкам. Проваленная проверка Харизмы (Убеждение) может означать, что королева не станет помогать, а провал на 5 и больше единиц разозлит её, и персонажей бросят в темницу.
!!!''Критические успехи и провалы''
Выпадение «20» и «1» при проверке характеристики или спасброске обычно не означает появление особых эффектов. Однако вы можете принять такой экстраординарный результат в расчёт, когда будете определять последствия. Вы сами решаете, как это проявится в игре. Можно увеличить влияние успеха или провала. Например, «1» при провальной попытке вскрыть замок может сломать воровские инструменты, а «20» при проверке Интеллекта (Анализ) может дать дополнительную подсказку.
Книга игрока делится на три части.
''Часть 1'' про создание персонажа, содержит правила и руководства, необходимые для создания персонажа, которого вы будете отыгрывать. Она содержит информацию о различных расах, классах, предысториях, снаряжении и других настраиваемых параметрах, которые вы можете выбрать. Многие правила 1 части основаны на материале 2 и 3 части. Если вы столкнулись в части 1 с игровым термином, который не понимаете, обратитесь к алфавитному указателю в конце книги.
''Часть 2'' излагает правила о том, как играть в D&D за рамками основ, описанных в этом введении. Эта часть описывает виды бросков костей, совершаемых вами, чтобы определить успех или провал задач, которые пытается выполнить ваш персонаж, и описывает три обширные категории действий в игре: исследование, взаимодействие и сражение.
''Часть 3'' полностью посвящена магии. Она охватывает природу магии в мирах D&D, правила сотворения заклинаний и огромный набор заклинаний, доступных для персонажей (и чудовищ), использующих магию.
!!!__''Испуганный''__
* Испуганное существо совершает с помехой проверки характеристик и броски атаки, пока источник его страха находится в пределах его линии обзора.
* Существо не способно добровольно приблизиться к источнику своего страха.
В этом разделе приводятся советы по проведению исследований, в частности, по путешествиям, выслеживанию и видимости.
!!__''Использование карты''__
В какой бы окружающей среде ни действовали искатели приключений, вы можете с помощью карты отслеживать их продвижение и составлять заметки об их путешествии. В подземелье карта позволит описать ветвящиеся проходы, двери, залы, и прочие примечательные места, а также даёт игрокам возможность выбрать собственный путь. Карта дикой местности может показывать дороги, реки, рельеф и прочие достопримечательности, которые могут направить персонажей на правильный путь — или сбить их с него.
Представленная ниже таблица поможет отслеживать перемещение по картам с разным масштабом. В ней показано, какое расстояние на карте искатели приключений покроют за минуту, час или день. Таблица использует три темпа перемещения — медленный, нормальный и быстрый — описанные в Книге игрока. Персонажи, перемещающиеся с нормальным темпом, могут пройти 24 мили в день.
<table>
<tr>
<th>Масштабкарты</th>
<th>Медленный темп</th>
<th>Нормальный темп</th>
<th>Быстрый темп</th>
</tr>
<tr>
<td>Подземелье (1 кл. = 10 фт.)</td>
<td>20 кл./мин</td>
<td>30 кл./мин</td>
<td>40 кл./мин</td>
</tr>
<tr>
<td>Город(1 кл. = 100 фт.)</td>
<td>2 кл./мин</td>
<td>3 кл./мин</td>
<td>4 кл./мин</td>
</tr>
<tr>
<td rowspan="2">Область(1 гекс = 1 миля)</td>
<td>2 гекса/ч</td>
<td>3 гекса/ч</td>
<td>4 гекса/ч</td>
</tr>
<tr>
<td>18 гексов/день</td>
<td>24 гекса/день</td>
<td>30 гексов/день</td>
</tr>
<tr>
<td rowspan="2">Королевство (1 гекс = 6 миль)</td>
<td>1 гекс/3 ч</td>
<td>1 гекс/2 ч</td>
<td>1 гекс/1,5 ч</td>
</tr>
<tr>
<td>3 гекса/день</td>
<td>4 гекса/день</td>
<td>5 гексов/день</td>
</tr>
</table>
!!__''Особый темп путешествия''__
Правила темпа перемещения из Книги игрока подразумевают, что группа путешественников идёт в темпе, на который не влияет скорость перемещения отдельных её участников. Разница в скорости ходьбы может быть важна во время сражения, а во время похода разница исчезает, так как путники изредка останавливаются, чтобы перевести дух, более быстрые поджидают медленных, а проворство одних уравновешивается выносливостью других.
Персонаж, скачущий на призрачном скакуне, парящий в воздухе на ковре-самолёте, или плывущий на паруснике или хитроумном изобретении гномов, работающем на пару, путешествует не с обычной скоростью, так как магия, двигатели или ветер не устают в отличие от существ, и в воздухе нет таких многочисленных препятствий как на земле. Если существо путешествует со скоростью полёта или со скоростью, дарованной магией, двигателем или силой стихии (такой как ветер или течение), превратите скорость в темп перемещения, используя следующие правила:
* За 1 минуту вы можете переместиться на количество футов, равное вашей скорости, умноженной на 10.
* За 1 час вы можете переместиться на количество миль, равное вашей скорости, делённой на 10.
* Для вычисления пройдённого за день расстояния умножьте расстояние, проходимое за час, на число часов в путешествии (обычно это 8 часов).
* Для быстрого темпа увеличьте пройдённое расстояние на одну треть.
* Для медленного темпа умножьте пройдённое расстояние на две третьих.
Например, персонаж под эффектом заклинания хождение по ветру получает скорость полёта 300 футов. За 1 минуту он может переместиться на 3000 футов в нормальном темпе, 4000 футов в быстром темпе или 2000 футов в медленном темпе. Этот персонаж может покрыть 20, 30 или 40 миль в час. Заклинание длится 8 часов, позволяя ему переместиться на 160, 240 или 320 миль в день.
Точно так же, заклинание призрачный скакун создаёт магического скакуна со скоростью 100 футов, и который не устаёт, в отличие от настоящей лошади. Персонаж на призрачном скакуне может покрыть 1000 футов за 1 минуту в нормальном темпе, 1333 футов в быстром темпе или 666 футов в медленном темпе. За 1 час этот персонаж может переместиться на 7, 10 или 13 миль.
!!__''Видимость на открытом пространстве''__
Путешествуя на открытом пространстве, персонажи видят примерно на 2 мили в любом направлении в ясный день, или вплоть до точки, где деревья, холмы или прочие помехи заслоняют обзор. Дождь обычно уменьшает максимальную видимость до 1 мили, а туман — до 100 или 300 футов.
В ясный день персонаж может видеть на 40 миль, если находится на вершине горы или высокого холма, или как минимум может посмотреть с высоты вниз.
!!__''Обнаружение других существ''__
Во время исследования персонажи могут встречать других существ. В таких ситуациях важно знать, кто кого заметил.
Внутри помещений то, заметит ли одна сторона другую, обычно зависит от конфигурации комнат и проходов. Зрение может быть ограничено источниками света. На открытом пространстве видимость осложняется местностью, погодой и временем дня. У существ больше шанс услышать друг друга, чем увидеть.
Если ни одна из сторон не ведёт себя скрытно, существа автоматически замечают друг друга, как только оказываются в пределах видимости или диапазона слышимости друг друга. В противном случае сравните результаты проверок Ловкости (Скрытность) скрывающейся группы с пассивными значениями Мудрости (Внимательность) другой группы, как объясняется в Книге игрока.
!!__''Выслеживание''__
Иногда искатели приключений идут по следам других существ — или же существа могут идти за искателями приключений! Для выслеживания одно или несколько существ должны преуспеть в проверке Мудрости (Выживание). Вы можете потребовать, чтобы следопыт совершил новую проверку при возникновении следующих обстоятельств:
* Выслеживание прерывается и продолжается уже после короткого или продолжительного отдыха.
* След пересекается препятствием, на котором не остаются следы, таким как река.
* Погодные условия или местность меняется так, что выслеживать становится труднее.
Сл проверки зависит от того, насколько хорошо видны следы прошедших существ. Если следы прекрасно видны, проверки не нужны. Например, для обнаружения следов армии, прошедшей по глинистой дороге, проверки не нужны. Найти следы на каменной скале гораздо сложнее, если только существо не оставляет за собой характерный след. Кроме того, со временем следы становятся ещё менее заметными. Если следа, по которому можно идти, вообще нет, вы можете заявить, что выслеживание невозможно.
Приведённая ниже таблица приводит примеры Сл, но вы можете устанавливать свои числа. Можете позволить совершить проверку с преимуществом, если следы оставляло не одно существо, или помехой, если потом по этому месту прошлись другие существа. При провале персонаж теряет след, но может попытаться вновь найти его, совершая тщательные поиски. Поиски утерянного следа занимают 10 минут в изолированных местах, таких как подземелье, или 1 час на открытой местности.
!!!!''Сл Выслеживания''
<table>
<tr>
<th>Поверхность</th>
<th>Сл</th>
</tr>
<tr>
<td>Мягкая поверхность, такая как снег</td>
<td>10</td>
</tr>
<tr>
<td>Грязь или трава</td>
<td>15</td>
</tr>
<tr>
<td>Голый камень</td>
<td>20</td>
</tr>
<tr>
<td>За каждый прошедший день</td>
<td>+5</td>
</tr>
<tr>
<td>Существо оставило особый след, например, истекало кровью</td>
<td>-5</td>
</tr>
</table>
!!!''Исследователь природы''
"""Вы очень хорошо знакомы с одним видом природной среды и имеете большой опыт путешествий и выживания в регионах с таким климатом. Выберите один вид известной местности: Арктика, болота, горы, леса, луга, побережье, Подземье или пустыня. Когда вы совершаете проверку Интеллекта или Мудрости, связанную с известной вам местностью, ваш бонус мастерства удваивается, если вы используете навык, которым владеете.
Путешествуя по избранной вами местности в течении часа или более, вы получаете следующие преимущества:"""
* Труднопроходимая местность не замедляет путешествие группы.
* Ваша группа не может заблудиться, кроме как по вине магии.
* Даже когда вы занимаетесь другой деятельностью во время путешествия (например, ищете пищу, ориентируетесь или выслеживание), вы остаётесь готовы к опасности.
* Если вы путешествуете в одиночку, вы можете перемещаться скрытно в нормальном темпе.
* Когда вы ищете пищу, то находите в два раза больше, чем обычно.
* Когда вы выслеживаете других существ, вы также узнаёте их точное количество, их размеры, и как давно они прошли через область.
Вы можете выбрать дополнительную известную местность на 6 и 10 уровнях.
//9 уровень, Некромантия, Друид/Жрец//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (немного святой воды и бриллианты, стоящие как минимум 25 000 зм, расходуемые заклинанием)
:''Длительность:'' Мгновенная
"""Вы касаетесь существа, мёртвого не больше двух сотен лет, умершего от чего угодно кроме старости. Если душа цели свободна и согласна, цель возвращается к жизни с полными хитами.
Это заклинание закрывает все раны, нейтрализует все яды, исцеляет все болезни и снимает все проклятья, бывшие у существа в момент смерти. Заклинание заменяет повреждённые и отсутствующие органы и части тела.
Это заклинание может даже воссоздать новое тело, если старого больше нет. В этом случае вы должны произнести вслух имя существа. Это существо появляется в свободном пространстве, выбранном вами в пределах 10 футов."""
//6 уровень, Прорицание, Бард/Волшебник/Жрец/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (мазь для глаз, стоящая 25 зм; изготавливается из грибного порошка, шафрана и жира; расходуется заклинанием)
:''Длительность:'' 1 час
Заклинание даёт согласному существу, которого вы коснулись, способность видеть вещи такими, какими они являются на самом деле. Пока заклинание активно, это существо обладает истинным зрением, видит потайные двери, сокрытые магией, и его зрение простирается на Эфирный План, и всё это в пределах 120 футов.
//9 уровень, Преобразование, Бард/Волшебник/Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (капля ртути, немного гуммиарабика и клуб дыма)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Выберите существо или немагический предмет, видимый в пределах дистанции. Вы превращаете существо в другое существо, существо в предмет или предмет в существо (предмет не должно носить и нести другое существо). Превращение длится, пока активно заклинание, или пока хиты цели не опустятся до 0, или она не умрёт. Если вы концентрируетесь на заклинании его полную длительность, превращение становится постоянным.
Перевёртыши не попадают под действие этого заклинания. Несогласные существа могут совершить спасбросок Мудрости, и в случае успеха они не попадают под действие заклинания. Это заклинание не может подействовать на цель, у которой 0 хитов
Существо в существо. Если вы превращаете существо в другое существо, новый облик может быть любым, лишь бы его показатель опасности не превышал ПО цели (или её уровня, если у цели нет показателя опасности). Игровые характеристики цели, включая значения ментальных характеристик, заменяются характеристиками нового облика. У цели остаётся мировоззрение и характер.
Цель принимает хиты нового облика. При возвращении в естественный облик количество его хитов будет как до превращения. Если оно возвращается в свой облик от того, что хиты опустились до 0, весь «лишний» урон перенесётся на естественный облик. Если «лишний» урон не опускает хиты естественного облика существа до 0, оно не теряет сознание.
Действия существа в новом облике ограничены теми, что доступны ей, и она не может говорить, накладывать заклинания и совершать другие действия, требующие рук или речи, если только новый облик не способен выполнять такие действия.
Снаряжение цели сливается с её новым обликом. Существо не может активировать, использовать, надевать или получать какие-то иные преимущества от своего снаряжения.
Предмет в существо. Вы можете превратить предмет в любое существо, чей размер не превышает размер предмета, и чей показатель опасности не превышает 9. Существо будет дружелюбным по отношению к вам и вашим спутникам. Оно будет действовать в ваш ход. Вы сами решаете, какие действия оно будет совершать, и как будет перемещаться. Характеристики существа есть у Мастера, и он же решает, что получилось из его действий и перемещений.
Если заклинание становится постоянным, вы перестаёте контролировать существо. Оно может остаться дружественным по отношению к вам, в зависимости от того, как вы с ним обращались.
Существо в предмет. Если вы превращаете существо в предмет, оно превращается вместе с тем, что оно несёт и носит. Его параметрами становятся параметры предмета, и существо не помнит о времени, проведённом в этом облике, когда заклинание оканчивается и оно обретает свой естественный облик."""
!!!''__Источник вдохновения__''
Начиная с 5 уровня вы восстанавливаете истраченные вдохновения барда и после короткого и после продолжительного отдыха.
!!!__''Источник магии''__
На 2 уровне вы получаете доступ к внутреннему источнику магии. Этот источник выражен в единицах чародейства, позволяющих вам создавать разнообразные магические эффекты.
!!!__''Истощение''__
Некоторые особые способности и опасности окружающей среды, такие как недоедание и длительное воздействие очень низких или высоких температур, могут стать причиной состояния, называемого истощением. Истощение делится на шесть степеней. Эффект даёт существу ту или иную степень истощения, согласно описанию.
<table>
<tr>
<th>Степень</th>
<th>Эффект</th>
</tr>
<tr>
<td>1</td>
<td>Помеха при проверках характеристик</td>
</tr>
<tr>
<td>2</td>
<td>Скорость уменьшается вдвое</td>
</tr>
<tr>
<td>3</td>
<td>Помеха при бросках атаки и спасбросках</td>
</tr>
<tr>
<td>4</td>
<td>Максимум хитов уменьшается вдвое</td>
</tr>
<tr>
<td>5</td>
<td>Скорость снижается до 0</td>
</tr>
<tr>
<td>6</td>
<td>Смерть</td>
</tr>
</table>
"""Если существо, уже находящееся в состоянии истощения, подвергается воздействию другого эффекта, вызывающего истощение, его текущая степень истощения повышается на значение, указанное в описании эффекта.
На существо воздействуют эффекты не только текущей степени истощения, но и более слабых степеней. Например, существо на 2 степени истощения перемещается в два раза медленнее и совершает с помехой проверки характеристик.
Эффект, снимающий истощение, понижает его степень согласно описанию эффекта, вплоть до окончания действия истощения, если степень истощения существа становится ниже 1.
Продолжительный отдых снижает степень истощения на 1, при условии, что существо что-нибудь съесть и выпьет."""
!!!__''Исчадие''__
Вы заключили договор с исчадием из нижних планов бытия, сущностью, обладающей злыми устремлениями, даже если сами вы не разделяете их. Эти сущности жаждут осквернения и разрушения всего сущего, особенно вас самих. Исчадия настолько мощные, чтоб заключить договор, включают демонических повелителей, таких как Демогоргон, Оркус, Фраз’Урб-луу и Бафомет; архидьяволов, таких как Асмодей, Диспатер, Мефистофель и Белиал; наиболее могущественных исчадий преисподней и балоров; ультролотов и других повелителей юголотов.
!!!''Расширенный список заклинаний''
Исчадие позволяет вам при изучении заклинаний колдуна выбирать из более широкого списка. В ваш список заклинаний колдуна добавляются следующие заклинания
''Дополнительные заклинания исчадия''
<table>
<tr>
<th>Уровень заклинания</th>
<th>Заклинания</th>
</tr>
<tr>
<td>1</td>
<td>огненные ладони, приказ</td>
</tr>
<tr>
<td>2</td>
<td>глухота/слепота, палящий луч</td>
</tr>
<tr>
<td>3</td>
<td>зловонное облако, огненный шар</td>
</tr>
<tr>
<td>4</td>
<td>огненная стена, огненный щит</td>
</tr>
<tr>
<td>5</td>
<td>небесный огонь, святилище</td>
</tr>
</table>
!!!''Благословение темнейшего''
Начиная с 1 уровня, когда вы опускаете хиты враждебного существа до 0, вы получаете временные хиты, равные вашему модификатору Харизмы + ваш уровень колдуна (минимум 1).
!!!''Удача темнейшего''
"""Начиная с 6 уровня, вы можете воззвать к своему покровителю, чтобы изменить судьбу в свою пользу. Когда вы совершаете проверку характеристики или спасбросок, вы можете использовать это умение, чтобы добавить к10 к броску. Вы можете так сделать после основного броска, но до того, как его эффект вступит в силу.
Использовав это умение, вы не можете использовать его снова до окончания короткого или продолжительного отдыха."""
''Устойчивость исчадия''
Начиная с 10 уровня вы можете выбрать один вид урона, когда заканчиваете короткий или продолжительный отдых. Вы получаете сопротивление этому виду урона, пока вы не выберете другой вид урона при помощи этого умения. Урон от магического или серебряного оружия игнорирует это сопротивление.
!!!''Бросок сквозь ад''
"""Начиная с 14 уровня, когда вы попадаете по существу атакой, вы можете использовать это умение, чтобы мгновенно переместить цель сквозь нижние планы. Существо исчезает и несётся через кошмарный ландшафт.
В конце вашего следующего хода цель возвращается в пространство, которое занимало, или ближайшее свободное пространство. Если цель — не исчадие, она получает урон психической энергией 10к10 от испытанных жутких ощущений.
Использовав это умение, вы не можете использовать его снова до окончания продолжительного отдыха."""
!!!''__Исчезновение__''
Начиная с 14 уровня вы можете использовать в свой ход действие Засада бонусным действием. Кроме того, вы не можете быть выслежены немагическими способом, если вы не оставите след намеренно.
//4 уровень, Ограждение, Волшебник//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (тонкий свинцовый лист, кусок матового стекла, шарик из ваты или ткани и толчёный хризолит)
:''Длительность:'' 24 часа
"""Вы создаёте в пределах дистанции защищённое магией место. Это куб с длиной ребра от 5 до 100 футов. Заклинание длится, пока не окончится, или вы не окончите его действием.
Когда вы накладываете это заклинание, вы решаете, какую именно безопасность обеспечивает заклинание, выбирая все или некоторые из следующих свойств:"""
* Звуки не проходят сквозь границу защищённого пространства.
* Граница защищённого пространства выглядит тёмной и затуманенной, блокируя обзор (в том числе и тёмное зрение) сквозь неё.
* Сенсоры, создаваемые заклинаниями школы Прорицания, не могут появляться в защищённой области и проходить сквозь её периметр.
* Существа в области не могут становиться целями заклинаний школы Прорицания.
* Ничто не может телепортироваться в охраняемую область или из неё.
* В охраняемой области блокируются планарные перемещения.
Накладывание этого заклинания на одно и то же место в течение года делает этот эффект постоянным.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, вы можете увеличить размер куба на 100 футов за каждый уровень ячейки выше 4. Таким образом, это заклинание, использованное ячейкой 5 уровня, может создать куб с длиной ребра 200 футов.
//Чудесный предмет, редкий//
Если в этом кадиле горит благовоние, вы можете действием произнести командное слово и призвать воздушного элементаля, как если бы наложили заклинание призыв элементаля. Кадило нельзя использовать повторно, пока не наступит следующий рассвет.
Этот сосуд 6 дюймов шириной и 1 фут высотой напоминает чашу с декорированной крышкой. Весит кадило 1 фунт.
"""
Игра в D&D разворачивается в соответствии с этими базовыми шаблонами:
1. ''Мастер описывает окружение.'' Он говорит игрокам, где находятся их искатели приключений и что их окружает, предоставляя основой набор вариантов взаимодействия с окружением (сколько дверей есть в комнате, что находится на столе, кто сидит в таверне и так далее).
2.'' Игроки описывают, что они хотят сделать.'' Иногда один игрок говорит за весь отряд: «Мы идём в восточную дверь», например. В другой раз разные искатели приключений делают разные вещи: один может обыскивать сундук с сокровищами, в то время как второй изучает эзотерический символ, выгравированный на стене, а третий стоит на страже. Игроки не должны действовать строго по очереди, но Мастер слушает каждого игрока и решает исход этих действий.
Иногда решить исход действий легко. Если искатель приключений хочет пересечь комнату и открыть дверь, Мастер может просто сказать, что дверь открыта, и описать, что за ней находится. Но дверь может быть заперта, на полу может скрываться смертельная ловушка, или какое-нибудь другое обстоятельство может осложнять задачу персонажа. В таком случае Мастер решает, что произойдёт, возможно, полагаясь на бросок костей, чтобы определить последствия действий.
3. ''Мастер описывает последствия действий искателей приключений.'' Описание последствий часто приводит повторному принятию решений, что возвращает игру назад к шагу 1.
Этот шаблон поддерживается независимо от того, что делает искатель приключений: осторожно исследует руины, говорит с коварным принцем или сражается с могущественным драконом. В некоторых ситуациях, особенно в бою, действия более упорядочены и игроки (а также Мастер) действуют по очереди, выбирая и совершая действия. Но большую часть времени игра течёт плавно и гибко, приспосабливаясь к обстоятельствам приключения.
Зачастую действие приключения происходит в воображении игроков и Мастера, опираясь на словесные зарисовки. Некоторым Мастерам нравится использовать музыку, рисунки или записи звуковых эффектов, чтобы помочь создать настроение, и многие игроки и Мастера также подражают разным голосам, имитируя разных героев, чудовищ и других персонажей, которых они отыгрывают. Иногда Мастер может выложить на стол карту и использовать жетоны или миниатюры, представляющие каждое существо, участвующее в сцене, чтобы помочь игрокам отслеживать, кто и где расположен.
"""
!!! __''Игровые кости''__
"""
В игре используются многогранные кости с различным числом граней. Вы можете найти такие кости в игровых и большинстве книжных магазинов.
В правилах различные кости обозначаются буквой «к» с последующим числом сторон: к4, к6, к8, к10, к12 и к20. К примеру, к6 — это шестигранная кость (обычный кубик, который используется во многих играх).
Процентная кость или к100 работает несколько иначе. Вы генерируете число от 1 до 100 броском двух разных десятигранных костей с числами от 0 до 9. Одна кость (назначенная до броска) означает десятки, другая — единицы. Например, если вы выкинули «7» и «1», то результат броска равен «71». Два «0» обозначают «100». Некоторые десятигранные кости пронумерованы десятками (00, 10, 20 и так далее), из-за чего их проще отличить от кости, отвечающей за единицы. В этом случае бросок «70» и «1» означает число «71», а «00» и «0» означает «100».
Когда вам нужно бросить кости, правила указывают, как много и какого вида кости бросать, а также какие модификаторы добавлять. Например, «3к8 + 5» означает, что нужно бросить три восьмигранных кости, сложить их вместе и добавить 5 к сумме.
То же самое обозначение «к» встречается в формулировках вроде «1к3» и «1к2». Для имитации броска 1к3, бросьте к6 и разделите выброшенное число на 2 (округляя в большую строну). Для имитации броска 1к2, бросьте любую кость и назначьте «1» и «2» нечётным и чётным числам соответственно (альтернативный вариант — если результат броска больше половины граней кости, результат равен «2»).
"""
!!! __''к20''__
"""
Пронзил ли клинок искателя приключений сердце дракона или просто отскочил от твёрдой как сталь чешуи? Поверит ли огр возмутительной лжи? Сможет ли персонаж переплыть бушующую реку? Сможет персонаж избежать сильного взрыва огненного шара или получит полный урон от пламени? В случаях, когда исход действия неизвестен, D&D полагается на бросок 20-гранной кости (к20), чтобы определить успех или провал.
Способности каждого персонажа и чудовища в игре определяются значениями шести характеристик. Характеристиками являются ''Сила, Ловкость, Телосложение, Интеллект, Мудрость и Харизма'', и для большинства искателей приключений их значение варьируется от 3 до 18 (чудовища могут иметь низкие показатели, такие как 1, или высокие, такие как 30). Эти значения характеристик и выведенные из них ''модификаторы характеристик'' являются основой почти всех бросков к20, совершаемых игроками от лица персонажей и чудовищ.
Проверки характеристик, броски атаки и спасброски являются тремя главными видами бросков к20, образующими ядро правил игры. Все три следуют этим простым шагам:
1. ''Бросьте игральные кости и добавьте модификатор. Бросьте к20 и добавьте соответствующий модификатор.'' Как правило, этот модификатор выводится из показателя одной из шести характеристик и иногда включает в себя бонус мастерства, отражающий особые умения персонажа (дополнительную информацию по всем характеристикам и определению модификаторов характеристик смотрите в главе 1).
2. ''Примените ситуационные бонусы и штрафы.'' Классовые умения, заклинания, отдельные обстоятельства или некоторые другие эффекты могут давать бонус или накладывать штраф на проверку.
3. ''Сравните сумму с целевым числом.'' Если итоговый результат равен или превосходит целевое число, проверка характеристики, бросок атаки или спасбросок будут успешными. В противном случае происходит провал. Обычно только Мастер определяет целевые числа и говорит игрокам, успешна или провалена оказалась проверка характеристики, бросок атаки или спасбросок.
Целевое число для проверок характеристик и спасбросков называется ''Сложностью'' (Сл). Целевое число для бросков атаки называется ''Классом Доспеха'' (КД).
Это простое правило определяет решение большинства задач во время игры. Глава 7 предоставляет более детальные правила по использованию к20 в игре.
"""
!!! __''Преимущество и помеха''__
Иногда проверка характеристики, бросок атаки или спасбросок изменяются особыми ситуациями, называемыми преимуществами или помехами. Преимущество отражает положительные обстоятельства броска к20, в то время как помехи отражают обратное. Если у вас есть преимущество либо помеха, вы бросаете второй к20, когда совершаете бросок. Используйте наибольшее значение из двух бросков, если у вас есть преимущество, или используйте меньшее значение, если у вас помеха. Например, если у вас помеха и выпадает «17» и «5», вы используете результат «5». Если бы у вас было преимущество, ваш результат был бы равен «17».
Более детальные правила по преимуществам и помехам представлены в главе 7.
!!! __''Частное превосходит общее''__
"""
Эта книга содержит правила, особенно в частях 2 и 3, которые определяют проведение игры. Тем не менее многие расовые особенности, классовые умения, заклинания, магические предметы, способности чудовищ и другие игровые элементы местами противоречат основным правилам, создавая исключения в части игровой механики. Запомните следующее: когда частное правило противоречит общему правилу, частное правило побеждает.
Исключения из правил часто незначительны. Например, многие искатели приключений не владеют длинными луками, но все лесные эльфы владеют ими благодаря расовой особенности. Эта особенность создаёт небольшое исключение в игре. Другие примеры нарушения правил более значительны. Например, искатель приключений обычно не может проходить сквозь стены, но некоторые заклинания делают это возможным. Магия — источник большинства серьёзных исключений из правил.
"""
!!! __''Округление в меньшую сторону''__
Это ещё одно общее правило, которое нужно знать на начальном этапе. Всякий раз, когда вы делите число в игре, округляйте в меньшую сторону, если имеется дробный остаток, даже если остаток равен или больше 0,5.
//4 уровень, Ограждение, Волшебник/Друид/Следопыт/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (пыль бриллианта, стоящего 100 зм, расходуемая заклинанием)
:''Длительность:'' Концентрация, вплоть до 1 часа
Это заклинание делает плоть согласного существа, которого вы коснулись, твёрдой как камень. Пока заклинание активно, цель получает сопротивление к немагическому дробящему, колющему и рубящему урону.
//5 уровень, Воплощение, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (небольшой кусочек гранита)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""В точке, выбранной вами в пределах дистанции, появляется немагическая стена из камня. Стена толщиной 6 дюймов (15 сантиметров) и составлена из десяти плит 10 × 10 футов. Каждая плита должна соседствовать как минимум с одной другой плитой. В качестве альтернативы, вы можете создать плиты 10 × 20 футов, но толщиной только 3 дюйма (7,5 сантиметров).
Если стена при появлении проходит по пространству существа, это существо выталкивается по одну из сторон стены (на ваш выбор). Если существо со всех сторон окружается стеной (или стеной и другой сплошной поверхностью), это существо может совершить спасбросок Ловкости. При успехе оно может реакцией переместиться на расстояние, равное своей скорости, чтобы не быть окружённым стеной.
Стена может иметь любую форму, хотя и не может занимать одно пространство с существами и предметами. Стена не обязана быть вертикальной, и не обязана целиком покоиться на твёрдом основании. Однако, она должна сливаться с существующим камнем, опираясь на него. Таким образом, вы можете создать этим заклинанием мост через пропасть или наклонный спуск.
Если вы создаёте пролёт длиной больше 20 футов, вы должны уменьшить вдвое размер каждой плиты, чтобы создать поддержку. Вы можете придавать стене грубую форму, создавая бойницы, зубцы, и так далее.
Стена является предметом, изготовленным из камня, которому можно причинить урон и, тем самым, пробить. У каждой плиты КД 15 и по 30 хитов за каждый 1 дюйм (2,5 сантиметра) толщины. Уменьшение хитов плиты до 0 уничтожает её, и по решению Мастера, может вызвать обвал смежных плит.
Если вы поддерживаете концентрацию на этом заклинании в течение всей длительности, стена становится постоянной, и с этого момента её уже нельзя будет рассеять. В противном случае стена исчезает, когда заклинание будет окончено."""
//Чудесный предмет, редкий (требуется настройка)//
У этого драгоценного камня есть 3 заряда. Вы можете действием произнести командное слово и потратить 1 заряд. В течение следующих 10 минут вы обладаете истинным зрением в пределах 120 футов, если смотрите через этот драгоценный камень.
Камень ежедневно восстанавливает 1к3 заряда на рассвете.
//Чудесный предмет, редкость варьируется (требуется настройка)//
Камень Йоун назван в честь богини знаний и пророчеств, почитаемой в нескольких мирах. Существует много разновидностей камней Йоун., все они отличаются по форме и цвету.
Если вы действием подбрасываете один из этих камней в воздух, он начинает вращаться вокруг вашей головы на расстоянии 1к3 футов, предоставляя вам постоянное преимущество. Впоследствии другое существо может действием схватить руками или чем-то иным камень, забирая его себе, если совершит успешный бросок атаки по КД 24 или совершит успешную проверку Ловкости (Акробатика) со Сл 24. Вы сами можете действием схватить и убрать камень, оканчивая его эффект.
У камня КД 24, 10 хитов и сопротивление ко всем видам урона. Пока он вращается вокруг вашей головы, он считается носимым.
;
:"""//''Большое поглощение (легендарный).''// Пока этот эллипсоид с зелёными и лавандовыми прожилками вращается вокруг вашей головы, вы можете реакцией отменить заклинание с уровнем не больше 8, наложенное видимым вами существом и нацеленное только на вас.
Как только камень отменит 50 уровней заклинаний, он выгорит и станет тускло-серым, потеряв всю магию. Если вы становитесь целью заклинания, чей уровень настолько большой, что камень не может поглотить его целиком, это заклинание нельзя отменить."""
://''Восприятие (редкий).''// Вы не можете быть захвачены врасплох, пока этот тёмно-синий ромбоид вращается вокруг вашей головы.
://''Защита (редкий).''// Вы получаете бонус +1 к КД пока эта серо-розовая призма вращается вокруг вашей головы.
://''Лидерство (очень редкий).''// Ваше значение Харизмы увеличивается на 2, с максимумом 20, пока эта сфера с розовыми и зелёными прожилками вращается вокруг вашей головы.
://''Мастерство (легендарный).''// Ваш бонус мастерства увеличивается на 1, пока эта бледно-зелёная призма вращается вокруг вашей головы.
://''Питание (редкий).''// Вам не нужно ни есть и ни пить, пока этот прозрачный веретенообразный камень вращается вокруг вашей головы.
:"""//''Поглощение (очень редкий).''// Пока этот бледнолавандовый эллипсоид вращается вокруг вашей головы, вы можете реакцией отменить заклинание с уровнем не больше 4, наложенное видимым вами существом и нацеленное только на вас.
Как только камень отменит 20 уровней заклинаний, он выгорит и станет тускло-серым, потеряв всю магию. Если вы становитесь целью заклинания, чей уровень настолько большой, что камень не может поглотить его целиком, это заклинание нельзя отменить."""
://''Проворство (очень редкий).''// Ваше значение Ловкости увеличивается на 2, с максимумом 20, пока эта тёмно-красная сфера вращается вокруг вашей головы.
://''Проницательность (очень редкий).''// Ваше значение Мудрости увеличивается на 2, с максимумом 20, пока эта ярко-синяя сфера вращается вокруг вашей головы.
://''Рассудок (очень редкий).''// Ваше значение Интеллекта увеличивается на 2, с максимумом 20, пока эта сфера с алыми и синими прожилками вращается вокруг вашей головы.
://''Регенерация (легендарный).''// Вы восстанавливаете 15 хитов в конце каждого часа, в течение которого этот жемчужно-белый веретенообразный камень вращается вокруг вашей головы, при условии, что у вас есть как минимум 1 хит.
:"""//''Резерв (редкий).''// Эта ярко-фиолетовая призма хранит заклинания, наложенные в неё, пока вы не используете их. Этот камень может хранить до 3 уровней заклинаний одновременно. Когда его находят, он хранит 1к4 - 1 уровень заклинаний, выбранных Мастером.
Любое существо может заложить в камень заклинание с уровнем от 1 до 3, касаясь его при накладывании. Заклинание не вступает в силу, а просто помещается в камень. Если камень не может уместить заклинание, заклинание тратится безо всякого эффекта. Занимаемое число уровней определяется уровнем, с которым заклинание было наложено.
Пока этот камень вращается вокруг вашей головы, вы можете наложить заклинание, хранящееся в нём. Заклинание использует уровень ячейки, Сл спасброска, бонус атаки заклинанием и базовую характеристику исходного заклинателя, но во всём остальном считается, что заклинание наложили вы. Наложенное заклинание перестаёт храниться в камне, освобождая пространство."""
://''Сила (очень редкий).''// Ваше значение Силы увеличивается на 2, с максимумом 20, пока этот бледно-синий ромбоид вращается вокруг вашей головы.
://''Стойкость (очень редкий).''// Ваше значение Телосложения увеличивается на 2, с максимумом 20, пока этот розовый ромбоид вращается вокруг вашей головы.
//Чудесный предмет, редкий//
Если этот камень касается пола, вы можете действием произнести командное слово и призвать земляного элементаля, как если бы вы наложили заклинание призыв элементаля. После этого камень нельзя повторно использовать до следующего рассвета. Весит камень 5 фунтов.
//Чудесный предмет, необычный//
У этой призмы есть 50 зарядов. Если вы её держите, вы можете действием произнести одно из трёх командных слов, чтобы вызвать один из следующих эффектов:
* Первое командное слово заставляет камень испускать яркий свет в радиусе 30 футов и тусклый свет в радиусе ещё 30 футов. Этот эффект не тратит заряд. Он длится, пока вы не повторите командное слово бонусным действием, или пока не воспользуетесь другой функцией камня.
* Второе командное слово тратит 1 заряд и заставляет камень испустить сверкающий луч в одно существо, которое вы видите в пределах 60 футов. Существо должно преуспеть в спасброске Телосложения со Сл 15, иначе станет ослеплённым на 1 минуту. Существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект при успехе.
* Третье командное слово тратит 5 зарядов и заставляет камень испускать ослепляющий свет 30-футовым конусом. Все существа в конусе должны совершить спасброски, как если бы по ним попал луч, созданный вторым командным словом.
Когда все заряды этого камня кончатся, он становится немагической драгоценностью, стоящей 50 зм.
//Чудесный предмет, необычный (требуется настройка)//
Пока этот полированный агат находится у вас, вы получаете бонус +1 к проверкам характеристик и спасброскам.
//Чудесный предмет, необычный//
Этот камень содержит частичку стихийной энергии. Если вы действием разбиваете камень, призывается элементаль, как если бы вы наложили заклинание призыв элементаля, и магия, заключённая в камне, исчезает. Вид камня определяет вид призываемого элементаля.
<table>
<tr>
<th>Камень</th>
<th>Призываемый элементаль</th>
</tr>
<tr>
<td>Изумруд</td>
<td>Элементаль воды</td>
</tr>
<tr>
<td>Синий сапфир</td>
<td>Элементаль воздуха</td>
</tr>
<tr>
<td>Жёлтый бриллиант</td>
<td>Элементаль земли</td>
</tr>
<tr>
<td>Красный корунд</td>
<td>Элементаль огня</td>
</tr>
</table>
//Чудесный предмет, необычный//
Камни послания изготавливаются парами. На их гладкой поверхности есть парные символы, по которым их можно отличать от других таких камней. Пока вы касаетесь одного камня, вы можете действием наложить им заклинание послание. Целью является владелец парного камня. Если второй камень никто не несёт, вы это узнаёте в момент использования камня и заклинание не накладываете.
После того как камни наложат заклинание послание, они не могут сделать это повторно до следующего утра. Если один из камней уничтожается, второй перестаёт быть магическим.
//Оружие (кинжал), редкое//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием.
Вы можете действием заставить этот клинок покрыться густым чёрным ядом. Яд остаётся 1 минуту, или пока атака этим оружием не попадёт по существу. Цель должна преуспеть в спасброске Телосложения со Сл 15, иначе она получит урон ядом 2к10 и станет отравленной на 1 минуту. Вы не можете использовать повторно это свойство до следующего рассвета.
Вы можете использовать правила из Книги игрока для создания ПМ с классами и уровнями, так же как создаются персонажи игрока. Представленные ниже классовые опции позволят создать два характерных злодейских архетипа: злого верховного жреца и злого рыцаря или антипаладина.
Домен смерти является дополнительным доменом для злых жрецов, а Клятвопреступник это альтернативный путь для согрешивших паладинов. Игроки могут выбирать эти опции только с вашего разрешения.
{{Домен смерти (Жнец)}}
{{Клятвопреступник (Паладин)}}
!!''Классовые умения''
Барды обладают следующими классовыми умениями.
;''Хиты''
:''Кость Хитов:'' 1к8 за каждый уровень барда
:''Хиты на 1 уровне:'' 8 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень барда после первого
;''Владение''
:''Доспехи:'' Лёгкие доспехи
:''Оружие:'' Простое оружие, длинные мечи, короткие мечи, рапиры, ручные арбалеты
:''Инструменты:'' Три музыкальных инструмента на ваш выбор
:''Спасброски:'' Ловкость, Харизма
:''Навыки:'' Выберите три любых
!!''Классовые умения''
Варвары обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к12 за каждый уровень варвара
:''Хиты на 1 уровне:'' 12 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к12 (или 7) + модификатор Телосложения за каждый уровень варвара после первого
;Владение
:''Доспехи:'' Лёгкие доспехи, средние доспехи, щиты
:''Оружие:'' Простое оружие, воинское оружие
:''Инструменты:'' Нет
:''Спасброски:'' Сила, Телосложение
:''Навыки:'' Выберите два навыка из следующих: Атлетика, Внимательность, Выживание, Запугивание, Природа, Уход за животными
!!!''Классовые умения''
Воины обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к10 за каждый уровень воина
:''Хиты на 1 уровне:'' 10 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к10 (или 6) + модификатор Телосложения за каждый уровень воина после первого
;Владение
:''Доспехи:'' Все доспехи, щиты
:''Оружие:'' Простое оружие, воинское оружие
:''Инструменты:'' Нет
:''Спасброски:'' Сила, Телосложение
:''Навыки:'' Выберите два навыка из следующих: Акробатика, Атлетика, Внимательность, Выживание, Запугивание, История, Проницательность, Уход за животными
!!__''Классовые умения''__
Волшебники обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к6 за каждый уровень волшебника
:''Хиты на 1 уровне:'' 6 + ваш модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к6 (или 4) + модификатор Телосложения за каждый уровень волшебника после первого
;''Владение''
:''Доспехи:'' Нет
:''Оружие:'' Кинжалы, дротики, пращи, боевые посохи, лёгкие арбалеты
:''Инструменты:'' Нет
:''Спасброски:'' Интеллект, Мудрость
:''Навыки:'' Выберите два навыка из следующих: Анализ, История, Магия, Медицина, Проницательность, Религия
!!''__Классовые умения__''
Друиды обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к8 за каждый уровень друида
:''Хиты на 1 уровне:'' 8 + ваш модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень друида после первого
;Владение
:''Доспехи:'' Лёгкие доспехи, средние доспехи, щиты (друиды не носят доспехи и щиты из металла)
:''Оружие:'' Боевые посохи, булавы, дротики, дубинки, кинжалы, копья, метательные копья, пращи, серпы, скимитары
:''Инструменты:'' Набор травника
:''Спасброски:'' Интеллект, Мудрость
:''Навыки:'' Выберите два навыка из следующих: Внимательность, Выживание, Магия, Медицина, Обращение с животными, Природа, Проницательность, Религия
!!''Классовые умения''
Жрецы обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к8 за каждый уровень жреца
:''Хиты на 1 уровне:'' 8 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень жреца после первого
;Владение
:''Доспехи:'' Лёгкие доспехи, средние доспехи, щиты
:''Оружие:'' Простое оружие
:''Инструменты:'' Нет
:''Спасброски:'' Мудрость, Харизма
:''Навыки:'' Выберите два навыка из следующих: История, Медицина, Проницательность, Религия, Убеждение
!!''Классовые умения''
Колдуны обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к8 за каждый уровень колдуна
:''Хиты на 1 уровне:'' 8 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень колдуна после первого
;Владение
:''Доспехи:'' Лёгкие доспехи
:''Оружие:'' Простое оружие
:''Инструменты:'' Нет
:''Спасброски:'' Мудрость, Харизма
:''Навыки:'' Выберите два навыка из следующих: Анализ, Запугивание, История, Магия, Обман, Природа, Религия
!!''Классовые умения''
Монахи обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к8 за каждый уровень монаха
:''Хиты на 1 уровне:'' 8 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень монаха после первого
;Владение
:''Доспехи:'' нет
:''Оружие:'' Простое оружие, короткие мечи
:''Инструменты:'' Выберите один вид инструмента ремесленников либо музыкального инструмента
:''Спасброски:'' Сила, Ловкость
:''Навыки:'' Выберите два навыка из следующих: Акробатика, Атлетика, История, Проницательность, Религия, Скрытность
!!''Классовые умения''
Паладины обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к10 за каждый уровень паладина
:''Хиты на 1 уровне:'' 10 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к10 (или 6) + модификатор Телосложения за каждый уровень паладина после первого
;Владение
:''Доспехи:'' Все виды доспехов, щиты
:''Оружие:'' Простое оружие, воинское оружие
:''Инструменты:'' нет
:''Спасброски:'' Мудрость, Харизма
:''Навыки:'' Выберите два навыка из следующих: Атлетика, Запугивание, Медицина, Проницательность, Религия, Убеждение
!!''Классовые умения''
Плуты обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к8 за каждый уровень плута
:''Хиты на 1 уровне:'' 8 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к8 (или 5) + модификатор Телосложения за каждый уровень плута после первого
;Владение
:''Доспехи:'' Лёгкие доспехи
:''Оружие:'' Простое оружие, ручные арбалеты, длинные мечи, рапиры, короткие мечи
:''Инструменты:'' Воровские инструменты
:''Спасброски:'' Ловкость, Интеллект
:''Навыки:'' Выберите четыре навыка из следующих: Акробатика, Анализ, Атлетика, Внимательность, Выступление, Запугивание, Ловкость рук, Обман, Проницательность, Скрытность, Убеждение.
!!''Классовые умения''
Следопыты обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к10 за каждый уровень следопыта
:''Хиты на 1 уровне:'' 10 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к10 (или 6) + модификатор Телосложения за каждый уровень следопыта после первого
;Владение
:''Доспехи:'' Лёгкие доспехи, средние доспехи, щиты
:''Оружие:'' Простое оружие, воинское оружие
:''Инструменты:'' Нет
:''Спасброски:'' Сила, Ловкость
:''Навыки:'' Выберите три навыка из следующих: Анализ, Атлетика, Внимательность, Выживание, Природа, Проницательность, Скрытность, Уход за животными
!!''Классовые умения''
Чародеи обладают следующими классовыми умениями.
;Хиты
:''Кость Хитов:'' 1к6 за каждый уровень чародея
:''Хиты на 1 уровне:'' 6 + модификатор Телосложения
:''Хиты на следующих уровнях:'' 1к6 (или 4) + модификатор Телосложения за каждый уровень чародея после первого
;Владение
:''Доспехи:'' нет
:''Оружие:'' Боевые посохи, дротики, кинжалы, лёгкие арбалеты, пращи
:''Инструменты:'' нет
:''Спасброски:'' Телосложение, Харизма
:''Навыки:'' Выберите два навыка из следующих: Запугивание, Магия, Обман, Проницательность, Религия, Убеждение
//2 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
Когда вы в следующий раз попадёте по существу атакой рукопашным оружием, пока заклинание активно, ваше оружие испускает астральное сияние. Атака причиняет цели дополнительный урон излучением 2к6. Цель становится видимой, если была невидима, начинает испускать тусклый свет в пределах 5 футов, и не может стать невидимой, пока активно это заклинание.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, дополнительный урон увеличивается на 1к6 за каждый уровень ячейки выше второй.
//Оружие (любой меч), легендарное (требуется настройка)//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием. Пока это оружие находится у вас, вы также получаете бонус +1 к спасброскам.
;
://''Удача.''// Если этот меч находится у вас, вы можете воззвать к его удаче (действие не требуется), чтобы перебросить один бросок атаки, проверку характеристики или спасбросок, который вам не понравился. Вы обязаны использовать результат второго броска. Это свойство нельзя использовать повторно до следующего рассвета.
://''Исполнение желаний.''// У меча есть 1к4 - 1 заряд. Если вы держите его, вы можете действием потратить 1 заряд, чтобы наложить им заклинание исполнение желаний. Это свойство нельзя использовать повторно до следующего рассвета. Меч теряет это свойство, когда у него не останется зарядов.
!!!__''Клятва Древних''__
Клятва Древних так же стара, как раса эльфов и ритуалы друидов. Иногда называемые фейскими рыцарями, зелёными рыцарями, или рогатыми рыцарями, паладины, которые дали эту клятву, связывают свою судьбу со стороной света в мировой борьбе против тьмы, потому что они любят красивые и животворные вещи в мире, а не потому, что верят в принципы чести, отваги и справедливости. Они украшают свои доспехи и одежду изображениями растительности, рогов и цветов, чтобы отразить свою приверженность сохранению в мире света и жизни.
!!!''Догматы древних''
"""Догматы клятвы Древних сохранялись в течение бессчётных веков. Эта клятва подчёркивает главенство принципов добра над проблемами порядка или хаоса. Её основные четыре принципа просты:
''Разожги свет.'' Делами милосердия, доброты и прощения разжигай свет надежды в мире, повергая ниц отчаяние.
''Сохраняй свет.'' Там, где есть добро, красота, любовь и смех в мире, стой против бесчестья, чтобы побороть его. Там, где процветает жизнь, стой против сил, что хотят погубить её.
''Храни свет в себе.'' Восторгайся песней и смехом, красотой и искусством. Если позволишь свету умереть в своём сердце, то не сможешь сохранить его в мире.
''Будь светом.'' Будь маяком великолепия для тех, кто живёт в отчаянии. Пусть свет твоей отваги и мужества сияет в твоих делах."""
!!!''Заклинания клятвы''
Вы получаете заклинания клятвы на указанных уровнях паладина.
''Заклинания клятвы древних''
<table>
<tr>
<th>Уровень паладина</th>
<th>Заклинания</th>
</tr>
<tr>
<td>3</td>
<td>опутывающий удар, разговор с животными</td>
</tr>
<tr>
<td>5</td>
<td>лунный луч, туманный шаг</td>
</tr>
<tr>
<td>9</td>
<td>защита от энергии, рост растений</td>
</tr>
<tr>
<td>13</td>
<td>град,каменная кожа</td>
</tr>
<tr>
<td>17</td>
<td>древесный путь, общение с природой</td>
</tr>
</table>
!!!''Божественный канал''
"""Когда вы даёте эту клятву на 3 уровне, вы получаете следующие два варианта использования Божественного канала.
''Гнев природы.'' Вы можете использовать Божественный канал, чтобы призвать первородные силы для опутывания врага. Вы можете действием опутать призрачными лозами существо, которое вы можете видеть, и которое находится в пределах 10 футов от вас. Это существо должно преуспеть в спасброске Силы или Ловкости (по своему выбору), иначе оно станет опутанным. Опутанное лозами существо повторяет спасбросок в конце каждого своего хода. В случае успеха оно освобождается, а лозы исчезают.
''Изгнать неверного.'' Вы можете использовать Божественный канал для произнесения древних слов, причиняющих боль феям и исчадиям, когда они слышат их. Вы действием демонстрируете свой священный символ и все феи и исчадия в пределах 30 футов, слышащие вас, должны совершить спасбросок Мудрости. Провалив его, существо изгоняется на 1 минуту или пока не получит урон.
Изгнанные существа должны весь свой ход пытаться убежать от вас так далеко, как только могут, и не могут добровольно переместиться в пространство, находящееся в пределах 30 футов от вас. Также они не могут совершать реакции. Из всех действий они могут совершать только Рывок и попытки избежать эффекта, не дающего им перемещаться. Если же двигаться некуда, существа могут использовать действие Уклонение.
Если истинная форма существа скрыта иллюзией, изменением облика, или другим эффектом, скрывающим её, то она раскрывается, когда существо изгоняется."""
!!!''Аура опеки''
"""Начиная с 7 уровня древняя магия так сильно вас пропитывает, что образует мистическую защиту. Вы и дружественные существа в пределах 10 футов от вас получаете сопротивление к урону от заклинаний.
На 18 уровне радиус ауры увеличивается до 30 футов."""
!!!''Бессмертный страж''
"""Начиная с 15 уровня, если ваши хиты опускаются до 0, но вы не были убиты, вы можете решить, чтобы вы вместо этого остались с 1 хитом. Использовав это умение, вы не можете повторно его использовать, пока не окончите продолжительный отдых.
Кроме того, вы не получаете недостатков от большого возраста, и не можете быть состарены магией."""
!!!''Древний чемпион''
На 20 уровне вы можете принимать форму древней силы природы, выбрав её внешний вид. Например, ваша кожа может позеленеть или превратиться в кору, а ваши волосы могут стать листьями или мхом, или у вас могут вырасти рога или львиная грива.
Вы можете действием подвергнуться этой трансформации. На 1 минуту вы получаете следующие преимущества:
* В начале каждого своего хода вы восстанавливаете 10 хитов.
* Каждый раз, когда вы накладываете заклинание паладина, которое накладывается за 1 действие, вы можете вместо этого сотворить его бонусным действием.
* Вражеские существа в пределах 10 футов от вас совершают с помехой спасброски от ваших заклинаний паладина и вариантов Божественного канала.
Использовав это умение, вы сможете использовать его повторно только после окончания продолжительного отдыха.
!!!''__Клятва мести__''
Давая клятву мести, вы берёте на себя торжественное обязательство карать тех, кто совершил тяжкий грех. Когда силы зла вырезают беспомощных селян, когда целый народ отворачивается от воли богов, когда гильдия воров становится слишком жестокой и сильной, когда дракон терроризирует сельскую местность — в такие времена появляются паладины, давшие клятву мести, чтобы установить, что правильно, а что ошибочно. Для этих паладинов, иногда называемых мстителями или тёмными рыцарями, собственная чистота не так важна, как сотворение правосудия.
!!!''Догматы мести''
"""Догматы клятвы мести разнятся от паладина к паладину, но все принципы сводятся к наказанию преступников любой ценой. Паладины, отстаивающие эти принципы, готовы пожертвовать даже собственной праведностью, чтобы совершить правосудие над теми, кто творит зло, и такие паладины часто нейтральны или законно-нейтральны. Основные принципы догматов жестоки, но просты:
''Сражайся с большим злом.'' При выборе между борьбой с заклятыми врагами и боем с меньшим злом, я выбираю большее зло.
''Не щадить зло.'' Обычные враги могут рассчитывать на пощаду, но только не мои заклятые враги.
''Любой ценой.'' Мои угрызения совести не могут встать на пути истребления моих врагов.
''Возмещение.'' Если мои враги сеют разруху в мире, то это потому, что мне не удалось их остановить. Я должен помочь тем, кто пострадал от их злодеяний."""
!!!''Заклинания клятвы''
Вы получаете заклинания клятвы на указанных уровнях паладина.
''Заклинания клятвы мести''
<table>
<tr>
<th>Уровень паладина</th>
<th>Заклинания</th>
</tr>
<tr>
<td>3</td>
<td>метка охотника, порча</td>
</tr>
<tr>
<td>5</td>
<td>туманный шаг, удержание личности</td>
</tr>
<tr>
<td>9</td>
<td>защита от энергии, ускорение</td>
</tr>
<tr>
<td>13</td>
<td>изгнание, переносящая дверь</td>
</tr>
<tr>
<td>17</td>
<td>наблюдение, удержание чудовища</td>
</tr>
</table>
!!!''Божественный канал''
"""Когда вы даёте эту клятву на 3 уровне, вы получаете следующие два варианта использования Божественного канала.
''Порицание врага.'' Вы действием демонстрируете свой священный символ и произносите обличающую молитву, используя Божественный канал. Выберите одно существо в пределах 60 футов, которое можете видеть. Это существо должно совершить спасбросок Мудрости, если не обладает иммунитетом к испугу. Исчадия и нежить совершают этот спасбросок с помехой.
Если спасбросок провален, существо становится испуганным на 1 минуту, или пока не получит урон. Пока существо испугано, его скорость равна 0, и оно не получает никаких бонусов к скорости.
Если спасбросок был успешен, скорость существа на 1 минуту, или пока оно не получает урон, уменьшается вдвое.
''Обет вражды.'' Вы можете бонусным действием произнести слова обета вражды по отношению к существу, которое вы можете видеть, и которое находится в пределах 10 футов от вас, используя Божественный канал. В течение 1 минуты, пока его хиты не опускаются до 0, или оно не потеряет сознание, вы совершаете броски атаки по нему с превосходством."""
!!!''Неумолимый мститель''
На 7 уровне ваше сверхъестественное внимание помогает вам предотвратить бегство врага. Если вы попадаете по существу провоцированной атакой, вы можете частью этой реакции переместиться на расстояние, равное половине своей скорости. Это перемещение не провоцирует атаки.
!!!''Душа мести''
Начиная с 15 уровня суть вашего Обета вражды даёт вам бо́льшую власть над врагом. Когда существо, находящееся под действием вашего Обета вражды, совершает атаку, вы можете реакцией совершить атаку рукопашным оружием по этому существу, если оно находится в пределах досягаемости.
!!!''Мстящий ангел''
На 20 уровне вы можете принять облик ангельского мстителя. Вы действием проходите трансформацию. На 1 час вы получаете следующие преимущества:
* Из вашей спины вырастают крылья, дающие вам скорость полёта 60 футов.
* Вы излучаете ауру угрозы в радиусе 30 футов. Когда враг впервые входит в ауру или начинает в ней своей ход во время сражения, он должен преуспеть в спасброске Мудрости, иначе он станет испуганным в течение 1 минуты, или пока не получит урон. Броски атаки по этому испуганному существа совершаются с преимуществом.
Использовав это умение, вы можете использовать его повторно только после окончания продолжительного отдыха.
!!!''__Клятва преданности__''
Клятва паладина связывает его с возвышенными идеалами справедливости, добродетели и порядка. Иногда называемые кавалерами, белыми рыцарями или святыми воителями, эти паладины подходят под идеал рыцаря в сияющих доспехах, действуя с честью в стремлении к справедливости и высшему благу. Они поддерживают самые высокие нормы поведения, и некоторые, к лучшему или худшему, приводят мир к тем же стандартам. Многие давшие эту клятву, почитают богов добра и закона, и следуют их догматам в качестве доказательства своей преданности. Они почитают ангелов — совершенных слуг добра — за свои идеалы, и изображают ангельские крылья на шлемах и гербах.
!!!''Догматы преданности''
"""Хотя точные слова и смысл клятвы преданности варьируются, паладины данной клятвы разделяют следующие принципы:
''Честность.'' Не лгите и не обманывайте. Да будет слово ваше незыблемо.
''Отвага.'' Никогда не бойтесь действовать, хотя и проявляя мудрость в осторожности.
''Сострадание.'' Помогайте другим, защищайте слабых и карайте тех, кто угрожает им. Проявляйте милосердие к врагам, но смягчайтесь мудро.
''Честь.'' Относитесь к людям по справедливости, и пусть ваши благородные дела будут примером для них. Делайте как можно больше добра, и как можно меньше дурного.
''Долг.'' Отвечайте за свои действия и их последствия, защищая тех, кого оберегаете, и подчиняйтесь тем, кто имеет власть над вами."""
!!!''Заклинания клятвы''
Вы получаете заклинания клятвы на указанных уровнях паладина.
''Заклинания клятвы преданности''
<table>
<tr>
<th>Уровень паладина</th>
<th>Заклинания</th>
</tr>
<tr>
<td>3</td>
<td>защита от зла и добра, убежище</td>
</tr>
<tr>
<td>5</td>
<td>малое восстановление, область истины</td>
</tr>
<tr>
<td>9</td>
<td>маяк надежды, рассеивание магии</td>
</tr>
<tr>
<td>13</td>
<td>свобода перемещения, страж веры</td>
</tr>
<tr>
<td>17</td>
<td>небесный огонь, общение</td>
</tr>
</table>
!!!''Божественный канал''
"""Когда вы даёте эту клятву на 3 уровне, вы получаете следующие два варианта использования Божественного канала.
''Священное оружие.'' Вы можете действием наполнить одно оружие, которое вы держите, позитивной энергией, используя Божественный канал. На протяжении 1 минуты вы добавляете свой модификатор Харизмы к броскам атаки, сделанным этим оружием (минимальный бонус +1). Также оружие испускает яркий свет в радиусе 20 футов и тусклый свет в пределах ещё 20 футов. Если оружие не является волшебным, то оно считается волшебным на время действия заклинания.
Вы можете закончить этот эффект в свой ход частью любого другого действия. Если вы не держите или не несёте это оружие, или теряете сознание, то этот эффект заканчивается.
''Изгнать нечистого.'' Вы действием показываете свой священный символ и произносите слова молитвы, осуждающей исчадия и нежить, используя Божественный канал. Все исчадия и нежить, которые могут видеть или слышать вас, находящиеся в пределах 30 футов от вас, должны совершить спасбросок Мудрости. Если они проваливают спасбросок, то изгоняются на 1 минуту или до тех пор, пока не получат урон.
Изгнанные существа должны весь свой ход пытаться убежать от вас так далеко, как только могут, и не могут добровольно переместиться в пространство, находящееся в пределах 30 футов от вас. Также они не могут совершать реакции. Из всех действий они могут совершать только Рывок и попытки избежать эффекта, не дающего им перемещаться. Если же двигаться некуда, существа могут использовать действие Уклонение."""
!!!''Аура преданности''
"""Начиная с 7 уровня вы и дружественные вам существа в пределах 10 футов от вас не могут быть очарованы, пока вы находитесь в сознании.
На 18 уровне радиус ауры увеличивается до 30 футов."""
!!!''Чистота духа''
Начиная с 15 уровня вы всегда находитесь под эффектом заклинания защита от зла и добра.
!!!''Святой нимб''
"""На 20 уровне вы можете действием создать ауру солнечного света. В течение 1 минуты от вас исходит яркий свет в радиусе 30 футов, и тусклый свет в пределах ещё 30 футов.
Каждый раз, когда враждебное существо начинает ход в этом ярком свете, оно получает урон излучением 10.
Кроме того, в течение этого времени вы совершаете с преимуществом спасброски от заклинаний, сотворённых исчадиями и нежитью.
Один раз использовав это умение, вы не можете использовать его повторно, пока не закончите продолжительный отдых."""
!!__''Паладин: Клятвопреступник''__
Клятвопреступник это паладин, нарушивший священную клятву и заимевший тёмные желания или ушедший на службу силам зла. Свет, когда-то горевший в его сердце, тухнет. Остаётся одна лишь тьма.
Чтобы стать Клятвопреступником, паладин должен быть злым и должен быть как минимум 3 уровня. Такой паладин заменяет умения, специфичные для его Священной клятвы умениями Клятвопреступника.
!!!''Заклинания Клятвопреступника''
Клятвопреступник теряет ранее полученные заклинания клятвы, но на указанных уровнях паладина получает следующие заклинания:
<table>
<tr>
<th>Уровень паладина</th>
<th>Заклинания</th>
</tr>
<tr>
<td>3</td>
<td>адское возмездие, нанесение ран</td>
</tr>
<tr>
<td>5</td>
<td>корона безумия, тьма</td>
</tr>
<tr>
<td>9</td>
<td>восставший труп, проклятие</td>
</tr>
<tr>
<td>13</td>
<td>смятение, усыхание</td>
</tr>
<tr>
<td>17</td>
<td>заражение, подчинение личности</td>
</tr>
</table>
!!!''Божественный канал''
Паладин-Клятвопреступник 3 уровня или выше получает следующие два варианта использования Божественного канала:
;
://''Контроль нежити.''// Паладин может действием выбрать целью одно существо-нежить, видимое им и находящееся в пределах 30 футов от него. Цель должна совершить спасбросок Мудрости. При провале цель должна повиноваться командам паладина в течение следующих 24 часов, или пока паладин не использует эту разновидность Божественного канала ещё раз. Нежить, чей показатель опасности равен уровню паладина или превышает его, обладает иммунитетом к этому эффекту.
://''Жуткий вид.''// Паладин может действием собрать все свои самые тёмные эмоции и выдать их вспышкой. Все существа на выбор паладина, находящиеся в пределах 30 футов от него, должны совершить спасбросок Мудрости, если они видят паладина. При провале цель становится испуганной паладином на 1 минуту. Если существо, испуганное этим эффектом, оканчивает ход более чем в 30 футах от паладина, оно может совершить ещё один спасбросок Мудрости для окончания на нём этого эффекта.
!!!''Аура ненависти''
Начиная с 7 уровня, паладин, а также все исчадия и нежить в пределах 10 футов от него, получают бонус к броскам урона рукопашным оружием, равный модификатору Харизмы паладина (минимум +1). Существо может получать преимущество только одного такого умения за раз.
На 18 уровне радиус ауры увеличивается до 30 футов.
!!!''Сверхъестественное сопротивление''
На 15 уровне паладин получает сопротивление дробящему, колющему и рубящему урону от немагического оружия.
!!!''Жуткий лорд''
На 20 уровне паладин может действием окружить себя аурой мрака, существующей 1 минуту. Эта аура уменьшает яркий свет в пределах 30 футов от паладина до тусклого света. Каждый раз, когда враг, испуганный паладином, начинает ход в этой ауре, он получает урон психической энергией 4к10. Кроме того, паладин и выбранные им существа, находящиеся в ауре, окутываются плотными тенями. Существа, полагающиеся на зрение, совершают с помехой броски атаки по существам, окутанным тенью.
Пока аура активна, паладин может в свой ход бонусным действием заставить теней в ауре атаковать одно существо. Паладин совершает по цели рукопашную атаку заклинанием. Ели атака попадает, цель получает урон некротической энергией 3к10 + модификатор Харизмы паладина.
Активировав ауру, паладин не может этого сделать ещё раз, пока не окончит продолжительный отдых.
<<<
!!!''Искупление Клятвопреступника''
Если вы позволяете игроку выбрать опцию Клятвопреступник, вы можете позже позволить паладину искупить свою вину и снова стать настоящим паладином.
Паладин, желающий искупления, должен вна нале избавиться от злого мировоззрения и продемонстрировать изменившееся мировоззрение словами и действиями. Сделав это, паладин теряет все умения Клятвопреступника и должен выбрать божество и священную клятву (с вашего разрешения, игрок может выбрать божество или священную клятву, отличающиеся от имеющихся изначально). Однако, паладин не получает классовые умения от священной клятвы, пока не выполнит опасное задание или испытание, назначенное Мастером.
Паладин, нарушивший священную клятву второй раз, может снова стать Клятвопреступником, но уже не может получить искупление.
<<<
!!!!''Книга восторженных деяний''
//Чудесный предмет, артефакт (требуется настройка существом с добрым мировоззрением)//
Прославленная Книга Восторженных Деяний, трактат о добре в мультивселенной, занимает важное место во многих религиях. Это не просто письмена о конкретной вере, разнообразные авторы заполняли её страницы своим пониманием истинной добродетели и давали советы по борьбе со злом.
Книга Восторженных Деяний редко надолго задерживается в одном месте. Когда её прочтут, она исчезает, чтобы появиться в другом уголке мультивселенной и нести там, в тёмный мир свои моральные нравоучения. Были попытки скопировать этот том, но они не увенчались успехом, так как не удаётся передать его магическую природу и его благословение целеустремлённым и чистым сердцем.
Книга запирается тяжёлой застёжкой в форме ангельских крыльев. Только существо с добрым мировоззрением, настроенное на эту книгу, может расстегнуть застёжку. Открыв книгу, настроенное существо должно потратить 80 часов на её чтение и изучение, чтобы получить преимущества от неё. Другие существа, смотрящие на открытые страницы, видят текст, но не понимают значения слов и не получают преимуществ. Злое существо, пытающееся читать эту книгу, получает урон излучением 24к6. Этот урон игнорирует сопротивления и иммунитеты, и его никак нельзя ни уменьшить, ни избежать. Существо, чьи хиты уменьшаются от этого урона до 0, исчезает в ослепительной вспышке, уничтоженное, но оставляет всё своё снаряжение.
Преимущества, даруемые Книгой Восторженных Деяний, длятся только пока вы стремитесь к добру. Если вы в течение 10 дней не совершаете ни одного доброго или благородного поступка, вы теряете все преимущества, даруемые книгой.
;
://''Случайные свойства.''// Книга Восторженных Деяний обладает несколькими свойствами, определяемыми случайным образом:
* малых положительных свойства
* 2 основных положительных свойства
://''Увеличенная Мудрость.''// После того как вы потратите нужное время на чтение и изучение книги, ваша Мудрость увеличивается на 2, с максимумом 24. Вы не можете получить это преимущество из книги более одного раза.
://''Просветлённая магия.''// После того как вы изучите книгу, все ячейки заклинаний, которые вы тратите для накладывания заклинаний жреца или паладина, считаются ячейками с уровнем на 1 выше.
://''Ореол.''// Изучив книгу, вы начинаете излучать защитный ореол. Он испускает яркий свет в пределах 10 футов и тусклый свет в пределах ещё 10 футов. Вы можете развеять или вернуть ореол бонусным действием. Пока ореол существует, вы совершаете с преимуществом проверки Харизмы (Убеждение), совершённые для взаимодействия с добрыми существами и проверки Харизмы (Запугивание), совершённые для взаимодействия со злыми существами. Кроме того, исчадия и нежить, находящиеся в пределах яркого света ореола, совершают по вам броски атаки с помехой.
://''Уничтожение Книги.''// Ходят слухи, что Книгу Восторженных Деяний нельзя уничтожить, пока в мультивселенной есть хоть частичка добра. Однако если её бросить в реку Стикс, её письмена и иллюстрации сотрутся, и на 1к100 лет книга станет бесполезной.
!!!''Книга древних секретов''
"""//Требование: умение Договор гримуара//
Теперь вы можете вписывать магические ритуалы в свою Книгу Теней. Выберите два заклинания 1 уровня с ключевым словом «ритуал» из списков заклинаний любых классов. Эти заклинания появляются в книге и не учитываются в общем количестве заклинаний, которые вы можете знать. Держа Книгу Теней в руке, вы можете творить выбранные заклинания как ритуалы. Вы не можете творить заклинания иначе как ритуалом, если вы не узнали их иным способом. Вы также можете творить известные заклинания колдуна как ритуалы, если у них есть ключевое слово «ритуал».
Во время приключений вы можете добавлять другие ритуальные заклинания в свою Книгу Теней. Когда вы найдёте такое заклинание, вы можете добавить его в книгу, если уровень заклинания не превышает половину вашего уровня колдуна (округляя в большую сторону) и если вы можете потратить время на переписывание заклинания. За каждый уровень заклинания время переписывания занимает 2 часа и стоит 50 золотых монет, которые должны быть потрачены на редкие чернила, необходимые для записи."""
!!!''Ваша книга заклинаний''
"""Заклинания, которые вы добавляете в свою книгу заклинаний, получая уровни, отражают исследования, которые вы проводите, а также интеллектуальные прорывы в изучении природы вселенной, сделанные вами. Вы также можете найти другие заклинания во время приключений. Вы можете обнаружить заклинание, записанное на свитке в сундуке злого волшебника, или, например, в пыльном фолианте в древней библиотеке.
//''Копирование заклинания в книгу.''// Если вы находите заклинание волшебника 1 или более высокого уровня, вы можете добавить его в свою книгу заклинаний, если оно имеет такой уровень, заклинания которого вы можете подготавливать, и у вас имеется свободное время для его расшифровки и копирования.
Копирование заклинания в вашу книгу включает воспроизведение основной формы заклинания, а также расшифровку уникальной системы обозначений, используемой волшебником, который записал его. Вы должны подобрать нужные жесты и звуки, после чего записываете его в свою книгу заклинаний, используя собственные обозначения.
За каждый уровень заклинания процесс занимает 2 часа и стоит 50 золотых монет. Стоимость представляет собой материальные компоненты, которые вы расходуете на эксперименты с заклинанием, чтобы им овладеть, а также высококачественные чернила для записи текста. После того как вы потратили время и деньги, вы можете подготавливать это заклинание как и свои прочие заклинания.
//''Замена книги.''// Вы можете копировать заклинание из своей книги заклинаний в другую, например, если хотите сделать запасную копию. Это делается так же как и простое копирование заклинаний, но быстрее и проще, так как вы понимаете свои собственные обозначения и уже знаете, как творить это заклинание. Вам необходимо потратить только по 10 золотых монет и 1 часу для каждого уровня копируемого заклинания.
Если вы потеряли свою книгу заклинаний, вы можете использовать ту же процедуру для записи заклинаний, которые у вас подготовлены, в новую книгу заклинаний. Для заполнения оставшейся части книги заклинаний потребует найти новые заклинания, чтобы вернуть всё как прежде. По этой причине многие волшебники держат запасные книги заклинаний в безопасном месте.
//''Внешний вид книги.''// Ваша книга заклинаний является уникальным сборником заклинаний, со своими декоративными завитушками и ремаркам. Это может быть обычная, обтянутая кожей книга, которую вы получили в подарок от наставника, или оплетённый золотом том, который вы нашли в древней библиотеке, или даже разрозненная коллекция записей, собранная вместе после потери предыдущей книги заклинаний в результате несчастного случая."""
!!!!''Книга Мерзкой Тьмы''
//Чудесный предмет, артефакт (требуется настройка)//
Содержимое этого отвратительного манускрипта — лакомый кусочек для тех, кто служит злу. Смертные не должны знать хранящиеся в нём тайны, они настолько ужасны, что один только взгляд на его страницы приводит к безумию.
Большинство считает, что авторство Книги Мерзкой Тьмы принадлежит богу-личу Векне. На её страницах он записал все свои больные идеи, все безумные мысли и все примеры самой чёрной магии, известные ему. Векна раскрыл все мерзкие темы, сделав книгу жутким каталогом всех смертных грехов.
Книга была в руках и других злодеев, и многие дополняли её своими мыслями. Эти дополнения сразу видны, так как они либо вклеивали свои страницы, либо делали пометки на полях и между строк. Есть также места, где страницы вырваны или полностью залиты чернилами или кровью, так что оригинальный текст уже не разобрать.
Присутствие книги уничтожает природу. Обычные растения вянут при ней, животные отказываются к ней приближаться, книга постепенно уничтожает всё, к чему прикасается. Даже камень трескается и становится прахом, если книга долго лежит на нём.
Существо, настроенное на эту книгу, должно потратить 80 часов на чтение и изучение её содержимого, чтобы получить преимущества от неё. После этого существо может изменять содержимое книги, при условии, что эти модификации увеличивают или распространяют зло.
Если на Книгу Мерзкой Тьмы настраивается не-злое существо, оно совершает спасбросок Харизмы со Сл 17. При провале его мировоззрение становится нейтрально-злым.
Книга Мерзкой Тьмы остаётся с вами только пока вы сеете зло в мире. Если вы за 10 дней не совершили ни одного злого поступка, или добровольно совершаете добрый поступок, книга исчезает. Если вы умираете, будучи настроенным на эту книгу, вашу душу забирает сущность великого зла. Вы не можете вернуться к жизни никакими средствами, пока ваша душа похищена.
<<<
!!!''Мерзкие знания''
Книга Мерзкой Тьмы описывает всё зло, существующее во Вселенной. Персонаж может найти в ней такие ужасные тайны, что их не должен знать ни один смертный. Среди прочих тем встречаются следующие:
* Апофеоз греховности. Книга может содержать ритуал, позволяющий персонажу стать личем или рыцарем смерти.
* Истинные имена. В книге могут быть истинные имена многочисленных исчадий.
* Тёмная магия. В книге могут быть ужасные и злые заклинания, созданные или отобранные Мастером. В заклинаниях могут быть проклятья, которые калечат, насылают боль, распространяют болезни или требуют жертвоприношений.
<<<
;
://''Случайные свойства.''// Книга Мерзкой Тьмы обладает несколькими свойствами, определяемыми случайным образом:
* 3 малых положительных свойства
* 1 основное положительное свойство
* 3 малых отрицательных свойства
* 2 основных отрицательных свойства
://''Изменение характеристик.''// После того как вы потратите нужное время на чтение и изучение книги, одна ваша характеристика на ваш выбор увеличивается на 2, с максимумом 24. Другая ваша характеристика на ваш выбор уменьшается на 2, с минимумом 3. Книга не может позже изменить ваши характеристики повторно.
://''Метка тьмы.''// После того как вы потратите нужное время на чтение и изучение книги, вы получаете физическое уродство, отражающее вашу преданность мерзкой тьме. На вашем лице может появиться руна. Ваши глаза могут стать абсолютно чёрными, или же на лбу могут вырасти рога. Вы можете покрыться морщинами или язвами, можете потерять часть лица, можете получить раздвоенный язык или другую особенность, выбранную Мастером. Метка тьмы позволяет вам совершать с преимуществом проверки Харизмы (Убеждение) при взаимодействии со злыми существами, а также проверки Харизмы (Запугивание) при взаимодействии с не-злыми персонажами.
://''Командование злом.''// Если вы настроены на книгу и держите её в руках, вы можете действием наложить на злую цель заклинание подчинение чудовища (Сл спасброска 18). Вы не сможете использовать это свойство повторно до следующего рассвета.
://''Тёмные знания.''// Вы можете обращаться к Книге Мерзкой Тьмы, если совершаете проверку Интеллекта для вспоминания информации о чём-то злом, например, о демонах. Если вы это делаете, то ваш бонус мастерства для этой проверки удваивается.
://''Тёмная Речь.''// Если вы несёте Книгу Мерзкой Тьмы и настроены на неё, вы можете действием прочесть вслух текст с её страниц на нечистом языке, известном как Тёмная Речь. Каждый раз, когда вы это делаете, вы получаете урон психической энергией 1к12, а все не-злые существа в пределах 15 футов от вас получают урон психической энергией 3к6.
:"""//''Уничтожение книги.''// Из Книги Мерзкой Тьмы можно вырывать страницы, но зло, содержащееся на них, в конечном счете, возвращается в неё, обычно когда новый автор добавляет туда свои знания.
Если солар порвёт книгу на две части, она будет уничтожена на 1к100 лет, после чего формируется заново в тёмной части мультивселенной.
Существо, настроенное на книгу в течение ста лет, может найти фразу, скрытую среди оригинального текста, которая, если её перевести на Небесный и произнести вслух, уничтожит и книгу и того, кто её произнесёт, в яркой вспышке света. Однако если в мультивселенной остаётся зло, книга формируется заново через 1к10 х 100 лет. Если всё зло в мультивселенной будет уничтожено, книга будет уничтожена навсегда."""
//Чудесный предмет, очень редкий//
Вы можете произнести действием командное слово, чтобы ковёр смог парить и летать. Он перемещается в сказанных вами вслух направлениях, при условии, что вы находитесь в пределах 30 футов от него.
Существует четыре версии такого ковра. Мастер сам выбирает размер ковра или определяет его случайным образом.
<table>
<tr>
<th>к100</th>
<th>Размер</th>
<th>Г рузоподъёмность</th>
<th>Скорость полёта</th>
</tr>
<tr>
<td>01-20</td>
<td>3 фт. х 5 фт.</td>
<td>200 фнт.</td>
<td>80 футов</td>
</tr>
<tr>
<td>21-55</td>
<td>4 фт. х 6 фт.</td>
<td>400 фнт.</td>
<td>60 футов</td>
</tr>
<tr>
<td>56-80</td>
<td>5 фт. х 7 фт.</td>
<td>600 фнт.</td>
<td>40 футов</td>
</tr>
<tr>
<td>81-100</td>
<td>6 фт. х 9 фт.</td>
<td>800 фнт.</td>
<td>30 футов</td>
</tr>
</table>
Ковёр может поднять в два раза больший вес, чем тот, что указан в таблице, но при нагрузке больше расчётной его скорость уменьшается вдвое.
Молодой эльф в золотых одеждах, с псевдодраконом, свернувшимся у него на плече, тепло улыбается дворцовому стражу, вплетая магическое очарование в свои сладкие речи, чтобы подчинить его своей воле.
Когда в руках морщинистой старухи оживает пламя, она шепчет тайное имя своего демонического покровителя, вливая в заклинание зловещую магию.
Переведя взгляд с потрёпанного тома на необычное сочетание звёзд над головой, тифлинг с дикими глазами начинает мистический ритуал, который откроет проход в далёкий мир.
Колдуны — искатели знаний, что скрываются в ткани мультивселенной. Через договор, заключённый с таинственными существами сверхъестественной силы, колдуны открывают для себя магические эффекты, как едва уловимые, так и впечатляющие воображение. Колдуны подпитывают свои силы древними знаниями таких существ как феи, демоны, дьяволы, карги и чужеродные сущности Дальнего Предела.
!!!''__Клятва и долг__''
Колдун заключает договор с потусторонней сущностью. Иногда отношения между колдуном и его покровителем похожи на отношения жреца и его божества, но сущности, выступающие в роли покровителей, вовсе не боги. Колдун может возглавить культ, посвящённый принцу демонов, архидьяволу или совершенно чужеродной сущности — созданиям, у которых обычно нет жрецов. Куда чаще их взаимоотношения похожи на отношения мастера и ученика. Знания колдуна и его сила растут по мере оказания услуг покровителю.
Магия, которой наделён колдун, может вносить незначительные изменения в его сущность (например, способность видеть в темноте или читать на любом языке), а также дарует возможность пользоваться мощными заклинаниями. В отличие от начитанных волшебников, колдуны могут дополнять магию некоторыми элементами рукопашного боя. Они хорошо себя чувствуют в лёгком доспехе, и знают, как пользоваться простым оружием.
!!!__''Поиски тайн''__
Колдунами управляет ненасытная жажда знаний и власти, это вынуждает их заключать договоры и определяет их будущую жизнь.
Истории о колдунах, связавших себя с исчадиями, широко известны. Но не все покровители колдунов — демонические сущности. Иногда путешественник находит в дебрях леса красивую башню, встречает её хозяина или хозяйку — фею, и оказывается втянутым в договор, не получив должной информации. А иногда, углубившись в толстые тома книг с запрещёнными знаниями, ученик открывает свой ум — блестящий, но сумасшедший, реальности, находящейся за пределами материального мира в пустоте, в которой таятся чужеродные создания.
Как только договор заключён, жажда колдуна к знаниям и власти не может быть утолена обычной учёбой и исследованиями. Никто не заключает договор с могущественным покровителем без намерения использовать полученную силу. Подавляющее большинство колдунов проводит свои дни в погоне за своими собственными целями. Как правило, это разного рода приключения. Кроме того, требования покровителей ведут колдунов навстречу приключениям.
{{Таблица развития Колдуна}}
{{Создание Колдуна}}
!!''Коллегии бардов''
Барды не любят одиночества. Они разыскивают друг друга, чтобы обменяться песнями и историями, похвастаться достижениями и поделиться знаниями. Барды образуют открытые ассоциации, называемые коллегиями, которые помогают им собираться вместе, и способствуют сохранению традиций.
<<Button "Коллегия доблести (Бард)" "Коллегия доблести">>
<<Button "Коллегия знаний (Бард)" "Коллегия знаний">>
!!!''__Коллегия бардов__''
На 3 уровне вы углубляетесь в традиции выбранной вами коллегии бардов: коллегии знаний или коллегии доблести. Обе они описаны в конце описания класса. Этот выбор предоставляет вам умения на 3, 6 и 14 уровнях.
!!!''__Коллегия доблести__''
Барды коллегии доблести это отважные скальды, чьи сказания не дают забыть великих героев прошлого и вдохновляют на подвиги нынешних героев. Такие барды собираются в медовых залах или вокруг походных костров, чтоб воспеть великие свершения прошлого и настоящего. Они путешествуют, чтобы стать очевидцами великих событий, и не дать памяти о них угаснуть. Своими песнями они вдохновляют на достижения, достойные памяти предков.
!!!''Дополнительные навыки''
Присоединяясь к коллегии доблести на 3 уровне, вы получаете владение средними доспехами, щитами и воинским оружием.
!!!''Боевое вдохновение''
При достижении 3 уровня вы узнаёте, как вдохновлять других в бою. Существо, получившее от вас кость бардовского вдохновения, может бросить эту кость и добавить результат к своему броску урона оружием. В качестве альтернативы, если существо атаковано, оно может реакцией совершить бросок кости вдохновения и добавить результат к своему КД от этой атаки. Оно может сделать это после броска атаки, но до того, как узнает, попали ли по нему.
!!!''Дополнительная атака''
Начиная с 6 уровня, если вы в свой ход совершаете действие Атака, вы можете совершить две атаки вместо одной.
!!!''Боевая магия''
На 14 уровне вы научились сплетать использование заклинаний и оружия в одно гармоничное действие. Если вы действием используете заклинание барда, вы можете бонусным действием совершить одну атаку оружием.
!!!''__Коллегия знаний__''
"""Барды коллегии знаний понемногу осведомлены обо всём на свете. Они собирают крупицы знаний отовсюду, будь то научные труды или крестьянские побасенки. Напевают ли они народные баллады в таверне, или исполняют изысканные композиции при дворе, эти барды используют свой талант, чтобы очаровать публику. И когда смолкают аплодисменты, публика может обнаружить себя рассказывающей все свои секреты, начиная со сплетен местного прихода, и заканчивая подробностями своей верности королю.
Лояльность таких бардов покоится на стремлении к красоте и правде, а не на верности монархам или приверженности к религиозным догматам. Дворяне, содержащие таких бардов в качестве советников или герольдов, хорошо знают, что бард скорее скажет неприятную правду, чем благоразумно промолчит.
Члены коллегии собираются в библиотеках, а иногда даже в колледжах, с настоящими классами и общежитиями. Там они делятся друг с другом знаниями. Они также посещают фестивали и общественные собрания, где могут выявлять растратчиков, разоблачать лжецов или выставлять на посмешище самоуверенных политиков."""
!!!''Дополнительные навыки''
Если вы по достижении 3 уровня присоединяетесь к коллегии знаний, вы овладеваете тремя навыками на ваш выбор.
!!!''Острое словцо''
Также на 3 уровне вы узнаёте, как использовать собственное остроумие, чтобы отвлечь, смутить или по-другому подорвать способности и уверенность противников. Если существо, которое вы можете видеть, в пределах 60 футов от вас совершает бросок атаки, урона или проверку характеристики, вы можете реакцией потратить одну из ваших костей бардовского вдохновения, и вычесть результат броска этой кости из броска этого существа. Вы можете принять решение об использовании этой способности после броска существа, но до того момента, когда Мастер объявит результат броска или проверки. Существо не подвержено этой способности, если не может слышать вас, или обладает иммунитетом к очарованию.
!!!''Дополнительные тайны магии''
На 6 уровне вы можете выучить 2 заклинания из доступных любому классу на свой выбор. Их уровень не должен превышать уровня заклинаний, которые вы можете использовать на этом уровне. Они также могут быть заговорами. Выбранные заклинания теперь считаются для вас заклинаниями барда, но максимальное количество заклинаний, которое вы можете знать, не меняется.
!!!''Непревзойдённый навык''
Начиная с 14 уровня, если вы совершаете проверку характеристики, вы можете бросить кость бардовского вдохновения и добавить результат к проверке. Вы можете принять решение об использовании этой способности после броска проверки, но до того, как Мастер объявит результат этой проверки.
//Чудесный предмет, необычный//
В этой коробке находится набор пергаментных карт. В полной колоде 34 карты. В колоде, которую находят как сокровище, чаще всего не хватает 1к20 - 1 карт.
Магия колоды работает только если карту тянуть случайным образом (можете заранее приготовить модифицированную колоду игральных карт). Вы можете действием вынуть из колоды случайным образом выбранную карту и бросить её на расстояние до 30 футов.
Над брошенной картой появляется иллюзия одного или нескольких существ, присутствующая, пока не будет рассеяна. Иллюзорное существо выглядит реальным, у него соответствующий размер, и ведёт себя оно как настоящее существо (как описано в Бестиарии), за исключением того, что оно не может причинять вред. Если вы находитесь в пределах 120 футов от иллюзорного существа и видите его, вы можете действием переместить его с помощью магии в любое место в пределах 30 футов от карты. Любое физическое взаимодействие с иллюзорным существом даст понять, что это иллюзия, потому что предметы проходят сквозь него. Тот, кто действием осмотрит существо, распознает в нём иллюзию при успешной проверке Интеллекта (Анализ) со Сл 15. После этого существо выглядит полупрозрачным.
Иллюзия существует, пока карту не переместят или иллюзию не рассеют. Когда иллюзия оканчивается, изображение на карте исчезает, и её уже больше нельзя использовать.
<table>
<tr>
<th>Карта</th>
<th>Иллюзия</th>
</tr>
<tr>
<td>Туз червей</td>
<td>Красный дракон</td>
</tr>
<tr>
<td>Король червей</td>
<td>Рыцарь и четыре стражника</td>
</tr>
<tr>
<td>Дама червей</td>
<td>Суккуб или инкуб</td>
</tr>
<tr>
<td>Валет червей</td>
<td>Друид</td>
</tr>
<tr>
<td>10 червей</td>
<td>Облачный великан</td>
</tr>
<tr>
<td>9 червей</td>
<td>Эттин</td>
</tr>
<tr>
<td>8 червей</td>
<td>Медвежатник</td>
</tr>
<tr>
<td>2 червей</td>
<td>Гоблин</td>
</tr>
<tr>
<td>Туз бубен</td>
<td>Злобоглаз</td>
</tr>
<tr>
<td>Король бубен</td>
<td>Архимаг и ученик мага</td>
</tr>
<tr>
<td>Дама бубен</td>
<td>Ночная карга</td>
</tr>
<tr>
<td>Валет бубен</td>
<td>Ассасин</td>
</tr>
<tr>
<td>10 бубен</td>
<td>Огненный великан</td>
</tr>
<tr>
<td>9 бубен</td>
<td>Огр маг</td>
</tr>
<tr>
<td>8 бубен</td>
<td>Гнолл</td>
</tr>
<tr>
<td>2 бубен</td>
<td>Кобольд</td>
</tr>
<tr>
<td>Туз пик</td>
<td>Лич</td>
</tr>
<tr>
<td>Король пик</td>
<td>Священник и два послушника</td>
</tr>
<tr>
<td>Дама пик</td>
<td>Медуза</td>
</tr>
<tr>
<td>Валет пик</td>
<td>Ветеран</td>
</tr>
<tr>
<td>10 пик</td>
<td>Ледяной великан</td>
</tr>
<tr>
<td>9 пик</td>
<td>Тролль</td>
</tr>
<tr>
<td>8 пик</td>
<td>Хобгоблин</td>
</tr>
<tr>
<td>2 пик</td>
<td>Гоблин</td>
</tr>
<tr>
<td>Туз треф</td>
<td>Железный голем</td>
</tr>
<tr>
<td>Король треф</td>
<td>Капитан разбойников и три бандита</td>
</tr>
<tr>
<td>Дама треф</td>
<td>Эриния</td>
</tr>
<tr>
<td>Валет треф</td>
<td>Берсерк</td>
</tr>
<tr>
<td>10 треф</td>
<td>Холмовой великан</td>
</tr>
<tr>
<td>9 треф</td>
<td>Огр</td>
</tr>
<tr>
<td>8 треф</td>
<td>Орк</td>
</tr>
<tr>
<td>2 треф</td>
<td>Кобольд</td>
</tr>
<tr>
<td>Джокеры (2)</td>
<td>Вы (владелец колоды)</td>
</tr>
</table>
//Чудесный предмет, легендарный//
Эта колода, находящаяся в коробке или мешочке, состоит из карт, сделанных из слоновой кости или пергамента. Большинство (75%) этих колод содержат только тринадцать карт, но остальные включают двадцать две.
Перед тем, как тянуть карты, вы должны объявить, сколько собираетесь брать, а затем тяните их по одной (можете использовать модифицированную колоду обычных игральных карт). Карты, взятые сверх названного числа, не будут иметь эффекта. Как только вы вытянули карту, её магия начинает действовать. Вы должны тянуть следующую карту не позднее, чем через час после предыдущей. Если вы не вытянули названное число карт, оставшиеся сами вылетают из колоды и вступают в силу одновременно.
Как только карта вытягивается, она исчезает. Если это не Дурак, и не Шут, карта вновь появляется в колоде, что позволяет вытянуть её повторно.
<table>
<tr>
<th>Игральная карта</th>
<th>Карта</th>
</tr>
<tr>
<td>Туз бубен</td>
<td>Визирь*</td>
</tr>
<tr>
<td>Король бубен</td>
<td>Солнце</td>
</tr>
<tr>
<td>Дама бубен</td>
<td>Луна</td>
</tr>
<tr>
<td>Валет бубен</td>
<td>Звезда</td>
</tr>
<tr>
<td>Двойка бубен</td>
<td>Комета*</td>
</tr>
<tr>
<td>Туз червей</td>
<td>Судьба*</td>
</tr>
<tr>
<td>Король червей</td>
<td>Трон</td>
</tr>
<tr>
<td>Дама червей</td>
<td>Ключ</td>
</tr>
<tr>
<td>Валет червей</td>
<td>Рыцарь</td>
</tr>
<tr>
<td>Двойка червей</td>
<td>Драгоценность*</td>
</tr>
<tr>
<td>Туз треф</td>
<td>Когти*</td>
</tr>
<tr>
<td>Король треф</td>
<td>Пустота</td>
</tr>
<tr>
<td>Дама треф</td>
<td>Огонь</td>
</tr>
<tr>
<td>Валет треф</td>
<td>Череп</td>
</tr>
<tr>
<td>Двойка треф</td>
<td>Юродивый*</td>
</tr>
<tr>
<td>Туз пик</td>
<td>Тюрьма*</td>
</tr>
<tr>
<td>Король пик</td>
<td>Руины</td>
</tr>
<tr>
<td>Дама пик</td>
<td>Эвриала</td>
</tr>
<tr>
<td>Валет пик</td>
<td>Плут</td>
</tr>
<tr>
<td>Двойка пик</td>
<td>Равновесие*</td>
</tr>
<tr>
<td>Джокер (со знаком)</td>
<td>Дурак*</td>
</tr>
<tr>
<td>Джокер (без знака)</td>
<td>Шут</td>
</tr>
</table>
* Только в колоде из 22 карт
<<<
!!!''Враги''
Две карты в колоде могут вызвать вражду другого существа. С картой Огонь вражда явная. Дьявол будет противостоять персонажу в многочисленных случаях. Поиск исчадия не должен быть простой задачей, и искатель приключений должен несколько раз столкнуться с союзниками и последователями дьявола, прежде чем сможет сразиться с ним самим.
В случае карты Плут вражда будет тайной, она будет проистекать от кого-то, кажущегося другом или союзником. Вы, как Мастер, должны ждать соответствующего драматического момента, чтобы показать эту вражду, заставляя персонажа гадать, кто же станет предателем.
<<<
;
://''Визирь.''// В любой момент в течение года, после того как вы вытянули эту карту, вы можете заняться медитацией и задать вопрос, чтобы получить мысленный правдивый ответ. Кроме простой информации ответ может помочь вам решить головоломку или другую дилемму. Другими словами, приходит не только знание, но и мудрость, позволяющая этим знанием распорядиться.
://''Драгоценность.''// Двадцать пять ювелирных украшений стоимостью 2000 зм каждое или пятьдесят драгоценных камней стоимостью 1000 зм каждый появляются у ваших ног.
://''Дурак.''// Вы теряете 10000 опыта, сбрасываете эту карту и вытягиваете из колоды новую, считая их вместе за одну в объявленном вами количестве вытягиваемых карт. Если потеря этого опыта заставила бы вас потерять уровень, вы вместо этого теряете такое количество, которое оставляет вас только с достигнутым уровнем.
://''Звезда.''// Увеличьте одну из ваших характеристик на 2. Новое значение может превысить 20, но не должно превышать 24.
://''Ключ.''// В ваших руках появляется волшебное оружие с редкостью как минимум «редкое», навыком владения которым вы обладаете (по выбору Мастера).
://''Когти.''// Все магические предметы, которые вы несёте и носите, распадаются. Ваши артефакты не уничтожаются, но исчезают.
://''Комета.''// Если вы в одиночку побеждаете следующее встретившееся вам враждебное чудовище или группу чудовищ, вы получаете достаточно опыта, чтобы получить следующий уровень. В противном случае эта карта не оказывает никакого эффекта.
://''Луна.''// Вы получаете возможность 1к3 раза наложить заклинание исполнение желаний.
://''Огонь.''// Могущественный дьявол становится вашим врагом. Он стремится вас уничтожить, смакуя ваши страдания перед попыткой убить вас. Эта вражда длиться до вашей или его гибели.
://''Плут.''// ПМ по выбору Мастера становится враждебным по отношению к вам. Его личность вам не известна до тех пор, пока он сам или кто-либо ещё не проявит это. Остановить эту вражду сможет как минимум заклинание исполнение желаний или божественное вмешательство.
://''Пустота.''// Эта чёрная карта предсказывает катастрофу. Ваша душа вырывается из тела и заключается в некоем предмете в месте, выбранном Мастером. Это место охраняет сильное создание или даже группа таких созданий. Пока ваша душа похищена, ваше тело недееспособно. Заклинание исполнение желаний не может вернуть вашу душу, но раскрывает местонахождение предмета, вмещающего вашу душу. Вы больше не тянете карты.
://''Равновесие.''// Ваше сознание претерпевает мучительные изменения, заставляя ваше мировоззрение измениться. Законное становится хаотичным, доброе становится злым, и наоборот. Если у вас истинно нейтральное мировоззрение или у вас нет мировоззрения, эта карта не оказывает никакого эффекта.
://''Руины.''// Вы теряете все богатства, которые вы носите или которыми владеете, кроме волшебных предметов. Движимое имущество исчезает. Бизнес, строения и земли, которыми вы владели, пропадают таким способом, который оказывает наименьшее влияние на действительность. Любые документы, подтверждающие ваши права собственности на утерянное имущество, тоже исчезают.
://''Рыцарь.''// Вы получаете на службу воина 4 уровня, который появляется в пределах 30 футов от вас (по вашему выбору). Воин той же расы, что и вы, и будет верно служить вам до смерти, полагая, что судьба привела его к вам. Этим персонажем управляете вы.
://''Солнце.''// Вы получаете 50000 опыта и в ваших руках появляется чудесный предмет (на выбор Мастера).
://''Судьба.''// Ткань реальности разворачивается и складывается вновь, позволяя вам избежать или стереть один случай, как будто его никогда не было. Вы можете использовать магию карты сразу, как только вытянете её, или в любое другое время, пока не умрёте.
://''Трон.''// Вы получаете владение навыком Убеждение, и удваиваете бонус мастерства при проверках этого навыка. Кроме того, вы получаете право владения небольшой цитаделью где-то в мире. Однако сейчас эта крепость занята чудовищами, которых предстоит уничтожить, чтобы объявить цитадель своей.
://''Тюрьма.''// Вы исчезаете и оказываетесь в состоянии приостановленной жизнедеятельности в межпространственной сфере. Все вещи, которые были у вас или на вас, остаются в том месте, где вы были до исчезновения. Вы остаётесь заключёнными в эту тюрьму до тех пор, пока не будете найдены и освобождены. Вы не можете быть обнаружены с помощью школы Прорицания, но заклинание исполнение желаний способно определить ваше местонахождение. Вы больше не тянете карты.
://''Череп.''// Вы вызываете [[Образ смерти]] — призрачного гуманоидного скелета, одетого в изодранную чёрную одежду и вооружённого призрачной косой. Он появляется в пределах 10 футов от вас (в месте по выбору Мастера) и нападает на вас, предупреждая всех, что вы должны выиграть это сражение в одиночку. Образ смерти сражается до тех пор, пока вы не погибнете, или его хиты не опустятся до 0. После этого он исчезает. Если кто-нибудь попытается помочь вам, он вызовет этим собственный образ смерти. Существо, убитое образом смерти, не может быть возвращено к жизни.
://''Шут.''// Вы получаете 10000 опыта или можете вытянуть две карты в дополнение к заявленному ранее количеству карт.
://''Эвриала.''// Напоминающий медузу образ на карте проклинает вас. Вы получаете штраф -2 к спасброскам, пока на вас лежит это проклятье. Только бог или магия карты Судьба может закончить действие этого проклятья.
://''Юродивый.''// Уменьшите ваш Интеллект на 1к4 + 1 (но не ниже 1). Вы можете вытянуть дополнительно ещё одну карту сверх заявленного ранее количества.
//Чудесный предмет, легендарный//
Эту чёрную ткань, гладкую как шёлк, можно свернуть до размеров носового платка. В развёрнутом виде это круг диаметром 6 футов.
Вы можете действием развернуть колодец многих миров и разместить его на твёрдой поверхности, после чего он станет двусторонним порталом в другой мир или план существования. Каждый раз, когда этот предмет открывает портал, Мастер решает, куда он будет вести. Вы можете действием закрыть открытый портал, свернув ткань за края. Колодец многих миров не может повторно открыть портал, пока не пройдёт 1к8 часов.
//Чудесный предмет, редкий//
Это полая металлическая трубка длинной 1 фут весит 1 фунт. Вы можете действием ударить по ней и направить на предмет, находящийся в пределах 120 футов от вас, который можно открыть, например, дверь, люк или замок. Трубка издаёт чистый звук, и один замок или засов на предмете отпирается, за исключением тех случаев, когда звук не может достигнуть цели. Если на предмете не остаётся запирающих элементов, то предмет открывается сам по себе.
Этот предмет может быть использован десять раз. После десятого использования он трескается и становится непригодным для использования.
//Чудесный предмет, необычный//
Все три отделения этого колчана соединены с межпространственным местом, что позволяет ему вмещать множество предметов, но весит он всегда не более 2 фунтов. В самом коротком отделении может поместиться до шестидесяти стрел, арбалетных болтов или подобных предметов. В среднем отделении помещается до восемнадцати метательных копий или подобных предметов. В самом длинном отделении помещается до шести длинных предметов, таких как луки, боевые посохи и копья.
Вы можете вынуть любой предмет из колчана, как если бы это был обычный колчан или ножны.
//Кольцо, редкое//
У этого кольца есть 3 заряда, и оно ежедневно восстанавливает 1к3 заряда на рассвете. Нося это кольцо, вы можете действием потратить 1 заряд, чтобы наложить одно из следующих заклинаний:
* Дружба с животными (Сл спасброска 13)
* Ужас (Сл спасброска 13), нацеливается только на зверей с Интеллектом 3 или ниже
* Разговор с животными
//Кольцо, редкое (требуется настройка)//
Вы получаете бонус +1 к КД и спасброскам, пока носите это кольцо.
//Кольцо, необычное (требуется настройка)//
Нося это кольцо, вы обладаете иммунитетом к магии, позволяющей другим существам читать ваши мысли, определять, лжёте ли вы, определять ваше мировоззрение и ваш вид существа. Существа могут телепатически общаться с вами только если вы позволяете это.
Вы можете действием сделать кольцо невидимым, пока вновь не сделаете его видимым другим действием, пока не снимете его, или пока не умрёте.
Если вы умрёте, нося это кольцо, ваша душа входит в него, если только оно уже не занято душой. Вы можете остаться в кольце, а можете отправиться навстречу посмертию. Пока ваша душа находится в кольце, вы можете телепатически общаться с любым существом, которое носит его. Владелец не может отказаться от этого телепатического общения.
//Кольцо, легендарное (требуется настройка)//
Это кольцо связано с одним из четырёх Стихийных Планов. Мастер выбирает один такой план самостоятельно или случайным образом.
Нося это кольцо, вы совершаете с преимуществом броски атаки по элементалям из связанного плана, а они совершают с помехой броски атаки по вам. Кроме того, вы получаете дополнительные преимущества, связанные с планом кольца.
У кольца есть 5 зарядов. Оно ежедневно восстанавливает 1к4 + 1 заряд на рассвете. У заклинаний, наложенных кольцом, Сл спасброска равна 17.
//''Кольцо командования водяными элементалями.''// Вы можете потратить 2 заряда кольца, чтобы наложить на водяного элементаля подчинение чудовища. Кроме того, вы можете стоять на жидких поверхностях и ходить по ним, как если бы они были твёрдыми. Вы также можете говорить на языке Акван и понимать его.
Если вы поможете убить водяного элементаля, будучи настроенным на это кольцо, вы получаете доступ к следующим свойствам:
* Вы можете дышать под водой и получаете скорость плавания, равную скорости ходьбы.
* Вы можете накладывать кольцом следующие заклинания, тратя соответствующее число зарядов: власть над водами (3 заряда), град (2 заряда), ледяная стена (3 заряда) или сотворение или уничтожение воды (1 заряд).
//''Кольцо командования воздушными элементалями.''// Вы можете потратить 2 заряда кольца, чтобы наложить на воздушного элементаля подчинение чудовища. Кроме того, если вы падаете, вы спускаетесь на 60 футов в раунд и не получаете урон от падения. Вы также можете говорить на языке Ауран и понимать его.
Если вы поможете убить воздушного элементаля, будучи настроенным на это кольцо, вы получаете доступ к следующим свойствам:
* Вы получаете сопротивление к урону электричеством.
* Вы получаете скорость полёта, равную вашей скорости хождения, и можете парить.
* Вы можете накладывать кольцом следующие заклинания, тратя соответствующее число зарядов: пляшущая молния (3 заряда), порыв ветра (2 заряда) или стена ветров (1 заряд).
//''Кольцо командования земляными элементалями.''// Вы можете потратить 2 заряда кольца, чтобы наложить на земляного элементаля подчинение чудовища. Кроме того, вы можете перемещаться по труднопроходимой местности, вызванной камнями, валунами или грязью, как если бы это была обычная местность. Вы также можете говорить на языке Терран и понимать его.
Если вы поможете убить земляного элементаля, будучи настроенным на это кольцо, вы получаете доступ к следующим свойствам:
* Вы получаете сопротивление к урону кислотой.
* Вы можете перемещаться сквозь плотную землю или камень, как если бы они были труднопроходимой местностью. Если вы оканчиваете ход в них, вас выбрасывает в ближайшее свободное пространство, занимаемое вами ранее.
* Вы можете накладывать кольцом следующие заклинания, тратя соответствующее число зарядов: изменение формы камня (2 заряда), каменная кожа (3 заряда) или каменная стена (3 заряда).
//''Кольцо командования огненными элементалями.''// Вы можете потратить 2 заряда кольца, чтобы наложить на огненного элементаля подчинение чудовища. Кроме того, вы получаете сопротивление к урону огнём. Вы также можете говорить на языке Игнан и понимать его.
Если вы поможете убить огненного элемента-ля, будучи настроенным на это кольцо, вы получаете доступ к следующим свойствам:
* Вы получаете иммунитет к урону огнём.
* Вы можете накладывать кольцом следующие заклинания, тратя соответствующее число зарядов: огненная стена (3 заряда), огненные ладони (1 заряд) или огненный шар (2 заряда).
//Кольцо, легендарное (требуется настройка)//
Нося это кольцо, вы можете действием становиться невидимым. Всё, что вы несёте и носите, становится невидимым вместе с вами. Вы остаётесь невидимым, пока не снимете кольцо, пока не атакуете или не наложите заклинание, или пока не станете снова видимым бонусным действием.
//Кольцо, легендарное (требуется настройка)//
Нося это кольцо, вы совершаете с преимуществом спасброски от заклинаний, нацеленных только на вас (не обладающих зонами воздействия). Кроме того, если у вас выпадет «20» при спасброске от заклинание с уровнем не больше 7, заклинание не оказывает на вас никакого эффекта, и вместо этого нацеливается на заклинателя, используя уровень ячейки, Сл спасброска, бонус атаки и базовую характеристику самого заклинателя.
//Кольцо, очень редкое (требуется настройка ночью на открытом воздухе)//
Нося это кольцо в области тусклого света или темноте, вы можете неограниченно действием накладывать им пляшущие огоньки или свет.
У кольца есть 6 зарядов для использования описанных ниже свойств. Кольцо ежедневно восстанавливает 1к6 зарядов на рассвете.
;
://''Огонь фей.''// Вы можете действием потратить 1 заряд, чтобы наложить кольцом огонь фей.
:"""//''Шаровая молния.''// Вы можете действием потратить 2 заряда, чтобы создать кольцом от одной до четырёх шаровых молний диаметром 3 фута.
Чем больше шаров вы создадите, тем менее эффективен каждый из них.
Каждый шар появляется в свободном пространстве, видимом вами в пределах 120 футов. Шары существуют, пока вы концентрируетесь (как при концентрации на заклинании), но не более 1 минуты. Каждый шар испускает тусклый свет в радиусе 30 футов.
Вы можете бонусным действием переместить каждый шар на расстояние до 30 футов, но не более чем на 120 футов от себя. Если какое-нибудь существо кроме вас оказывается в пределах 5 футов от шара, шар выпускает в него разряд молнии и исчезает. Это существо должно совершить спасбросок Ловкости со Сл 15. При провале существо получает урон электричеством, зависящий от количества созданных вами шаров."""
<table>
<tr>
<th>Шары</th>
<th>Урон электричеством</th>
</tr>
<tr>
<td>4</td>
<td>2к4</td>
</tr>
<tr>
<td>3</td>
<td>2к6</td>
</tr>
<tr>
<td>2</td>
<td>5к4</td>
</tr>
<tr>
<td>1</td>
<td>4к12</td>
</tr>
</table>
;
://''Падающие звёзды.''// Вы можете действием потратить от 1 до 3 зарядов. За каждый потраченный заряд вы выпускаете из кольца по одному светящемуся шарику в точку, которую видите в пределах 60 футов. Все существа в пределах 15футового куба, исходящего из этой точки, покрываются искрами и должны совершить спасбросок Ловкости со Сл 15, получая урон огнём 5к4 при провале или половину урона при успехе.
Кольцо, редкое (требуется настройка)
Если вы падаете, нося это кольцо, вы опускаетесь на 60 футов в раунд и не получаете урон от падения.
//Кольцо, необычное//
Вы получаете скорость плавания 40 футов, пока носите это кольцо.
//Кольцо, легендарное (требуется настройка)//
Нося это кольцо, вы можете действием произнести его командное слово, чтобы призвать конкретного джинна со Стихийного Плана Воздуха. Джинн появляется в свободном пространстве, выбранном вами в пределах 120 футов от себя. Он остаётся, пока вы концентрируетесь (как при концентрации на заклинании), но не более 1 часа, или пока его хиты не опустятся до 0, после чего он возвращается на домашний план.
Будучи призванным, джинн дружелюбен к вам и вашим спутникам. Он повинуется командам, которые вы отдаёте, вне зависимости от использованного языка. Если вы не отдаёте приказы, джинн защищается от нападающих, но не совершает других действий.
После того как джинн возвращается на родной план, его нельзя призвать повторно, пока не пройдёт 24 часа, и кольцо перестаёт быть магическим, если джинн умирает.
//Кольцо, редкое (требуется настройка)//
Нося это кольцо, вы можете действием произнести его командное слово. Сделав это, вы сможете видеть через твёрдую материю в течение 1 минуты. Радиус этого зрения — 30 футов. Для вас твёрдые предметы в этом радиусе выглядят прозрачными и не препятствуют проходить сквозь них свету. Это зрение может проникать сквозь 1 фут камня, 1 дюйм обычного металла или 3 фута дерева или земли. Более толстые препятствия, а также тонкий лист свинца блокируют обзор.
Каждый раз, когда вы используете это кольцо повторно до совершения продолжительного отдыха, вы должны преуспеть в спасброске Телосложения со Сл 15, иначе получите 1 уровень истощения.
//Кольцо, необычное (требуется настройка)//
Нося это кольцо, вы можете бонусным действием накладывать заклинание прыжок, но нацеливаясь при этом только на себя.
//Кольцо, очень редкое (требуется настройка)//
Нося это кольцо, вы восстанавливаете 1к6 хитов каждые 10 минут, при условии, что у вас есть хотя бы 1 хит. Если вы теряете часть тела, кольцо отращивает её и возвращает функциональность через 1к6 + 1 день, если всё это время у вас есть хотя бы 1 хит.
//Кольцо, редкое (требуется настройка)//
Если вы носите это кольцо, труднопроходимая местность не заставляет вас тратить дополнительное перемещение. Кроме того, магия не может ни уменьшить вашу скорость, ни сделать вас парализованным или опутанным.
//Кольцо, редкое (требуется настройка)//
Вы обладаете сопротивлением к одному виду урона, пока носите это кольцо. Драгоценный камень в кольце указывает на этот вид урона, который Мастер выбирает самостоятельно или с помощью данной таблицы:
<table>
<tr>
<th>к10</th>
<th>Вид урона</th>
<th>Камень</th>
</tr>
<tr>
<td>1</td>
<td>Кислота</td>
<td>Жемчужина</td>
</tr>
<tr>
<td>2</td>
<td>Холод</td>
<td>Турмалин</td>
</tr>
<tr>
<td>3</td>
<td>Огонь</td>
<td>Гранат</td>
</tr>
<tr>
<td>4</td>
<td>Силовое поле</td>
<td>Сапфир</td>
</tr>
<tr>
<td>5</td>
<td>Электричество</td>
<td>Цитрин</td>
</tr>
<tr>
<td>6</td>
<td>Некротическая энергия</td>
<td>Гагат</td>
</tr>
<tr>
<td>7</td>
<td>Яд</td>
<td>Аметист</td>
</tr>
<tr>
<td>8</td>
<td>Психическая энергия</td>
<td>Жадеит</td>
</tr>
<tr>
<td>9</td>
<td>Излучение</td>
<td>Топаз</td>
</tr>
<tr>
<td>10</td>
<td>Звук</td>
<td>Шпинель</td>
</tr>
</table>
//Кольцо, редкое (требуется настройка)//
У этого кольца 3 заряда, и оно ежедневно восстанавливает 1к3 заряда на рассвете. Нося это кольцо, вы можете действием потратить от 1 до 3 зарядов, чтобы атаковать одно существо, видимое в пределах 60 футов. Кольцо создаёт призрачную голову барана и совершает атаку с бонусом +7.
При попадании за каждый использованный вами заряд цель получает урон силовым полем 2к10 и толкается на 5 футов от вас.
В качестве альтернативы, вы может действием потратить от 1 до 3 зарядов, чтобы попытаться сломать предмет, видимый в пределах 60 футов, который никто не несёт и не носит. Кольцо совершает проверку Силы с бонусом +5 за каждый использованный заряд.
//Кольцо, очень редкое (требуется настройка)//
Нося это кольцо, вы можете неограниченно накладывать заклинание телекинез., но нацеливаясь только на предметы, которые никто не несёт и не носит.
//Кольцо, необычное (требуется настройка)//
Нося это кольцо, вы обладаете сопротивлением к урону холодом. Кроме того, вы и всё, что вы несёте и носите, не получают вреда от температур не ниже -50 °F (-45 °C).
//Кольцо, легендарное//
Нося это кольцо, вы можете действием использовать 1 из 3 его зарядов, чтобы наложить им заклинание исполнение желаний. Кольцо перестаёт быть магическим, когда тратится последний заряд.
//Кольцо, редкое (требуется настройка)//
У этого кольца 3 заряда, и оно ежедневно восстанавливает 1к3 заряда на рассвете. Если вы проваливаете спасбросок Ловкости, когда носите его, вы можете реакцией потратить 1 заряд, чтобы спасбросок стал успешным.
//Кольцо, необычное//
Нося это кольцо, вы можете стоять на жидких поверхностях и ходить по ним, как если бы они были твёрдыми.
//Кольцо, редкое (требуется настройка)//
Это кольцо хранит заклинания, наложенные на него, позволяя использовать их владельцу, настроенному на кольцо. Кольцо может хранить до 5 уровней заклинаний одновременно. Когда кольцо находят, оно хранит 1к6 - 1 уровень заклинаний, которые выбирает Мастер.
Любое существо может наложить заклинание с уровнем от 1 до 5 на кольцо, касаясь его в процессе колдовства. Заклинание не оказывает эффекта сейчас, а просто сохраняется в кольце. Если кольцо не может удержать заклинание, заклинание тратится безо всякого эффекта. Занимаемое пространство определяется уровнем ячейки, использованной для накладывания заклинания.
Нося это кольцо, вы можете накладывать любые хранящиеся в нём заклинания. Заклинание использует уровень ячейки, Сл спасброска, бонус атаки и базовую характеристику исходного заклинателя, но во всём остальном считается, что заклинание наложили вы. Наложенное кольцом заклинание больше не хранится в нём и освобождает пространство.
//Доспех (кольчуга), легендарный (требуется настройка)//
Пока вы носите этот доспех, вы получаете бонус +3 к КД и иммунитет к урону огнём, а также можете говорить на Первичном и понимаете его. Кроме того, вы можете стоять на расплавленном камне и ходить по нему, как если бы он был твёрдой поверхностью.
<$macrocall
$name="toc-tabbed-internal-nav"
tag="Компендиум Заклинаний"
selectedTiddler="$:/temp/toc/selectedTiddler"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
!!!''__Компетентность__''
"""На третьем уровне выберите 2 навыка из тех, которыми вы владеете. Ваш бонус мастерства для этих навыков удваивается.
На 10 уровне вы можете выбрать ещё 2 навыка и получить для них это преимущество."""
!!!''__Компетентность__''
"""На 1 уровне выберите два ваших владения в навыках или одно владение навыком и владение воровскими инструментами. Ваш бонус мастерства удваивается для всех проверок характеристик, которые вы совершаете, используя любое из выбранных владений.
На 6 уровне вы можете выбрать ещё два владения (навыки или воровские инструменты), чтобы получить эту же выгоду."""
//3 уровень, Ограждение, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 реакция, совершаемая вами, когда вы видите, как существо в пределах 60 футов от вас накладывает заклинание
:''Дистанция:'' 60 футов
:''Компоненты:'' С
:''Длительность:'' Мгновенная
Вы пытаетесь прервать процесс накладывания заклинания. Если существо накладывает заклинание 3 уровня или ниже, его заклинание проваливается, и не оказывает никакого эффекта. Если оно накладывало заклинание 4 уровня или выше, совершите проверку базовой характеристики. Сл равна 10 + уровень заклинания. В случае успеха заклинание проваливается и не оказывает никакого эффекта.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, прерванное заклинание автоматически не оказывает эффекта, если его уровень не превышает уровень использованной вами ячейки.
!!!''__Контрочарование__''
На 6 уровне вы получаете возможность использовать звуки или слова силы для разрушения воздействующих на разум эффектов. Вы можете действием начать исполнение, которое продлится до конца вашего следующего хода. В течение этого времени вы и все дружественные существа в пределах 30 футов от вас совершают спасброски от запугивания и очарования с преимуществом. Чтобы получить это преимущество, существа должны слышать вас. Исполнение заканчивается преждевременно, если вы оказываетесь недееспособны, теряете способность говорить, или прекращаете исполнение добровольно (на это не требуется действие).
//5 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (60-футовый конус)
:''Компоненты:'' В, С, М (небольшой кристаллический или стеклянный конус)
:''Длительность:'' Мгновенная
"""Из ваших рук вырывается волна холодного воздуха. Все существа в 60-футовом конусе должны совершить спасбросок Телосложения. Существа получают урон холодом 8к8 при провале, или половину этого урона при успехе.
Существа, убитые этим заклинанием, становятся замороженными статуями, пока не растают."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше пятого.
//2 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Один гуманоид на ваш выбор, видимый вами в пределах дистанции должен преуспеть в спасброске Мудрости, иначе он станет очарованным вами на время действия заклинания. Пока цель очарована таким способом, на её голове появляется изогнутая железная корона, а в глазах светится безумие.
Очарованная цель должна в каждый свой ход перед перемещением совершать действием рукопашную атаку по любому существу кроме себя, которое вы мысленно выбираете. Цель может действовать в свой ход как обычно, если вы не выбрали существо или в пределах его досягаемости нет других существ.
В последующие ходы вы должны действием поддерживать контроль над целью, иначе заклинание оканчивается. Кроме того, цель в конце каждого своего хода может совершать спасброски Мудрости. В случае успеха заклинание оканчивается."""
//Доспех (проклёпанная кожа), редкий//
Пока вы носите этот доспех, вы получаете бонус +1 к КД Вы также можете бонусным действием произнести его командное слово и заставить доспех принять облик обычной одежды или любого другого доспеха Вы сами решаете, как он будет выглядеть, включая цвет, стиль и аксессуары, но доспех при этом сохраняет свой объём и вес. Иллюзорный облик длится до тех пор, пока вы не используете это свойство повторно или не снимете доспех.
!!!''__Круг друидов__''
На 2 уровне нужно выбрать, в каком круге друидов состоит персонаж: круге Земли или круге Луны. Оба описаны в конце описания класса. Этот выбор даёт дополнительные умения на 2, 6, 10 и 14 уровнях.
!!!__''Круг Земли''__
Круг Земли состоит из мистиков и мудрецов, поколениями передающих из уст в уста сложную систему древних знаний и обрядов. Собрания проводятся в кольце деревьев или мегалитов, где на тайном языке звучат секреты самого мироздания. Мудрейшие представители круга служат духовными лидерами и советниками вождей в общинах, проповедующих Старую Веру. Причастность к кругу Земли наделяет магию друида силой тех мест, где персонажа посвятили в священные таинства.
!!!''Дополнительный заговор''
Выбрав круг Земли на 2 уровне, вы осваиваете один дополнительный заговор друида на свой выбор.
!!!''Естественное восстановление''
"""Начиная со 2 уровня единение с природой через медитацию позволяет вам частично восстановить магическую силу. Во время короткого отдыха можно восстановить потраченные ячейки заклинаний. Сумма уровней выбранных ячеек не должна превышать половину уровня друида (округляя в большую сторону), и ни одна ячейка не может быть 6 уровня или выше. Применение этого умения восстанавливается после продолжительного отдыха.
Например, будучи друидом 4 уровня, вы можете восстановить два уровня ячеек заклинаний. Вы можете восстановить или ячейку 2 уровня или две ячейки 1 уровня."""
!!!''Заклинания круга''
"""Духовная связь друида с землёй наделяет его некоторыми заклинаниями. На 3, 5, 7 и 9 уровнях друид получает доступ к заклинаниями в соответствии с землёй, где он был посвящён. Необходимо выбрать болото, гору, лес, луг, побережье, Подземье, пустыню или тундру.
Получив доступ к заклинанию круга, вы будете всегда иметь его подготовленным, и оно не учитывается при подсчёте количества заклинаний, которые можно подготовить. Если вы получаете доступ к заклинанию, отсутствующему в списке заклинаний друида, оно всё равно будет считаться для вас заклинанием друида."""
<table>
<tr>
<th></th>
<th>Болото</th>
<th>Гора</th>
<th>Лес</th>
<th>Луг</th>
</tr>
<tr>
<th>Уровень друида</th>
<th colspan="4">Заклинания круга</th>
</tr>
<tr>
<td>3</td>
<td>Мельфова кислотная стрела, Тьма</td>
<td>паук, шипы</td>
<td>дубовая кора, паук</td>
<td>бесследное передвижение, невидимость</td>
</tr>
<tr>
<td>5</td>
<td>Зловонное облако, Хождение по воде</td>
<td>молния, слияние с камнем</td>
<td>призыв молнии, рост растений</td>
<td>дневной свет, ускорение</td>
</tr>
<tr>
<td>7</td>
<td>Поиск существа, Свобода перемещения</td>
<td>изменение формы камня, каменная кожа</td>
<td>предсказание, свобода перемещения</td>
<td>предсказание, свобода перемещения</td>
</tr>
<tr>
<td>9</td>
<td>Наблюдение, Нашествие насекомых</td>
<td>каменная стена, создание прохода</td>
<td>древесный путь, общение с природой</td>
<td>вещий сон, нашествие насекомых</td>
</tr>
<tr>
<th></th>
<th>Побережье</th>
<th>Подземье</th>
<th>Пустыня</th>
<th>Тундра</th>
</tr>
<tr>
<td>3</td>
<td>отражения, туманный шаг</td>
<td>паук, паутина</td>
<td>размытый образ, тишина</td>
<td>удержание личности, шипы</td>
</tr>
<tr>
<td>5</td>
<td>подводное дыхание, хождение по воде</td>
<td>газообразная форма, зловонное облако</td>
<td>защита от энергии, сотворение пищи и воды</td>
<td>замедление, метель</td>
</tr>
<tr>
<td>7</td>
<td>власть над водами, свобода перемещения</td>
<td>высшая невидимость, изменение формы камня</td>
<td>мираж, усыхание</td>
<td>град, свобода перемещения</td>
</tr>
<tr>
<td>9</td>
<td>наблюдение, призыв элементаля</td>
<td>нашествие насекомых, облако смерти</td>
<td>каменная стена, нашествие насекомых</td>
<td>конус холода, общение с природой</td>
</tr>
</table>
!!!''Тропами земли''
"""Начиная с 6 уровня, перемещение по немагической труднопроходимой местности не затрудняет перемещение. Вы также можете проходить через немагическую растительность без снижения скорости и не получая урона от их шипов, выростов и других помех.
Кроме того, вы совершаете с преимуществом спасброски от магически созданных или изменённых растений, должных затруднять перемещение — например, от заклинания опутывание."""
!!!''Покровительство природы''
С 10 уровня вы не можете быть очарованным или напуганным феями и элементалями. Вы также получаете иммунитет к болезням и ядам.
!!!''Природная благодать''
Когда вы достигаете 14 уровня, природные создания начинают чувствовать вашу тесную связь с естественным миром и остерегаются нападать. Когда зверь или растение атакует вас, это существо должно совершить спасбросок Мудрости против Сл спасброска заклинания друида. В случае провала существо должно выбрать иную цель, или же его атака автоматически промахивается. В случае успеха существо получает иммунитет к данному эффекту на 24 часа.
Существо осознаёт этот эффект ещё до попытки атаковать вас.
!!!__''Круг Луны''__
Друиды круга Луны — непримиримые стражи дикой природы. Их собрания проходят под полной луной для обмена новостями и предостережениями. Стражи рыщут в самой дремучей глуши, где можно неделями не встретить другого гуманоида, не говоря уже о друиде.
Переменчивые как сама луна и дикие до глубины души, друиды этого круга то крадутся кошкой, то парят орлом, то ломятся в облике медведя, устрашая забредшее чудище.
!!!''Боевой дикий облик''
"""Выбрав этот круг на 2 уровне, вы получаете способность принимать дикий облик бонусным действием вместо обычного.
Кроме того, в диком облике вы можете бонусным действием потратить ячейку заклинания, чтобы восстановить 1к8 хитов за каждый уровень потраченной ячейки."""
!!!''Облики круга''
"""Обряды круга Луны позволяют принимать облик более опасных животных. Начиная со 2 уровня, можно превращаться в зверя с показателем опасности 1 (игнорируйте столбец «Макс. ПО» таблицы «Облик животного»).
Начиная с 6 уровня можно превращаться в зверя с показателем опасности вплоть до уровня друида, поделённого на 3 (округляя в меньшую сторону)."""
!!!''Природный удар''
Начиная с 6 уровня ваши атаки в облике зверя считаются магическими для преодоления сопротивления и иммунитета к немагическим атакам и урону.
!!!''Стихийный дикий облик''
С 10 уровня вы можете одновременно потратить два применения дикого облика, чтобы принять облик водяного, воздушного, земляного или огненного элементаля.
!!!''Тысяча лиц''
С 14 уровня вы понимаете, как магически изменять детали своего облика. Вы можете неограниченно творить заклинание смена обличья.
//5 уровень, Ограждение, Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 10 минут
От вас исходит божественная энергия, искажающая и рассеивающая магическую энергию в пределах 30 футов от вас. Пока заклинание активно, сфера перемещается вместе с вами, оставаясь с центром на вас. Все дружественные существа в этой области (включая вас) получают преимущество к спасброскам от заклинаний и других магических эффектов. Кроме того, когда такое существо преуспевает в спасброске от заклинания или магического эффекта, позволяющего совершить спасбросок для получения всего лишь половины урона, оно не получает урон вообще.
//6 уровень, Некромантия, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (порошок растолчённой чёрной жемчужины, стоящей как минимум 500 зм)
:''Длительность:'' Мгновенная
Из точки в пределах дистанции расходится сфера негативной энергии с радиусом 60 футов. Все существа в этой области должны совершить спасбросок Телосложения. Цель получает урон некротической энергией 8к6 при провале или половину этого урона в случае успеха.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, урон увеличивается на 2к6 за каждый уровень ячейки выше шестого.
5 уровень, Вызов, Бард/Волшебник/Чародей
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 10 футов
:''Компоненты:'' В, М (редкие мелки и чернила с основой из драгоценных камней стоимостью 50 зм, расходуемые заклинанием)
:''Длительность:'' 1 раунд
"""В процессе накладывания заклинания вы рисуете на полу круг диаметром 10 футов, исписанный знаками, связывающими ваше местоположение с постоянным кругом телепортации на ваш выбор, чью последовательность знаков вы знаете, и находящимся на том же плане существования, что и вы. В нарисованном круге появляется мерцающий портал, остающийся открытым до конца вашего следующего хода. Все существа, входящие в портал, мгновенно появляются в пределах 5 футов от места назначения или в ближайшем свободном пространстве, если то место занято.
Во многих основных храмах, гильдиях и прочих важных местах есть постоянные круги телепортации, начертанные где-то на их территории. У каждого такого круга есть уникальная последовательность знаков — серия рун, начертанных в определённом узоре. Когда вы впервые получаете возможность накладывать это заклинание, вы изучаете последовательность знаков двух местонахождений на Материальном Плане, выбранных Мастером. Вы можете узнать дополнительные последовательности знаков во время приключений. Вы можете запомнить новую последовательность, изучая её 1 минуту.
Вы можете создать постоянный круг телепортации, накладывая это заклинание в одном и том же месте в течение одного года. При этом вы не обязаны тут же использовать свежесозданный круг."""
!!''Круги друидов''
"""Немногие знают, что друиды составляют единое общество, существующее помимо любых политических границ. Любой друид считается частью общества, даже если живёт настолько изолированно, что никогда не видел высокопоставленных собратьев и не бывал на собраниях. Друиды считают друг друга братьями и сёстрами, но, подобно всяким диким зверям, они не чужды соперничеству друг меж другом и даже хищничеству.
В местном масштабе друиды объединены в круги, связанные общими убеждениями о природе, равновесии и роли друида."""
<<Button "Круг Земли (Друид)" "Круг Земли">>
<<Button "Круг Луны (Друид)" "Круг Луны">>
//Чудесный предмет, легендарный//
Это куб с длиной ребра 3 дюйма, излучающий ощутимую на ощупь магическую энергию. Все шесть граней этого куба связаны с разными планами существования, причём один из них — Материальный План. Остальные планы определяет Мастер.
Вы можете действием нажать на одну из граней куба, чтобы наложить им заклинание врата, создающее портал на план, связанный с этой гранью. В качестве альтернативы, если вы действием нажмёте на одну грань дважды, вы можете наложить кубом заклинание уход в иной мир (Сл спасброска 17), перенося целей на план, связанный с этой гранью.
У этого куба есть 3 заряда. Каждое использование куба тратит 1 заряд. Куб ежедневно восстанавливает 1к3 заряда на рассвете.
//Чудесный предмет, редкий (требуется настройка)//
Это кубик с длиной ребра около дюйма. На каждой грани есть характерная метка, на которую можно нажать. Вначале у куба 36 зарядов, и он ежедневно восстанавливает 1к20 зарядов на рассвете.
Вы можете действием нажать на одну из граней куба, тратя при этом указанное в таблице число зарядов. У каждой грани свой эффект. Если в кубе не осталось достаточного числа зарядов, ничего не произойдёт. В противном случае возникает барьер из невидимого силового поля, формирующий куб с длиной ребра 15 футов. Барьер создаётся с центром на вас, перемещается вместе с вами и существует 1 минуту, пока вы не нажмёте действием на шестую грань куба или пока в кубе не кончатся заряды. Вы можете изменить эффект барьера, нажав на другую грань куба и потратив нужное количество зарядов, сбрасывая при этом счётчик длительности.
Если из-за перемещения барьер вступает в контакт с твёрдым предметом, который не может пройти сквозь поле, вы не сможете приблизиться к этому предмету, пока поле существует.
<table>
<tr>
<th>Грань</th>
<th>Заряды</th>
<th>Эффект</th>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>Через барьер не проходят газы, ветер и туман</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>Через барьер не проходит неживая материя. Стены, пол и потолок могут проходить, если вы того пожелаете.</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>Через барьер не проходит живая материя.</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>Через барьер не проходят эффекты заклинаний.</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>Через барьер не проходит ничего. Стены, пол и потолок могут проходить, если вы того пожелаете.</td>
</tr>
<tr>
<td>6</td>
<td>0</td>
<td>Барьер исчезает.</td>
</tr>
</table>
Куб теряет заряды, когда барьер становится целью определённых заклинаний или вступает во взаимодействие с эффектами определённых заклинаний или магических предметов, как показано ниже.
<table>
<tr>
<th>Заклинание или предмет</th>
<th>Потеря зарядов</th>
</tr>
<tr>
<td>Огненная стена</td>
<td>1к4</td>
</tr>
<tr>
<td>Радужные брызги</td>
<td>1к20</td>
</tr>
<tr>
<td>Распад</td>
<td>1к12</td>
</tr>
<tr>
<td>Рог взрыва</td>
<td>1к10</td>
</tr>
<tr>
<td>Создание прохода</td>
<td>1к6</td>
</tr>
</table>
//8 уровень, Вызов, Волшебник//
;
;''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы изгоняете существо, видимое в пределах дистанции, в похожий на лабиринт демиплан. Цель остаётся там, пока заклинание активно, или пока она не найдёт выход.
Цель может действием пытаться найти выход. Для этого она совершает проверку Интеллекта со Сл 20. При успехе она находит выход, а заклинание оканчивается (минотавры и демоны гористро преуспевают автоматически).
Когда заклинание заканчивается, цель возвращается в пространство, которое она покинула, или, если оно занято, в ближайшее свободное пространство."""
<table>
<tr>
<th colspan="7">Ларва</th>
</tr>
<tr>
<th colspan="7">//Среднее исчадие, нейтрально-злое//</th>
</tr>
<tr>
<th>Класс Доспеха</th>
<td colspan="6">9</td>
</tr>
<tr>
<th>Хиты</th>
<td colspan="6">9 (2к8)</td>
</tr>
<tr>
<th>Скорость</th>
<td colspan="6">20 фт.</td>
</tr>
<tr>
<th rowspan="2">Характеристики</th>
<th>СИЛ</th>
<th>ЛОВ</th>
<th>ТЕЛ</th>
<th>ИНТ</th>
<th>МДР</th>
<th>ХАР</th>
</tr>
<tr>
<td>9 (-1)</td>
<td>9 (-1)</td>
<td>10 (+0)</td>
<td>6 (-2)</td>
<td>10 (+0)</td>
<td>2 (-4)</td>
</tr>
<tr>
<th>Чувства</th>
<td colspan="6">пассивная Внимательность 10</td>
</tr>
<tr>
<th>Языки</th>
<td colspan="6">понимает языки, известные при жизни, но не говорит</td>
</tr>
<tr>
<th>Опасность</th>
<td colspan="6">0 (10 опыта)</td>
</tr>
</table>
;__''Действия''__
:''//Укус.//''
:Рукопашная атака оружием: +1 к попаданию, досягаемость 5 фт., одна цель. Попадание: Колющий урон 1 (1к4 - 1).
//Доспех (латы), легендарный (требуется настройка)//
Если вы носите этот доспех, вы можете действием произнести его командное слово, чтобы получить эффект заклинания эфирность, который длится 10 минут, либо пока вы не снимете доспех, либо пока вы не произнесёте командное слово ещё раз. Вы не можете использовать это свойство повторно до следующего рассвета.
//Доспех (латный), очень редкий//
Пока вы носите этот доспех, вы получаете бонус +2 к КД. Кроме того, если некий эффект перемещает вас против вашей воли, а вы стоите на твёрдой поверхности, вы можете реакцией уменьшит расстояние, на которое вас переместят, на расстояние до 10 футов.
//2 уровень, Преобразование, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (либо маленькая кожаная петля, либо кусочек золотой проволоки, согнутый в форме кубка с длинной ножкой)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Одно выбранное вами существо или предмет, видимые в пределах дистанции, поднимается вертикально на расстояние до 20 футов, и остаётся висеть там на время действия заклинания. Заклинание может заставить левитировать цель, весящую до 500 фунтов. Несогласное существо, преуспевшее в спасброске Телосложения, не попадает под действие этого заклинания.
Цель может перемещаться только отталкиваясь от твёрдых предметов и поверхностей (таких как стены и потолок), а также подтягиваясь за них, что позволяет перемещаться так, как если бы они лазали. В свой ход вы можете изменить высоту цели на 20 футов в любом направлении. Если целью являетесь вы сами, вы можете частью перемещения двигаться вверх или вниз. В противном случае, вы можете действием переместить цель, которая должна оставаться при этом в пределах досягаемости заклинания.
Когда заклинание оканчивается, если цель всё ещё находится в воздухе, она плавно опускается на землю."""
//Заговор, Некромантия, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 раунд
"""Вы создаёте призрачную руку скелета в пространстве существа, находящегося в пределах дистанции. Совершите дальнобойную атаку заклинанием по существу, чтобы окутать его могильным холодом. При попадании цель получает урон некротической энергией 1к8, и не может восстанавливать хиты до начала вашего следующего хода. Всё это время рука держится за цель.
Если вы попадаете по нежити, то она вместо этого до конца вашего следующего хода совершает по вам броски атаки с помехой."""
Урон этого заклинания увеличивается на 1к8, когда вы достигаете 5 уровня (2к8), 11 уровня (3к8) и 17 уровня (4к8).
//6 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (небольшой кусочек кварца)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте стену изо льда на твёрдой поверхности в пределах дистанции. Вы можете сформировать её в виде купола полусферы или сферы с радиусом до 10 футов, или же вы можете создать плоскую поверхность, состоящую из десяти квадратных плит с длиной ребра 10 футов. Каждая плита должна быть смежна с другой плитой. Какая бы форма ни была у стены, у неё толщина 1 фут (30 сантиметров), и существует она пока активно заклинание.
Если стена при появлении проходит по пространству существа, это существо выталкивается по одну из сторон стены и совершает спасбросок Ловкости. При провале существо получает урон холодом 10к6, или половину этого урона при успехе.
Стена является предметом, которому можно причинить урон и, тем самым, пробить. У каждой 10-футовой секции КД 12 и по 30 хитов, а также уязвимость к урону огнём. Уменьшение хитов плиты до 0 уничтожает её, и оставляет в воздухе область холодного воздуха. Существо, впервые за ход перемещающееся через эту область холодного воздуха, должно совершить спасбросок Телосложения. Это существо получает урон холодом 5к6 при провале или половину этого урона при успехе."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, урон, причиняемый стеной при возникновении, увеличивается на 2к6, а урон от прохождения через область холодного воздуха увеличивается на 1к6 за каждый уровень ячейки выше шестого.
//4 уровень, Вызов, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (изысканный сундук, 90×60×60 сантиметров, созданный из редких материалов, и стоящий как минимум 5 000 зм, и его копия Крошечного размера, изготовленная из того же материала, стоящая как минимум 50 зм)
:''Длительность:'' Мгновенная
"""Вы прячете сундук вместе со всем его содержимым на Эфирном Плане. Вы должны касаться и сундука и его миниатюрной копии, служащей материальным компонентом для заклинания. Сундук может содержать до 12 кубических футов неживой материи (3×2×2 фута).
Пока сундук остаётся на Эфирном Плане, вы можете действием прикоснуться к копии, чтобы вернуть сундук. Он появляется в свободном пространстве на полу в пределах 5 футов от вас. Вы можете отослать сундук обратно на Эфирный План, прикоснувшись действием к сундуку и его копии.
Спустя 60 дней появляется накопительный шанс 5 процентов в день, что эффект заклинания окончится. Эффект оканчивается, если вы активируете это заклинание ещё раз, если копия сундука будет уничтожена, или если вы окончите это заклинание действием. Если заклинание оканчивается, а сундук находится на Эфирном Плане, он безвозвратно теряется."""
//3 уровень, Воплощение, Бард/Волшебник (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя (полусфера с радиусом 10 футов)
:''Компоненты:'' В, С, М (маленькая кристаллическая бусина)
:''Длительность:'' 8 часов
"""Над вами и вокруг вас появляется неподвижный купол из силового поля с радиусом 10 футов, остающийся неподвижным всё время существования. Заклинание оканчивается, если вы покидаете его область.
Под куполом вместе с вами могут поместиться девять существ с размером не больше Среднего. Заклинание срывается, если в его область попадает существо большего размера или более девяти существ. Существа и предметы, находившиеся под куполом, когда вы наложили это заклинание, могут свободно проходить сквозь него. Все остальные существа и предметы не могут пройти сквозь него. Заклинания и прочие магические эффекты не могут простираться под купол и не могут быть наложены сквозь него. Атмосфера под ним сухая и комфортная, какой бы ни была погода снаружи.
Пока заклинание активно, вы можете сделать пространство под ним тускло освещённым или погружённым во тьму. Купол снаружи матовый, любого цвета, но изнутри он прозрачный."""
//1 уровень, Воплощение, Бард/Друид/Жрец//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Существо на ваш выбор, видимое в пределах дистанции, восстанавливает количество хитов, равное 1к4 + ваш модификатор базовой характеристики. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, количество восстанавливаемых хитов увеличивается на 1к4 за каждый уровень ячейки выше первого.
//1 уровень, Воплощение, Бард/Друид/Жрец/Паладин/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Существо, которого вы касаетесь, восстанавливает количество хитов, равное 1к8 + ваш модификатор базовой характеристики. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, лечение увеличивается на 1к8 за каждый уровень ячейки выше первого.
Ловушки можно найти практически где угодно. Один неправильный шаг в древней гробнице — и из стен вылетят клинки, рассекающие и доспехи и кости. Невинные лианы, растущие над входом в пещеру, могут хватать и душить тех, кто хочет сквозь них пройти. Сеть, спрятанная под кронами деревьев, может упасть на проходящих под ней искателей приключений. В игре D&D неосторожные искатели приключений могут упасть и разбиться, могут сгореть заживо, а могут стать мишенью для сотен отравленных дротиков.
Ловушка может быть механической или магической по своей природе. В ''механические ловушки'' входят ямы, ловушки со стрелами, падающие глыбы, заполняющиеся водой комнаты, вращающиеся клинки и всё, что действует за счёт механизма. ''Магические ловушки'' это либо магические устройства, либо заклинания-ловушки. Магические устройства при активации генерируют эффект того или иного заклинания. Заклинания-ловушки это такие заклинания как знак и охранные руны, действующие подобно ловушкам.
!!//''Ловушки в игре''//
Когда искатели приключений сталкиваются с ловушкой, вам нужно знать, от чего ловушка срабатывает и что она делает, а также вероятность её обнаружения и обезвреживания.
!!!''Срабатывание ловушки''
Большая часть ловушек срабатывает когда существо идёт куда-то или касается чего-то, что создатель ловушки хотел защитить. Обычно спусковыми механизмами является нажимная плита или фальшивая секция пола, натянутся над полом верёвка, дверная ручка или неправильный ключ в замке. Магические ловушки обычно срабатывают когда существо входит в охранную область или касается предмета. Некоторые магические ловушки (такие как заклинание охранные руны) могут срабатывать при более сложных условиях, включая произношение пароля, не дающего ловушке активироваться.
!!!''Обнаружение и обезвреживание ловушки''
Обычно какую-то часть ловушки можно обнаружить при тщательном исследовании. Персонажи могут заметить выступающую каменную плитку, под которой находится нажимная плита, отблеск света на натянутой проволоке, небольшие отверстия в стене, из которых может вырваться пламя, или другие признаки наличия ловушки.
В описании ловушки указываются проверки и их Сл для обнаружения, обезвреживания, или и того и другого. Персонаж, активно ищущий ловушку, может совершить проверку Мудрости (Внимательность) против Сл ловушки. Вы можете также сравнить Сл обнаружения с пассивным значением Мудрости (Внимательность) всех персонажей, чтобы определить, не заметил ли кто из персонажей ловушку мимоходом. Если искатели приключений обнаруживают ловушку до того как та сработает, они могут попробовать обезвредить её, либо навсегда, либо на небольшой период, чтобы спокойно миновать её. Вы можете попросить совершить проверку Интеллекта (Анализ), чтобы персонаж понял, что нужно сделать, после чего будет проверка Ловкости с использованием воровских инструментов, чтобы выполнить нужные действия.
Любой персонаж может попытаться совершить проверку Интеллекта (Магия) для обнаружения или обезвреживания магической ловушки, вдобавок ко всем остальным проверкам, указанным в описании ловушки. Сл будет такой же. Кроме того, большую часть магических ловушек может обезвредить рассеивание магии. В описании магической ловушки указана Сл для проверки характеристики при использовании рассеивания магии.
В большинстве случаев описание ловушки позволяет чётко рассудить, могут ли персонажи действиями обнаружить или сломать ловушку. Как и во многих других случаях не позволяйте броскам костей портить интересную игру и хорошие планы. Используйте здравый смысл и описание ловушки, чтобы определить, что могло произойти. Ни одна ловушка не может предусмотреть все варианты действий, которые могут предпринять персонажи.
Вы должны позволить персонажам обнаружить ловушку без проверок характеристик, если их действия однозначно должны выдать присутствие ловушки. Например, если персонаж поднимет ковёр, под которым прячется нажимная плита, он обнаружит спусковой механизм без проверок.
С обезвреживанием ловушек дела обстоят несколько сложнее. Рассмотрим сундук с сокровищами и ловушкой. Если его открыть, не повернув предварительно две рукоятки, находящийся внутри механизм выстреливает в тех, кто стоит перед ним, град отравленных игл. Исследовав сундук и совершив несколько проверок, персонажи всё ещё не уверены, есть ли в нём ловушки. Вместо того чтобы просто открыть сундук, они ставят перед ним щит и открывают с расстояния железным прутом. В этом случае ловушка срабатывает, но шипы бессильно ударяются о щит.
Ловушки часто создают с механизмами, позволяющими их временно отключать или обходить. Разумные чудовища, помещающие ловушки в своём логове ли около него, должны как-то существовать рядом с ними, не причиняя себе вреда У таких ловушек может быть потайной рычаг, отключающий спусковой механизм, или потайная дверь, позволяющая обойти ловушку стороной.
!!!''Эффекты ловушек''
Эффекты ловушек могут быть как безобидными, так и смертельными, и в них могут использоваться стрелы, шипы, лезвия, яды, газы, огненные вспышки и глубокие ямы. В самых опасных ловушках используется сразу несколько элементов, чтобы убивать, ранить, удерживать или наоборот, прогонять нежелательных существ. В описании ловушки сказано, что происходит при её активации.
Бонус атаки ловушки, Сл спасброска для сопротивления её эффектам и урон, который она причиняет, зависит от степени угрозы этой ловушки. Используйте две приведённые таблицы для подбора значений трём разновидностям ловушек.
Ловушки, которые должны вызывать ''неудобство'', теоретически не должны убивать и серьёзно ранить персонажей указанных уровней, ''опасные'' ловушки могут серьёзно ранить (и даже убить) персонажей указанных уровней. ''Смертельные'' ловушки вполне могут убить персонажей указанных уровней.
{{$:/Сл спасения и бонусы атаки ловушек}}
{{$:/Урон в зависимости от уровня}}
!!!''Комплексные ловушки''
Комплексные ловушки действуют как обычные, но будучи активированными, они в каждом раунде совершают некий набор действий. Комплексная ловушка превращает процесс её отключения в подобие боевой сцены.
Когда комплексная ловушка активируется, она совершает проверку инициативы. В описании ловушки приводится её бонус инициативы. В свой ход ловушка активируется ещё раз, обычно совершая при этом какие-то действия. Она может совершать атаки по чужакам, создавать эффекты, меняющиеся с течением времени, или создавать какие-то другие динамические перемены. Во всем остальном комплексную ловушку можно точно так же обнаружить и обезвредить.
Например, ловушку, заливающую комнату водой, лучше всего представить в виде комплексной ловушки. В ход ловушки уровень воды будет увеличиваться. Через несколько раундов комната будет полностью затопленной.
!!__''Примеры ловушек''__
Магические и механические ловушки, представленные здесь, отличаются по степени исходящей от них угрозы, и приводятся в алфавитном порядке.
!!!''Катящийся шар''
//Механическая ловушка//
Если на нажимной пластине этой ловушки оказывается 20 или больше фунтов веса, в потолке открывается потайной люк, выпуская каменный 3метровый шар.
Совершив успешную проверку Мудрости (Внимательность) со Сл 15, персонаж может заметить люк и нажимную плиту. Поиски на полу, сопровождаемые успешной проверкой Интеллекта (Анализ) со Сл 15, позволяют найти разницу в высоте, выдающую наличие нажимной плиты. Эта же проверка при исследовании потолка позволяет найти люк. Если поместить под нажимную плиту железный шип или другой тонкий предмет, это не даст ловушке активироваться.
При активации шара все присутствующие существа совершают проверку инициативы. Шар совершает проверку инициативы с бонусом +8. В свой ход он перемещается на 60 футов по прямой линии. Шар может проходить сквозь пространство существ, и существа могут проходить через его пространство, считая его труднопроходимой местностью. Когда шар входит в пространство существа или существо входит в его пространство, пока шар катится, это существо должно преуспеть в спасброске Ловкости со Сл 15, иначе оно получает дробящий урон 55 (10к10) и сбивается с ног.
Шар останавливается, когда ударяется о стену или подобное препятствие. Он не может огибать углы, но умные строители подземелий делают плавные повороты, позволяющие шару катиться дальше.
Существо, находящееся в пределах 5 футов от шара, может попытаться замедлить его проверкой Силы со Сл 20. При успехе скорость шара уменьшается на 15 футов. Если скорость шара уменьшается до 0, он останавливается и перестаёт представлять угрозу.
!!!''Обрушивающийся потолок''
//Механическая ловушка//
В этой ловушке используется натянутая верёвка, ломающая подставку, удерживающую кусок раскрошившегося потолка.
Верёвка находится в 7 сантиметрах над полом и натягивается между двумя опорами. Сл обнаружения верёвки — 10. Успешная проверка Ловкости со Сл 15 с использованием воровских инструментов обезвреживает ловушку. Персонаж без воровских инструментов может совершить эту проверку с помехой, используя острое оружие или инструмент. При провале ловушка срабатывает.
Тот, кто исследует опоры, может с лёгкостью определить, что они едва держатся на месте. Персонаж может действием толкнуть опору, вызывая срабатывание ловушки.
Потолок над верёвкой находится в плохом состоянии, и тот, кто видит его, может сказать, что есть риск его обрушения.
Когда ловушка срабатывает, потолок рушится. Все существа в области под шатким потолком должны преуспеть в спасброске Ловкости со Сл 15, получая при провале дробящий урон 22 (4к10), или половину этого урона при успехе. После того как ловушка сработает, пол под ней заполняется обломками и становится труднопроходимой местностью.
!!!''Огнедышащая статуя''
//Магическая ловушка//
Эта ловушка активируется когда чужак наступает на потайную нажимную плиту, выпуская магический сгусток пламени из статуи. Статуя может быть какой угодно, в том числе драконом или волшебником, накладывающим заклинание.
Сл обнаружения нажимной плиты, а также небольших подпалин на полу и стенах, — 15. Заклинание или другой эффект, ощущающий присутствие магии, такой как обнаружение магии., раскрывает присутствие вокруг статуи магии школы Воплощения.
Ловушка активируется когда на нажимной плите оказывается больше 20 фунтов веса, после чего статуя испускает 30-футовый конус огня. Все существа в этом огне обязаны совершить спасбросок Ловкости со Сл 13, получая урон огнём 22 (4к10) при провале, или половину при успехе.
Если поместить под нажимную плиту железный шип или другой тонкий предмет, это не даст ловушке активироваться. Успешное рассеивание магии (Сл 13), наложенное на статую, уничтожает ловушку.
!!!''Отравленная игла''
//Механическая ловушка//
Отравленная игла прячется в замке сундука или другого предмета. Если попытаться открыть сундук без правильного ключа, выскочит игла, передающая дозу яда.
Когда ловушка активируется, игла выскакивает на 7 сантиметров из замка. Существо, находящееся в этой области, получает колющий урон 1 и урон ядом 11 (2к10), а также должно преуспеть в спасброске Телосложения со Сл 15, иначе оно станет отравленным на 1 час.
Успешная проверка Интеллекта (Анализ) со Сл 20 позволяет персонажу понять наличие ловушки по изменениям, сделанным в замке, чтобы тот уместил иглу. Успешная проверка Ловкости со Сл 15 с использованием воровских инструментов обезвреживает ловушку, вынимая иглу из замка. Неудачная попытка вскрыть замок тоже вызывает срабатывание ловушки.
!!!''Отравленные дротики''
//Механическая ловушка//
Когда существо наступает на потайную нажимную плиту, из трубок в стене, находящихся под давлением или оснащённых пружинами, вылетают дротики с ядом на конце. На полу может быть несколько нажимных пластин, и каждая будет активировать свой набор дротиков.
Крохотные отверстия в стене закрываются пылью и паутиной, либо маскируются среди барельефов и фресок. Сл их обнаружения — 15. Успешная проверка Интеллекта (Анализ) со Сл 15 позволит понять присутствие нажимных пластин по колебаниям уровня пола. Если поместить под нажимную плиту железный шип или другой тонкий предмет, это не даст ловушке активироваться.
Если отверстия забить тканью или залить воском, это не даст дротикам вылететь.
Ловушка активируется когда на нажимной плите оказывается больше 20 фунтов веса, после чего вылетают четыре дротика. Каждый дротик совершает дальнобойную атаку с бонусом +8 против случайной цели в пределах 10 футов от нажимной пластины (видимость никак не мешает этому броску атаки). Если в этой области нет целей, дротики ни во что не попадают. Цель, по которой попали, получает колющий урон 2 (1к4) и должна преуспеть в спасброске Телосложения со Сл 15, получая урон ядом 11 (2к10) при провале, или половину этого урона при успехе.
!!!''Падающая сеть''
//Механическая ловушка//
В этой ловушке натянутая верёвка сбрасывает подвешенную к потолку сеть.
Верёвка находится в 7 сантиметрах над полом и растягивается между двумя колоннами или деревьями. Сеть маскируется паутиной или листвой. Сл обнаружения верёвки и сети — 10. Успешная проверка Ловкости со Сл 15 с использованием воровских инструментов позволяет безопасно перерезать верёвку. Персонаж без воровских инструментов может совершить эту проверку с помехой, используя острое оружие или инструмент. При провале ловушка срабатывает.
Когда ловушка срабатывает, сеть падает, накрывая квадратную площадь с длиной стороны 10 футов. Те, кто находятся в этой области, становятся опутанными, а провалившие спасбросок Силы со Сл 10 ещё и сбиваются с ног. Существа могут действием совершать проверку Силы со Сл 10, освобождая при успехе себя или другое существо в пределах досягаемости. У сети КД 10 и 20 хитов. Причинение сети рубящего урона 5 (КД 10) уничтожает квадратный участок с длиной стороны 5 футов, освобождая находящихся там существ.
!!!''Сфера аннигиляции''
//Магическая ловушка//
Магическая непроницаемая тьма заполняет разинутый рот каменного лица, вырезанного в стене. Диаметр круглого рта 60 сантиметров. Из него не слышны звуки, свет не может проникнуть внутрь его, и вся материя, входящая туда, мгновенно уничтожается.
Успешная проверка Интеллекта (Анализ) со Сл 20 даст понять, что во рту находится сфера аннигиляции, которую нельзя контролировать и перемещать. Во всём остальном она идентична обычной сфере аннигиляции, как описано в главе 7.
В некоторых разновидностях этой ловушки на каменное лицо накладывают чары, чтобы определённые существа чувствовали неодолимое желание подойти ко рту и залезть внутрь. Этот эффект подобен эффекту симпатия заклинания антипа-тия/симпатия. Успешное рассеивание магии (Сл 18) устраняет эти чары.
!!!''Ямы''
//Механическая ловушка//
Здесь представлены четыре разновидности ловушек-ям.
;
:"""//''Простая яма.''// Простая яма выкапывается в земле. Отверстие прикрывают большим куском ткани, закреплённым по краям, и маскируют грязью и обломками.
Сл обнаружения ямы — 10. Тот, кто наступит на ткань, падает, утягивая ткань за собой, получая урон, зависящий от глубины ямы (обычно 10 футов, но может быть и глубже)."""
:"""//''Скрытая яма.''// Такая яма сверху прикрывается материалом, идентичным окружающему полу.
Успешная проверка Мудрости (Внимательность) со Сл 15 позволит увидеть отсутствие следов на участке пола над ямой. Успешная проверка Интеллекта (Анализ) со Сл 15 позволит понять, что под этой частью пола вырыта яма.
Если существо наступает на поверхность над ямой, та распахивается как люк, сбрасывая чужака вниз. Обычно глубина такой ямы от 10 до 20 футов, но она может быть и глубже.
После того как ловушка обнаружена, между крышкой ямы и окружающим полом можно вогнать железный шип или подобный предмет, чтобы крышка не могла провернуться, и по ней можно было пройти. Крышку также можно удержать закрытой заклинанием волшебный замок или подобной магией."""
:"""//''Запирающаяся яма.''// Эта ловушка идентична скрытой яме, за одним исключением: люк, накрывающий яму, снабжён засовом. После того как существо падает яму, крышка запирает его внутри.
Для открывания люка требуется успешная проверка Силы со Сл 20. Люк можно также разрушить (определите его характеристики согласно рекомендациям из главы 8). Персонаж, находящийся в яме, может также попытаться обезвредить запирающий механизм проверкой Ловкости со Сл 15, используя воровские инструменты, при условии, что до механизма можно дотянуться и персонаж может видеть. В некоторых случаях люк открывается механизмом (обычно спрятанным за потайной дверью)."""
://''Яма с шипами.''// Это простая, скрытая или запирающаяся яма с деревянными или железными шипами на дне. Существо, упавшее в неё, получает колющий урон 11 (2к10) от шипов, а также обычный урон от падения. Есть и более опасные разновидности, когда шипы покрывают ядом. В этом случае тот, кто получает колющий урон от шипов, должен также совершить спасбросок Телосложения со Сл 13, получая урон ядом 22 (4к10) при провале, или половину этого урона при успехе.
//Доспех (щит), редкий (требуется настройка)//
Вы получаете бонус +2 к КД от дальнобойных атак, пока носите этот щит. Этот бонус идёт в дополнение к обычному бонусу щита к КД Кроме того, каждый раз, когда кто-нибудь совершает дальнобойную атаку по цели, находящейся в пределах 5 футов от вас, вы можете реакцией вместо этого сделать целью атаки себя.
//Оружие (длинный лук), очень редкое (требуется настройка)//
Когда вы натягиваете тетиву этого лука, он шепчет на Эльфийском языке: «Несу смерть врагам». Если вы используете это оружие для совершения дальнобойной атаки, вы можете сказать командную фразу: «Смерть презревшему меня». Цель вашей атаки становится вашим заклятым врагом, пока не умрёт, или пока не наступит рассвет по прошествии семи дней. У вас может быть только один заклятый враг одновременно. Если ваш заклятый враг умирает, вы можете выбрать нового после следующего рассвета.
Если вы совершаете бросок дальнобойной атаки по заклятому врагу, вы совершаете его с преимуществом. Кроме того, цель не получает преимуществ от укрытия, кроме полного укрытия, и вы не получаете штраф за совершение атаки на расстояние, превышающее обычную дистанцию. Если атака попадает, заклятый враг получает дополнительный колющий урон 3к6.
Пока ваш заклятый враг жив, вы совершаете с помехой броски атаки всем другим оружием.
!!!''Лунный клинок''
//Оружие (длинный меч), легендарное (требуется настройка эльфом или полуэльфом нейтральнодоброго мировоззрения)//
Из всех магических предметов, созданных эльфами, больше всех ценится и яростнее всех охраняется Лунный клинок. В древние времена практически у каждого эльфийского благородного дома было по одному такому клинку. По прошествии столетий часть клинков затерялась и магия их была утеряна вместе с родословными. Другая часть сгинула вместе с владельцами, отправившимися на выполнение заданий. Таким образом, осталось лишь несколько экземпляров этого оружия.
Лунный клинок переходит от родителя к ребёнку. Он остаётся связанным с ним всю жизнь. Если владелец умирает, меч может достаться другому наследнику. Если достойных наследников нет, меч впадает в спячку. Он действует как обычный длинный меч, пока его не найдёт достойная душа, способная пробудить его силу.
Лунный клинок служит только одному хозяину одновременно. Процесс настройки требует особого ритуала в тронном зале эльфийского правителя или храме эльфийских богов.
Лунный клинок не станет служить тому, кого он посчитает трусливым, непостоянным, порочным или нежелающим хранить и защищать эльфов. Если клинок вас отвергает, вы 24 часа совершаете с помехой проверки характеристик, броски атаки и спасброски. Если клинок вас принимает, вы настраиваетесь на него, а на клинке появляется новая руна. Вы остаётесь настроенным на это оружие пока не умрёте или оно не уничтожится.
У Лунного клинка на лезвии есть по одной руне за каждого владельца, которому он служил (обычно их 1к6 + 1). Первая руна всегда предоставляет бонус +1 к броскам атаки и урона, совершённым этим магическим оружием. За каждую последующую руну клинок получает дополнительное свойство. Мастер может сам выбрать каждое свойство, а может определить их случайным образом.
Свойства Лунного клинка
<table>
<tr>
<th>к100</th>
<th>Свойство</th>
</tr>
<tr>
<td>01-40</td>
<td>Увеличьте бонус к броскам атаки и урона на 1, до максимума +3. Перебросьте, если у Лунного клинка бонус уже +3.</td>
</tr>
<tr>
<td>41-80</td>
<td>Лунный клинок получает случайным образом определённое малое свойство (смотрите «Особые свойства» ранее в этой главе).</td>
</tr>
<tr>
<td>81-82</td>
<td>Лунный клинок получает свойство «фехтовальное».</td>
</tr>
<tr>
<td>83-84</td>
<td>Лунный клинок получает свойство «метательное» (дистанция 20/60 футов).</td>
</tr>
<tr>
<td>85-86</td>
<td>Лунный клинок функционирует как защитник.</td>
</tr>
<tr>
<td>87-90</td>
<td>Лунный клинок совершает критическое попадание при выпадении «19» или «20».</td>
</tr>
<tr>
<td>91-92</td>
<td>Если вы попадаете атакой, используя Лунный клинок, вы причиняете дополнительный рубящий урон 1к6.</td>
</tr>
<tr>
<td>93-94</td>
<td>Если вы попадаете Лунным клинком по существу определённого вида (такому как дракон, исчадие или нежить), цель получает дополнительный урон 1к6 одного из следующих видов: звук, кислота, огонь, холод или электричество.</td>
</tr>
<tr>
<td>95-96</td>
<td>Вы можете бонусным действием заставить Лунный клинок ярко вспыхнуть. Все существа, видящие вас и находящиеся в пределах 30 футов от вас, должны преуспеть в спасброске Телосложения со Сл 15, иначе они станут ослеплёнными на 1 минуту. Существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе. Это свойство нельзя повторно использовать, пока вы не совершите короткий отдых, будучи настроенным на это оружие.</td>
</tr>
<tr>
<td>97-98</td>
<td>Лунный клинок действует как кольцо хранения заклинаний.</td>
</tr>
<tr>
<td>99</td>
<td>Вы можете действием призвать эльфийскую тень, при условии, что у вас сейчас нет в услужении такой тени. Эльфийская тень появляется в свободном пространстве в пределах 120 футов от вас. Она использует статистику тени из Бестиария, за исключением того, что она нейтральна, обладает иммунитетом к эффектам, изгоняющим нежить, и не создаёт новых теней. Это существо контролируете вы, и вы определяете его действия и перемещения. Оно существует, пока его хиты не опустятся до 0 или вы не отпустите его действием.</td>
</tr>
<tr>
<td>00</td>
<td>Лунный клинок действует как меч головоруб.</td>
</tr>
</table>
;
:"""//''Разум.''// Лунный клинок — разумное нейтраль-ное-доброе оружие с Интеллектом 12, Мудростью 10 и Харизмой 12. Он обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие общается с владельцем, передавая эмоции, и посылая в руку владельца покалывающее ощущение, когда хочет передать что-то, что оно почувствовало. Клинок может общаться менее завуалированно, через видения и грёзы, когда владелец спит или находится в трансе."""
:"""//''Индивидуальность.''// Все Лунные клинки стремятся продвигать идеалы эльфов: храбрость, преданность, красоту, музыку и жизнь во всех её проявлениях.
Это оружие привязано к роду, которому должно служить. Когда оно связывается с владельцем, разделяющим его идеалы, его преданность будет абсолютной.
Если у Лунного клинка и есть недостаток, то это чрезмерная уверенность. Если он выбрал себе владельца, то будет считать, что только эта личность достойна его носить, даже если владелец позже предаст эльфийские идеалы."""
//2 уровень, Воплощение, Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (несколько семечек лунносемянника и кусочек опалесцирующего полевого шпата)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Бледный серебристый луч сияет в цилиндре с радиусом 5 футов и высотой 40 футов с центром на точке в пределах дистанции. Пока заклинание активно, цилиндр освещён тусклым светом.
Когда существо впервые за ход входит в область заклинания или начинает там ход, оно окутывается призрачным пламенем, причиняющим настоящую боль, и должно совершить спасбросок Телосложения. Оно получает урон излучением 2к10 при провале или половину этого урона при успехе.
Перевёртыши совершают спасбросок с помехой. При провале они мгновенно принимают свой истинный облик, и не могут принимать другие формы, пока не выйдут из света от заклинания.
В каждый последующий после накладывания заклинания ход вы можете действием перемещать луч на 60 футов в любом направлении."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше второго.
//1 уровень, Некромантия, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Луч тошнотворно-зелёной энергии устремляется к существу, находящемуся в пределах дистанции. Совершите дальнобойную атаку заклинанием по цели. При попадании цель получает урон ядом 2к8 и должна совершить спасбросок Телосложения. При провале она становится также отравленной до конца вашего следующего хода.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше первого.
//2 уровень, Некромантия, Волшебник/Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Чёрный луч вылетает из вашего пальца к существу, находящемуся в пределах дистанции. Совершите по цели дальнобойную атаку заклинанием. При попадании цель до конца действия заклинания причиняет только половину урона атаками оружием, использующими Силу.
В конце каждого своего хода цель может совершать спасбросок Телосложения от этого заклинания. При успехе заклинание оканчивается."""
//Заговор, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Холодный сине-белый луч устремляется к существу, находящемуся в пределах дистанции. Совершите по цели дальнобойную атаку заклинанием. При попадании она получает урон холодом 1к8, а скорость до начала вашего следующего хода уменьшается на 10 футов.
Урон от заклинания увеличивается на 1к8, когда вы достигаете 5 уровня (2к8), 11 уровня (3к8) и 17 уровня (4к8).
//Зелье, необычное//
Вы становитесь на 1 час очарованы первым же существом, которое вы увидите в течение 10 минут после того, как выпили это зелье. Если существо принадлежит к биологическому виду и полу, которые привлекают вас в обычных условиях, то вы воспринимаете его как свою истинную любовь, пока очарованы им. Жидкость представляет собой розовую, шипучую жидкость, с пузырьками в виде сердец.
//6 уровень, Вызов, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 500 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте связанные порталы для телепортации, остающиеся открытыми на время длительности. Выберите две точки на земле, которые вы видите, одну в пределах 10 футов от себя, и вторую в пределах 500 футов. В каждой точке появляется круглый портал диаметром 10 футов. Если портал должен открыться в пространстве, занятом существом, заклинание проваливается.
Порталы представляют собой двумерные светящиеся круги, заполненные туманом, парящие в паре сантиметров над землёй и перпендикулярные выбранной вами точке. Круги видны только с одной стороны (на ваш выбор), которая и функционирует как портал.
Все существа и предметы, входящие в портал, выходят из другого портала, как если бы они были смежны друг с другом; прохождение сквозь портал с неактивной стороны не оказывает никакого эффекта. Туман, заполняющий порталы, непрозрачный, и блокирует зрение. Вы в свой ход можете бонусным действием повернуть кольца, чтобы активные стороны поменялись местами с неактивными."""
Магические предметы находятся в залежах у чудовищ или в давно утерянных гробницах. Такие предметы дают персонажам способности, которые они едва ли могли получить в ином случае, или улучшают уже существующие причудливыми способами.
{{01. Редкость}}
{{02. Покупка и продажа}}
{{03. Идентификация магических предметов}}
{{04. Настройка на магический предмет}}
{{05. Проклятые предметы}}
{{06. Категории магических предметов}}
{{07. Ношение и использование магических предметов}}
{{08. Активация предмета}}
{{09. Прочность магических предметов}}
{{10. Особые свойства}}
Магические предметы представлены в алфавитном порядке. Описание магического предмета включает в себя название предмета, его категорию, показатель редкости, и описание магических его свойств.
<<list-links "[tag[04. Магические предметы А-Я]sort[title]]">>
!!''Магические традиции''
"""Изучение волшебства старо настолько, что простирает корни к самым ранним открытиям магии смертных. Магия опирается на различные традиции, посвящённые её комплексному изучению.
Наиболее распространённые магические традиции в мультивселенной вращаются вокруг школ магии. Волшебники на протяжении веков каталогизировали тысячи заклинаний, группируя их по восьми так называемым школам, как описано в главе 10. В некоторых местах эти традиции в буквальном смысле являются школами; один волшебник может пройти обучение в школе Иллюзии, а другой будет обучаться в городе со школой Очарования. В других учреждениях школы больше похожи на факультеты, соперничающие за студентов и финансирование. Даже волшебники-одиночки, которые учат в своих башнях, используют разделение магии по школам в учебном процессе, так как заклинания каждой школы требуют различного рода мастерства и методов."""
<<Button "Школа Воплощения (Волшебник)" "Школа Воплощения">>
<<Button "Школа Вызова (Волшебник)" "Школа Вызова">>
<<Button "Школа Иллюзии (Волшебник)" "Школа Иллюзии">>
<<Button "Школа Некромантии (Волшебник)" "Школа Некромантии">>
<<Button "Школа Ограждения (Волшебник)" "Школа Ограждения">>
<<Button "Школа Очарования (Волшебник)" "Школа Очарования">>
<<Button "Школа Преобразования (Волшебник)" "Школа Преобразования">>
<<Button "Школа Прорицания (Волшебник)" "Школа Прорицания">>
!!!__''Магические традиции''__
Когда вы достигаете 2 уровня, вы выбираете магическую традицию, формирующую вашу магическую практику посредством одной из восьми школ: Воплощения, Вызова, Иллюзии, Некромантии, Ограждения, Очарования, Преобразования или Прорицания. Подробнее о школах можно прочесть в конце описания класса.
Ваш выбор даёт вам умения на 2, 6, 10 и 14 уровнях.
//4 уровень, Прорицание, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (мех летучей мыши)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы создаёте невидимый магический глаз в пределах дистанции, который парит в воздухе на время длительности.
Вы мысленно воспринимаете зрительную информацию с глаза, у которого обычное зрение и тёмное зрение в пределах 30 футов. Глаз смотрит во всех направлениях.
Вы можете действием переместить глаз на 30 футов в любом направлении. Глаз может удаляться от вас на любое расстояние, но не может уходить на другие планы существования. Сплошные препятствия блокируют движение глаза, но он может проходить через отверстия диаметром в 1 дюйм (2,5 сантиметра)."""
//3 уровень, Ограждение, Волшебник/Жрец/Колдун/Паладин//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (святая вода или порошок серебра и железа, стоящий как минимум 100 зм, расходуемые заклинанием)
:''Длительность:'' 1 час
"""Вы создаёте из магической энергии цилиндр с радиусом 10 футов и высотой 20 футов с центром на точке на полу, видимой в пределах дистанции. Там, где цилиндр пересекает пол или другую поверхность, появляются светящиеся руны.
Выберите один или несколько видов существ из следующего списка: исчадия, небожители, нежить, феи или элементали. Круг действует на выбранных существ следующим образом:"""
* Существа не могут добровольно войти в цилиндр немагическими средствами. Если существо пытается использовать телепортацию или межпланарное путешествие, оно должно вначале преуспеть в спасброске Харизмы.
* Существо совершает с помехой броски атаки по целям, находящимся в пределах цилиндра.
* Целей в цилиндре нельзя сделать очарованными, испуганными или одержимыми.
При накладывании этого заклинания вы можете обратить его магию, чтобы существа выбранного вида не могли покинуть цилиндр, и защищены были цели, находящиеся снаружи.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, длительность увеличивается на 1 час за каждый уровень ячейки выше третьего.
!!!__''Магическое восстановление''__
"""Вы знаете как восстанавливать часть магической энергии, изучая книгу заклинаний. Один раз в день, когда вы заканчиваете короткий отдых, вы можете восстановить часть использованных ячеек заклинаний. Ячейки заклинаний могут иметь суммарный уровень, который не превышает половину уровня вашего волшебника (округляя в большую сторону), и ни одна из ячеек не может быть шестого уровня или выше.
Например, если вы волшебник 4 уровня, вы можете восстановить ячейки заклинаний с суммой уровней не больше двух. Вы можете восстановить одну ячейку заклинаний 2 уровня, или две ячейки заклинаний 1 уровня."""
//2 уровень, Преобразование, Волшебник/Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы касаетесь немагического оружия. Пока заклинание активно, это оружие становится магическим оружием с бонусом +1 к броскам атаки и урона.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, бонус увеличивается до +2. Если вы используете ячейку заклинания 6 уровня или выше, бонус увеличивается до +3.
Для большинства миров D&D магия естественна, но, несмотря на это, необычна, а иногда даже может пугать. Все люди в мире знают о магии, а большинство из них вообще встречали доказательства её существования в какой-то момент своей жизни. Она пронизывает космос и питает древние вещи легендарных героев, загадочные руины павших империй, тех, кого коснулись боги, течёт в жилах существ, рождённых со сверхъестественной силой, наполняет тех, кто изучает тайны вселенной. О подвигах тех, кто ей обладают, слагают истории и рассказывают своим детям сказки у камина.
Что обычный человек знает о магии, зависит от того, где он живёт, и знает ли он кого-то, кто практикует магию. Жители изолированной деревни, возможно, не видели настоящей магии столетиями, и говорят шёпотом о странных силах старого отшельника, живущего в соседнем лесу. В городе Глубоководье мира Забытых Королевств есть гильдия волшебников под названием Бдительный Орден Магов и Защитников. Эти маги хотят сделать колдовство более доступным, чтобы члены ордена смогли извлекать прибыль от продаж своих услуг.
В некоторых мирах D&D магии больше, чем в других. В Атхасе, в суровом мире Тёмного Солнца, тайная магия является ненавистной практикой, ведь она истощает жизнь мира. Большая часть магии Атхаса находится в руках злодеев. И наоборот, в мире Эберрон магия — такое же обычное явление, как и любой другой товар. Торговые дома продают волшебные предметы и услуги всем, кто может себе их позволить. Люди покупают билеты на дирижабли и поезда, которые движутся с помощью стихийной магии.
Добавляя магию в свой мир, ответьте на следующие вопросы:
* Какая магия является обыденной для этого мира? Какая социально неприемлема? А какая редкая?
* Насколько необычны для мира классы персонажей, способные использовать заклинания? Насколько обыденны те, кто могут накладывать заклинания высокого уровня?
* Насколько редки магические предметы, магические места, и существа, которые имеют сверхъестественные способности? На каком уровне силы эти вещи превратятся из повседневных в экзотические?
* Как власти регулируют использование магии? Как обычные люди используют магию и защищают себя от неё?
Ответы на некоторые вопросы предполагают ответы и на другие. Например, если заклинатели низкого уровня привычны для мира, как в мире Эберрон, то органы власти и простые люди, скорее всего, имеют доступ и пользуются результатами таких заклинаний. Покупка простых заклинаний не просто возможна, она гораздо дешевле. Люди, скорее всего, знают об известных заклинаниях, и готовят защиту от них, особенно в рискованных ситуациях.
<<<
!!!''Пример фракции: Жентарим''
Жентарим (также известный как Чёрная Сеть) является беспринципной теневой организацией, которая стремится расширить своё влияние и власть на весь мир Забытых Королевств.
Внешне Чёрная Сеть выглядит относительно доброжелательной организацией. Она предлагает лучшие и самые дешёвые товары и услуги, как легальные, так и нелегальные, тем самым уничтожая своих конкурентов и заставляя всех зависеть от неё.
Члены Жентарима рассматривают друг друга в качестве членов очень большой семьи и полагаются на ресурсы и безопасность организации. Тем не менее, им предоставляется полная свобода в достижении их собственных целей и в увеличении личного богатства или влияния. В целом, Жентарим обещает «всё самое лучшее», хотя на самом деле эта организация больше заинтересована в распространении собственной пропаганды и влияния, чем в улучшении жизни её отдельных членов.
//''Девиз.''// «Присоединяйся к нам и процветай. Выступи против нас и страдай».
Убеждения. Убеждения Жентарима можно резюмировать следующим образом:
* Жентарим — ваша семья. Вы присматриваете за ней, а она за вами.
* Вы хозяин своей судьбы. Всегда получайте то, чего заслуживаете.
* Всё и все имеют свою цену.
//''Цели.''// Увеличить богатство, власть, влияние, и таким образом доминировать на Фаэруне.
//''Типичные задания.''// Типичные задания Жентарима включают в себя грабёж или кражу сокровищ, мощного магического предмета, или артефакта; заключение прибыльного контракта или продление существующего; и создание плацдарма в местах, где Жентарим не имеет большого влияния.
<<<
!!__''Ограничения на магию''__
В некоторых государствах могут существовать ограничения или запреты на использование магии. Колдовство без лицензии или официального разрешения может быть запрещено. В таких местах магические предметы и постоянные магические эффекты редки, но магические методы защиты от магии являются исключением.
Некоторые населённые пункты могут запрещать определённые заклинания. В таких местах будет преступлением использование заклинания, чтобы что-то украсть или смошенничать, а также нельзя использовать магию, которая дарует невидимость или производит иллюзии. Заклинания, которые позволяют очаровывать или доминировать над другими вне закона, так как с помощью них легко ограбить любого с его собственного разрешения. Деструктивные заклинания также запрещены по понятным причинам. Местный правитель может бояться конкретного эффекта или заклинания (например, заклинания перевоплощения, он боится, что перевоплотятся в них) и потому вводится закон, ограничивающий этот вид магии.
!!__''Школы магии''__
Правила игры часто обращаются к школам магии (иллюзии, некромантии, ограждения и так далее), но вам решать, какое значение эти школы имеют в вашем мире. Таким же образом, некоторые классовые умения свидетельствуют о существовании в мире организаций, использующих магию — бардовских колледжей и кругов друидов — опять же, вам решать, какими они будут.
Вы можете решить, что никаких формальных структур, вроде описанных выше, не существует в вашем мире. Волшебники (и барды с друидами) могут быть настолько редкими, что персонаж обучается у одного наставника и никогда больше не встречает другого персонажа такого же класса. В этом случае маги могут выучить свои специализации в школах без всякого формального обучения.
Однако если магия более распространена в мире, академии могут стать вариантами школ магии. Эти учреждения имеют свои собственные иерархии, традиции, правила и процедуры. Например, некромант Матеррос может быть учеником некромантской Кабалы из Тар-Зада Ввиду своего высокого положения в иерархии, он имеет право носить красные и зелёные одеяния мастера. Конечно, когда он носит эти одежды, его род занятий легко узнаётся теми, кто знает о кабале. То, что его узнали, может пойти на пользу или принести вред, поскольку Кабала из Тар-Зада имеет грозную репутацию.
Если вы выбираете такой способ, вы можете расценивать школы магии, бардовские колледжи и круги друидов как организации, используя руководство для организаций, представленное ранее в этой главе. Игрок, отыгрывающий персонажа-некроманта, может получать очки славы в Кабале из Тар-Зада, а бард стремиться получить всё большую известность в колледже Мак-Фюрмидх.
!!__''Круги телепортации''__
Круги телепортации занимают важное место в экономической жизни фэнтезийного мира. Заклинания, такие как уход в иной мир; телепортация и круг телепортации соединены с этими кругами, которые есть в храмах, академиях, в штаб-квартирах тайных организаций, и на видных общественных местах. Однако, поскольку каждый круг телепортации является возможным средством входа в город, они охраняются военной и магической защитой.
Когда вы создаёте фэнтези город, подумайте, сколько кругов телепортации он может содержать, и о каких из них искатели приключений, вероятней всего, будут знать. Если искатели приключений обычно возвращаются на свою базу с помощью такого круга, используйте его как зацепку для развития сюжетных событий. Что отряд персонажей будет делать, если по прибытии в круг телепортации они обнаружат, что все средства защиты отключены, а охрана лежит в лужах крови? Что если их прибытие прерывает спор между двумя враждующими священниками в храме? Наступает время приключений!
!!__''Воскрешение из мёртвых''__
Когда существо умирает, его душа покидает тело, оставляет Материальный План, проходит через Астральный, и направляется блуждать по плану, где проживает его божество. Если существо не поклоняется божеству, его душа уходит на план, соответствующей его мировоззрению. Возвращение кого-нибудь из мёртвых означает поиск души на том плане и возвращение её обратно в тело.
Враги могут предпринять шаги, чтобы усложнить персонажу возвращение из мёртвых. Сохранение тела не позволяет другим использовать заклинания оживление и воскрешение, чтобы вернуть убитого персонажа к жизни.
Душа не может быть возвращена к жизни, если она этого не желает. Душа знает имя, мировоззрение, и божество-покровителя (если таковое имеется) персонажа, который пытается её возродить, и может отказаться возвращаться. Например, если отважный рыцарь Стурм Светлый Меч убит, и верховная жрица Такхизис (богиня злых драконов) заполучит его тело, Стурм, возможно, не захочет, чтобы она подняла его из мёртвых. Любые её попытки автоматически обречены на провал. Если злая жрица хочет возродить Стурма, чтобы допросить его, она должна найти способ обмануть его душу, например, обманом уговорить доброго священнослужителя оживить его, а затем, как только он ожил — захватить его.
!!!__''Магия договора''__
Исследования тайн и магия, дарованная покровителем, дают вам возможность использовать заклинания. Общие правила по использованию заклинаний смотрите в главе 10, а в главе 11 вы найдёте список заклинаний, доступных колдуну.
!!!''Заговоры''
Вы знаете два заговора на свой выбор из списка заклинаний колдуна. Вы узнаёте дополнительные заговоры колдуна на более высоких уровнях, как показано в колонке «известные заговоры».
!!!''Ячейки заклинаний''
"""Таблица «Колдун» показывает, какое количество ячеек для сотворения заклинаний у вас есть, а также уровень этих ячеек — все ваши ячейки заклинаний одного уровня. Для сотворения одного из заклинаний колдуна 1 уровня и выше вы должны потратить ячейку заклинаний. Вы восстановите все потраченные ячейки, когда завершите короткий или продолжительный отдых.
Например, если ваш персонаж 5 уровня, у вас есть две ячейки заклинаний 3 уровня. Чтобы использовать заклинание 1 уровня волна грома вы должны потратить одну из этих ячеек, и заклинание сработает как заклинание 3 уровня."""
!!!''Известные заклинания первого и более высоких уровней''
"""На 1 уровне вы знаете два заклинания 1 уровня по своему выбору из списка заклинаний колдуна.
Колонка «известные заклинания» показывает, когда вы сможете выучить новые заклинания 1 уровня и выше. Уровень заклинания, которое вы выбрали, не должен превышать уровень ячеек, указанный в таблице для колдуна вашего уровня. Например, когда вы получите 6 уровень, вы изучите новое заклинание колдуна, которое может быть 1, 2 или 3 уровней.
Кроме того, когда вы получаете уровень в этом классе, вы можете выбрать одно из известных вам заклинаний колдуна и заменить его другим заклинанием из списка заклинаний колдуна, с уровнем, не превышающим уровень ячеек заклинаний."""
!!!''Базовая характеристика заклинаний''
При создании заклинаний колдун использует Харизму. Вы используете Харизму в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Харизмы при определении Сл спасбросков от ваших заклинаний колдуна, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Харизмы
:''Модификатор броска атаки'' = бонус мастерства + модификатор Харизмы
!!!''Фокусировка заклинания''
Вы можете использовать магическую фокусировку (смотрите в главе 5) в качестве заклинательной фокусировки для заклинаний колдуна.
//Чудесный предмет, необычный//
Это стеклянная банка, три дюйма в диаметре, содержит 1к4 + 1 доз густой мази, которая слабо пахнет алоэ. Банка и её содержимое весят 0,5 фунта.
Действием можно проглотить или нанести на кожу одну дозу мази. Существо, которое делает так, восстанавливает 2к8 + 2 хита, перестаёт быть отравленным и излечивается от всех болезней.
//Заговор, Иллюзия, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' С, М (кусок овечьей шерсти)
:''Длительность:'' 1 минута
"""Вы создаёте звук или образ предмета в пределах дистанции, существующий, пока активно заклинание. Иллюзия также оканчивается, если вы отпустите её действием или используете это заклинание ещё раз.
Если вы создаёте звук, его громкость может быть как шёпотом, так и криком. Это может быть ваш голос, чей-то другой голос, львиный рык, бой барабанов или любой другой звук. Звук звучит всю длительность заклинания, или вы можете создавать отдельные звуки в разное время, пока заклинание активно.
Если вы создаёте образ предмета — например, стул, отпечаток в грязи, или небольшой сундук — он должен помещаться в куб с длиной ребра 5 футов. Образ не может издавать звуки, свет, запах или прочие сенсорные эффекты. Физическое взаимодействие с образом даёт понять, что это иллюзия, потому что сквозь него всё проходит.
Если существо действием исследует звук или образ, оно может понять, что это иллюзия, совершив успешную проверку Интеллекта (Анализ) против Сл ваших заклинаний. Если существо распознаёт иллюзию, она для него становится нечёткой."""
//2 уровень, Ограждение, Бард/Друид/Жрец/Паладин/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы касаетесь существа и можете окончить одну болезнь или одно состояние, в котором оно находится. Этим состоянием может быть глухота, отравление, паралич или слепота.
//Чудесный предмет, легендарный (требуется настройка волшебником, колдуном или чародеем)//
Этот красивый наряд пошит из белой, серой или чёрной ткани и украшен серебристыми рунами. Цвет мантии соответствует мировоззрению, для которого она и создана. Белые мантии делают для добрых, серые для нейтральных, а чёрные для злых. Вы не можете настроиться на мантию архимага, чьё мировоззрение не совпадает с вашим.
Вы получаете следующие преимущества, пока носите мантию:
* Если вы не носите доспех, ваш базовый Класс Доспеха равен 15 + ваш модификатор Ловкости.
* Вы совершаете с преимуществом спасброски от заклинаний и других магических эффектов.
* Сл спасбросков от ваших заклинаний и бонус атаки заклинаниями увеличиваются на 2.
//Чудесный предмет, редкий (требуется настройка)//
Эта мантия украшена узором в виде глаз. Пока вы носите её, вы обладаете следующими преимуществами:
* Мантия позволяет вам видеть во всех направлениях, и вы совершаете с преимуществом проверки Мудрости (Внимательность), полагающиеся на зрение.
* Вы обладаете тёмным зрением в пределах 120 футов.
* Вы можете видеть невидимых существ и предметы, а также ваше зрение простирается на 120 футов на Эфирный План.
Глаза на мантии нельзя закрыть или отвести в сторону. Вы можете закрыть или увести в сторону свои собственные глаза, но пока вы носите эту мантию, считается, что вы этого никогда не делаете.
Заклинание свет, наложенное на эту мантию, или заклинание дневной свет, наложенное в пределах 5 футов от мантии, вызывает у вас слепоту на 1 минуту. В конце каждого своего хода вы можете совершать спасброски Телосложения (Сл 11 для света или 15 для дневного света), оканчивая слепоту при успехе.
//Чудесный предмет, очень редкий (требуется настройка)//
Эта чёрная или тёмно-синяя мантия украшена белыми или серебристыми звёздочками. Вы получаете бонус +1 к спасброскам, пока носите её.
Шесть звёзд, расположенные на груди, отличаются увеличенным размером. Если вы носите эту мантию, вы можете действием оторвать одну из звёзд и использовать её для наложения заклинания волшебная стрела как заклинания 5 уровня. Каждый день на закате на мантии заново появляются 1к6 звёзд.
Пока вы носите эту мантию, вы можете действием перейти на Астральный План вместе со всем, что вы несёте и носите. Вы остаётесь там, пока не вернётесь действием на тот же самый план. Вы появляетесь в пространстве, которое занимали ранее, или ближайшем пространстве, если прошлое место занято.
//3 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
От вас начинает исходить святая сила аурой с радиусом 30 футов, пробуждающая в дружественных существах отвагу. Пока заклинание активно, аура перемещается вместе с вами, оставаясь с центром на вас. Находясь в ауре, все невраждебные существа (включая вас) при попадании атакой оружием причиняют дополнительный урон 1к4.
//Чудесный предмет, необычный//
Эта мантия покрыта множеством цветных заплат различных размеров и форм. Пока вы носите эту мантию, вы можете действием оторвать одну из заплаток, вследствие чего она превращается в тот предмет, который символизировала. В тот момент, когда будет оторвана последняя заплатка, мантия превращается в обычную одежду.
Мантия содержит по две штуки каждой из заплат, представленных ниже:
* Кинжал
* Направленный фонарь (заправленный и зажжённый)
* Стальное зеркальце
* 10-футовый шест
* Пеньковая верёвка (50 футов, собранная в бухту)
* Мешок
Кроме того, на мантии также есть 4к4 других заплат. Мастер может самостоятельно выбрать, что именно это за заплатки, или же определить их случайным образом.
<table>
<tr>
<th>к100</th>
<th>Заплатка</th>
</tr>
<tr>
<td>01–08 </td>
<td>Сумка со 100 зм</td>
</tr>
<tr>
<td>09–15</td>
<td>Серебряный сундучок (1 фут в длину и 6 дюймов в ширину и высоту)</td>
</tr>
<tr>
<td>16–22 </td>
<td>Железная дверь (до 10 футов в ширину и высоту, имеющая запор с одной стороны), которую вы можете установить в проём, до которого можете дотронуться. Дверь самостоятельно приспосабливается под нужный размер и навешивается на петли</td>
</tr>
<tr>
<td>23–30</td>
<td>10 драгоценных камней стоимостью 100 зм каждый</td>
</tr>
<tr>
<td>31–44</td>
<td>Деревянная лестница (24 фута длиной)</td>
</tr>
<tr>
<td>45–51</td>
<td>Ездовая лошадь с притороченными седельными сумками (смотрите характеристики в Бестиарии)</td>
</tr>
<tr>
<td>52–59</td>
<td>Яма (куб с длиной грани 10 футов, который вы можете разместить на полу в пределах 10 футов от себя)</td>
</tr>
<tr>
<td>60–68</td>
<td>4 зелья лечения</td>
</tr>
<tr>
<td>69–75</td>
<td>Шлюпка (12 футов в длину)</td>
</tr>
<tr>
<td>76–83</td>
<td>Свиток заклинания, содержащий заклинание 1–3 уровня</td>
</tr>
<tr>
<td>84–90</td>
<td>2 мастиффа (смотрите характеристики в Бестиарии)</td>
</tr>
<tr>
<td>91–96</td>
<td>Окно (4 на 2 фута и глубиной до 2 футов), устанавливаемое на вертикальную поверхность, до которой можете дотронуться.</td>
</tr>
<tr>
<td>97–00</td>
<td>Портативный таран</td>
</tr>
</table>
//Чудесный предмет, очень редкий (требуется настройка)//
У этой мантии 3 заряда, и она ежедневно восстанавливает 1к3 заряда на рассвете. Пока вы её носите, вы можете действием потратить 1 заряд, чтобы на ней появился до конца вашего следующего хода узор из завораживающих оттенков. В это время мантия испускает яркий свет в пределах 30 футов и тусклый свет в пределах ещё 30 футов. Существа, видящие вас, совершают по вам броски атаки с помехой. Кроме того, когда свойство мантии активируется, все существа в области яркого света, видящие вас, должны преуспеть в спасброске Мудрости со Сл 15, иначе они станут ошеломлёнными до окончания эффекта.
//Чудесный предмет, редкий (требуется настройка)//
Вы совершаете с преимуществом спасброски от заклинаний, пока носите этот плащ.
!!!''Маска многих лиц''
"""Вы можете неограниченно накладывать заклинание маскировка, не тратя ячейки заклинаний."""
//1 уровень, Иллюзия, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' 1 час
"""Вы заставляете себя — включая одежду, доспехи, оружие и прочее имущество — выглядеть иначе, пока заклинание не окончится, или пока вы не окончите его преждевременно, действием. Вы можете выглядеть на 1 фут (30 сантиметров) выше или ниже, а также стать худым, толстым или получить среднее телосложение. Вы не можете менять основу тела, поэтому у новой формы должен быть такой же набор конечностей. Во всём остальном характер иллюзии определяете вы.
Изменения, вызванные этим заклинанием, не выдерживают проверку физическим исследованием. Например, если вы добавили к своему снаряжению шляпу, предметы будут проходить сквозь неё, и все, кто к ней прикоснутся, либо ничего не почувствуют, либо почувствуют вашу голову и волосы. Если вы становитесь худее, то рука того, кто к вам тянется, наткнётся на вас на полпути, ещё в воздухе.
Для обнаружения того, что вы замаскированы, существо должно действием обследовать вашу внешность и преуспеть в проверке Интеллекта (Анализ) против вашей Сл заклинаний."""
!!!''__Маскировка на виду__''
"""Начиная с 10 уровня, вы можете потратить 1 минуту для создания персонального камуфляжа. У вас должен быть доступ к свежим илу, грязи, растениям, саже и другим природным материалам, с помощью которых будет создаваться камуфляж.
После того как вы замаскировались подобным образом, вы можете попытаться спрятаться, прижавшись к твёрдой поверхности, такой как дерево или стена, не уступающей вам по высоте и ширине. Вы получаете бонус +10 к проверкам Ловкости (Скрытность), пока находитесь без движения и не предпринимаете действий. После того как вы переместились, совершили действие или реакцию, вы должны снова маскироваться с самого начала, чтобы получить это преимущество."""
//Зелье, очень редкое//
Это прозрачное и густое масло сверкает от крошечных серебристых включений. Масло может покрыть одно рубящее или колющее оружие или до 5 рубящих или колющих боеприпасов. Нанесение масла занимает 1 минуту. В течение часа покрытые предметы считаются магическими и предоставляют бонус +3 к броскам атаки и урона.
//Зелье, необычное//
Эта липкая, чёрная мазь, хранящаяся в толстостенном и тяжёлом контейнере, очень текуча. Маслом можно обмазать одно существо Среднего или меньшего размера, вместе с одеждой и переносимым им снаряжением (на каждую категорию размера выше Среднего необходим один дополнительный пузырёк масла). Нанесение масла занимает 10 минут. Обмазанное существо получает на 8 часов эффект заклинания свобода перемещения.
В качестве альтернативы, можно действием разлить масло по полу, покрыв площадь 10 х 10 футов. Эффект будет такой же, как от заклинания скольжение длительностью 8 часов.
//Зелье, редкое//
Крошечные капли этого серого масла очень быстро испаряются. Маслом можно обмазать одно существо Среднего или меньшего размера, вместе с одеждой и переносимым им снаряжением (на каждую категорию размера выше Среднего необходим один дополнительный пузырёк масла). Нанесение масла занимает 10 минут. Обмазанное существо получает на 1 час эффект заклинания эфирность.
!!!''Мастер бесчисленных обликов''
"""//Требование: 15 уровень//
Вы можете неограниченно накладывать заклинание смена обличья, не тратя ячейки заклинаний."""
!!__''Мастер боевых искусств''__
Тот, кто выбрал архетип мастера боевых искусств, полагается на техники, выработанные поколениями бойцов. Для такого воина сражение сродни академической задаче, и часто включает вещи, далёкие от боя, вроде кузнечного мастерства или каллиграфии. Не все воины способны впитать уроки истории, теорию и артистизм, отражённые в архетипе мастера боевых искусств, но те, кто смог сделать это, являются отлично подготовленными воинами, обладающими прекрасными навыками и знаниями.
!!!''Боевое превосходство''
Если на 3 уровне вы выбираете этот архетип, вы изучаете приёмы, использующие специальные кости, называемые костями превосходства.
* """//''Приёмы.''//Вы изучаете три приёма на ваш выбор. Они описаны в разделе «приёмы», расположенном ниже. Большинство приёмов тем или иным образом усиливают атаку. Во время одной атаки вы можете использовать только один приём.
Вы изучаете два дополнительных приёма при достижении 7, 10 и 15 уровней. Каждый раз, при изучении новых приёмов, вы можете также заменить один из известных вам приёмов на другой."""
* """//''Кости превосходства.''// У вас есть четыре кости превосходства. Это кости к8. Кости превосходства тратятся при использовании. Вы восполняете все потраченные кости в конце короткого или продолжительного отдыха.
Вы получаете ещё по одной кости превосходства на 7 и 15 уровнях."""
* ''//Спасброски.//'' Некоторые из ваших приёмов требуют от цели спасброска, чтобы избежать эффекта приёма. Сложность такого спасброска рассчитывается следующим образом:
;
://''Сл спасброска приёма''// = 8 + ваш бонус мастерства + модификатор Силы или Ловкости (на ваш выбор)
!!!''Ученик войны''
На 3 уровне вы осваиваете владением одним из ремесленных инструментов на ваш выбор.
!!!''Познай своего врага''
Начиная с 7 уровня, если вы потратите как минимум 1 минуту, рассматривая, или по другому взаимодействуя с существом вне боя, вы можете узнать некоторую информацию о его способностях в сравнении с вашими. Мастер сообщит вам, равняется ли существо, превосходит или уступает вам в двух характеристиках на ваш выбор из перечисленных:
* Значение Силы
* Значение Ловкости
* Значение Телосложения
* Класс Доспеха
* Текущие хиты
* Общее количество уровней (если есть)
* Количество уровней в классе Воин (если есть)
!!!''Улучшенное боевое превосходство''
На 10 уровне ваша кость превосходства увеличивается до к10. На 18 уровне — до к12.
!!!''Неослабевающий''
Начиная с 15 уровня, если вы совершаете бросок инициативы, не имея костей превосходства, вы получаете одну.
!!!''Приёмы''
Приёмы приведены в алфавитном порядке.
//''Активное уклонение.''// При перемещении вы можете потратить одну кость превосходства, совершить её бросок и добавить выпавшее значение к КД, пока не прекратите перемещение.
//''Атака с выпадом.''// Если вы в свой ход совершаете рукопашную атаку оружием, вы можете потратить одну кость превосходства, чтобы увеличить досягаемость этой атаки на 5 футов. В случае попадания вы добавляете кость превосходства к броску урона этой атаки.
//''Атака с манёвром.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы один из ваших товарищей смог переместиться в более выгодное положение. Вы добавляете кость превосходства к броску урона этой атаки и выбираете дружественное существо, которое может видеть или слышать вас. Это существо может реакцией переместиться на расстояние до половины своей скорости, не провоцируя при этом атаки от цели вашей атаки.
//''Атака с угрозой.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы попытаться напугать цель. Вы добавляете кость превосходства к броску урона этой атаки, а цель должна совершить спасбросок Мудрости. При провале цель испугана вами до конца вашего следующего хода.
//''Атака с финтом.''// Вы можете в свой ход потратить одну кость превосходства и бонусным действием совершить финт, выбрав в качестве цели одно существо в пределах 5 футов. Следующий бросок атаки по этому существу вы совершаете с преимуществом. Если атака попадает, добавьте кость превосходства к броску урона этой атаки. Оба преимущества пропадают, если вы не используете их в том же ходу, в котором получили их.
//''Обезоруживающая атака.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы попытаться обезоружить противника, заставляя его выронить один предмет по вашему выбору, который он держит. Вы добавляете кость превосходства к броску урона атаки, а цель должна совершить спасбросок Силы. В случае провала она роняет выбранный вами предмет. Предмет падает у её ног.
//''Опрокидывающая атака.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы попытаться сбить цель с ног. Вы добавляете кость превосходства к броску урона атаки, и, если размер цели Большой или меньше, она должна совершить спасбросок Силы. В случае провала вы сбиваете цель с ног.
//''Ответный удар.''// Если существо промахивается по вам рукопашной атакой, вы можете реакцией потратить одну кость превосходства, чтобы совершить рукопашную атаку оружием по этому существу. Если вы попадаете, вы добавляете кость превосходства к броску урона этой атаки.
//''Отвлекающий удар.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы отвлечь существо, открывая его для ваших союзников. Вы добавляете кость превосходства к броску урона этой атаки. Следующий бросок атаки по этой цели любого существа кроме вас совершается с преимуществом, если атака совершается до начала вашего следующего хода.
//''Парирование.''// Если другое существо причиняет вам урон рукопашной атакой, вы можете реакцией потратить одну кость превосходства, чтобы уменьшить урон на величину, равную броску вашей кости превосходства + ваш модификатор Ловкости.
''//Провоцирующая атака//''. Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы попытаться спровоцировать противника атаковать вас. Вы добавляете кость превосходства к броску урона этой атаки, а цель должна совершить спасбросок Мудрости. При провале цель до конца вашего следующего хода совершает с помехой броски атаки по всем целям, кроме вас.
//''Сплочение.''// Вы можете в свой ход бонусным действием потратить одну кость превосходства, чтобы поддержать решимость одного из ваших спутников. Если вы это сделаете, выберите дружественное существо, которое может видеть или слышать вас. Это существо получает временные хиты, равные броску кости превосходства + ваш модификатор Харизмы.
//''Толкающая атака.''// Если вы попадаете по существу атакой оружием, вы можете потратить одну кость превосходства, чтобы попытаться оттолкнуть цель. Вы добавляете кость превосходства к броску урона атаки, и, если размер цели Большой или меньше, она должна совершить спасбросок Силы. При провале вы толкаете цель на расстояние до 15 футов от себя.
//''Точная атака.''// Если вы совершаете бросок атаки оружием по существу, вы можете потратить одну кость превосходства, чтобы добавить её к броску. Вы можете использовать этот приём до или после совершения броска атаки, но до применения эффектов атаки.
//''Удар командующего.''// Если вы совершаете в свой ход действие Атака, вы можете отказаться от одной из ваших атак и бонусным действием направить удар одного из ваших соратников. Если вы это сделаете, выберите дружественное существо, которое может видеть или слышать вас и потратьте одну кость превосходства. Это существо может немедленно совершить реакцией одну атаку оружием, добавив кость превосходства к броску урона этой атаки.
//''Широкая атака.''// Если вы попадаете по существу атакой рукопашным оружием, вы можете потратить одну кость превосходства, чтобы попытаться причинить урон другому существу этой же атакой. Выберите другое существо в пределах 5 футов от первоначальной цели и в пределах вашей досягаемости. Если исходный бросок атаки попал бы по второму существу, оно получает урон, равный броску кости превосходства. Урон того же вида, что и для исходной атаки.
!!!''__Мастер на все руки__''
Начиная со 2 уровня вы можете добавлять половину бонуса мастерства, округлённую в меньшую сторону, ко всем проверкам характеристик, куда этот бонус ещё не включён.
!!!''__Мастерство заклинателя__''
"""На 18 уровне вы достигаете такого мастерства в отношении некоторых заклинаний, что можете творить их неограниченное количество раз. Выберите одно заклинание волшебника 1 уровня и одно заклинание волшебника 2 уровня, которые есть в вашей книге заклинаний. Вы можете использовать эти заклинания без увеличения их уровня, не тратя ячеек заклинаний, при условии, что вы их подготовили. Если вы хотите увеличить уровень этих заклинаний, вы должны потратить ячейку заклинаний как обычно.
Потратив 8 часов на обучение, вы можете изменить одно или оба этих заклинания по своему усмотрению на заклинания тех же уровней."""
//3 уровень, Ограждение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Это заклинание дарует надежду и живучесть. Выберите любое количество существ в пределах дистанции. Пока заклинание активно, все цели совершают спасброски Мудрости и спасброски от смерти с преимуществом, а также восстанавливают от любого лечения максимально возможное количество хитов.
//Чудесный предмет, редкий//
Вы можете действием поместить этот металлический кубик с длиной ребра 1 дюйм на пол и произнести командное слово. Куб быстро вырастет в крепость, которая остаётся, пока вы не произнесёте действием командное слово, которое сработает только если крепость пуста.
Крепость является квадратной башней 20 х 20 футов и 30 футов высотой, с бойницами и зубчатой стеной сверху. Внутри она поделена на два этажа, соединённых лестницей, идущей вдоль одной из стен. Лестница заканчивается наверху люком. После активации в ближайшей к вам стене будет небольшая дверь. Дверь открывается только по вашей команде, которую вы произносите бонусным действием. Она обладает иммунитетом к заклинанию открывание и подобной магии, например, к колокольчику открывания.
Все существа, находящиеся в области, в которой появляется крепость, должны совершить спасбросок Ловкости со Сл 15, получая дробящий урон 10к10 при провале или половину этого урона при успехе. В любом случае, такое существо выталкивается в ближайшее свободное пространство вне крепости. Предметы в этой области, которые никто не несёт и не носит, получают этот же урон и автоматически толкаются.
Башня изготовлена из адамантина, и магия не даёт её опрокинуть. У крыши, двери и стен по 100 хитов, иммунитет к урону от немагического оружия, исключая осадное оружие, и сопротивление ко всем остальным видам урона. Чинить крепость можно только заклинанием исполнение желаний (это считается дублированием заклинания с уровнем ниже 9). Каждое накладывание этого заклинания восстанавливает крыше, двери или одной из стен 50 хитов.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите этот медальон, ваше состояние стабилизируется каждый раз, когда вы находитесь в умирающем состоянии в начале своего хода. Кроме того, каждый раз, когда вы бросаете Кости Хитов для восстановления хитов, вы удваиваете число восстановленных хитов.
//Чудесный предмет, редкий//
На этой изысканной серебряной цепочке висит подвеска из чёрного драгоценного камня бриллиантовой огранки. Пока вы её носите, яды не оказывают на вас эффекта. Вы обладаете иммунитетом к состоянию «отравлен» и к урону ядом.
//Чудесный предмет, необычный//
Вы обладаете иммунитетом ко всем болезням, пока носите этот медальон. Если вы уже болеете, эффект болезни подавляются на время, пока вы носите этот медальон.
//Чудесный предмет, необычный (требуется настройка)//
У этого медальона есть 3 заряда. Пока вы его носите, вы можете действием потратить 1 заряд, чтобы наложить им заклинание обнаружение мыслей (Сл спасброска 13). Медальон ежедневно восстанавливает 1к3 заряда на рассвете.
!!!''__Медленное падение__''
Начиная с 4 уровня, если вы упали, вы можете реакцией уменьшить урон от падения на значение, равное вашему уровню монаха, умноженному на пять.
"""Между походами в подземелья и сражениями с древним злом искателям приключений нужно время на отдых, восстановление и подготовку к следующим приключениям. Многие также используют это время для выполнения других задач, таких как создание оружия и доспехов, проведение исследований и трата заработанного золота.
В некоторых случаях время проходит без примечательных событий. Начиная новое приключение, Мастер может просто объявить, что прошло такое-то количество времени, и позволить вам поверхностно описать, чем занимались ваши персонажи. Мастер может наоборот, пристально следить за потраченным временем, потому что параллельно этим событиям происходит что-то другое, невидимое вам."""
!!!__''Затраты на существование''__
"""Между приключениями вы выбираете образ жизни и платите за него, как написано в [[главе 5|09. Расходы]].
На вашего персонажа выбранный стиль жизни не оказывает большого эффекта, но он может влиять на то, как другие реагируют на вас. Например, если вы ведёте аристократическое существование, вам проще будет повлиять на дворян, чем если бы вы жили в нищете."""
!!!__''Деятельность во время простоя''__
"""Между приключениями Мастер может спросить, чем ваш персонаж занимается во время простоя. Периоды простоя могут быть разными, но каждая деятельность требует определённое количество дней для завершения, и как минимум 8 часов каждого дня должны быть потрачены на деятельность, чтобы этот день был засчитан. Дни не обязаны быть последовательными. Если у вас больше дней простоя, чем вам нужно потратить, вы можете заниматься одним делом чуть дольше, а можете переключиться на новую деятельность.
Возможна и другая деятельность кроме тех вариантов, что описаны ниже. Если вы хотите, чтобы персонаж тратил время простоя на что-то другое, посоветуйтесь с Мастером."""
!!!''Ремесло''
"""Вы можете создавать немагические предметы, включая снаряжение для приключений и предметы искусства. Вы должны владеть инструментами, связанными с создаваемым предметом (обычно это инструмент ремесленника). Вам также могут потребоваться особые материалы или место для создания. Например, даже если вы владеете инструментами кузнеца, вам всё равно нужна кузница для создания меча или доспеха.
За каждый день простоя, потраченный на создание предмета, вы можете создать один или несколько предметов, с суммарной рыночной стоимостью не более 5 зм, но вы должны потратить сырья стоимостью в половину этой суммы. Если рыночная стоимость того, что вы создаёте, больше 5 зм, вы копите за каждый день по 5 зм, пока не достигнете полной стоимости предмета. Например, комплект лат (рыночная стоимость 1 500 зм) создаётся в одиночку за 300 дней.
Несколько персонажей могут объединять усилия, создавая один предмет, при условии, что все они владеют требуемыми инструментами и работают сообща в одном месте. Каждый персонаж вкладывает по 5 зм в день в создание предмета. Например, три персонажа, владеющие нужными инструментами, и имеющие доступ к кузнице, могут создать комплект лат за 100 дней, затратив сообща 750 зм.
Во время создания предметов вы можете поддерживать скромное существование, не тратя по 1 зм в день, или комфортное существование за половину обычной стоимости (подробности смотрите в [[главе 5|09. Расходы]])."""
!!!''Работа по профессии''
"""Вы можете работать между приключениями, что позволяет вам поддерживать скромное существование, не тратя по 1 зм в день (подробности смотрите в [[главе 5|09. Расходы]]). Это преимущество длится, пока вы продолжаете работать по профессии.
Если вы член организации, способной дать прибыльную работу, такой как храм или гильдия воров, вы зарабатываете достаточно для поддержания комфортного существования.
Если вы владеете навыком Выступление и используете его во время простоя, вы зарабатываете достаточно, чтобы вести богатое существование."""
!!!''Восстановление''
"""Вы можете использовать простой между приключениями для избавления от ранений, болезней и отравлений.
За три дня простоя, потраченных на восстановление, вы можете совершить один спасбросок Телосложения со Сл 15. В случае успеха вы можете выбрать один из следующих результатов:"""
* Окончите один эффект на себе, не дающий восстанавливать хиты.
* В течение следующих 24 часов вы совершаете с преимуществом спасброски от одной болезни или яда, действующего в данный момент на вас.
!!!''Исследование''
Время между приключениями отлично подходит для совершения исследований и попыток разгадать тайны, возникающие по ходу кампании. Исследование может включать кропотливое исследование пыльных книг и свитков в библиотеке, или покупку выпивки для местных пьяниц в надежде услышать от них слухи и сплетни.
Когда вы начинаете исследование, Мастер определяет, доступна ли эта информация, сколько дней простоя требуется для её обнаружения, и есть ли какие-то ограничения (такие как необходимость найти определённую личность, книгу или место. Мастер может также потребовать совершения проверок характеристик, таких как Интеллект (Анализ), чтобы найти подсказки к разыскиваемой информации, или Харизма (Убеждение), чтобы заполучить чью-то помощь. Выполнив эти условия, вы получаете искомую информацию, если она доступна.
За каждый день исследований вы должны потратить на расходы 1 зм. Эта стоимость добавляется к затратам на существование (смотрите в [[главе 5|09. Расходы]]).
!!!''Обучение''
"""Вы можете тратить время между приключениями на изучение новых языков и тренировку обращения с инструментами. Мастер может позволить дополнительные варианты обучения.
Во-первых, вы должны найти согласного учителя. Мастер определяет, сколько времени на это уйдёт, и какие проверки характеристик для этого потребуются.
Обучение длится 250 дней и стоит 1 зм в день. Потратив нужное количество времени и денег, вы изучаете новый язык или получаете владение новым инструментом."""
//2 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (порошок из листьев ревеня и желудок гадюки)
:''Длительность:'' Мгновенная
К цели, находящейся в пределах дистанции, устремляется мерцающая зелёная стрела, разлетающаяся брызгами кислоты. Совершите по цели дальнобойную атаку заклинанием. При попадании цель получает единовременно урон кислотой 4к4 и урон кислотой 2к4 в конце своего следующего хода. При промахе стрела немного задевает цель, причиняет половину единовременного урона и в конце следующего хода цель урона не получает.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон (и единовременный и последующий) увеличивается на 1к4 за каждый уровень ячейки выше второго.
//5 уровень, Прорицание, Волшебник (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (кусочки яичной скорлупы двух разных видов существ)
:''Длительность:'' 1 час
"""Вы создаёте телепатическую связь между восемью согласными существами на ваш выбор в пределах досягаемости. Существа с Интеллектом 2 и ниже не попадают под действие этого заклинания.
Пока заклинание активно, цели могут телепатически общаться посредством этой связи, даже если у них нет общего языка. Общение возможно на любом расстоянии, но оно не может простираться на другие планы существования."""
//3 уровень, Преобразование, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' 1 минута
"""Пока заклинание активно, бросайте к20 в конце каждого своего хода. Если выпадет «11» или выше, вы исчезаете на текущем плане существования и появляетесь на Эфирном Плане (заклинание проваливается, если вы уже находитесь на этом плане). В начале своего следующего хода, а также если заклинание окончится, когда вы будете на Эфирном Плане, вы возвращаетесь в свободное пространство на свой выбор, которое вы видите в пределах 10 футов от места, из которого вы исчезли. Если в пределах дистанции нет свободного пространства, вы появляетесь в ближайшем свободном пространстве (выбранном случайным образом, если есть несколько подходящих мест). Вы можете остановить заклинание действием.
Находясь на Эфирном Плане, вы можете видеть и слышать на плане, с которого пришли, видя всё в оттенках серого и не видя того, что происходит за пределами 60 футов. Вы можете воздействовать только на существ, находящихся на Эфирном Плане, и только такие существа могут воздействовать на вас. Существа, не находящиеся там, не могут вас воспринимать и взаимодействовать с вами, если у них нет таких возможностей."""
!!!__''Метамагия''__
"""На 3 уровне вы получаете способность подстраивать заклинания под свои нужды. Вы выбираете два варианта метамагии из перечисленных ниже. На 10 и 17 уровне вы получаете ещё по одному варианту.
При сотворении заклинания может быть использован только один метамагический вариант, если в его описании не указано обратное."""
!!!''Аккуратное заклинание''
"""Когда вы накладываете заклинание, которое вынуждает других существ совершить спасбросок, вы можете защитить некоторых из них от магического воздействия. Для этого вы тратите 1 единицу чародейства и выбираете существ в количестве, равном вашему модификатору Харизмы (минимум одно существо). Указанные существа автоматически преуспевают в спасброске от данного заклинания."""
!!!''Далёкое заклинание''
"""При накладывании заклинания, дистанция которого 5 футов и более, вы можете потратить 1 единицу чародейства, чтобы удвоить это расстояние.
При накладывании заклинания с дистанцией «прикосновение», вы можете потратить 1 единицу чародейства, чтобы увеличить это расстояние до 30 футов."""
!!!''Непреодолимое заклинание''
"""Когда вы накладываете заклинание, которое вынуждает существо совершить спасбросок для защиты от его эффектов, вы можете потратить 3 единицы чародейства, чтобы одна из целей заклинания совершила первый спасбросок от этого заклинания с помехой."""
!!!''Неуловимое заклинание''
Во время использования заклинания вы можете потратить 1 единицу чародейства, чтоб сотворить его без вербальных и соматических компонентов.
!!!''Продлённое заклинание''
При накладывании заклинания с длительностью 1 минута или более, вы можете потратить 1 единицу чародейства, чтобы удвоить это время, вплоть до максимального в 24 часа.
!!!''Удвоенное заклинание''
Если вы используете заклинание, нацеливаемое на текущем накладываемом уровне только на одно существо и не имеющее дальность «на себя», вы можете потратить количество единиц чародейства, равное уровню заклинания (1 для заговоров), чтобы нацелиться им на второе существо-цель в пределах дистанции этого заклинания.
!!!''Усиленное заклинание''
"""При совершении броска урона от заклинания вы можете потратить 1 единицу чародейства, чтобы перебросить несколько костей урона (количество равно вашему модификатору Харизмы, минимум одна). Вы должны использовать новое выпавшее значение.
Вы можете воспользоваться вариантом «усиленное заклинание» даже если вы уже использовали другой вариант метамагии для этого заклинания."""
!!''Ускоренное заклинание''
Если вы используете заклинание со временем накладывания «1 действие», вы можете потратить 2 единицы чародейства, чтобы сотворить это заклинание бонусным действием.
//Оружие (метательное копьё), необычное//
Это метательное копьё — магическое оружие. Если вы метнёте его и произнесёте его командное слово, оно превратится в молнию, формируя линию шириной 5 футов и простирающуюся от вас до цели, находящейся в пределах 120 футов. Все существа в этой линии, исключая вас и цель, должны совершить спасбросок Ловкости со Сл 13, получая урон электричеством 4к6 при провале или половину этого урона при успехе.
Молния снова становится копьём, когда достигает цели. Совершите дальнобойную атаку оружием по цели. При попадании цель получает урон от метательного копья плюс урон электричеством 4к6.
Это свойство метательного копья нельзя использовать повторно до следующего рассвета. Однако оно всё равно может использоваться как магическое оружие.
//3 уровень, Вызов, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (щепотка пыли и несколько капель воды)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Пока заклинание активно, в цилиндре высотой 20 футов и радиусом 40 футов с центром на точке, выбранной вами в пределах дистанции, идёт мокрый снег. Это сильно заслонённая местность, и открытые источники огня в ней тухнут.
Пол в этой местности покрывается скользким льдом, что делает его труднопроходимой местностью. Когда существо впервые за ход входит в область заклинания или начинает там ход, оно должно совершить спасбросок Ловкости. При провале оно падает ничком.
Если существо концентрируется, находясь в области заклинания, оно должно совершить успешный спасбросок Телосложения против Сл ваших заклинаний, иначе оно потеряет концентрацию."""
//9 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 1 миля
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Пылающие шары ударяют о землю в четырёх разных точках, видимых в пределах дистанции. Все существа в сфере с радиусом 40 футов с центром на каждой из точек должны совершить спасбросок Ловкости. Сфера огибает углы. Существо получает при провале урон огнём 20к6 и дробящий урон 20к6, или половину урона при успехе. Существо, находящееся в области двух взрывов получает урон только один раз.
Заклинание причиняет урон предметам и воспламеняет горючие предметы, которые никто не несёт и не носит."""
//1 уровень, Прорицание, Следопыт//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы выбираете существо, видимое в пределах дистанции, и объявляете его своей добычей. Пока заклинание активно, вы причиняете цели дополнительный урон 1к6 каждый раз, когда попадаете по ней атакой оружием, и вы совершаете с преимуществом проверки Мудрости (Внимательность) и Мудрость (Выживание), совершённые для её поиска. Если хиты цели опускаются до 0, пока заклинание активно, вы можете в свой следующий ход бонусным действием выбрать целью новое существо.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 или 4 уровня, вы можете поддерживать концентрацию 8 часов. Если вы используете ячейку заклинания 5 уровня или выше, вы можете поддерживать концентрацию 24 часа.
//Заговор, Прорицание, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' С
:''Длительность:'' Концентрация, вплоть до 1 раунда
Вы вытягиваете руку и указываете пальцем на цель, находящуюся в пределах дистанции. Ваша магия даёт краткое понимание защит цели. В своём следующем ходу вы совершаете с преимуществом первый бросок атаки по цели, при условии, что заклинание к тому моменту не окончится.
//Оружие (любой меч, причиняющий рубящий урон), легендарное (требуется настройка)//
Вы получаете бонус +3 к броскам атаки и урона этим магическим оружием. Кроме того, это оружие игнорирует сопротивление к рубящему урону.
Если вы атакуете этим оружием существо, у которого есть как минимум одна голова, и при броске атаки у вас выпадает «20», вы отрубаете одну из голов чудовища. Существо умирает, если не может жить без головы. Существо обладает иммунитетом к этому эффекту, если обладает иммунитетом к рубящему урону, не имеет головы или не нуждается в ней, обладает легендарными действиями или Мастер решает, что существо слишком большое, чтобы вы могли отрубить ему голову этим оружием. Такие существа вместо этого получают рубящий урон 6к8.
!!!!''Меч Каса''
//Чудесный предмет, артефакт (требуется настройка)//
Когда Векна получил власть, он сделал злого и безжалостного полководца, Каса Кроваворукого, своим телохранителем и приближенным. Этот злодей был советником, военачальником и наёмным убийцей. За выдающиеся успехи он заслужил уважение Векны и награду: меч, с происхождением, таким же тёмным, как его хозяин.
Кас долго служил личу, но вместе с его собственной силой росла и его гордыня. Его меч убедил его уничтожить Векну, чтобы он сам мог править империей. Легенды гласят, что Векна был уничтожен рукой Каса, но и Векна уничтожил своего полководца, оставив один лишь только меч. После этого мир стал светлее.
Меч Каса это магический, разумный длинный меч, предоставляющий бонус +3 к броскам атаки и урона, совершённым им. Он совершает критическое попадание при выпадении «19-20», а нежити причиняет дополнительный урон 2к10.
Если меч не испробует крови через 1 минуту после того как его вынут из ножен, владелец совершает спасбросок Харизмы со Сл 15. В случае успеха он получает урон психической энергией 3к6. При провале владелец становится доминируемым мечом, как будто под заклинанием подчинение чудовища, и меч требует, чтобы его омыли кровью. Эффект заклинания оканчивается, когда требование меча будет выполнено.
;
://''Случайные свойства.''// Меч Каса обладает несколькими свойствами, определяемыми случайным образом:
* 1 малое положительное свойство
* 1 основное положительное свойство
* 1 малое отрицательное свойство
* 1 основное отрицательное свойство
://''Дух Каса.''// Пока Меч находится у вас, вы добавляете к10 к инициативе в начале каждого сражения. Кроме того, когда вы действием атакуете Мечом, вы можете передать весь его бонус атаки или его часть к Классу Доспеха Изменённые бонусы остаются действовать до начала вашего следующего хода.
://''Заклинания.''// Пока Меч находится у вас, вы можете действием наложить им одно из следующих заклинаний (Сл спасброска 18): божественное слово, перст смерти или призыв молнии. Использовав Меч для накладывания заклинания, вы до следующего рассвета не сможете повторно наложить им это же самое заклинание.
:"""//''Разум.''// Меч Каса — разумное хаотично-злое оружие с Интеллектом 15, Мудростью 13 и Харизмой 16. Он обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие может понимать Общий язык, а также говорить и читать на нём и телепатически общаться с владельцем."""
:"""//''Индивидуальность.''// Предназначение меча в уничтожении Векны. Для этого нужно убивать последователей Векны, уничтожать плоды его деяний и срывать планы.
Меч Каса также стремится уничтожать тех, кто развращён Глазом и Рукой Векны. Одержимость Меча этими артефактами, в конечном счете, передаётся и его владельцу."""
://''Уничтожение Меча.''// Существо, настроенное на Глаз Векны и Руку Векны, может использовать свойство объединённых артефактов накладывать заклинание исполнение желаний, чтобы уничтожить Меч Каса. Существо должно наложить заклинание исполнение желаний и совершить проверку Харизмы, противопоставленную проверке Харизмы Меча. Меч при этом должен находиться в пределах 30 футов, иначе заклинание будет потрачено впустую. Если состязание выиграет Меч, ничего не произойдёт, и заклинание исполнение желаний будет потрачено впустую. Если Меч проиграет, он уничтожается.
//Оружие (любой меч), редкое (требуется настройка)//
Если вы атакуете этим магическим оружием существо, и при броске атаки выпадает «20», эта цель получает дополнительный урон некротической энергией 10, если не является ни конструктом, ни нежитью. Вы также получаете 10 временных хитов.
//Оружие (любой меч), необычное (требуется настройка)//
Вы получаете бонус +1 к броскам атаки и урона этим магическим оружием.
//''Проклятье.''// Этот меч проклят и одержим мстительным духом. Настроившись на него, вы тоже становитесь проклятым. Пока вы прокляты, вы не желаете расставаться с эти мечом, и всегда держите его при себе. Пока вы настроены на это оружие, вы совершаете с помехой все броски атаки другим оружием.
Кроме того, пока меч находится у вас, вы должны совершать спасбросок Мудрости со Сл 15 каждый раз, когда получаете урон в сражении.
При провале вы должны атаковать существо, причинившее вам урон, пока хиты одного из вас не опустятся до 0, или пока вы не сможете дотянуться до существа, чтобы совершить по нему рукопашную атаку.
Вы можете избавиться от проклятья как обычно. В качестве альтернативы, накладывание изгнания на меч заставляет мстительный дух покинуть его. После этого меч становится обычным оружием +1 без особых свойств.
//7 уровень, Воплощение, Бард/Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (миниатюрный платиновый меч с рукояткой и навершием из меди и цинка, стоящий 250 зм)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте сгусток силового поля в форме меча, парящий в пределах дистанции. Он существует, пока активно заклинание.
Когда меч появляется, вы совершаете рукопашную атаку заклинанием по цели на ваш выбор, находящейся в пределах 5 футов от меча. При попадании цель получает урон силовым полем 3к10. Пока заклинание активно, вы можете в каждом своём ходу бонусным действием перемещать меч на 20 футов в видимое место, и повторять эту атаку по той же самой или другой цели."""
//Оружие (любой меч, причиняющий рубящий урон), очень редкое (требуется настройка)//
Если вы атакуете этим магическим мечом предмет и попадаете, кости урона причиняют цели максимальный урон.
Если вы атакуете этим оружием существо, и при броске атаки выпадает «20», эта цель получит дополнительный рубящий урон 14. После этого бросьте ещё к20. Если выпадет «20», вы отрубаете одну из конечностей цели, а эффект этого определяет Мастер. Если у существа не было конечностей, вы отрубаете часть его тела.
Кроме того, вы можете произнести командное слово меча, чтобы клинок начал излучать яркий свет в радиусе 10 футов и тусклый свет в пределах ещё 10 футов. Повторное произнесение этого слова или убирание меча в ножны гасит свет.
//Оружие (длинный меч) легендарное (требуется настройка существом с тем же мировоззрение, что у меча)//
В мире Грейхок известны девять таких мечей. Все они изготовлены по образу легендарного меча, Фра-гараха, чьё название часто переводят как «Последнее слово». У каждого из девяти мечей есть своё название и своё мировоззрение, и у всех у них в навер-шии использованы разные драгоценные камни.
<table>
<tr>
<th>Название</th>
<th>Мировоззрение</th>
<th>Камень</th>
</tr>
<tr>
<td>Возразитель</td>
<td>Законно-доброе</td>
<td>Аквамарин</td>
</tr>
<tr>
<td>Грубитель</td>
<td>Законно-злое</td>
<td>Гранат</td>
</tr>
<tr>
<td>Дерзитель</td>
<td>Хаотично-злое</td>
<td>Агат</td>
</tr>
<tr>
<td>Опровергатель</td>
<td>Нейтрально-доброе</td>
<td>Топаз</td>
</tr>
<tr>
<td>Ответчик</td>
<td>Хаотично-доброе</td>
<td>Изумруд</td>
</tr>
<tr>
<td>Подавитель</td>
<td>Нейтрально-злое</td>
<td>Шпинель</td>
</tr>
<tr>
<td>Рассказчик</td>
<td>Нейтральное</td>
<td>Перидот</td>
</tr>
<tr>
<td>Решатель</td>
<td>Законно-нейтральное</td>
<td>Аметист</td>
</tr>
<tr>
<td>Язвитель</td>
<td>Хаотично-нейтральное</td>
<td>Турмалин</td>
</tr>
</table>
Вы получаете бонус +3 к броскам атаки и урона, совершаемым этим мечом. Кроме того, пока вы держите этот меч, вы можете реакцией совершать им одну рукопашную атаку по существу, находящемуся в пределах вашей досягаемости, которое причиняет вам урон. Вы совершаете этот бросок атаки с преимуществом, и урон, причиняемый этой особой атакой, игнорирует все сопротивления к урону и иммунитеты, которые могут быть у цели.
//Оружие (любой меч), редкое (требуется настройка)//
Хиты, потерянные из-за урона этим оружием, могут восстановиться только за счёт короткого или продолжительного отдыха, а не за счёт регенерации, магии и других средств.
Один раз в ход, когда вы попадаете по существу атакой, используя это магическое оружие, вы можете ранить цель. В начале каждого своего хода раненое существо получает урон некротической энергией 1к4 за каждое ранение, а потом совершает спасбросок Телосложения со Сл 15, оканчивая эффекты всех таких ран на себе при успехе. В качестве альтернативы, раненое существо или любое существо в пределах 5 футов от неё может действием совершить проверку Мудрости (Медицина) со Сл 15, оканчивая эффект таких ран на нём при успехе.
//4 уровень, Иллюзия, Бард/Волшебник/Друид/Колдун//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 300 футов
:''Компоненты:'' В, С, М (камень, ветка, и кусочек зелёного растения)
:''Длительность:'' 24 часа
"""Вы заставляете природную местность в пределах куба с длиной ребра 150 футов, находящегося в пределах дистанции, выглядеть, звучать и пахнуть как другая природная местность. Таким образом, поле или дорогу можно сделать похожей на болото, холм, расселину или другую труднопроходимую или непроходимую местность. Пруд можно сделать похожим на травяную лужайку, пропасть сделать пологим спуском, а каменистый овраг — широкой и ровной дорогой. Рукотворные строения, снаряжение и существа в области не меняют облик.
Тактильные ощущения местности не меняются, поэтому существа, входящие в неё, скорее всего, поймут обман. Если на прикосновение разница не очевидна, существо, тщательно исследующее иллюзию, может предпринять проверку Интеллекта (Анализ) против Сл ваших заклинаний, чтобы не поверить. Существо, способное распознавать иллюзии, видит полупрозрачный образ, наложенный на местность."""
Многочисленные миры D&D населены волшебством и чудовищами, храбрыми воинами и волнующими приключениями. Все они основаны на фундаменте средневекового фэнтези, к которому добавлены существа, места и магия, которые делают эти миры уникальными.
Миры игры D&D существуют в бескрайнем пространстве, называемом мультивселенной, и связаны странными и загадочными путями между собой и с другими планами существования, такими как Стихийный План Огня и Бесконечные Глубины Бездны. Внутри мультивселенной находится бесконечное разнообразие миров. Огромное количество их было опубликовано в качестве официальных игровых миров для игры D&D. Легенды Забытых Королевств, Сага о Копье, Серый Ястреб, Тёмное Солнце, Мистара и Эберрон — игровые миры, переплетённые вместе в материи мультивселенной. Наряду с этими мирами, существуют ещё сотни тысяч, созданных поколениями игроков для своих собственных кампаний. И среди этого богатства мультивселенной вы можете создать свой собственный мир.
Все эти миры имеют сходные особенности, но каждый отличается своей собственной историей и культурой, различными чудовищами и расами, причудливой географией, древними подземельями и плетущими интриги злодеями. Некоторые расы имеют необычные особенности в различных мирах. Полурослики мира Тёмное Солнце, к примеру, являются обитающими в джунглях каннибалами, а эльфы — пустынными кочевниками. Некоторые миры населяют расы, неизвестные в других мирах, такие как кованые из Эберрона, созданные солдатами и наделённые жизнью, чтобы сражаться в Последней Войне. В некоторых мирах преобладает одна основная история, например, Война Копья, которая играет центральную роль в мире Саги о Копье. Но все они — миры D&D, и вы можете использовать правила этой книги, чтобы создать персонажа и играть в любом из них.
Ваш Мастер может проводить кампанию в одном из этих миров или в одном из миров, которые он создал. Из-за того что существует такое многообразие миров D&D, вы должны осведомиться у Мастера о наличии так называемых «домашних правил», которые будут влиять на ход игры. Мастер является главным авторитетом в проведении кампании в любом игровом мире, даже если тот является опубликованным.
//Заговор, Воплощение, Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
К существу, находящемуся в пределах дистанции, устремляется луч потрескивающей энергии. Совершите дальнобойную атаку заклинанием по цели. При попадании цель получает урон силовым полем 1к10.
Заклинание создаёт ещё один луч, когда вы достигаете больших уровней: два луча на 5 уровне, три луча на 11 уровне и четыре луча на 17 уровне. Вы можете направить лучи в одну цель или в разных. Для каждого луча совершите свой бросок атаки.
!!!__''Мистический ловкач''__
Некоторые плуты усиливают свои прекрасно отточенные навыки скрытности и ловкости магией, обучаясь премудростям чар и иллюзий. Этими плутами становятся не только карманники и грабители, но и шутники, интриганы и достаточное количество искателей приключений.
!!!''Использование заклинаний''
По достижении 3 уровня вы получаете способность накладывать заклинания. Смотрите общие правила о заклинаниях в главе 10 и список заклинаний волшебника в главе 11.
!!!''Заговоры.''
Вы знаете три заговора: волшебная рука и два других заговора по своему выбору из списка заклинаний волшебника. Вы узнаёте ещё один заговор волшебника на 10 уровне.
!!!''Ячейки заклинаний.''
"""В приведённой ниже таблице показано, сколько у вас есть ячеек для сотворения заклинаний 1 уровня и выше. Для сотворения одного из этих заклинаний вы должны потрать ячейку заклинаний с уровнем не ниже уровня заклинания. Вы восстанавливаете все потраченные ячейки заклинаний, когда заканчиваете продолжительный отдых.
Например, если вы знаете заклинание 1 уровня очарование личности и у вас есть ячейки заклинания 1 и 2 уровня, вы можете сотворить это заклинание, используя любую из этих ячеек."""
!!!''Известные заклинания первого и более высоких уровней.''
"""Вы знаете три заклинания волшебника 1 уровня по своему выбору, два из которых должны быть выбраны из школ Иллюзий или Очарования.
Колонка «известные заклинания» показывает, когда вы сможете выучить новые заклинания волшебника 1 уровня и выше. Все эти заклинания должны принадлежать школе Иллюзии или Очарования, и должны быть того уровня, для которого у вас есть ячейки заклинаний. Например, когда вы получите 7 уровень в этом классе, вы можете узнать одно новое заклинание 1 или 2 уровня.
Заклинания, которые вы узнаёте на 8, 14 и 20 уровнях могут принадлежать любой школе магии.
Каждый раз, когда вы получаете уровень в этом классе, вы можете заменить одно известное заклинание волшебника другим заклинанием по своему выбору из списка заклинаний волшебника. Уровень нового заклинания не должен превышать уровень самой большой ячейки заклинаний, и оно должно принадлежать школе Иллюзий или Очарования, если только вы не заменяете заклинание, полученное на 8, 14 или 20 уровне."""
!!!''Базовая характеристика заклинаний.''
При создании заклинаний волшебника вы используете Интеллект, так как вы узнаёте их с помощью специальных исследований и запоминания. Вы используете Интеллект в случаях, когда заклинание ссылается на базовую характеристику. Кроме того, вы используете модификатор Интеллекта при определении Сл спасбросков от ваших заклинаний волшебника, и при броске атаки заклинаниями.
;
:Сложкость спасброска = 8 + бонус мастерства + модификатор Интеллекта
:Модификатор броска атаки = бонус мастерства + модификатор Интеллекта
!!!''Улучшенная волшебная рука''
Начиная с 3 уровня, когда вы накладываете заклинание волшебная рука, вы можете создать руку невидимой, и совершать ею следующие дополнительные действия:
* Вы можете положить один предмет, удерживаемый рукой, в контейнер, носимый или несомый другим существом.
* Вы можете достать предмет из контейнера, носимого или несомого другим существом.
* Вы можете использовать воровские инструменты для вскрытия замков и обезвреживания ловушек в дистанции этого заклинания.
"""Вы можете выполнить одно из этих действий, не будучи замеченным, если успешно совершите проверку Ловкости (Ловкость рук) против проверки Мудрости (Внимательность) существа.
Кроме того, вы можете использовать бонусное действие, предоставленное умением Хитрое действие, для управления рукой."""
''Использование заклинаний мистического ловкача''
<table>
<tr>
<th rowspan="2">Уровень плута</th>
<th rowspan="2">Известные заговоры</th>
<th rowspan="2">Известные заклинания</th>
<th colspan="4">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>3</td>
<td>5</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>3</td>
<td>6</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>3</td>
<td>6</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>4</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>4</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>4</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>4</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>4</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>4</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>4</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>4</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>18</td>
<td>4</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>19</td>
<td>4</td>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>4</td>
<td>13</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
</table>
!!!''Магическая засада''
Начиная с 9 уровня, если вы накладываете заклинание на существо, от которого скрыты, существо в этом ходу совершает с помехой спасброски от этого заклинания.
!!!''Многогранный ловкач''
На 13 уровне вы получаете возможность отвлекать цель своей волшебной рукой. В свой ход вы бонусным действием можете обозначить существо в пределах 5 футов от руки, сотворённой этим заклинанием. Если вы так делаете, то до конца этого хода совершаете броски атаки по этому существу с преимуществом.
!!!''Вор заклинаний''
"""На 17 уровне вы получаете способность магически воровать у другого колдующего знания о том, как творить заклинание.
Сразу после сотворения заклинания существом, целью которого являетесь вы, или же если вы попали в область действия этого заклинания, вы можете реакцией заставить существо совершить спасбросок его базовой характеристики. Сл равна вашей Сл спасброска заклинания. Если спасбросок провален, вы отрицаете эффект заклинания на себе, и крадёте знание этого заклинания, если оно как минимум 1 уровня, и вы можете накладывать заклинания этого уровня (оно не обязано быть заклинанием волшебника). Вы знаете это заклинание в течение следующих 8 часов и можете его накладывать, используя свои ячейки заклинаний. Существо, у которого вы украли заклинание, не может его творить на протяжении 8 часов.
Использовав это умение, вы не можете использовать его повторно до окончания продолжительного отдыха."""
!!__''Мистический рыцарь''__
<table>
<tr>
<th rowspan="2">Уровень воина</th>
<th rowspan="2">Известные заговоры</th>
<th rowspan="2">Известные заклинания</th>
<th colspan="4">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>2</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>2</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>2</td>
<td>5</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>2</td>
<td>6</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>2</td>
<td>6</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>3</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>3</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>3</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>3</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>3</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>3</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>3</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>3</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>18</td>
<td>3</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
</tr>
<tr>
<td>19</td>
<td>3</td>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>3</td>
<td>13</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
</table>
Архетип мистического рыцаря совмещает в себе воинское искусство и тщательное изучение волшебства. Мистические рыцари используют приёмы, схожие с практиками волшебников. Но они сосредоточились на изучении двух из восьми школ магии: Воплощения и Ограждения. Заклинания Ограждения обеспечивают мистическим рыцарям дополнительную защиту в бою, а Воплощения причиняют урон сразу нескольким противникам за раз, увеличивая возможности рыцаря в бою. Эти рыцари владеют относительно небольшим количеством заклинаний, что позволяет постоянно держать их в памяти и не использовать книгу заклинаний.
!!! ''Использование заклинаний''
При достижении 3 уровня к своим воинским талантам вы добавляете возможность использовать заклинания. Смотрите общие правила о заклинаниях в главе 10 и список заклинаний волшебника в главе 11.
!!! ''Заговоры.''
Вы изучаете 2 заговора на свой выбор из списка волшебника. Дополнительный заговор волшебника вы изучите на 10 уровне.
!!!''Ячейки заклинаний.''
"""Таблица заклинаний мистического рыцаря содержит информацию о количестве доступных вам ячеек заклинаний. Чтобы использовать заклинание определённого уровня, вы должны потратить ячейку того же уровня или выше. Все потраченные ячейки заклинаний вы восстанавливаете после окончания продолжительного отдыха.
Например, если вы знаете заклинание 1 уровня щит, и имеете ячейки 1 и 2 уровней, вы можете использовать это заклинание, использовав любую из этих ячеек."""
!!!''Известные заклинания первого и более высоких уровней.''
"""Вы знаете три заклинания 1 уровня из списка волшебника на свой выбор, два из которых должны принадлежать к школам Воплощения и Ограждения.
Колонка «известные заклинания» в таблице показывает, когда вы сможете выучить новые заклинания волшебника. Все эти заклинания должны принадлежать школам Воплощения или Ограждения, и не должны превышать уровень доступных вам ячеек заклинаний. Например, при достижении 7 уровня в этом классе вы можете выучить новое заклинание 1 или 2 уровня.
Заклинания, которые вы выучите на 8, 14 и 20 уровнях могут принадлежать к любой школе магии.
Каждый раз, получая уровень в этом классе, вы можете заменить одно из заклинаний волшебника, известное вам, другим, на ваш выбор. Новое заклинание должно быть из списка доступных волшебнику, у вас должны быть ячейки соответствующего уровня, и заклинание должно принадлежать школам Воплощения или Ограждения, кроме случаев, когда вы заменяете заклинания, полученные на 8, 14 или 20 уровнях."""
!!!''Базовая характеристика заклинаний.''
Интеллект является базовой характеристикой для ваших заклинаний, поскольку вы узнаёте заклинания посредством изучения и запоминания. Когда заклинание требует использовать базовую характеристику, вы используете Интеллект. Кроме того, вы используете модификатор Интеллекта при определении Сл спасбросков от ваших заклинаний волшебника, и при броске атаки заклинаниями.
;
:''Сл спасброска'' = 8 + бонус мастерства + модификатор Интеллекта
:''Модификатор броска атаки'' = бонус мастерства + модификатор Интеллекта
!!!''Связь с оружием''
"""На 3 уровне вы узнаёте ритуал, позволяющий создать магическую связь между вами и одним оружием. Вы выполняете ритуал в течение 1 часа, и он может быть совершён в течение короткого отдыха. Оружие во время проведения ритуала должно находиться на доступном расстоянии от вас, и в конце вы должны прикоснуться к нему и создать связь.
Как только вы привязали к себе оружие, вы не можете быть обезоруженным, пока не станете недееспособным. Если оружие находится на одном плане существования с вами, вы можете в свой ход бонусным действием призвать его, телепортируя себе в руку.
У вас может быть не более двух привязанных оружий одновременно, и бонусным действием вы призываете их по одному. Если вы попытаетесь создать связь с третьим оружием, вам придётся разорвать связь с одним из первых двух."""
!!!''Боевая магия''
Начиная с 7 уровня, если вы действием используете заговор, вы можете бонусным действием совершить одну атаку оружием.
!!!''Мистический удар''
Начиная с 10 уровня вы узнаёте, как с помощью удара оружием снизить сопротивляемость цели вашим заклинаниям. Если вы попадаете по существу атакой оружием, это существо совершает следующий спасбросок от вашего заклинания, использованного до конца вашего следующего хода, с помехой.
Волшебный рывок
С 15 уровня вы получаете возможность телепортироваться на 30 футов в свободное пространство, которое вы видите, когда используете Всплеск действий. Вы можете телепортироваться до или после дополнительного действия.
!!!''Улучшенная боевая магия''
Начиная с 18 уровня, если вы действием используете заклинание, вы можете бонусным действием совершить одну атаку оружием.
!!!''Мистическое копьё''
"""//Требование: заговор мистический заряд//
Когда вы накладываете мистический заряд, его дистанция равна 300 футам. """
//Доспех (средний или тяжёлый, но не шкурный), необычный//
Мифрил это лёгкий и гибкий металл. Сделанная из мифрила кольчужная рубаха или кираса может носиться под обычной одеждой. Если в обычном исполнении доспех накладывает помеху на проверки Ловкости (Скрытность) или имеет требования к Силе, то в версии из мифрила он не обладает этими недостатками.
//6 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, М (язык змеи и либо кусочек медовых сот, либо капля сладкого масла)
:''Длительность:'' 24 часа
"""Вы внушаете определённый курс действий (ограниченный одной-двумя фразами) и магически влияете на двенадцать существ на свой выбор, видимых в пределах дистанции, которые могут слышать и понимать вас. Существа, которые не могут быть очарованы, обладают иммунитетом к этому эффекту. Внушение должно быть сформировано так, чтобы действие звучало разумным. Просьбы ударить себя мечом, броситься на копьё, сжечь себя, или как-то иначе причинить себе вред отменяют эффект заклинания.
Каждая цель должна совершить спасбросок Мудрости. При провале она следует заданному курсу действий. Внушённые действия могут продолжаться всю длительность заклинания. Если внушённую деятельность можно выполнить за меньший срок, заклинание оканчивается, когда субъект оканчивает порученную задачу.
Вы можете также указать условие, которое запустит особое действие во время действия заклинания. Например, вы можете внушить группе солдат, чтобы они отдали все свои деньги первому встреченному нищему. Если до окончания действия условие не будет выполнено, деятельность не совершается.
Если вы или кто-то из ваших спутников причиняют урон существу, находящемуся под действием этого заклинания, для этого существа заклинание оканчивается."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня, длительность равна 10 дням. Если вы используете ячейку 8 уровня, длительность равна 30 дням. Если вы используете ячейку 9 уровня, длительность равна 1 году и 1 дню.
//3 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Вы произносите слова восстановления, и до шести существ на ваш выбор, видимых в пределах дистанции, восстанавливают хиты в количестве, равном 1к4 + ваш модификатор базовой характеристики. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, восстанавливается дополнительно 1к4 хитов за каждый уровень ячейки выше 3.
//5 уровень, Воплощение, Бард/Друид/Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Волна целительной энергии исходит из точки, выбранной вами в пределах дистанции. Выберите до шести существ в сфере с радиусом 30 футов с центром на этой точке. Все цели восстанавливают хиты в количестве, равном 3к8 + модификатор вашей базовой характеристики. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, восстанавливается дополнительно 1к8 хитов за каждый уровень ячейки выше пятого.
//9 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Поток целительной энергии перетекает от вас к раненым существам. Вы восстанавливаете до 700 хитов, разделённых на ваш выбор между любым количеством существ, видимых вами в пределах дистанции. Существа, вылеченные этим заклинанием, также исцеляются от всех эффектов, делающих их ослеплёнными или оглушёнными, а также от всех болезней. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
!!!''Могильный шёпот''
"""//Требование: 9 уровень//
Вы можете неограниченно накладывать заклинание разговор с мёртвыми, не тратя ячейки заклинаний."""
//2 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Каждое из шести существ на ваш выбор, видимых в пределах дистанции, восстанавливает количество хитов, равное 2к8 + модификатор вашей базовой характеристики. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, лечение увеличивается на 1к8 за каждый уровень ячейки выше второго.
//3 уровень, Преобразование, Следопыт//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""В следующий раз, когда вы совершите дальнобойную атаку оружием, пока активно это заклинание, ваш боеприпас или само оружие, если это метательное оружие, превращается в разряд молнии. Совершите бросок атаки как обычно. Вместо обычного урона от оружия цель при попадании получает урон электричеством 4к8, или половину урона при промахе.
Вне зависимости от попадания или промаха, все существа в пределах 10 футов от цели должны совершить спасбросок Ловкости. При провале эти существа получают урон электричеством 2к8, или половину урона при успехе.
После этого боеприпас или оружие возвращается в обычную форму."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон от обоих эффектов увеличивается на 1к8 за каждый уровень ячейки выше третьего.
//3 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (100-футовая линия)
:''Компоненты:'' В, С, М (кусочек меха и жезл из янтаря, кристалла или стекла)
:''Длительность:'' Мгновенная
"""Разряд молнии формирует линию длиной 100 футов и шириной 5 футов, вылетающую в выбранном вами направлении. Все существа в линии должны совершить спасбросок Ловкости. При провале существо получает урон электричеством 8к6, или половину урона при успехе.
Молния поджигает горючие предметы в поражаемой области, которые никто не несёт и не носит."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше третьего.
//Оружие (молот), легендарное//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием.
Погибель великанов (требуется настройка). Вы должны носить пояс силы великана (любую разновидность) и рукавицы силы огра, чтобы настроиться на это оружие. Настройка окончится, если вы снимаете любой из этих предметов. Если вы настроены на этой оружие и держите его, ваше значение Силы увеличивается на 4 и может превышать 20, но не 30. Если у вас выпало «20» на кости при броске атаки этим оружием по великану, великан должен преуспеть в спасброске Телосложения со Сл 17, иначе он сразу умрёт.
У этого молота есть 5 зарядов. Если вы настроены на него, вы можете потратить 1 заряд и совершить им дальнобойную атаку оружием, метая его, как если бы у него было свойство «метательное» с нормальной дистанцией 20 футов и максимальной дистанцией 60 футов. Если эта атака попадает, молот испускает громовой рокот, слышный в пределах 300 футов. Цель и все существа в пределах 30 футов от неё должны преуспеть в спасброске Телосложения со Сл 17, иначе станут ошеломлёнными до конца вашего следующего хода. Молот ежедневно восстанавливает 1к4 + 1 заряд на рассвете.
!!!''__Монастырская традиция__''
При достижении 3 уровня вы выбираете монастырскую традицию, которой следуете: Путь открытой ладони, Путь тени, или Путь четырёх стихий. Все они описаны далее. Выбранная традиция обеспечивает вам дополнительные умения на 3, 6, 11 и 17 уровнях.
!!''Монастырские традиции''
В монастырях мультивселенной следуют трём основным традициям. Большинство монастырей следуют какой-то одной традиции, но в некоторых почитают все три, и обучают монахов согласно их способностям и желаниям. Все три традиции основываются на одних и тех же базовых техниках. Различия проявляются при более глубоком изучении. Поэтому монах должен выбрать ту или иную традицию только по достижении 3 уровня.
<<<
!!!''Монашеские ордены''
"""Миры D&D содержат множество монастырей и монашеских традиций. В землях с азиатским культурным уклоном, таких как Шу Лунь на востоке Забытых Королевств, эти монастыри связаны с философскими традициями и практикой боевых искусств. Школа железной руки, Школа пяти звёзд, Школа северного кулака и Школа южной звезды из Шу Луня учат разным подходам к физическим, психическим и духовным дисциплинам монаха. Некоторые из этих монастырей распространили свои традиции и на западных землях Фаэруна, особенно в местах с большими общинами иммигрантов из Шу, таких как Теск и Западные Врата.
Другие монашеские традиции связаны с божествами, которые учат физическому совершенству и ментальным практикам. В Забытых Королевствах орден Тёмной луны состоит из монахов, служащих Шар (богиня лишений), которые поддерживают тайные общины в отдалённых горах, глухих переулках и подземных убежищах. Монастыри Ильматера (бога выносливости) названы в честь цветков, и их ордена несут имена великих героев веры; Адепты Святого Соллара Дважды-замученного принадлежат монастырю Жёлтой Розы близ Дамары. Монастыри Эберрона совмещают изучение боевых искусств с познанием. Большинство из них посвящено Верховным Владыкам. В мире Саги о Копье большинство монахов преданы Маджере, богу медитации и мышления. В мире Серого Ястреба многие монастыри посвящены Цан Яй, богине сумерек и превосходства ума над материей, или Цуокену, богу психического и физического мастерства.
Злые монахи Алого Братства в мире Серого Ястреба черпают фанатичное усердие не из преданности богу, а из преданности принципам своей нации и расы, полагая, что цивилизация Суел призвана править миром."""
<<<
<<Button "Путь открытой ладони (Монах)" "Путь открытой ладони">>
<<Button "Путь тени (Монах)" "Путь тени">>
<<Button "Путь четырёх стихий (Монах)" "Путь четырёх стихий">>
Её кулаки превратились в марево, отражая обрушившийся град стрел. Полуэльфийка перескочила баррикаду и бросилась в плотные ряды хобгоблинов. Кружась среди них, она раздавала удары во все стороны, расшвыривая противников, пока не осталась единственной, стоящей на ногах.
Глубоко вздохнув, покрытый татуировками человек принял боевую стойку. Когда первый из атакующих орков приблизился к нему, он выдохнул, и поток огня, с рёвом вырвавшись из его рта, поглотил противника.
Двигаясь бесшумно, как сама ночь, одетый во всё чёрное полурослик вступил в пятно тени под аркой, и мгновенно появился из другой чернильной тени на балконе, на расстоянии броска камня. Он медленно высвободил клинок из укутанных тканью ножен, и сквозь открытое окно взглянул на деспотичного принца, столь уязвимого во сне.
Вне зависимости от выбранной дисциплины, всех монахов объединяет одно — возможность управлять энергией, текущей в их телах. Вне зависимости от того, проявляется ли она выдающимися боевыми способностями, или чуть заметным усилением защиты и скорости, эта энергия влияет на всё, что делает монах.
!!!''__Магия ци__''
Монахи тщательно изучают магическую энергию, которая в большинстве монастырских традиций именуется ци. Эта энергия является составляющей частью магии, пронизывающей мультивселенную, а точнее, той её частью, которая протекает сквозь тела живущих. Монахи научились управлять энергией, протекающей сквозь их тела, повышая физические способности и нанося атаки, способные препятствовать течению ци в телах противников. Используя эту энергию, монахи наделяют удары своих голых рук и ног неестественной силой и скоростью. С приобретаемым опытом их боевые тренировки и тренировки владением ци дают им всё больше власти над собственными телами и над телами врагов.
!!!''__Тренировки и аскеза__''
Маленькие огороженные монастыри разбросаны по мирам D&D. Это крошечные убежища, позволяющие укрыться от потока повседневной жизни, где само время, кажется, замирает. Живущие тут монахи ищут путь к личному совершенству через созерцание и утомительные тренировки. Многие попадают в монастырь детьми, отправленные туда, если родителям не хватало еды прокормить их, если родители умерли, или в знак благодарности за оказанную монахами помощь.
Некоторые монахи живут обособленно от окружающих, оградившись от всего способного препятствовать их духовному росту. Другие дали обет изоляции, появляясь лишь в качестве шпионов или убийц, действуя по приказу своих лидеров, благородных покровителей или иных, смертных или божественных сил.
Однако большинство монахов не избегают своих соседей и часто посещают ближайшие городки и посёлки, обменивая свои услуги на еду и другие товары. Будучи универсальными воителями, монахи нередко оказываются защитниками соседей от чудовищ или захватчиков.
Для монаха становление искателем приключений означает конец упорядоченной жизни в коммуне. Это может быть трудным шагом, и монахи принимают такое решение нелегко. Те же, кто покинул свой монастырь, относятся к этому шагу очень серьёзно, воспринимая свои странствия как испытание своего физического и духовного развития. Как правило, монахи мало заботятся о материальных богатствах, и ими движет желание достичь большего, чем просто убить чудовище и завладеть его сокровищами.
{{Таблица развития Монаха}}
{{Создание Монаха}}
//Оружие (любой меч) очень редкое (требуется настройка)//
Если вы попадаете атакой, используя этот магический меч, цель получает дополнительный урон холодом 1к6. Кроме того, пока вы держите этот меч, вы обладаете сопротивлением к урону огнём.
При температуре, не превышающей 0 °C, клинок испускает яркий свет в радиусе 10 футов и тусклый свет в радиусе ещё 10 футов.
Когда вы вынимаете оружие из ножен, вы можете погасить все источники немагического огня в пределах 30 футов. Это свойство можно использовать не чаще раза в час.
"""Вы много лет плавали на морском судне. Вы видели могучие шторма, глубоководных чудовищ и тех, кто хотел отправить вас на дно. Первая любовь осталась далеко за горизонтом, и настало время попробовать что-то новое.
Решите вместе с Мастером, на каком корабле вы до этого плавали. Это было торговое, пассажирское, исследовательское или пиратское судно? Насколько оно прославилось (в хорошем или дурном смысле)? Много ли вы путешествовали? Оно всё ещё на плаву, потоплено или утеряно?
Кем вы были на борту — боцманом, капитаном, лоцманом, коком или кем-то другим? Кем были капитан и его первый помощник? Вы расстались с экипажем в хороших отношениях или поссорились с ними?"""
;
:''Владение навыками:'' Атлетика, Внимательность
:''Владение инструментами:'' Инструменты навигатора, транспорт (водный)
;
:''Снаряжение:'' Кофель-нагель (дубинка), 50 футов шёлковой верёвки, талисман, такой как кроличья лапка или камень с дыркой (можете совершить бросок по таблице «безделушки» из главы 5), комплект обычной одежды, поясной кошель с 10 зм
!!!''Умение: Поездка на корабле''
Если понадобится, вы можете получить бесплатную поездку на паруснике для себя и своих спутников. Это может быть ваш старый корабль, или другой корабль, с которым вы находитесь в хороших отношениях (возможно, им командует ваш бывший напарник). Вам оказывают услугу, поэтому вы не можете устанавливать распорядок и прокладывать маршрут. Мастер сообщит, сколько времени уйдёт на плавание. В обмен на бесплатную поездку от вас и ваших спутников ожидают посильную помощь экипажу во время плавания.
!!!''Персонализация''
Моряки бывают грубыми, но на их плечах лежит груз ответственности за сохранение жизни экипажа, поэтому на них можно положиться. Жизнь, проведённая на корабле, формирует их взгляды и самые важные привычки.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Друзья знают, что всегда могут на меня положиться.</td>
</tr>
<tr>
<td>2</td>
<td>Я усердно тружусь, чтобы потом можно было хорошо отдохнуть.</td>
</tr>
<tr>
<td>3</td>
<td>Мне нравится заходить в новые порты и находить друзей за кружечкой эля.</td>
</tr>
<tr>
<td>4</td>
<td>Я готов приврать, чтобы получился хороший рассказ.</td>
</tr>
<tr>
<td>5</td>
<td>Для меня драка в таверне — отличный способ познакомиться с новым городом.</td>
</tr>
<tr>
<td>6</td>
<td>Я никогда не откажусь от пари.</td>
</tr>
<tr>
<td>7</td>
<td>Я ругаюсь как банда орков.</td>
</tr>
<tr>
<td>8</td>
<td>Мне нравится, когда работа выполнена, особенно если её можно поручить другому.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Уважение. Корабль держится целым благодаря взаимному уважению капитана и экипажа. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Справедливость. Все мы делаем одно дело, и награду должны делить поровну. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Свобода. Море это свобода — свобода идти куда угодно и делать что угодно. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Власть. Я хищник, а другие корабли в море — моя добыча. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Команда. Я предан экипажу, а не идеалам. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Стремление. Когда-нибудь у меня будет свой корабль, и я проложу курс куда захочу. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>В первую очередь я верен своему капитану, всё остальное вторично.</td>
</tr>
<tr>
<td>2</td>
<td>Самое важное — это корабль, а экипаж и капитаны постоянно меняются.</td>
</tr>
<tr>
<td>3</td>
<td>Я всегда буду помнить свой первый корабль.</td>
</tr>
<tr>
<td>4</td>
<td>В гавани у меня есть возлюбленная, глаза которой стоят того, чтобы оставить ради неё море.</td>
</tr>
<tr>
<td>5</td>
<td>Как-то раз мне выплатили не полную долю с дохода, и я хочу вернуть себе причитающееся.</td>
</tr>
<tr>
<td>6</td>
<td>Безжалостные пираты убили моего капитана и почти всю команду, разграбили корабль, и оставили меня умирать. Месть будет страшной.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я выполняю приказы, даже если считаю, что они несправедливые.</td>
</tr>
<tr>
<td>2</td>
<td>Я наплету с три короба, лишь бы не делать лишнюю работу.</td>
</tr>
<tr>
<td>3</td>
<td>Когда кто-то бросает мне вызов, я никогда не отступлюсь, какой бы опасной не была ситуация.</td>
</tr>
<tr>
<td>4</td>
<td>Начав пить, я не могу остановиться.</td>
</tr>
<tr>
<td>5</td>
<td>Не могу ничего поделать, но деньги у меня не задерживаются.</td>
</tr>
<tr>
<td>6</td>
<td>Моя гордость меня когда-нибудь погубит.</td>
</tr>
</table>
!!!''Разновидность моряка: Пират''
"""Вы провели молодость среди жутких пиратов, безжалостных головорезов, научивших вас выживать среди акул и дикарей. Вы занимались грабежом в морях, и не одну душу отправили в солёную пучину. Вы хорошо знакомы со страхом и кровью, и заслужили сомнительную репутацию во многих портовых городах.
Если вы решите, что во время плаваний по морю вы занимались пиратством, можете выбрать умение Дурная репутация (смотрите во врезке) вместо умения Поездка на корабле."""
<<<
!!!''Альтернативное умение: Дурная репутация''
"""Если у вашего персонажа предыстория моряка, можете выбрать это умение вместо умения Поездка на корабле.
Где бы вы ни оказались, вас боятся из-за вашей репутации. Находясь в цивилизованном поселении, вы можете безнаказанно совершать небольшие преступления, такие как отказ платить за еду в таверне или выламывание двери в магазине, так как жители боятся сообщать о вас властям."""
<<<
!!!''Мощь исчадия''
"""Вы можете неограниченно накладывать на себя заклинание псевдожизнь как заклинание 1 уровня, не тратя ячейки заклинаний и материальные компоненты."""
Вы провели много лет, постигая тайны мультивселенной. Вы читали рукописи, изучали свитки, и общались с величайшими экспертами в интересующих вас темах. Всё это сделало вас знатоком в своей области.
;
:''Владение навыками:'' История, Магия
:''Языки:'' Два на ваш выбор
;
:''Снаряжение:'' Бутылочка чернил, писчее перо, небольшой нож, письмо от мёртвого коллеги с вопросом, на который вы пока не можете ответить, комплект обычной одежды, поясной кошель с 10 зм
''Специализация''
Чтобы определить область изучаемого вами знания совершите бросок по таблице или выберите один из вариантов самостоятельно.
<table>
<tr>
<th>к8</th>
<th>Специализация</th>
<th>к8</th>
<th>Специализация</th>
</tr>
<tr>
<td>1</td>
<td>Академик с испорченной репутацией</td>
<td>5</td>
<td>Исследователь</td>
</tr>
<tr>
<td>2</td>
<td>Алхимик</td>
<td>6</td>
<td>Писец</td>
</tr>
<tr>
<td>3</td>
<td>Астроном</td>
<td>7</td>
<td>Подмастерье волшебника</td>
</tr>
<tr>
<td>4</td>
<td>Библиотекарь</td>
<td>8</td>
<td>Профессор</td>
</tr>
</table>
!!!''Умение: Исследователь''
Если вы пытаетесь изучить или вспомнить информацию, которой вы не обладаете, вы часто знаете, где и от кого её можно получить. Обычно это библиотека, скрипторий, университет, мудрец или другое образованное существо. Мастер может решить, что искомое знание является тайной и хранится в практически недоступном месте, или что оно вообще недоступно. Поиски глубочайших тайн вселенной могут потребовать отдельного приключения или даже целой кампании.
!!!''Персонализация''
Мудрецами становятся после продолжительных занятий, и личность таких существ отражает жизнь в постоянном обучении. Будучи в постоянном поиске мудрости, они высоко ценят знания — как для себя, так и в стремлении к идеалам.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я использую многосложные слова, создающие впечатление образованности.</td>
</tr>
<tr>
<td>2</td>
<td>Я прочитал все книги в величайших библиотеках мира — или, по крайней мере, говорю так.</td>
</tr>
<tr>
<td>3</td>
<td>Я привык помогать тем, кто не так умён как я, и терпеливо всем всё объясняю.</td>
</tr>
<tr>
<td>4</td>
<td>Больше всего на свете я люблю тайны.</td>
</tr>
<tr>
<td>5</td>
<td>Прежде чем принять решение, я выслушаю аргументы обеих спорящих сторон.</td>
</tr>
<tr>
<td>6</td>
<td>Я ... говорю ... медленно ... когда разговариваю ... с идиотами, ... то есть ... практически ... всегда.</td>
</tr>
<tr>
<td>7</td>
<td>В социальном взаимодействии я ужасно неуклюж.</td>
</tr>
<tr>
<td>8</td>
<td>Я убеждён, что остальные постоянно хотят украсть мои тайны.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Знание. Путь к силе и самосовершенствованию лежит в знаниях. (Нейтральный)</td>
</tr>
<tr>
<td>2</td>
<td>Красота. Красота ведёт нас к тому, что истинно. (Добрый)</td>
</tr>
<tr>
<td>3</td>
<td>Логика. Эмоции не должны подавлять логическое мышление. (Законный)</td>
</tr>
<tr>
<td>4</td>
<td>Свобода. Ничто не должно сдерживать бесконечные варианты всех возможных исходов. (Хаотичный)</td>
</tr>
<tr>
<td>5</td>
<td>Власть. Знания — путь к власти и контролю. (Злой)</td>
</tr>
<tr>
<td>6</td>
<td>Самосовершенствование. Цель жизни в познании — самосовершенствование. (Любое)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я должен защищать своих учеников.</td>
</tr>
<tr>
<td>2</td>
<td>У меня есть древний текст, содержащий ужасную тайну, и который не должен попасть в чужие руки.</td>
</tr>
<tr>
<td>3</td>
<td>Я работаю над сохранением библиотеки, университета, скриптория или монастыря.</td>
</tr>
<tr>
<td>4</td>
<td>Труд всей моей жизни это серия томов, посвящённая определённой области знаний.</td>
</tr>
<tr>
<td>5</td>
<td>Всю свою жизнь я ищу ответ на один вопрос.</td>
</tr>
<tr>
<td>6</td>
<td>Ради знаний я продал душу. Когда-нибудь я надеюсь совершить великое деяние и вернуть её себе.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Меня легко отвлечь, пообещав информацию.</td>
</tr>
<tr>
<td>2</td>
<td>Увидев демона, большинство закричит и убежит. Я же остановлюсь и буду изучать его анатомию.</td>
</tr>
<tr>
<td>3</td>
<td>Для раскрытия древних тайн можно пожертвовать современной цивилизацией.</td>
</tr>
<tr>
<td>4</td>
<td>Я избегаю очевидных решений, пользуясь замысловатыми.</td>
</tr>
<tr>
<td>5</td>
<td>Я говорю, не обдумывая слова, чем часто оскорбляю других.</td>
</tr>
<tr>
<td>6</td>
<td>Ради спасения своей или чьей-либо ещё жизни я выболтаю любую тайну.</td>
</tr>
</table>
"""Мультиклассирование позволяет получать уровни в разных классах. Это позволяет смешивать умения этих классов, создавая концепцию персонажа, которую не создать ни одним из стандартных классов.
Это правило позволяет при получении уровня увеличивать уровень не текущего класса, а другого. Сумма уровней всех ваших классов определяет уровень персонажа. Например, если вы волшебник третьего уровня и воин второго уровня, то вы персонаж 5 уровня.
Вы получаете стартовое снаряжение только первого класса.
Можно вкладывать почти все уровни в основной класс, а в других лишь отметиться, а можно полностью пересмотреть карьеру и уже не вкладываться в первый класс. Можно даже взять третий и четвёртый классы. В сравнении с персонажем одного класса вы не так сфокусированы, но зато обладаете широким спектром возможностей."""
<<<
!!!''Пример мультиклассирования''
"""Гарри играет воином 4 уровня. Когда его персонаж зарабатывает достаточно опыта для перехода на 5 уровень, Гарри решает мультиклассироваться. Воин Гарри проводит много времени с плутом Дэйва, и к тому же иногда сотрудничает с местной гильдией воров в качестве громилы. Гарри решает, что его персонаж мультиклассируется в плута, и потому его персонаж становится воином 4 уровня и плутом 1 уровня (записывается в виде воин 4/плут 1).
Когда персонаж Гарри получает опыт, необходимый для перехода на 6 уровень, он может получить уровень воина (став воином 5/плутом 1), уровень плута (став воином 4/плутом 2), или уровень третьего класса, возможно, волшебника, так как он как раз нашёл загадочную книгу о магии (став воином 4/плутом 1/ волшебником 1)."""
<<<
!!!__''Требования''__
Для того чтобы получить новый класс, нужно удовлетворять требованиям к характеристикам и для текущего и для нового класса, показанным в приведённой таблице. Например, у варвара, решившего мультиклассироваться в друида, Сила и Мудрость должны быть не меньше 13. Обучение происходит не плавно как обычно, а ускоренно, поэтому значения характеристик должны быть выше среднего.
''Требования к мультиклассированию''
<table>
<tr>
<th>Класс</th>
<th>Минимальные значения характеристик</th>
</tr>
<tr>
<td>Бард</td>
<td>Харизма 13</td>
</tr>
<tr>
<td>Варвар</td>
<td>Сила 13</td>
</tr>
<tr>
<td>Воин</td>
<td>Сила 13 или Ловкость 13</td>
</tr>
<tr>
<td>Жрец</td>
<td>Мудрость 13</td>
</tr>
<tr>
<td>Волшебник</td>
<td>Интеллект 13</td>
</tr>
<tr>
<td>Друид</td>
<td>Мудрость 13</td>
</tr>
<tr>
<td>Колдун</td>
<td>Харизма 13</td>
</tr>
<tr>
<td>Монах</td>
<td>Ловкость 13 и Мудрость 13</td>
</tr>
<tr>
<td>Паладин</td>
<td>Сила 13 и Харизма 13</td>
</tr>
<tr>
<td>Плут</td>
<td>Ловкость 13</td>
</tr>
<tr>
<td>Следопыт</td>
<td>Ловкость 13 и Мудрость 13</td>
</tr>
<tr>
<td>Чародей</td>
<td>Харизма 13</td>
</tr>
</table>
!!!__''Опыт''__
Количество опыта, необходимого для получения нового уровня, зависит от уровня персонажа, а не от уровня в каком-то одном классе. Таким образом, если вы жрец 6/воин 1, вам нужно набрать опыта, необходимого для получения 8 уровня, прежде чем сможете получить 2 уровень воина или 7 уровень жреца.
!!!__''Хиты и Кости Хитов''__
"""Вы получаете хиты от нового класса как для любого уровня после первого. Хиты класса 1 уровня получают только когда уровень персонажа тоже первый.
Вы складываете Кости Хитов, полученные от всех классов, формируя общий фонд Костей Хитов. Если все Кости Хитов одного вида, вы можете их просто просуммировать. Например, и у воина и у паладина Кости Хитов к10, поэтому если вы паладин 5/воин 5, у вас десять Костей Хитов к10. Если классы дают разные Кости Хитов, отслеживайте их отдельно. Например, если вы паладин 5/жрец 5, у вас будет пять Костей Хитов к10 и пять Костей Хитов к8."""
!!!__''Бонус мастерства''__
"""Бонус мастерства всегда зависит от уровня персонажа, и вычисляется по таблице «Развитие персонажа» из главы 1.
Например, если вы воин 3/плут 2, то ваш бонус мастерства будет как у персонажа 5 уровня, то есть +3."""
!!!__''Владение''__
Когда вы получаете первый уровень нового класса, вы получаете не все его владения, а только часть, как показано в приведённой таблице:
''Мультиклассовые владения''
<table>
<tr>
<th>Класс</th>
<th>Получаемые владения</th>
</tr>
<tr>
<td>Бард</td>
<td>Лёгкие доспехи, один навык на ваш выбор, один музыкальный инструмент</td>
</tr>
<tr>
<td>Варвар</td>
<td>Щиты, простое оружие, воинское оружие</td>
</tr>
<tr>
<td>Воин</td>
<td>Лёгкие доспехи, средние доспехи, щиты, простое оружие, воинское оружие</td>
</tr>
<tr>
<td>Волшебник</td>
<td>—</td>
</tr>
<tr>
<td>Друид</td>
<td>Лёгкие доспехи, средние доспехи, щиты (друиды не носят и не используют доспехи и щиты из металла)</td>
</tr>
<tr>
<td>Жрец</td>
<td>Лёгкие доспехи, средние доспехи, щиты</td>
</tr>
<tr>
<td>Колдун</td>
<td>Лёгкие доспехи, простое оружие</td>
</tr>
<tr>
<td>Монах</td>
<td>Простое оружие, короткие мечи</td>
</tr>
<tr>
<td>Паладин</td>
<td>Лёгкие доспехи, средние доспехи, щиты, простое оружие, воинское оружие</td>
</tr>
<tr>
<td>Плут</td>
<td>Лёгкие доспехи, один навык из списка классовых навыков, воровские инструменты</td>
</tr>
<tr>
<td>Следопыт</td>
<td>Лёгкие доспехи, средние доспехи, щиты, простое оружие, воинское оружие, один навык из списка классовых навыков</td>
</tr>
<tr>
<td>Чародей</td>
<td>—</td>
</tr>
</table>
!!!__''Классовые умения''__
Когда вы получаете новый уровень одного из классов, вы получаете соответствующие этому уровню умения. Однако некоторые умения подчиняются особым правилам: Божественный канал, Дополнительная атака, Защита без доспехов и Использование заклинаний.
!!!''Божественный канал''
Если у вас уже есть умение Божественный канал, и вы получаете уровень в классе, тоже дающем это умение, вы получаете эффекты Божественного канала от нового класса, но не получаете возможность дополнительного его использования. Дополнительные использования вы получите только тогда, когда получите в каком-нибудь из классов уровень, дающий эти дополнительные использования недвусмысленно. Например, если вы жрец 6/паладин 4, то можете использовать Божественный канал два раза между отдыхами, потому что уровень жреца это позволяет. Каждый раз, когда вы используете это умение, вы можете выбирать эффекты, доступные за счёт любого из имеющихся классов.
!!!''Дополнительная атака''
Если вы получаете классовое умение Дополнительная атака из нескольких классов, то они не складываются между собой. Вы не можете совершать с помощью этого умения более двух атак, если только оно не позволяет прямо это делать (как в случае с версией Дополнительной атаки у воина). Кроме того, таинственное воззвание колдуна «Жаждущий клинок» не предоставляет вам дополнительную атаку, если у вас есть умение Дополнительная атака.
!!!''Защита без доспехов''
Если у вас уже есть умение Защита без доспехов, вы не можете получить его ещё раз от другого класса.
!!!''Использование заклинаний''
"""Ваша способность использовать заклинания зависит как от суммы уровней классов заклинателей, так и от индивидуальных уровней в этих классах. Если сразу несколько ваших классов даруют вам умение Использование заклинаний, используйте приведённые ниже правила. Если вы мультиклассируетесь, но это умение есть только у одного класса, используйте правила, описанные для этого класса.
//''Известные и подготовленные заклинания.''// Вы определяете, какие заклинания знаете и можете подготовить для каждого класса индивидуально, как если бы других классов просто не было. Например, если вы следопыт 4/волшебник 3, то благодаря первому классу вы знаете три заклинания следопыта 1 уровня. Как волшебник 3 уровня вы знаете три заговора волшебника, и в книге заклинаний может быть десять (как минимум) заклинаний волшебника, два из которых могут быть 2 уровня (получены на 3 уровне волшебника). Если ваш Интеллект равен 16, вы можете подготовить шесть заклинаний волшебника из книги заклинаний.
Все известные вам заклинания подготавливаются в рамках одного из классов, и при накладывании этого заклинания вы используете базовую характеристику этого класса. Точно так же фокусировки заклинаний, такие как священные символы, могут использоваться только классами, использующими эту фокусировку.
//''Ячейки заклинаний.''// Количество имеющихся ячеек заклинаний вы определяете, суммируя уровни барда, волшебника, друида, жреца и чародея, половины уровней (округляя в меньшую сторону) паладина и следопыта, и треть уровней воина или плута (округляя в меньшую сторону), если у вас есть умения Мистический рыцарь и Мистический ловкач соответственно. Получив сумму, определите по приведённой таблице количество имеющихся ячеек заклинаний разных уровней.
Результат из таблицы может дать ячейки заклинаний таких уровней, каких вы не знаете или не можете подготавливать. Вы можете использовать эти ячейки для заклинаний с меньшим уровнем. Если накладываемое вами низкоуровневое заклинание, такое как огненные ладони, обладает усиленным эффектом при использовании ячейки более высокого уровня, вы можете использовать усиленный эффект, несмотря на то, что у вас нет заклинаний такого высокого уровня.
Например, если вы уже упомянутый выше следопыт 4/ волшебник 3, при определении ячеек заклинаний вы считаетесь персонажем 5 уровня: у вас есть четыре ячейки 1 уровня, три ячейки 2 уровня и две ячейки 3 уровня. Однако у вас нет никаких заклинаний 3 уровня и нет заклинаний следопыта 2 уровня. Вы можете использовать ячейки этих высоких уровней для накладывания известных заклинаний, значительно усиливая их эффекты.
//''Магия договора.''// Если у вас есть и умение Использование заклинаний и умение Магия договора от класса колдуна, вы можете использовать ячейки заклинаний, полученные от Магии договора для накладывания известных или подготовленных заклинаний, полученных от умения Использование заклинаний, а также можете использовать ячейки заклинаний, полученные от умения Использование заклинаний для накладывания известных вам заклинаний колдуна."""
''Мультиклассовый заклинатель: Ячейки заклинаний разного уровня''
<table>
<tr>
<th>Уровень</th>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
!!!''Мучительный взрыв''
"""//Требование: заговор мистический заряд//
Когда вы накладываете мистический заряд, добавьте модификатор Харизмы к урону, причиняемому при попадании."""
//5 уровень, Прорицание, Бард/Волшебник/Друид/Жрец/Колдун//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (фокусировка, стоящая как минимум 1 000 зм, такая как хрустальный шар, серебряное зеркало или чаша со святой водой)
:''Длительность:'' Концентрация, вплоть до 10 минут
Вы можете видеть и слышать конкретное выбранное вами существо, находящееся на том же плане существования, что и вы. Цель должна совершить спасбросок Мудрости, модифицируемый тем, как хорошо вы знаете цель, и тем, какая связь с этим существом у вас есть. Если цель знает, что вы накладываете это заклинание, она может добровольно провалить спасбросок, если хочет, чтобы за ней следили.
<table>
<tr>
<th>Знание</th>
<th>Модификатор спасброска</th>
</tr>
<tr>
<td>Через посредников (вы только слышали о цели)</td>
<td>+5</td>
</tr>
<tr>
<td>Из первых рук (вы встречались с целью)</td>
<td>+0</td>
</tr>
<tr>
<td>Знакомые (вы хорошо знаете цель)</td>
<td>−5</td>
</tr>
<tr>
<th>Связь</th>
<th>Модификатор спасброска</th>
</tr>
<tr>
<td>Образ или рисунок</td>
<td>−2</td>
</tr>
<tr>
<td>Вещь или одежда</td>
<td>−4</td>
</tr>
<tr>
<td>Часть тела, прядь волос, кусок ногтя, и т. п.</td>
<td>−10</td>
</tr>
</table>
"""При успехе цель не попадает под действие, и вы не можете использовать это заклинание на ней в течение 24 часов.
При провале заклинание создаёт невидимый сенсор в пределах 10 футов от цели. Вы можете видеть и слышать через него, как если бы вы там находились. Сенсор перемещается вместе с целью, оставаясь в пределах 10 футов от неё, пока активно заклинание. Существа, способные видеть невидимые предметы, видят сенсор как светящийся шарик размером с ваш кулак.
Вместо того чтобы нацеливаться на существо, вы можете выбрать целью место, уже видимое вами. В этом случае сенсор появляется в этом месте и не перемещается."""
!!!''__Надёжный талант__''
На 11 уровне вы улучшаете выбранные навыки, пока они не достигнут совершенства. Каждый раз, когда вы совершаете проверку характеристики, которая позволяет добавить бонус мастерства, вы можете при выпадении на к20 результата «1–9» считать, что выпало «10».
Искатели приключений могут платить ПМ за оказание услуг в самых разных ситуациях. Информация о наёмниках есть в 5 главе Книги игрока.
Наёмные ПМ редко играют важную роль в приключении, и обычно не требуют глубокой проработки. Когда искатели приключений нанимают карету для перемещений по городу или им требуется передать письмо, кучер или посыльный будут наёмниками, и искатели приключений, скорее всего, не будут разговаривать с ними и даже не спросят их имя. Капитан корабля, везущего искателей приключений по морю, тоже является наёмником, но он по ходу приключения потенциально может стать союзником, покровителем или даже врагом.
Когда искатели приключений нанимают ПМ на долгий срок, добавьте стоимость его услуг к затратам на существование. Подробности смотрите в разделе «дополнительные расходы» 6 главы.
"""Когда персонаж накладывает заклинание, используются единые правила, каким бы ни был его класс или эффект заклинания.
Описание каждого заклинания в главе 11 начинается с блока информации, включающего название заклинания, его уровень, школу магии, время накладывания, дистанцию, компоненты и длительность. Дальше описываются эффекты заклинания."""
<<<
!!!''Школы магии''
"""Магические академии делят заклинания на восемь категорий, называемых школами магии. Учёные, в частности волшебники, применяют эти категории абсолютно ко всем заклинаниям, считая, что магия действует одинаково, вне зависимости от того, что является её источником — прилежное изучение или щедрое божество.
Школы магии помогают описывать заклинания; сами по себе они не несут правил, но некоторые правила применяются только к тем или иным школам.
Заклинания ''Воплощения'' создают различные эффекты из магической энергии. Это могут быть вспышки огня или молний. Другие используют позитивную энергию для лечения ран.
Заклинания ''Вызова'' перемещают предметы и существ из одного места в другое. Некоторые призывают существ и предметы к заклинателю, другие же перемещают заклинателя в другое место. Некоторые заклинания создают предметы и эффекты из ничего.
Заклинания ''Иллюзии'' обманывают чувства или сознания других. Они заставляют видеть вещи, которых нет, не замечать вещи, которые есть, слышать ненастоящие звуки, или вспоминать то, чего никогда не было. Некоторые иллюзии создают образ, которые видят все, но самые коварные иллюзии помещают изображение прямиком в сознание конкретного существа.
Заклинания ''Некромантии'' манипулируют энергиями жизни и смерти. Такие заклинания могут давать дополнительные резервы жизненных сил, забирать жизненные силы у других, создавать нежить, и даже оживлять мертвецов.
Создание нежити при помощи таких заклинаний некромантии как восставший труп не является добрым поступком, и только злые персонажи используют это заклинание часто.
Заклинания ''Ограждения'' носят защитный характер, хотя у некоторых из них возможно агрессивное использование. Они создают магические барьеры, снимают вредоносные эффекты, причиняют вред нарушителям границ, или изгоняют существ на их родной план существования.
Заклинания ''Очарования'' воздействуют на чужое сознание, контролируя поведение существ или влияя на него. Такие заклинания могут заставить врагов считать заклинателя союзником, заставить существо совершить определённые действия, или даже контролировать другое существо как марионетку.
Заклинания ''Преобразования'' изменяют свойства существ, предметов или окружения. Они могут сделать врага безвредным существом, увеличить силу союзника, переместить предмет по приказу заклинателя, или усилить врождённые свойства существа к восстановлению, чтобы оно быстрее оправилось от ранения.
Заклинания ''Прорицания'' раскрывают информацию, будь то давно забытые тайны, проблески будущего, местонахождение тайников, истина, сокрытая за иллюзией, или видение далёких мест и существ."""
<<<
!!!__''Время накладывания''__
Большинство заклинаний накладываются действием, но некоторые накладываются бонусным действием, реакцией, или же требуют долгого времени.
!!!''Бонусное действие''
Заклинания, накладываемые бонусным действием, особенно быстры. Для накладывания такого заклинания вы должны в свой ход использовать бонусное действие, при условии, что в этом ходу ещё не совершали бонусных действий. В этом ходу вы уже не сможете накладывать другие заклинания, за исключением заговоров со временем накладывания «1 действие».
!!!''Реакция''
Некоторые заклинания накладываются реакцией. Эти заклинания активируются за считанные доли секунды, и накладываются в ответ на определённые события. Если заклинание может быть наложено в качестве реакции, в описании будет сказано, когда именно вы можете это сделать.
!!!''Долгое активирование''
Некоторые заклинания (в том числе заклинания, активированные в качестве ритуалов) требуют больше времени на активацию: от нескольких минут до нескольких часов. Если вы используете заклинание со временем накладывания больше одного действия или реакции, вы должны каждый свой ход тратить действие на накладывание этого заклинания, и поддерживать при этом концентрацию (смотрите ниже «Концентрация»). Если концентрация нарушена, заклинание проваливается, но ячейка заклинания не тратится. Если захотите снова наложить это заклинание, придётся начать всё с начала.
!!!__''Дистанция''__
"""Цель заклинания должна находиться в пределах дистанции заклинания. Для таких заклинаний как волшебная стрела целью является существо. Для такого заклинания как огненный шар целью является точка в пространстве, из которой исходит огненный шар.
Дистанция большинства заклинаний указана в футах. Некоторые заклинания нацеливаются только на одно существо, которого вы коснётесь (включая вас). Другие заклинания, такие как щит, действуют только на вас. У таких заклинаний указана дистанция «На себя».
Заклинания, создающие конусы или линии эффекта, исходящие от вас, тоже обладают дистанцией «На себя», что означает, что исходной клеткой эффекта должны быть вы (смотрите ниже «Области воздействия»).
После того как заклинание активировано, его эффекты не ограничиваются его дистанцией, если только в его описании не сказано обратное."""
!!!__''Компоненты''__
Компоненты заклинания это требования, которые нужно выполнить, чтобы его активировать. В описании заклинания сказано, использует ли оно вербальный (В), соматический (С) или материальный (М) компоненты. Если вы не можете предоставить хотя бы один из компонентов заклинания, вы не можете его активировать.
!!!''Вербальный (В)''
Большинство заклинаний требуют произношения таинственных слов. Сами по себе слова не являются источником силы заклинания; просто комбинация звуков с особой тональностью вызывает резонанс в прядях магии, приводя их в движение. Таким образом, персонаж с кляпом во рту или в области заклинания тишина, не может активировать заклинания с вербальным компонентом.
!!!''Соматический (С)''
Заклинание может требовать энергичной жестикуляции или замысловатой последовательности телодвижений. Если у заклинания есть соматический компонент, у заклинателя должна быть свободной хотя бы одна рука для исполнения этих жестов.
!!!''Материальный (М)''
"""Накладывание некоторых заклинаний требует наличия особых предметов, указанных в скобках в описании заклинания. Персонаж может использовать ''мешочек с компонентами'' или ''заклинательную фокусировку'' (смотрите в [[главе 5|05. Снаряжение]]) вместо указанных компонентов. Однако, если для компонента указана цена, у персонажа для накладывания заклинания должен быть именно такой компонент.
Если в заклинании сказано, что материальные компоненты расходуются, заклинатель должен предоставить компоненты для каждого использования этого заклинания.
У заклинателя должна быть одна свободная рука для доступа к материальным компонентам, но это может быть та же самая рука, что используется для выполнения соматического компонента."""
!!!__''Длительность''__
Длительность заклинания это время, в течение которого это заклинание будет активно. Длительность может измеряться в раундах, минутах, часах и даже годах. Некоторые заклинания указывают, что их эффект длится до тех пор, пока не будет рассеян или уничтожен.
!!!''Мгновенно''
Многие заклинания мгновенны. Заклинания, причиняющие урон, лечащие, создающие или изменяющие существ или предметы, не могут быть рассеяны, потому что магия возникает на непродолжительное время.
!!!''Концентрация''
"""Некоторые заклинания требуют от вас сохранения концентрации для поддерживания магии в активном состоянии. Если вы потеряете концентрацию, такое заклинание оканчивается.
Если заклинание должно поддерживаться концентрацией, это указывается в разделе Длительность, и там же указывается, сколько можно концентрироваться на нём. Вы можете окончить концентрацию в любое время (действие не требуется).
Нормальная деятельность, такая как перемещение и сражение, не прерывают концентрацию. Её могут прервать следующие события:"""
* Накладывание другого заклинания, требующего концентрацию. Вы теряете концентрацию на заклинании, если накладываете другое заклинание, требующее концентрации. Нельзя концентрироваться на двух заклинаниях одновременно.
* Получение урона. Каждый раз, когда вы получаете урон во время концентрации на заклинании, вы должны совершить спасбросок Телосложения для продолжения концентрации. Сл равна 10 или половине причинённого урона, в зависимости от того, что выше. Если вы получаете урон из нескольких источников, например, от стрелы и дыхания дракона, вы совершаете отдельные спасброски для каждого источника урона.
* Недееспособность или смерть. Вы теряете концентрацию на заклинании, если становитесь недееспособным или умираете.
Мастер может также решить, что определённые эффекты окружения, такие как накатившая на корабль волна во время шторма, требуют совершения спасброска Телосложения со Сл 10, чтобы сохранить концентрацию на заклинании.
!!!__''Цели''__
"""Обычно заклинание требует, чтобы вы выбрали одну или несколько целей, которые и попадут под действие магии заклинания. В описании заклинания сказано, на что оно нацеливается — на существ, предметы, или точку в пространстве (описано ниже).
Если у цели нет воспринимаемого эффекта, существо может вообще не узнать, что было целью заклинания. Естественно, трещащие молнии легко заметить, но тайные эффекты, такие как попытки прочесть мысли, обычно проходят незамеченными, если в описании заклинания не сказано обратное."""
!!!''Свободный путь до цели''
"""Чтобы на что-то нацелиться, у вас должен быть свободный путь, поэтому у цели не должно быть полного укрытия.
Если вы создаёте область воздействия в точке, которую не видно из-за препятствия, и между вами и этой точкой есть сплошная преграда, такая как стена, исходная точка возникнет с ближайшей к вам стороны этой преграды."""
!!!''Нацеливание на себя''
Если заклинание нацеливается на любое существо, вы можете выбрать себя, кроме тех случаев, когда существо должно быть враждебным, или когда указано, что это должно быть существо, отличное от вас. Если вы находитесь в области эффекта наложенного вами же заклинания, вы можете сделать целью себя.
!!!__''Области воздействия''__
"""Такие заклинания как конус холода и огненные ладони создают область, позволяющую воздействовать сразу на несколько существ.
Описание заклинания определяет область воздействия, которая обычно принимает одну из пяти разных форм: конус, куб, линия, сфера или цилиндр. У каждой области воздействия есть исходная точка, место, из которого исходит энергия заклинания. Правила форм определяют, как вы можете размещать исходную точку. Обычно исходная точка это точка в пространстве, но области некоторых заклинаний исходят из существ или предметов.
Эффект заклинания распространяется по прямым линиям из исходной точки. Если до какого-то места в области воздействия нет свободных линий от исходной точки, это место не включается в область воздействия. Для блокирования таких воображаемых линий препятствие должно предоставлять полное укрытие, как объясняется в [[главе 9|05. Укрытие]]."""
!!!''Конус''
"""Конус простирается в выбранном вами направлении из исходной точки. Ширина конуса на том или ином расстоянии от исходной точки равна расстоянию от этого места до исходной точки. Область воздействия конуса указывает его максимальную длину.
Исходная точка конуса не включается в область воздействия заклинания, если вы не решите иначе."""
!!!''Куб''
"""Вы выбираете исходную точку куба, лежащую на любой из граней кубического эффекта. Для куба указывается длина его ребра.
Исходная точка куба не включается в область воздействия заклинания, если вы не решите иначе."""
!!!''Линия''
"""Линия простирается из исходной точки по прямому пути на расстояние, равное своей длине и покрывает площадь, определяемую её шириной.
Исходная точка линии не включается в область воздействия заклинания, если вы не решите иначе."""
!!!''Сфера''
"""Вы выбираете исходную точку сферы, и она исходит из неё. Размер сферы определяется радиусом, а центром будет исходная точка.
Исходная точка сферы включается в область воздействия заклинания."""
!!!''Цилиндр''
"""Исходная точка цилиндра является центром круга определённого радиуса, указанного в описании заклинания. Круг должен быть верхним или нижним основанием цилиндра. Энергия расширяется по прямым линиям из исходной точки до периметра круга, формируя основание. После этого эффект заклинания «выстреливает» вверх или вниз, на расстояние, равное высоте цилиндра.
Исходная точка цилиндра включается в область воздействия заклинания."""
!!!__''Спасброски''__
"""Во многих заклинаниях указано, что цель может совершить спасбросок для избавления от части эффектов заклинания. В описании заклинания сказано, какая характеристика при этом используется, и что происходит при успешном или провальном спасброске.
Сл противостояния вашим заклинаниям равна 8 + модификатор вашей базовой характеристики + ваш бонус мастерства + все особые модификаторы."""
!!!__''Броски атаки''__
"""Некоторые заклинания требуют, чтобы заклинатель совершил бросок атаки, дабы определить, попал ли эффект заклинания по выбранной цели. Ваш бонус атаки атакой заклинанием равен модификатору вашей базовой характеристики + ваш бонус мастерства.
Большинство заклинаний, требующих броска атаки, совершают дальнобойные атаки. Помните, что вы совершаете броски дальнобойных атак с помехой, если в пределах 5 футов есть враждебное дееспособное существо, видящее вас (смотрите в [[главе 9|04. Совершение атаки]])."""
!!!__''Объединение магических эффектов''__
"""Эффекты разных заклинаний складываются, пока их длительность перекрывается. Однако, эффекты одного и того же заклинания, наложенного несколько раз, не складываются. Вместо этого применяется только самый сильный из эффектов (например, дающий больший бонус), пока длительность двух эффектов перекрывает друг друга.
Например, если два жреца наложат благословение на одну и ту же цель, этот персонаж получит преимущество от этого заклинания только один раз; он не будет бросать две бонусных кости."""
<<<
!!!''Плетение магии''
"""Миры в мультивселенной D&D — магические места. Всё сущее пропитано магической силой, и потенциальная магия находится в каждом камне, каждом ручье, каждом живом существе, и даже в воздухе. Сырая магия — исходный материал, немая и бездумная воля к существованию, пронизывающая всё вокруг и присутствующая во всех проявлениях энергии.
Смертные не могут формировать эту сырую магию. Но зато они научились использовать ткань магии — своеобразный стык между волей заклинателя и сырой магией. Заклинатели мира Забытых Королевств называют это Плетением, и называют его воплощением богиню Мистру, хотя разные заклинатели могут называть этот стык и по-другому. Как бы Плетение не называлось, без него сырая магия оказывается недоступной; даже великий архимаг не сможет зажечь свечу при помощи магии там, где Плетение разорвано. Но зато окружённый Плетением заклинатель может уничтожать врагов молниями, перемещаться за миг на сотни километров, и даже воскрешать умерших.
Вся магия зависит от Плетения, хотя разные виды магии по-разному получают к нему доступ. Заклинания волшебников, колдунов, чародеев и бардов обычно называют ''тайной магией''. Эти заклинания полагаются на понимание — осознанное или интуитивное — Плетения. Заклинатель вмешивается в саму структуру Плетения, создавая желаемый эффект. Мистические рыцари и мистические ловкачи тоже используют тайную магию. Заклинания жрецов, друидов, паладинов и следопытов называют ''божественной магией''. Доступ этих заклинателей к Плетению обеспечен божественными силами — богами, обожествлёнными силами природы или священными клятвами паладинов.
При создании любого магического эффекта нити Плетения переплетаются и скручиваются, создавая желаемый эффект. Когда персонажи используют заклинания школы Прорицания, такие как обнаружение магии или опознание, они бросают короткий взгляд на Плетение. Такие заклинания как рассеивание магии разглаживают Плетение. Такие заклинания как преграда магии упорядочивают Плетение, чтобы магия огибала определённое место. В местах, где Плетение повреждено или разорвано, магия может действовать непредсказуемо — а может вообще не действовать."""
<<<
!!!__''Наложение рук''__
"""Ваше благословенное касание может лечить раны. У вас есть запас целительной силы, который восстанавливается после продолжительного отдыха. При помощи этого запаса вы можете восстанавливать количество хитов, равное уровню паладина, умноженному на 5.
Вы можете действием коснуться существа и, зачерпнув силу из запаса, восстановить количество хитов этого существа на любое число, вплоть до максимума, оставшегося в вашем запасе.
В качестве альтернативы, вы можете потрать 5 хитов из вашего запаса хитов для излечения цели от одной болезни или одного действующего на неё яда. Вы можете устранить несколько эффектов болезни и ядов одним использованием Наложения рук, тратя хиты отдельно для каждого эффекта.
Это умение не оказывает никакого эффекта на нежить и конструктов."""
//1 уровень, Некромантия, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Совершите рукопашную атаку заклинанием по существу в пределах досягаемости. При попадании цель получает урон некротической энергией 3к10.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше первого.
//1 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 раунд
Вспышка света устремляется к выбранному вами существу в пределах дистанции. Совершите дальнобойную атаку заклинанием по цели. При попадании цель получает урон излучением 4к6, и следующий бросок атаки по цели, совершённый до конца вашего следующего хода, совершается с преимуществом, благодаря мистическому тусклому свету, остающемуся недолго на цели.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше первого.
У вас было низкое социальное положение, но судьбой было уготовано большее. Жители вашей родной деревни уже считают вас своим героем, но вам предначертано сражаться с тиранами и чудовищами, угрожающими другим.
;
:''Владение навыками:'' Выживание, Уход за животными
:''Владение инструментами:'' Один вид ремесленных инструментов, транспортное средство (наземное)
;
:''Снаряжение:'' Ремесленные инструменты (один вид на ваш выбор), лопата, железный горшок, обычная одежда, поясной кошель с 10 зм
!!!''Определяющее событие''
Вы занимались обычным делом для деревенщины. Возможно, вы возделывали землю, трудились в шахте, прислуживали дворянину, пасли скот, рубили деревья или копали могилы. Но потом произошло нечто, втянувшее вас в великие события. Выберите или определите случайно определяющее событие, сделавшее вас героем среди своего народа.
<table>
<tr>
<th>к10</th>
<th>Определяющее событие</th>
</tr>
<tr>
<td>1</td>
<td>Я дал отпор прислужникам тирана.</td>
</tr>
<tr>
<td>2</td>
<td>Я спас народ от природного катаклизма.</td>
</tr>
<tr>
<td>3</td>
<td>Я сразился один на один с ужасным чудищем.</td>
</tr>
<tr>
<td>4</td>
<td>Я обокрал продажного торговца, чтобы помочь бедным.</td>
</tr>
<tr>
<td>5</td>
<td>Я возглавил ополчение, отбросившее врага.</td>
</tr>
<tr>
<td>6</td>
<td>Я вломился в замок тирана и украл оружие для своего народа.</td>
</tr>
<tr>
<td>7</td>
<td>Я учил крестьян, как использовать обычные инструменты в качестве оружия против солдат тирана.</td>
</tr>
<tr>
<td>8</td>
<td>Лорд отменил непопулярный закон после того как я выступил с акцией протеста.</td>
</tr>
<tr>
<td>9</td>
<td>Небожитель, фея или другое подобное существо благословило меня или открыло тайну моего рождения.</td>
</tr>
<tr>
<td>10</td>
<td>Вступив в армию лорда, я получил хорошее звание и заслужил благодарности.</td>
</tr>
</table>
!!!''Умение: Деревенское гостеприимство''
Вы сами из простого народа, и потому легко находите с ними общий язык. Вы можете найти место, чтобы спрятаться, отдохнуть или подлечиться среди обывателей, если только вы не угрожаете им. Они укроют вас от представителей закона и тех, кто ищет вас, но своими жизнями за вас они рисковать не будут.
!!!''Персонализация''
Народный герой — один из обывателей, как в хорошем смысле, так и в плохом. Многие из них считают своё происхождение положительной стороной, а не изъяном, и их родное поселение остаётся навсегда очень важным для них.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я сужу других по поступкам, а не словам.</td>
</tr>
<tr>
<td>2</td>
<td>Если кто-то в беде, я всегда готов прийти на помощь.</td>
</tr>
<tr>
<td>3</td>
<td>Задумав что-то, я прямолинейно иду к цели, невзирая на помехи.</td>
</tr>
<tr>
<td>4</td>
<td>У меня обострённое чувство справедливости, и в споре я всегда ищу самого честного решения.</td>
</tr>
<tr>
<td>5</td>
<td>Я уверен в своих способностях, и стараюсь внушить такую же уверенность в других.</td>
</tr>
<tr>
<td>6</td>
<td>Пусть думают другие. Я предпочитаю действовать.</td>
</tr>
<tr>
<td>7</td>
<td>Я неправильно произношу длинные слова, когда пытаюсь выглядеть умнее.</td>
</tr>
<tr>
<td>8</td>
<td>Я быстро устаю. Когда уже я найду свою судьбу?</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Уважение. Нужно относиться друг к другу с достоинством и уважением. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Справедливость. Закон не должен делать ни для кого исключений, и никто не может стать выше закона. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Свобода. Тираны не должны угнетать народ. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Мощь. Если я стану сильным, я смогу брать то, что захочу — и я это заслуживаю. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Искренность. Нет ничего хорошего в том, что ты притворяешься тем, кем не являешься. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Судьба. Никто и ничто не собьёт меня с пути к высшему призванию. (Любое)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>У меня есть семья, но я не знаю, где она. Надеюсь, когда-нибудь я увижу их вновь.</td>
</tr>
<tr>
<td>2</td>
<td>Я работал на земле, я люблю землю, и я буду защищать землю.</td>
</tr>
<tr>
<td>3</td>
<td>Один благородный меня дико поколотил, и я вымещаю свой гнев на всех встреченных задирах.</td>
</tr>
<tr>
<td>4</td>
<td>Мои инструменты — символ моей былой жизни, и я ношу их, чтобы не забывать корни.</td>
</tr>
<tr>
<td>5</td>
<td>Я защищаю тех, кто не может защитить себя сам.</td>
</tr>
<tr>
<td>6</td>
<td>Хотел бы я, чтобы та, кого я любил в детстве, разделила со мной судьбу.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Тиран, правящий моими землями, ни перед чем не остановится, лишь бы убить меня.</td>
</tr>
<tr>
<td>2</td>
<td>Я слепо верю в своё предназначение, и не замечаю ни своих недостатков, ни смертельных опасностей.</td>
</tr>
<tr>
<td>3</td>
<td>Те, кто знают меня молодым, знают и мою самую постыдную тайну, так что я никогда не вернусь домой.</td>
</tr>
<tr>
<td>4</td>
<td>Я беззащитен перед пороками большого города, особенно перед пьянством.</td>
</tr>
<tr>
<td>5</td>
<td>Я тайно считаю, что было бы хорошо стать тираном, правящим землями.</td>
</tr>
<tr>
<td>6</td>
<td>Я не доверяю союзникам.</td>
</tr>
</table>
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите эти наручи, вы получаете бонус +2 к КД если не носите доспех и не используете щит.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эти наручи, вы получаете навык владения длинным и коротким луком и бонус +2 к броскам урона дальнобойными атаки этим оружием.
!!!''__Наследие драконьей крови__''
Ваша врождённая магия произошла из магии драконов, примешавшейся к вашей крови, или унаследованной вами. Чаще всего, чародеи с таким источником силы могут проследить свою родословную до могучих чародеев древности, заключавших сделки с драконами или даже объявлявших себя потомками драконов. Некоторые из таких наследственных ветвей хорошо известны, но большинство из них скрыты. Или чародей может являться родоначальником такой ветви, получив силу в результате договора или других сверхъестественных обстоятельств.
''Драконий предок''
На 1 уровне вы выбираете вид вашего дракона-предка. Связанный с ним вид урона используется в ваших умениях.
<table>
<tr>
<th rowspan="2">Дракон</th>
<th rowspan="2">Вид урона</th>
</tr>
<tr>
</tr>
<tr>
<td>Бронзовый</td>
<td>Электричество</td>
</tr>
<tr>
<td>Зелёный</td>
<td>Яд</td>
</tr>
<tr>
<td>Золотой</td>
<td>Огонь</td>
</tr>
<tr>
<td>Красный</td>
<td>Огонь</td>
</tr>
<tr>
<td>Латунный</td>
<td>Огонь</td>
</tr>
<tr>
<td>Медный</td>
<td>Кислота</td>
</tr>
<tr>
<td>Серебряный</td>
<td>Холод</td>
</tr>
<tr>
<td>Синий</td>
<td>Электричество</td>
</tr>
<tr>
<td>Чёрный</td>
<td>Кислота</td>
</tr>
</table>
Вы можете говорить, читать и писать на Драконьем языке. Кроме того, когда вы взаимодействуете с драконами и совершаете проверку Харизмы, ваш бонус мастерства удваивается для этой проверки.
!!!''Драконья устойчивость''
"""Магия, струящаяся через ваше тело, проявляет физические черты ваших предков драконов. Максимум ваших хитов увеличивается на 1 на 1 уровне и на 1 на каждом уровне, полученном в данном классе.
Кроме того, некоторые участки вашей кожи покрыты тонкой драконьей чешуёй. Если вы не носите доспехов, ваш Класс Доспеха равен 13 + модификатор Ловкости."""
!!!''Родство со стихией''
Начиная с 6 уровня, когда вы накладываете заклинание, причиняющее урон вида, связанного с вашим драконьим предком, вы добавляете модификатор Харизмы к одному броску урона этого заклинания. В это же самое время вы можете потратить 1 единицу чародейства, чтобы получить сопротивление к этому виду урона на 1 час.
!!!''Крылья дракона''
"""На 14 уровне вы получаете способность расправить драконьи крылья у себя за спиной, получая при этом скорость полёта, равную вашей текущей скорости. Вы можете создать их бонусным действием в свой ход. Крылья существуют, пока вы не развеете их бонусным действием в свой ход.
Вы не можете призвать свои крылья, нося броню, если, конечно, броня не изготовлена специально для этого. Одежда, также не приспособленная под крылья, может быть уничтожена, когда вы призываете их."""
!!!''Образ дракона''
Начиная с 18 уровня вы можете вызвать ужасный образ своего предка дракона, повергая им в ужас врагов. Вы можете действием потратить 5 единиц чародейства, чтобы окружить себя аурой страха или трепета (на ваш выбор), радиусом 60 футов. В течение 1 минуты, или пока вы не утратите концентрацию (как если бы вы концентрировались на заклинании), все враждебные существа, начинающие ход в этой ауре, должны преуспеть в спасброске Мудрости, иначе они станут очарованными (если вы выбрали трепет) или испуганными (если вы выбрали страх) до окончания действия ауры. Существо, преуспевшее в спасброске, получает иммунитет к вашей ауре на 24 часа.
//8 уровень, Преобразование, Бард/Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' 1 час
Пока заклинание не окончится, каждый раз, когда вы совершаете проверку Харизмы, вы можете заменить выпавший результат числом «15». Кроме того, что бы вы ни говорили, магия, проверяющая, говорите ли вы правду, показывает, что вы искренни.
"""Когда вы создаёте персонажа, вы получаете снаряжение, состав которого определяется вашим классом и предысторией. В качестве альтернативы, вы можете получить монеты и выбрать себе снаряжение самостоятельно. Количество получаемых монет смотрите в таблице «Начальное богатство».
Вы сами решаете, как ваш персонаж получил это стартовое снаряжение. Оно может быть унаследовано, или персонаж мог постепенно покупать его в течение жизни. Вы могли получить оружие, доспех и рюкзак на военной службе. Вы даже могли в своё время украсть своё снаряжение. Оружие может быть семейной ценностью, передаваемой из поколения в поколение."""
''Начальное снаряжение''
<table>
<tr>
<th>Класс</th>
<th>Деньги</th>
</tr>
<tr>
<td>Бард</td>
<td>5к4 × 10 зм</td>
</tr>
<tr>
<td>Варвар</td>
<td>2к4 × 10 зм</td>
</tr>
<tr>
<td>Воин</td>
<td>5к4 × 10 зм</td>
</tr>
<tr>
<td>Волшебник</td>
<td>4к4 × 10 зм</td>
</tr>
<tr>
<td>Друид</td>
<td>2к4 × 10 зм</td>
</tr>
<tr>
<td>Жрец</td>
<td>5к4 × 10 зм</td>
</tr>
<tr>
<td>Колдун</td>
<td>4к4 × 10 зм</td>
</tr>
<tr>
<td>Монах</td>
<td>5к4 зм</td>
</tr>
<tr>
<td>Паладин</td>
<td>5к4 × 10 зм</td>
</tr>
<tr>
<td>Плут</td>
<td>4к4 × 10 зм</td>
</tr>
<tr>
<td>Следопыт</td>
<td>5к4 × 10 зм</td>
</tr>
<tr>
<td>Чародей</td>
<td>3к4 × 10 зм</td>
</tr>
</table>
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) рапира, б) длинный меч или в) любое простое оружие
* а) набор дипломата или б) набор артиста
* а) лютня или б) любой другой музыкальный инструмент
* Кожаный доспех и кинжал
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) секира или б) любое воинское рукопашное оружие
* а) два ручных топора или б) любое простое оружие
* Набор путешественника и четыре метательных копья
"""''Cнаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) кольчуга или б) кожаный доспех, длинный лук и 20 стрел
* а) воинское оружие и щит или б) два воинских оружия
* а) лёгкий арбалет и 20 болтов или б) два ручных топора
* а) набор исследователя подземелий или б) набор путешественника
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) боевой посох или б) кинжал
* а) мешочек с компонентами или б) магическая фокусировка
* а) набор учёного или б) набор путешественника
* Книга заклинаний
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) деревянный щит или б) одно простое оружие
* а) скимитар или б) простое рукопашное оружие
* Кожаный доспех, набор путешественника и фокусировка друидов
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) булава или б) боевой молот (если владеете)
* а) чешуйчатый доспех, б) кожаный доспех или в) кольчуга (если владеете)
* а) лёгкий арбалет и 20 болтов или б) любое простое оружие
* а) набор священника или б) набор путешественника
* Щит и священный символ
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) лёгкий арбалет и 20 болтов или б) любое простое оружие
* а) мешочек с компонентами или б) магическая фокусировка
* а) набор учёного или б) набор исследователя подземелий
* Кожаный доспех, любое простое оружие и два кинжала
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) короткий меч или б) любое простое оружие
* а) набор исследователя подземелий или б) набор путешественника
* 10 дротиков
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) воинское оружие и щит или б) два воинских оружия
* а) пять метательных копий или б) любое простое рукопашное оружие
* а) набор священника или б) набор путешественника
* Кольчуга и священный символ
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) рапира или б) короткий меч
* а) короткий лук и колчан с 20 стрелами или б) короткий меч
* а) набор взломщика или б) набор исследователя подземелий или в) набор путешественника
* Кожаная броня, два кинжала, воровские инструменты
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) чешуйчатый доспех или б) кожаный доспех
* а) два коротких меча или б) два простых рукопашных оружия
* а) набор исследователя подземелий или б) набор путешественника
* Длинный лук и колчан с 20 стрелами
"""''Снаряжение''
Вы начинаете со следующим снаряжением в дополнение к снаряжению, полученному за вашу предысторию:"""
* а) лёгкий арбалет и 20 болтов или б) любое простое оружие
* а) мешочек с компонентами или б) магическая фокусировка
* а) набор исследователя подземелий или б) набор путешественника
* Два кинжала
//5 уровень, Вызов, Друид/Жрец/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 300 футов
:''Компоненты:'' В, С, М (несколько крупинок сахара, немного зёрнышек и капля жира)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Рой кусачей саранчи заполняет сферу с радиусом 20 футов с центром на точке, выбранной вами в пределах дистанции. Сфера огибает углы. Сфера существует, пока активно заклинание, и её местность слабо заслонена. Пространство сферы является труднопроходимой местностью.
Когда сфера появляется, все находящиеся в ней существа должны совершить спасбросок Телосложения. Существо получает колющий урон 4к10 при провале, или половину урона при успехе. Существа должны также совершать этот спасбросок когда впервые за ход входят в область заклинания или оканчивают там ход."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше пятого.
//5 уровень, Воплощение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (щепотка серы)
:''Длительность:'' Мгновенная
В указанном вами месте возникает вертикальная колонна божественного пламени. Все существа в цилиндре с радиусом 10 футов и высотой 40 футов с центром на точке в пределах дистанции должны совершить спасбросок Ловкости. Существо получает урон излучением 4к6 и урон огнём 4к6 при провале и половину урона при успехе.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, урон излучением или урон огнём (на ваш выбор) увеличивается на 1к6 за каждый уровень ячейки выше пятого.
!!!''__Невероятное уклонение__''
Начиная с 5 уровня, когда нападающий, которого вы можете видеть, попадает по вам атакой, вы можете реакцией уменьшить вдвое урон от этой атаки.
//1 уровень, Иллюзия, Бард/Волшебник/Колдун (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' С, М (свинцовые чернила, стоящие как минимум 10 зм, расходуемые заклинанием)
:''Длительность:'' 10 дней
"""Вы пишете на пергаменте, бумаге или другом подходящем материале, и накрываете его иллюзией, существующей, пока активно заклинание.
Для вас и всех существ, указанных вами при накладывании заклинания, письмена кажутся обычными, написанными вашей рукой, и передающими тот самый смысл, который вкладывали вы. Для всех остальных письмена кажутся написанными на неизвестном или магическом языке, который невозможно прочитать. В качестве альтернативы вы можете заставить письмена поменять смысл, или сделать так, чтобы они выглядели написанными другой рукой или на другом языке, но язык при этом должен быть тем, который вы знаете.
Если заклинание рассеять, исчезает и исходное письмо и иллюзия.
Существо с истинным зрением может читать скрытое послание."""
//2 уровень, Иллюзия, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (ресница в смоле)
:''Длительность:'' Концентрация, вплоть до 1 часа
Существо, которого вы касаетесь, становится невидимым до окончания действия заклинания. Всё, что цель несёт или носит, становится невидимым, пока остаётся у неё. Заклинание оканчивается на цели, если она совершает атаку или накладывает заклинание.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше второго.
!!!__''Невидимый''__
* Невидимое существо невозможно увидеть без помощи магии или особого чувства. С точки зрения скрытности существо считается сильно заслонённым. Местонахождение существа можно определить по шуму, который оно издаёт, или по оставленным им следам.
* Броски атаки по невидимому существу совершаются с помехой, а его броски атаки — с преимуществом.
//1 уровень, Вызов, Бард/Волшебник/Колдун (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (часть тетивы и кусочек дерева)
:''Длительность:'' 1 час
"""Это заклинание создаёт невидимую, бессознательную и бесформенную силу, выполняющую отдаваемые вами простые поручения. Слуга появляется в свободном пространстве на земле в пределах дистанции. У него КД 10, 1 хит, Сила 2, и он не может атаковать. Если его хиты опускаются до 0, заклинание оканчивается.
Один раз в каждом своём ходу вы можете бонусным действием отдать команду слуге переместиться на 15 футов и совершить манипуляции с каким-нибудь предметом. Слуга может выполнять простые задачи, доступные человеку, такие как подношение предметов, чистка, починка и складывание одежды, разжигание костра, подача пищи и разливание вина. Получив команду, слуга начинает её выполнять, стараясь изо всех сил, пока не выполнит, после чего начинает ждать вашу следующую команду.
Если вы отдаёте слуге поручение, из-за которого тот окажется дальше чем в 60 футах от вас, заклинание оканчивается."""
!!!__''Недееспособный''__
Недееспособное существо не может совершать действия и реакции.
//3 уровень, Ограждение, Бард/Волшебник/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (щепотка алмазной пыли, стоящая 25 зм, которой посыпается цель, расходуемая заклинанием)
:''Длительность:'' 8 часов
Пока заклинание активно, цель, которой вы коснулись, сокрыта от заклинаний школой Прорицания. Целью может быть согласное существо, место или предмет, не превышающий 10 футов ни по одному из линейных размеров. Цель не может стать целью магии школы Прорицания, и её не воспринимают магические наблюдательные сенсоры.
Путешествие по дикой местности не всегда означает перемещение по земле. Искатели приключений могут плавать в открытом море на каравелле или стихийном галеоне, летать по воздуху на гип-погрифах или на ковре-самолёте, или даже кататься на гигантских морских коньках среди коралловых дворцов в пучине моря.
!!__''Под водой''__
Правила подводного сражения смотрите в 9 главе Книги игрока.
!!!''Случайные встречи под водой''
Можете совершать проверки на случайные встречи под водой с такой же частотой, с какой совершаете их на суше (смотрите в главе 3). Представленная таблица приводит несколько интересных вариантов. Можете или совершить бросок по этой таблице или выбрать наиболее подходящий вариант самостоятельно.
{{$:/Случайные встречи под водой}}
!!!''Плавание''
Без помощи магии персонажи не могут плыть по 8 часов в день. После каждого часа плавания персонаж должен преуспеть в спасброске Телосложения со Сл 10, иначе он получает одну степень истощения.
Существо, имеющее скорость плавания — включая персонажей с кольцом плавания или подобной магией — могут без штрафов плыть весь день, используя обычные правила форсированного марша из Книги игрока.
Плавание глубоко под водой подобно путешествию на большой высоте, из-за большого давления и низкой температуры. Для существа без скорости плавания, каждый час плавания на глубине
больше 100 футов считается за 2 часа при определении истощения. Плавание на глубине более 200 футов считается за 4 часа.
!!!''Видимость под водой''
Видимость под водой зависит от чистоты воды и освещения. Если у персонажей нет источника света, используйте приведённую таблицу для определения расстояния, с которого персонажи могут узнать о возможной сцене.
{{$:/Дистанция подводных сцен}}
!!__''Море''__
Персонажи могут сидеть на вёслах по 8 часов в день, или же могут грести дольше, с риском получить истощение (по правилам форсированного марша из Книги игрока). Полностью укомплектованное вёсельное судно может плыть круглые сутки, так как подразумевается, что гребцы сменяют друг друга.
!!''Навигация''
Морские суда стараются при возможности держаться берега, так как ориентироваться гораздо проще, если видны ориентиры. Пока с корабля видна суша, судно не может сбиться с курса. В противном случае штурман будет вынужден полагаться на вычисление координат по направлению и скорости судна, или же будет ориентироваться по солнцу и звёздам.
Используйте приведённую выше таблицу «навигация в дикой местности», чтобы определить, сбился ли корабль с курса.
!!!''Случайные встречи в море''
Можете совершать проверки на случайные встречи в море с такой же частотой, что и на суше (смотрите подробности в главе 3). В представленной таблице есть несколько вариантов и готовых идей.
<<<
!!!''Кораблекрушение''
Кораблекрушение это сюжетный ход, который изредка можно использовать, если вы хотите, чтобы персонажей вынесло на берег кишащего чудовищами острова или (в случае крушения воздушного судна) они попали в экзотическую страну. Нет правил по тому, когда происходит кораблекрушение; оно происходит тогда, когда вам нужно или хочется.
Даже самый крепкий корабль может затонуть в шторм, налететь на риф или мель, стать жертвой пиратов или морского чудища. Буря или голодный дракон могут уничтожить воздушное судно. Кораблекрушение потенциально может изменить ход кампании. Однако это не очень хороший способ избавиться от персонажей или закончить кампанию.
Если вы в своей кампании планируете устроить крушение судна, на котором находятся персонажи, то подразумевается, что персонажи выживут вместе со снаряжением, которое они несут или носят. Судьба остальных персонажей и груза целиком зависит от вас.
<<<
{{$:/Случайные встречи в море}}
!!!''Погода на море''
При проверке погоды в море используйте приведённую выше таблицу «погода».
Если погодные условия указывают на сильный ветер и сильный дождь, то получается шторм с высокими волнами. Экипаж, попавший в шторм, теряет все ориентиры (если нет маяка или другой яркой приметы), а все проверки характеристик, совершённые для навигации во время шторма, совершаются с помехой.
В штиль (когда нет ветра), корабли не могут плыть за счёт парусов, и приходится использовать вёсла. Корабль, идущий на парусах против сильного ветра, перемещается с уменьшенной вдвое скоростью.
!!!''Видимость''
Спокойное море даёт отличную видимость. С вороньего гнезда, вперёдсмотрящий может заметить другой корабль или сушу с расстояния 10 миль, если стоит ясная погода. Облачность уменьшает это расстояние в два раза. Дождь и туман ограничивают видимость точно так же как на суше.
!!!''Владение кораблём''
В какой-то момент вашей кампании искатели приключений могут завладеть кораблём. Они могут захватить корабль, могут купить его, а могут получить на время выполнения задания. Есть ли корабли для покупки, решаете вы, и вы всегда можете отнять у них корабль, если он станет помехой (смотрите врезку «кораблекрушение»).
;
:"""//''Экипаж.''// Кораблю нужен экипаж из опытных наёмников. Как указано в Книге игрока, один опытный наёмник стоит минимум 2 зм в день. Минимальное количество опытных наёмников для экипажа зависит от типа судна и указано в таблице «воздушные и водные суда».
Вы можете отслеживать верность отдельных членов экипажа или сразу всего экипажа, используя опциональное правило из главы 4. Если как минимум половина экипажа перестаёт быть верной во время путешествия, экипаж поднимает бунт и начинается мятеж. Когда корабль приходит в порт, взбунтовавшиеся члены экипажа покидают корабль и никогда не возвращаются."""
:"""//''Пассажиры.''// В таблице указано количество пассажиров Маленького и Среднего размера Отдыхать им приходится в общих гамаках, подвешенных в тесных каютах. Корабль, оснащённый индивидуальными каютами, вмещает лишь одну пятую от указанного количества пассажиров.
Обычно пассажир платит за гамак по 5 см в день, но на разных кораблях цены могут отличаться. Частная каюта обычно стоит 2 зм в день."""
://''Груз.''// В таблице указан в тоннах вес груза, перевозимого всеми судами.
://''Порог урона.''// Корабль обладает иммунитетом ко всем видам урона, пока этот урон не превышает указанный порог, но если урон выше его, он причиняется как обычно. Урон, не превышающий порог, считается незначительным и не уменьшает хиты корабля.
://''Починка суда.''// Чинить получившее урон судно можно в порту. Восстановление 1 хита требует 1 дня и стоит 20 зм за материалы и труд.
{{$:/Воздушные и водные суда}}
!!__''Небо''__
Летающие персонажи могут перемещаться из одного места в другого по относительно прямой линии, игнорируя местность и чудовищ, которые не могут летать, и у которых нет дальнобойных атак.
Летание при помощи заклинания или магического предмета работает так же как пешее путешествие, как описано в Книге игрока. Существо, которое служит летающим ездовым животным, должно отдыхать 1 час за каждые 3 часа полёта, и оно не может летать более 9 часов в день. Таким образом, персонаж верхом на грифоне (у которого скорость полёта 80 футов) может пролетать 8 миль в час, покрывая в день 72 мили за 9 часов с двумя часовыми перерывами. Если скакун не устаёт (например, является летающим конструктом), он не подвержен этим ограничениям.
//Жезл, необычный//
У этого прямого железного жезла есть кнопка на одном торце. Вы можете действием нажать эту кнопку, после чего жезл становится магическим образом зафиксирован в текущей точке пространства. Пока вы или другое существо не нажмёте эту кнопку ещё раз, жезл не может быть сдвинут с места, игнорируя при этом даже гравитацию. Жезл может выдержать до 8000 фунтов веса. Больший вес деактивирует жезл, и тогда тот падает. Существо может действием совершить проверку Силы со Сл 30, сдвигая зафиксированный жезл на 10 футов в случае успеха.
!!!''__Непреклонная ярость__''
"""Начиная с 11 уровня ваша ярость позволяет вам сражаться, несмотря на тяжелейшие раны. Если ваши хиты опустилось до 0, когда вы находились в состоянии ярости, и вы не умерли сразу, вы можете совершить спасбросок Телосложения со Сл 10. В случае успеха ваше здоровье опускается всего лишь до 1.
Каждый раз, когда вы используете эту способность повторно, Сл спасброска повышается на 5. Когда вы закончите короткий либо продолжительный отдых, Сл снова равняется 10."""
!!!''__Непрерывная ярость__''
Начиная с 15 уровня ваша ярость становится настолько сильной, что досрочно прекращается только если вы теряете сознание или сами прекращаете её.
//2 уровень, Некромантия Волшебник/Жрец (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (щепотка соли и по одной медной монетке на каждый глаз трупа, которые должны оставаться там всё время, пока активно заклинание)
:''Длительность:'' 10 дней
"""Вы касаетесь трупа или других останков. Пока заклинание активно, цель защищена от разложения и не может стать нежитью.
Это заклинание также увеличивает ограничение по времени, в течение которого труп можно воскресить, так как дни, проведённые под воздействием этого заклинания, не учитываются при подсчёте времени со дня смерти для таких заклинаний как оживление."""
//6 уровень, Очарование, Бард/Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Выберите одно существо, видимое в пределах дистанции. Цель начинает смешно танцевать на месте, шаркая ногами, притоптывая и подпрыгивая. Существа, которые не могут быть очарованы, обладают иммунитетом к этому заклинанию.
Танцующее существо должно использовать всё своё перемещение на танец, не покидая своё пространство и получая помеху к спасброскам Ловкости и броскам атаки. Пока цель находится под действием этого заклинания, другие существа совершают с преимуществом броски атаки по нему. Танцующее существо может действием совершить спасбросок Мудрости, чтобы вернуть контроль над телом. При успехе заклинание заканчивается."""
!!!''__Неукротимая мощь__''
Начиная с 18 уровня, если результат вашей проверки Силы оказался меньше значения вашей Силы, то вы можете использовать значение характеристики вместо результата проверки.
!!!''__Неуловимость__''
Начиная с 18 уровня вы можете уклоняться так хорошо, что противник крайне редко может взять над вами верх. Никакие броски атаки не получают преимущества над вами, пока вы не станете недееспособным.
//2 уровень, Иллюзия, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (небольшой лоскут шёлка)
:''Длительность:'' 24 часа
"""Вы помещаете иллюзию на существо или предмет, которого касаетесь, чтобы заклинания школы Прорицания получали о нём ложную информацию. Целью может быть согласное существо или предмет, не несомый и не носимый другим существом.
При накладывании этого заклинания выберите один из описанных ниже эффектов или сразу оба. Эффект длится, пока активно заклинание. Если вы накладываете это заклинание на одно и то же существо или предмет каждый день в течение 30 дней, используя один и тот же эффект, иллюзия начинает длиться, пока не будет рассеяна.
//''Ложная аура.''// Вы меняете то, как цель представляется для заклинаний и магических эффектов, таких как обнаружение магии, сканирующих магическую ауру. Вы можете немагический предмет заставить выглядеть магическим, магический предмет заставить выглядеть немагическим, или изменить магическую ауру предмета, чтобы казалось, что находящаяся в нём магия принадлежит другой школе магии, выбранной вами. Если вы использовали этот эффект на предмете, можете сделать так, что новая магия будет сразу видна существу, держащему его в руках.
//''Маскировка.''// Вы меняете то, как цель представляется для заклинаний и магических эффектов, определяющих вид существ, таких как Божественное чувство паладина и триггер заклинания знак. Вы выбираете вид существа, и все заклинания и магические эффекты будут считать, что цель принадлежит этому виду или имеет это мировоззрение."""
//Чудесный предмет, необычный//
Пока вы носите эти тёмные очки, вы получаете тёмное зрение в радиусе 60 фт. Если у вас уже было тёмное зрение, очки увеличивают его радиус на 60 фт.
//5 уровень, Очарование, Бард/Волшебник/Друид/Жрец/Паладин//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' 30 дней
"""Вы отдаёте магическую команду существу, видимому в пределах дистанции, заставляя его оказать некую услугу или наоборот, не совершать чего-либо. Если существо может вас понять, оно должно преуспеть в спасброске Мудрости, иначе оно станет очарованным вами на время действия заклинания. Пока существо очаровано вами, оно получает урон психической энергией 5к10 каждый раз, когда действует, противореча вашим инструкциям, но не чаще одного раза за день. Существо, не способное вас понять, не попадает под действие этого заклинания.
Вы можете отдать любую команду, кроме той, что однозначно будет самоубийственной. Если вы отдадите такую команду, заклинание оканчивается.
Вы можете окончить заклинание преждевременно, потратив на это действие. Снятие проклятья, высшее восстановление и исполнение желаний тоже оканчивают его."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 или 8 уровня, длительность равна 1 году. Если вы накладываете это заклинание, используя ячейку 9 уровня, заклинание длится, пока не будет окончено одним из упомянутых выше заклинаний.
//2 уровень, Вызов, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (осколок стекла)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы заполняете воздух крутящимися кинжалами в кубе с длиной ребра 5 футов, с центром на точке, выбранной вами в пределах дистанции. Существо получает рубящий урон 4к4, когда впервые за ход входит в область заклинания или начинает там ход.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 2к4 за каждый уровень ячейки выше второго.
//5 уровень, Вызов, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте сферу с радиусом 20 футов из ядовитого жёлто-зелёного тумана с центром на точке, выбранной вами в пределах дистанции. Этот туман огибает углы. Он существует, пока активно заклинание, или пока сильный ветер его не развеет, окончив длительность. Его пространство — сильно заслонённая местность.
Когда существо впервые за ход входит в область заклинания или начинает там ход, оно должно совершить спасбросок Телосложения. Существо получает урон ядом 5к8 при провале или половину этого урона в случае успеха. Существо попадает под действие заклинания даже если задерживает дыхание или вообще не должно дышать.
Облако в начале каждого вашего хода перемещается на 10 футов прочь от вас, катясь по поверхности. Испарения, будучи тяжелее воздуха, стекаются вниз, и даже могут проникать в отверстия."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше пятого.
//2 уровень, Очарование, Бард/Жрец/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' 10 минут
"""Вы создаёте магическую зону, защищающую от обмана в сфере с радиусом 15 футов с центром на точке, выбранной вами в пределах дистанции. Пока заклинание активно, существо, впервые за ход входящее в область этого заклинания или начинающее в ней ход, должно совершить спасбросок Харизмы. При провале существо не может умышленно лгать, находясь в указанном радиусе. Вы знаете, какие существа прошли спасбросок, а какие провалили.
Попавшее под действие заклинания существо знает о заклинании, и потому может избегать отвечать на вопросы, на которые оно предпочло бы солгать. Такие существа могут давать уклончивые ответы, пока принуждены говорить правду."""
!!!''Обманчивое влияние''
"""Вы получаете владение навыками Обман и Убеждение."""
//1 уровень, Прорицание, Друид/Жрец/Следопыт/Паладин (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (лист тиса)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пока заклинание активно, вы можете ощущать присутствие и местонахождение ядов, ядовитых существ и болезней в пределах 30 футов от себя. Вы также распознаёте вид яда, ядовитого существа или болезни.
Заклинание проницает большую часть барьеров, но блокируется 1 футом камня, 1 дюймом обычного металла, тонким листом свинца или 3 футами дерева или земли."""
//1 уровень, Прорицание, Жрец/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пока заклинание активно, вы знаете, есть ли в пределах 30 футов от вас аберрации, исчадия, небожители, нежить, феи или элементали, а также их местоположение. Кроме того, вы знаете, есть ли в пределах 30 футов от вас место или предмет, который был магически освящён или осквернён.
Заклинание проницает большую часть барьеров, но блокируется 1 футом камня, 1 дюймом обычного металла, тонким листом свинца или 3 футами дерева или земли."""
//1 уровень, Прорицание, Бард/Волшебник/Друид/Жрец/Следопыт/Паладин/Чародей (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пока заклинание активно, вы чувствуете присутствие магии в пределах 30 футов. Если вы почувствовали за счёт этого заклинания присутствие магии, вы можете действием увидеть слабую ауру вокруг видимого существа или предмета, несущего на себе магию, а также узнать школу этой магии, если она есть.
Заклинание проницает большую часть барьеров, но блокируется 1 футом камня, 1 дюймом обычного металла, тонким листом свинца или 3 футами дерева или земли."""
//2 уровень, Прорицание, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (медная монетка)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Пока заклинание активно, вы можете читать мысли некоторых существ. Если вы сотворили это заклинание, и в свой ход совершаете действие, вы можете сосредоточиться на одном существе, которое видите в пределах 30 футов. Если у выбранного существа Интеллект равен 3 или ниже, или если оно не может говорить ни на одном языке, оно не попадает под действие заклинания.
Вначале вы знаете поверхностные мысли существа — то, что находится в его сознании на текущий момент. Вы можете действием либо перенести внимание на мысли другого существа, либо попытаться углубиться в мысли текущего существа. Если вы погружаетесь глубже, цель должна совершить спасбросок Мудрости. В случае провала вы получаете понимание её мыслей (если есть), её эмоционального состояния, и того, что её больше всего заботит (а также то, что она любит и ненавидит). Если существо преуспеет, заклинание оканчивается. В любом случае, цель знает, что вы прощупывали её сознание, и если вы не перевели внимание на мысли другого существа, предыдущее существо может в свой ход действием совершить проверку Интеллекта, противопоставленную вашей проверке Интеллекта; в случае успеха заклинание оканчивается.
Вопросы, задаваемые устно цели, влияют на ход её мыслей, поэтому это заклинание чрезвычайно эффективно во время допросов.
Вы можете также использовать это заклинание для обнаружения присутствия мыслящих существ, которых вы не видите. Когда вы накладываете это заклинание, или позже, пока оно активно, потратив действие, вы можете поискать мысли существ в пределах 30 футов. Заклинание проницает большую часть барьеров, но блокируется 2 футами камня, 2 дюймами обычного металла или тонким листом свинца. Вы не можете обнаружить существ с Интеллектом 3 и ниже, а также тех, кто не говорят ни на одном языке.
Обнаружив таким методом присутствие существа, вы можете до окончания действия заклинания читать его мысли, как описано выше, даже если вы его не видите, но оно должно находиться в пределах дистанции."""
//3 уровень, Иллюзия, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (кусок овечьей шерсти)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте образ предмета, существа или другого видимого явления, помещающийся в объёме в куб с длиной ребра 20 футов. Образ появляется в точке, которую вы видите в пределах дистанции, и существует, пока активно заклинание. Он выглядит абсолютно реальным, включая звук, запах и температуру, соответствующую этому предмету. Вы не можете создать жар или холод, достаточный для получения урона, звук, громкость которого может причинить урон звуком или оглушить существо, или запах, способный вызвать тошноту (такую как вонь троглодита).
Пока вы находитесь в пределах дистанции от иллюзии, вы можете действием заставить образ переместиться в любое место в пределах дистанции. Пока образ меняет местоположение, вы можете изменять его внешность, чтобы перемещение выглядело естественным. Например, если вы создаёте образ существа и перемещаете его, вы можете изменить образ, чтобы казалось, что оно идёт. Точно так же, вы можете заставить иллюзию издавать в разное время разные звуки, и даже заставлять её принимать участие в беседе, например.
Физическое взаимодействие с образом даёт понять, что это иллюзия, потому что сквозь него всё проходит. Существа, исследующие образ действием, могут определить, что это иллюзия, совершив успешную проверку Интеллекта (Анализ) против Сл ваших заклинаний. Если существо распознаёт иллюзию, оно может видеть сквозь неё, и все прочие сенсорные эффекты иллюзии тоже притупляются."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, оно длится, пока не рассеется, не требуя от вас концентрацию.
{{$:/Образ смерти (Stats)}}
!!!!__''Особенности''__
;
://''Бестелесное перемещение.''// Образ может проходить сквозь предметы и других существ, как будто они являются труднопроходимой местностью. Он получает урон силовым полем 5 (1 к10), если заканчивает ход в предмете.
://''Иммунитет к изгнанию.''// Образ обладает иммунитетом к умениям, изгоняющим нежить.
!!!!__''Действия''__
;
://''Коса смерти.''// Образ проводит призрачной косой сквозь существо, находящееся в пределах 5 футах от него, причиняя рубящий урон 7 (1к8 + 3) плюс урон некротической энергией 4 (1к8).
//Чудесный предмет, необычный//
Пока вы носите этот обруч, вы можете действием наложить им заклинание палящий луч. Вы совершает бросок атаки этого заклинания с бонусом +5. Обруч не может использоваться повторно до следующего рассвета.
//5 уровень, Прорицание, Жрец (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (благовоние и флакон святой или нечестивой воды)
:''Длительность:'' 1 минута
"""Вы связываетесь со своим божеством или божественным посредником и задаёте три вопроса, на которые можно ответить «да» или «нет». Вы должны задать вопросы пока заклинание активно. На каждый вопрос вы получаете правильный ответ.
Божественные создания не всегда всеведущи, поэтому вы можете получить ответ «неясно», если вопрос находится вне компетенции божества. Если односложный ответ может ввести в заблуждение или противоречит интересам божества, Мастер может выдать короткую фразу.
Если вы накладываете это заклинание несколько раз до завершения продолжительного отдыха, существует накопительный шанс 25 процентов за каждое использование, начиная со второго, что вы не получите ответ. Мастер совершает этот бросок скрытно."""
//5 уровень, Прорицание, Друид/Следопыт (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы ненадолго сливаетесь с природой и получаете знание об окружающей территории. На открытом воздухе заклинание даёт вам знание о землях в пределах 3 миль. В пещерах и естественном подземном окружении радиус 300 футов. Заклинание не действует там, где природа заменена конструкциями, например, в городах и подвалах.
Вы мгновенно получаете знание о трёх фактах на ваш выбор о следующих особенностях местности:"""
* местность и водоёмы
* преобладающие растения, минералы, животные и разумные существа
* мощные исчадия, небожители, нежить, феи и элементали
* влияние с других планов существования
* строения
Например, вы можете определить местонахождение мощной нежити, местонахождение чистой воды для питья и местонахождение окрестных поселений.
!!!__''Оглохший''__
Оглохшее существо ничего не слышит и автоматически проваливает все проверки характеристик, связанные со слухом.
//4 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
В следующий раз, когда вы попадёте по существу рукопашной атакой оружием, пока активно это заклинание, ваша атака пронзает не только его тело, но и сознание, и атака причиняет цели дополнительный урон психической энергией 4к6. Цель должна совершить спасбросок Мудрости. При провале она до конца своего следующего хода совершает с помехой броски атаки и проверки характеристик, а также не может совершать реакции.
//7 уровень, Воплощение, Друид/Жрец/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""В выбранном вами в пределах дистанции пространстве начинается огненная буря. Область бури состоит из 1–10 кубов с длиной ребра 10 футов, которые вы можете располагать как вам захочется. Каждый куб должен иметь хотя бы одну общую грань с другим кубом. Все существа в этом пространстве должны совершить спасбросок Ловкости. Они получают урон огнём 7к10 при провале, или половину этого урона при успехе.
Этот урон повреждает предметы и воспламеняет горючие предметы, которые никто не несёт и не носит. Если хотите, растения не будут затронуты этим заклинанием."""
//4 уровень, Воплощение, Волшебник/Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (небольшой кусочек фосфора)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте стену из огня на твёрдой поверхности в пределах дистанции. Вы можете создать стену до 60 футов в длину, 20 футов в высоту и 1 фут толщиной, или замкнутой кольцом стеной до 20 футов диаметром, 20 футов высотой и толщиной 1 фут. Стена непрозрачная и существует, пока активно заклинание.
Когда стена появляется, все существа в её области должны совершить спасбросок Ловкости. При провале они получают урон огнём 5к8 или половину этого урона при успехе.
Одна сторона стены, выбранная при накладывании заклинания, причиняет урон огнём 5к8 всем существам, оканчивающим ход в пределах 10 футов от этой стороны или внутри стены. Существа получают такой же урон когда впервые за ход входят в стену или оканчивают там ход. Другая сторона стены не причиняет урон."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше четвёртого.
//1 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (15-футовый конус)
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Соединив ладони и растопырив пальцы веером, вы испускаете из них тонкие языки пламени. Все существа в пределах 15-футового конуса должны совершить спасброски Ловкости. Существо получает урон огнём 3к6 в случае провала и половину этого урона в случае успеха.
Пламя поджигает все горючие предметы, никем не несомые и не носимые.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше первого.
//Заговор, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы кидаете сгусток огня в существо или предмет в пределах дистанции. Совершите по цели дальнобойную атаку заклинанием. При попадании цель получает урон огнём 1к10. Горючие предметы, по которым попало это заклинание, воспламеняются, если их никто не несёт и не носит.
Урон этого заклинания увеличивается на 1к10, когда вы достигаете 5 уровня (2к10), 11 уровня (3к10), 17 уровня (4к10).
//3 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (крошечный шарик из гуано летучей мыши и серы)
:''Длительность:'' Мгновенная
"""Яркий луч вылетает из вашего указательного пальца в точку, выбранную вами в пределах дистанции, где и происходит взрыв пламени с гулким рёвом. Все существа в пределах сферы с радиусом 20 футов с центром в этой точке должны совершить спасбросок Ловкости. Цель получает урон огнём 8к6 при провале или половину этого урона при успехе.
Этот огонь огибает углы. Он воспламеняет горючие предметы, которые никто не несёт и не носит."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше третьего.
//4 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (кусочек фосфора или светлячок)
:''Длительность:'' 10 минут
"""На время длительности заклинания ваше тело покрывается тонким слоем пламени, испускающим яркий свет в пределах 10-футового радиуса и тусклый свет в пределах ещё 10 футов. Вы можете досрочно окончить это заклинание действием.
Это пламя предоставляет вам либо тёплый щит, либо прохладный щит, на ваш выбор. Тёплый щит даёт вам сопротивление к урону холодом, а прохладный щит даёт сопротивление к урону огнём.
Кроме того, каждый раз, когда существо, находящееся в пределах 5 футов от вас, попадает по вам рукопашной атакой, щит испускает пламя. Атакующий получает урон огнём 2к8 в случае тёплого щита или урон холодом 2к8 в случае прохладного щита."""
//1 уровень, Воплощение, Волшебник/Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Все предметы в кубе с длиной ребра 20 футов в пределах дистанции подсвечиваются синим, зелёным или фиолетовым цветом (на ваш выбор). Все существа в этой области тоже подсвечиваются, если проваливают спасбросок Ловкости. На время длительности заклинания подсвеченные предметы и существа испускают тусклый свет в радиусе 10 футов.
Все броски атаки по затронутым существам и предметам совершаются с преимуществом, если атакующий видит их, и эти существа и предметы не получают преимуществ от невидимости."""
<<SizeButton "$:/Огр зомби (B)""$:/Огр зомби (S)">>
{{$:/Огр зомби (Stats)}}
!!!!''__Особенности__''
;
://''Стойкость нежити.''// Если урон опускает хиты зомби до 0, он совершает спасбросок Телосложения со Сл 5+полученный урон, если только это не был урон излучением или урон от критического попадания. При успехе хиты зомби опускаются до 1.
!!!!__''Действия''__
;
://''Моргенштерн.''// Рукопашная атака оружием: +6 к попаданию, досягаемость 5 фт., одна цель. Попадание: Дробящий урон 13 (2к8+4).
!!!''Один среди теней''
"""//Требование: 5 уровень//
Когда вы находитесь в области тусклого света или в темноте, вы можете действием стать невидимым, пока вы не переместитесь или не используете действие или реакцию."""
//Чудесный предмет, необычный (требуется настройка)//
Нося это ожерелье, вы можете нормально дышать в любой окружающей среде и совершаете с преимуществом спасброски от вредоносных газов и испарений (таких как эффекты облака смерти и зловонного облака, вдыхаемые яды и оружие дыхания некоторых драконов).
//Чудесный предмет, редкий (требуется настройка друидом, жрецом или паладином)//
У этого ожерелья 1к4 + 2 магические бусины, изготовленные из аквамарина, чёрного жемчуга или топаза. На нём также много немагических бусин, изготовленных из янтаря, кровавика, цитрина, коралла, жадеита, жемчуга или кварца. Если магическую бусину снимут с ожерелья, она теряет свою магию.
Существует шесть видов магических бусин. Мастер сам решает вид каждой бусины или определяет их случайным образом. На ожерелье могут быть бусины одного и того же вида. Для того чтобы использовать одну из них, вы должны носить это ожерелье. В каждой бусине находится заклинание, которое вы можете наложить ей бонусным действием (при необходимости используйте свою Сл спасброска). После того как заклинание магической бусины наложено, эту бусину нельзя использовать повторно до следующего рассвета.
<table>
<tr>
<th>к20</th>
<th>Бусина...</th>
<th>Заклинание</th>
</tr>
<tr>
<td>1-6</td>
<td>Благословения</td>
<td>Благословение</td>
</tr>
<tr>
<td>7-12</td>
<td>Лечения</td>
<td>Лечение ран (2 уровень) или малое восстановление</td>
</tr>
<tr>
<td>13-16</td>
<td>Благоволения</td>
<td>Высшее восстановление</td>
</tr>
<tr>
<td>17-18</td>
<td>Кары</td>
<td>Клеймящая кара</td>
</tr>
<tr>
<td>19</td>
<td>Призыва</td>
<td>Планарный союзник</td>
</tr>
<tr>
<td>20</td>
<td>Хождения по ветру</td>
<td>Хождение по ветру</td>
</tr>
</table>
//Чудесный предмет, редкий//
На этом ожерелье висят 1к6 + 3 бусины. Вы можете действием оторвать одну бусину и метнуть её на расстояние до 60 футов. Достигнув конечной точки, бусина детонирует как заклинание огненный шар 3 уровня (Сл спасброска 15).
Вы можете метнуть одним действием сразу несколько бусин или даже всё ожерелье. При этом увеличьте уровень огненного шара на 1 за каждую бусину после первой.
//5 уровень, Некромантия, Бард/Жрец/Паладин//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (бриллиант, стоящий как минимум 500 зм, расходуемый заклинанием)
:''Длительность:'' Мгновенная
"""Вы возвращаете к жизни мёртвое существо, которого касаетесь, при условии, что оно мертво не более 10 дней. Если душа этого существа может воссоединиться с телом и хочет этого, существо воскрешается с 1 хитом.
Это заклинание также нейтрализует все яды и исцеляет немагические болезни, бывшие у существа в момент смерти. Однако это заклинание не снимает магические болезни, проклятья и подобные эффекты; если их не снять до накладывания этого заклинания, они снова начнут действовать, когда существо оживёт. Это заклинание не может оживить нежить.
Это заклинание исцеляет все раны, но не восстанавливает отсутствующие части тела. Если у существа отсутствуют жизненно важные части тела — например, голова — заклинание автоматически проваливается.
Возвращение к жизни — тяжёлое испытание. Цель получает штраф −4 ко всем броскам атаки, спасброскам и проверкам характеристик. Каждый раз, когда цель заканчивает длительный отдых, штраф уменьшается на 1, пока не исчезнет полностью."""
//5 уровень, Преобразование, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""По вашему приказу оживают предметы. Выберите до десяти немагических предмета в пределах дистанции, которые никто не несёт и не носит. Цели Среднего размера считаются за два предмета, Большие цели считаются за четыре предмета, Огромные цели считаются за восемь предметов. Оживлять предметы с размером больше Огромного нельзя. Все цели оживают и становятся существами под вашим контролем до окончания действия заклинания или пока их хиты не уменьшатся до 0.
Вы можете бонусным действием мысленно отдать приказ существу, созданному этим заклинанием, если оно находятся в пределах 500 футов от вас (если вы контролируете несколько существ, вы можете отдавать один и тот же приказ любому количеству из них одновременно). Вы решаете, какое действие совершит это существо, и куда оно переместится в следующем ходу, или вы можете отдать общий приказ, например, охранять комнату или коридор. Если вы не отдадите команду, существо будет всего лишь защищаться от врагов. Получив приказ, существо продолжает его выполнять, пока задача не будет выполнена."""
<table>
<tr>
<th>Размер</th>
<th>Хиты</th>
<th>КД</th>
<th>Атака</th>
<th>Сил</th>
<th>Лов</th>
</tr>
<tr>
<td>Крошечный</td>
<td>20</td>
<td>18</td>
<td>+8 к атаке, урон 1к4 + 4</td>
<td>4</td>
<td>18</td>
</tr>
<tr>
<td>Маленький</td>
<td>25</td>
<td>16</td>
<td>+6 к атаке, урон 1к8 + 2</td>
<td>6</td>
<td>14</td>
</tr>
<tr>
<td>Средний</td>
<td>40</td>
<td>13</td>
<td>+5 к атаке, урон 2к6 + 1</td>
<td>10</td>
<td>12</td>
</tr>
<tr>
<td>Большой</td>
<td>50</td>
<td>10</td>
<td>+6 к атаке, урон 2к10 + 2</td>
<td>14</td>
<td>10</td>
</tr>
<tr>
<td>Огромный</td>
<td>80</td>
<td>10</td>
<td>+8 к атаке, урон 2к12 + 4</td>
<td>18</td>
<td>6</td>
</tr>
</table>
"""Оживлённый предмет является конструктом с КД, хитами, атаками, Силой и Ловкостью, зависящими от его размера. Его Телосложение 10, Интеллект и Мудрость 3, а Харизма 1. Его скорость 30 футов; если у предмета нет ног или других придатков, которые можно использовать для перемещения, то он получает скорость полёта 30 футов и может парить. Если предмет прикреплён к поверхности или большему предмету, например, это цепь, прикреплённая к стене, его скорость равна 0. Он обладает слепым зрением в радиусе 30 футов и ничего не воспринимает за этими пределами. Когда хиты оживлённого предмета опускаются до 0, он возвращает себе свой обычный облик, а излишний урон переносится на оригинальный облик.
Если вы приказываете предмету атаковать, он может совершить одну рукопашную атаку по существу в пределах 5 футов от него. Он совершает размашистую атаку с бонусом атаки и дробящим уроном, зависящим от его размера. Мастер может постановить, что этот предмет причиняет рубящий или колющий урон."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, вы можете оживить два дополнительных предмета за каждый уровень ячейки выше пятого.
!!!__''Окаменевший''__
* Окаменевшее существо, а также все немагические предметы, которые оно несёт или носит, трансформируется в твёрдое инертное вещество (как правило, в камень). Его вес увеличивается в 10 раз, и оно перестаёт стареть.
* Существо «недееспособно» (см. состояние), не способно двигаться и говорить, а также не осознаёт своё окружение.
* Броски атаки по существу совершаются с преимуществом.
* Существо автоматически проваливает спасброски Силы и Ловкости.
* Существо получает сопротивление ко всем видам урона.
* Существо получает иммунитет к ядам и болезням. Если яд или болезнь уже действовали на существо, их действие приостанавливается, но не исчезает.
//6 уровень, Преобразование, Волшебник/Колдун//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (щепотка извести, воды и земли)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь сделать каменным одно существо, которое видите в пределах дистанции. Если тело цели состоит из плоти, она должна совершить спасбросок Телосложения. При провале она становится опутанной, так как плоть начитает отвердевать. В случае успеха существо не попадает под действие заклинания.
Существо, опутанное этим заклинанием, должно совершать спасброски Телосложения в конце каждого своего хода. Если оно успешно спасается от этого заклинания три раза, оно оканчивается. Если оно провалит спасбросок три раза, оно превращается в камень и получает состояние «окаменевшее» на время длительности заклинания. Успехи и провалы не обязаны быть последовательными; отслеживайте их отдельно, пока не накопится три вида чего-то одного.
Если существо физически ломается, будучи окаменевшим, при возвращении в обычное тело оно сохраняет все полученные деформации.
Если вы сохраняете концентрацию на этом заклинании до максимально возможного времени, существо становится окаменевшим до снятия эффекта."""
!!!!''Око Дракона''
//Чудесный предмет, артефакт (требуется настройка)//
Много столетий назад, в мире Кринн эльфы и люди развязали ужасную войну со злыми драконами. Когда мир был уже практически обречён, волшебники Башен Высшего Волшебства объединились и с помощью самой могущественной магии создали пять Очей Драконов, чтобы победить своих врагов. Каждой из башен досталось своё Око, и с их помощью удалось одержать победу над драконами. Волшебники приманивали к себе драконов и уничтожали их мощной магией.
Когда позже Башни Высшего Волшебства пали, Очи либо были уничтожены, либо пропали, и считается, что осталось только три таких Ока. Их магия за столетия изменилась, и, несмотря на то, что они по-прежнему могут приманивать драконов, теперь они могут оказывать и другое воздействие.
Каждое Око содержит сущность злого дракона, которая сопротивляется попыткам использовать её магию. Те, кто слабы духом, рискуют стать рабами Ока.
Око это гравированный хрустальный шар примерно 25 сантиметров диаметром. Когда его используют, он увеличивается диаметром до полуметра и в нём начинает клубиться туман.
Будучи настроенным на Око, вы можете действием заглянуть в его глубины и произнести командное слово. Затем вы совершаете проверку Харизмы со Сл 15. В случае успеха вы контролируете Око всё время, пока настроены на него. При провале вы становитесь очарованы Оком, пока вы настроены на него.
Пока вы очарованы Оком, вы не можете добровольно окончить настройку на него, и Око может неограниченно накладывать на вас внушение (Сл спасброска 18), побуждая вас совершать злые поступки. Сущность дракона в Оке может желать разного: уничтожения конкретного народа, освобождения из Ока, распространения страданий по миру, распространения поклонения Такхизис (имя Тиамат на Кринне), или чего-то ещё, на усмотрение Мастера.
://''Случайные свойства.''// Око Дракона обладает несколькими свойствами, определяемыми случайным образом:
* 2 малых положительных свойства
* 1 малое отрицательное свойство
* 1 основное отрицательное свойство
:"""//''Заклинания.''// У Ока есть 7 зарядов, и оно восстанавливает 1к4 + 3 заряда на рассвете. Если вы контролируете Око, вы можете действием потратить 1 или несколько зарядов, чтобы наложить им одно из следующих заклинаний (Сл спасброска 18): дневной свет (1 заряд), защита от смерти (2 заряда), лечение ран (версия 5 уровня, 3 заряда) или наблюдение (3 заряда).
Вы также можете действием наложить Оком заклинание обнаружение магии, не тратя заряды."""
://''Зов драконов.''// Если вы контролируете Око, вы можете действием заставить артефакт испустить телепатический зов, распространяющийся на 40 миль. Злые драконы в пределах этой дистанции вынуждены лететь к Оку кратчайшим маршрутом. Божества-драконы, такие как Тиамат, не попадают под действие этого зова. Прилетевшие драконы могут быть враждебны к вам, за то, что вы принудили их. Использовав это свойство, вы не можете повторно использовать его 1 час.
://''Уничтожение Ока.''// Око Дракона выглядит хрупким, но оно не подвержено практически никакому урону, включая атаки и дыхание драконов. Однако Око можно уничтожить заклинанием распад или одним попаданием магического оружия +3.
//Чудесный предмет, редкий//
Вы можете действием надеть эти оковы на недееспособное существо. Они подходят для существ с размером от Маленького до Большого. Кроме того, что оковы служат как обычные наручники, они не позволяют скованному существу никакие перемещения меж измерениями, включая телепортацию и путешествия на другие планы существования. Они не мешают существу проходить сквозь межпространственные порталы.
Вы и все существа, указанные вами при надевании оков, можете действием снять их. Раз в 30 дней скованное существо может совершить проверку Силы (Атлетика) со Сл 30. При успехе существо ломает и уничтожает оковы.
Приключения по своей природе включают исследование тёмных, опасных и таинственных мест. Правила этого раздела покрывают самые важные методы взаимодействия персонажей с окружающей средой в таких местах. В Руководстве Мастера есть правила по необычным ситуациям.
!!!__''Падение''__
"""Падение с большой высоты — одна из самых распространённых опасностей, поджидающих искателей приключений.
В конце падения существо получает дробящий урон 1к6 за каждые 10 футов падения, с максимумом 20к6. Существо падает ничком, если только каким-то образом не избежит урона от падения."""
!!!__''Удушение''__
"""Существо может задержать дыхание на количество минут, равное 1 + модификатор Телосложения (минимум 30 секунд).
Если существо не может дышать, оно может жить в течение количества раундов, равного модификатору Телосложения (минимум 1 раунд). В начале своего следующего хода его хиты опускаются до 0, и оно начинает умирать. Если у вас кончился воздух или вас душат, вы не можете восстанавливать хиты и становиться стабилизированным, пока снова не сможете дышать.
Например, существо с Телосложением 14 может задержать дыхание на 3 минуты. Если оно начнёт задыхаться, у него будет 2 раунда, после чего его хиты опускаются до 0."""
!!!__''Зрение и свет''__
"""Основные задачи в приключениях — заметить опасность, найти спрятанные предметы, попасть по врагу, нацелить заклинание — сильно зависят от способности персонажа видеть. Темнота и прочие эффекты, мешающие зрению, вызывают большие затруднения.
Область может быть слабо или сильно заслонённой. В ''слабо заслонённой'' области, например, в области тусклого света, в тумане, листве, существа совершают со штрафом проверки Мудрости (Внимательность), полагающиеся на зрение.
''Сильно заслонённая местность'' — такая как тьма, густой туман или густая листва — полностью блокирует зрение. Существа фактически считаются ослеплёнными, когда пытаются рассмотреть что-то, находящееся в такой местности (смотрите приложение А).
Наличие или отсутствие света создаёт три категории освещения: яркий свет, тусклый свет и тьму.
''Яркий свет'' позволяет большинству существ видеть хорошо. Даже пасмурный день предоставляет яркий свет, равно как факелы, фонари, костры и прочие источники света в определённом радиусе.
''Тусклый свет'', также называемый тенью, создаёт слабо заслонённую местность. Область тусклого света обычно находится между источником яркого света, таким как факел, и окружающей тьмой. На рассвете и закате свет тоже тусклый. Яркая луна в полнолуние освещает землю тусклым светом.
''Темнота'' создаёт сильно заслонённую местность. Персонажи оказываются в темноте по ночам (когда не светит луна), в коридорах подземелий и в областях магической тьмы."""
!!!''Слепое зрение''
Существо со слепым зрением может воспринимать своё окружение в определённом радиусе, не полагаясь на зрение. Этим чувством обладают существа без глаз, такие как слизи, и существа с эхолокацией или обострёнными чувствами, такие как летучие мыши и драконы.
!!!''Тёмное зрение''
Многие существа в мирах D&D, особенно те, что обитают под землёй, обладают тёмным зрением. Такие существа могут видеть в темноте, как если бы она была тусклым светом, так что для них эта область считается слабо заслонённой. Однако такие существа не могут в темноте различать цвета, для них это разные оттенки серого.
!!!''Истинное зрение''
Существа с истинным зрением могут в определённом радиусе видеть в обычной и магической темноте, видеть невидимые существа и предметы, автоматически обнаруживать зрительные иллюзии и преуспевать в спасбросках от них, и видеть истинный облик перевёртышей и существ, превращённых магией. Кроме того, зрение таких существ простирается на Эфирный План.
!!!__''Еда и вода''__
Персонажи, которые не едят и не пьют, получают эффекты истощения (смотрите приложение А). Истощение, вызванное отсутствием еды или воды, нельзя устранить, пока персонаж не съест или не выпьет полностью требуемое количество.
!!!''Еда''
"""Персонажу нужен один фунт еды в день, но он может растянуть пищу, съев всего половину рациона. Полфунта еды в день считается как полдня без еды.
Персонаж может прожить без еды количество дней, равное 3 + модификатор Телосложения (минимум 1). В конце каждого дня после этого персонаж автоматически получает одну степень истощения.
День с полноценным питанием сбрасывает счётчик дней без еды до нуля."""
!!!''Вода''
"""Персонажу нужен 1 галлон (4 литра) воды в день, или 2 галлона (8 литров), если погода жаркая. Персонаж, выпивший за день только половину этого объёма, должен в конце дня преуспеть в спасброске Телосложения со Сл 15, иначе он получает одну степень истощения. Выпивший меньший объём воды получает в конце дня одну степень истощения автоматически.
И в том и в другом случае персонаж, уже имеющий как минимум одну степень истощения, получает сразу две степени."""
!!!__''Взаимодействие с предметами''__
"""Взаимодействие персонажей с предметами обычно легко разрешить. Игрок сообщает Мастеру, что его персонаж делает, например, двигает рычаг, а Мастер описывает, что произошло, если что-то вообще произошло.
Например, персонаж может потянуть рычаг, который, поднимет решётку, затопит комнату водой или откроет потайную дверь в стене. Однако если рычаг заржавел, его придётся сдвинуть с места. В такой ситуации Мастер может призвать к совершению проверки Силы, чтобы увидеть, сдвинулся ли рычаг. Мастер устанавливает Сл, основываясь на трудности задачи.
Персонажи могут также причинять урон предметам своим оружием и заклинаниями. Предметы обладают иммунитетом к урону ядом и психической энергией, но во всём остальном они могут подвергаться магическим и физическим атакам так же как существа. Мастер определяет КД предмета и его хиты, а также может решить, что предмет обладает сопротивлением или иммунитетом к определённым видам атак (например, сложно перерезать верёвку дубинкой). Предметы всегда проваливают спасброски Силы и Ловкости, и они обладают иммунитетом к эффектам, требующим от других совершения спасброска. Когда хиты предмета падают до 0, он ломается.
Персонаж может также попытаться совершить проверку Силы, чтобы сломать предмет. Сл такой проверки определяет Мастер."""
!!''Описание персонажа''
Имя вашего персонажа и его физическое описание могут быть первым, что другие игроки узнают о вас. Поэтому стоит подумать, как эти показатели будут отражать характер вашего персонажа, которого вы уже придумали в своей голове.
!!!__''Имя''__
Описание расы вашего персонажа включает примеры имён для представителей этой расы. Вложите некоторый смысл в своё имя, даже если вы просто выбираете его из списка.
!!!__''Пол''__
Вы можете играть мужчиной или женщиной, не получая особых преимуществ или недостатков. Подумайте о том, как ваш персонаж относится к вопросу полов. Например, мужчина жрец дроу может отрицать традиционное разделение по половому признаку общества своей расы, и именно поэтому он покинул его и отправился на поверхность.
<<<
!!!''Тика и Артемис: Контрастные персонажи''
"""Информация из этой главы делает персонажей непохожими друг на друга. Давайте рассмотрим двух людей воинов.
Тика Вейлан родом из мира Саги о Копье. Это дерзкая девочка-подросток, у которой было суровое детство. Будучи дочерью вора, она сбежала из дома и занималась на улицах города Утеха тем же, что и её отец. Попытавшись ограбить владельца таверны Последний Приют, она попалась, но была принята на воспитание и стала официанткой. Однако когда войска драконов уничтожили город и сожгли таверну, нужда заставила Тику пуститься в приключения с друзьями, которых она знала с детства. Её навыки воина (сковородка так и осталась её любимым оружием) вкупе с опытом жизни на улицах дали ей знания, бесценные в карьере искателя приключений.
Артемис Энтрери вырос на улицах Калимпорта в мире Забытых Королевств. С помощью хитрости, силы и ловкости он завоёвывал свой кусочек территории в трущобах. Через несколько лет он привлёк внимание одной из самых влиятельных гильдий воров в городе, и, несмотря на молодость, был принят в её члены. Артемис стал избранным наёмным убийцей одного из пашей города, отправившего его в далёкую долину Ледяного Ветра, чтобы вернуть украденные драгоценные камни. Это профессиональный убийца, постоянно совершенствующий свои навыки.
Тика и Артемис оба люди и оба относятся к классу воин (а также обладают знаниями плута). У них высокие значения Силы и Ловкости, но на этом их сходство заканчивается."""
<<<
!!!__''Рост и вес''__
"""Вы можете определить рост и вес своего персонажа, используя информацию, приведённую в описании вашей расы, или же воспользовавшись приведённой ниже таблицей. Подумайте, как характеристики вашего персонажа могут повлиять на его рост и вес. Слабый, но подвижный персонаж может быть худым, в то время как сильный и стойкий персонаж может быть высоким или просто крупным.
Вы можете случайным образом определить рост и вес персонажа, используя таблицу. Бросок по колонке «модификатор роста» определяет количество дюймов, которое необходимо прибавить к базовому росту персонажа, выраженному в футах и дюймах. Это же число, умноженное на результат броска костей или готовое число из колонки «модификатор веса», определяет количество фунтов, которые необходимо прибавить к базовому весу персонажа."""
''Случайный рост и вес''
<table>
<tr>
<th>Раса</th>
<th>Базовый рост (фут'дюйм)</th>
<th>Модификатор роста</th>
<th>Базовый вес</th>
<th>Модификатор веса</th>
</tr>
<tr>
<td>Человек</td>
<td>4'8</td>
<td>+2к10</td>
<td>110 фнт.</td>
<td>× (2к4) фнт.</td>
</tr>
<tr>
<td>Дварф, горный</td>
<td>4'</td>
<td>+2к4</td>
<td>130 фнт.</td>
<td>× (2к6) фнт.</td>
</tr>
<tr>
<td>Дварф, холмовой</td>
<td>3'8</td>
<td>+2к4</td>
<td>115 фнт.</td>
<td>× (2к6) фнт.</td>
</tr>
<tr>
<td>Эльф, высший</td>
<td>4'6</td>
<td>+2к10</td>
<td>90 фнт.</td>
<td>× (1к4) фнт.</td>
</tr>
<tr>
<td>Эльф, лесной</td>
<td>4'6</td>
<td>+2к10</td>
<td>100 фнт.</td>
<td>× (1к4) фнт.</td>
</tr>
<tr>
<td>Эльф, дроу</td>
<td>4'5</td>
<td>+2к6</td>
<td>75 фнт.</td>
<td>× (1к6) фнт.</td>
</tr>
<tr>
<td>Полурослик</td>
<td>2'7</td>
<td>+2к4</td>
<td>35 фнт.</td>
<td>× 1 фнт.</td>
</tr>
<tr>
<td>Драконорождённый</td>
<td>5'6</td>
<td>+2к8</td>
<td>175 фнт.</td>
<td>× (2к6) фнт.</td>
</tr>
<tr>
<td>Гном</td>
<td>2'11</td>
<td>+2к4</td>
<td>35 фнт.</td>
<td>× 1 фнт.</td>
</tr>
<tr>
<td>Полуэльф</td>
<td>4'9</td>
<td>+2к8</td>
<td>110 фнт.</td>
<td>× (2к4) фнт.</td>
</tr>
<tr>
<td>Полуорк</td>
<td>4'10</td>
<td>+2к10</td>
<td>140 фнт.</td>
<td>× (2к6) фнт.</td>
</tr>
<tr>
<td>Тифлинг</td>
<td>4'9</td>
<td>+2к8</td>
<td>110 фнт.</td>
<td>× (2к4) фнт.</td>
</tr>
</table>
Например, у Тики, как у человека, рост 4 фута 8 дюймов плюс 2к10 дюймов. Её игрок бросает 2к10 и получает результат 12. В итоге у Тики рост 5 футов 8 дюймов, то есть 173 сантиметра. Затем игрок берёт тот же результат броска (12) и умножает его на 2к4 фунта. В результате броска 2к4 игрок получает 3, поэтому Тика прибавляет 36 фунтов (12 × 3) к своему базовому весу 110 фунтов, получая окончательный вес 146 фунтов, то есть 66 килограмм.
!!!''__Другие физические характеристики__''
Вы выбираете возраст своего персонажа, цвет его волос, глаз и кожи. Чтобы получить своеобразную нотку, вы можете добавить необычную или памятную характеристику, такую как шрам, хромоту или татуировку.
<<<
!!!''Тика и Артемис: Подробности персонажей''
"""Посмотрите, как даже имена отличают Тику Вейлан и Артемиса Энтрери, отражая их личности. Тика — молодая девушка, решившая доказать, что она уже не ребёнок, и её имя весьма простое. Артемис прибыл из экзотической страны, и имя у него загадочное.
Тике 19 лет в начале приключения, и у неё рыжие волосы, зелёные глаза, светлая кожа с веснушками и родинка на правой щеке. Артемис невысок и плотно сложен. У него рельефная мускулатура, угловатые черты лица, высокие скулы и постоянная щетина. У него густые чёрные волосы, а глаза серые и безжизненные — они выдают пустоту его жизни и души."""
<<<
!!!''__Мировоззрение__''
"""У существ в мирах D&D есть своё мировоззрение, которое в примерных чертах описывает моральный и личный настрой. Мировоззрение является комбинацией двух факторов: первый отражает мораль (добрый, злой или нейтральный), а другой описывает отношение к обществу и порядку (законный, хаотический или нейтральный). Таким образом, из всех комбинаций получаются девять различных мировоззрений.
Ниже приведены краткие изложения девяти мировоззрений и типичное поведение существ с этим мировоззрением. Поведение индивидуумов может значительно отличаться от данного типичного поведения, и мало кто непрестанно выполняет все заветы выбранного мировоззрения."""
"""//''Законно-добрые (ЗД)''// существа совершают поступки, считающиеся в обществе как правильные. Золотые драконы, паладины и большинство дварфов являются законно-добрыми.
//''Нейтрально-добрые (НД)''// стараются сделать всё, от них зависящее, чтобы помочь другим. Многие небожители, некоторые облачные великаны и большинство гномов нейтрально-добрые.
//''Хаотично-добрые (ХД)''// существа действуют по собственной совести, вне зависимости от того, что думают другие. Медные драконы, многие эльфы и единороги хаотично-добрые.
//''Законно-нейтральные (ЗН)''// индивидуумы действуют в соответствии с законом, традицией, или личным кодексом. Многие монахи и некоторые волшебники являются законно-нейтральными.
//''Нейтральное (Н)''// мировоззрение у тех, кто предпочитает держаться подальше от нравственных вопросов и не принимать ничью сторону, делая то, что кажется лучшим в данное время. Людоящеры, большинство друидов и многие люди являются нейтральными.
//''Хаотично-нейтральные (ХН)''// существа следуют своим прихотям, держа свою личную свободу превыше всего. Многие варвары и разбойники, а также некоторые барды хаотично-нейтральны.
//''Законно-злые (ЗЗ)''// существа методично берут то, что хотят, в рамках кодекса традиции, верности, или порядка. Дьяволы, синие драконы и хобгоблины законно-злые.
//''Нейтрально-злое (НЗ)''// мировоззрение у тех, кто делает всё, что может сойти им с рук, без сострадания и угрызений совести. Многие дроу, некоторые облачные великаны и юголоты нейтрально-злы.
//''Хаотично-злые (ХЗ)''// существа действуют со спонтанной жестокостью, вызванной их жадностью, ненавистью или жаждой крови. Демоны, красные драконы и орки хаотично-злы."""
<<<
!!!''Тика и Артемис: Мировоззрение''
"""У Тики Вейлан нейтрально-доброе мировоззрение, у неё доброе сердце, и она всегда помогает нуждающимся, если может. Артемис же законно-злой, он ни в грош не ставит ценность жизни, во всяком случае, с точки зрения своей профессии убийцы.
Будучи злым персонажем, Артемис плохо подходит на роль искателя приключений. Он зол и эгоистичен, и только острая необходимость или выгода заставит его сотрудничать с другими героями. В большинстве игр злые искатели приключений приносят много проблем в группах, которые не разделяют их интересы. Чаще всего злое мировоззрение имеют злодеи и чудовища."""
<<<
!!!''Мировоззрение в мультивселенной''
"""Для многих существ мировоззрение является вопросом морального выбора. Люди, дварфы, эльфы и другие народы могут выбрать, чему они следуют — путям добра или зла, порядка или хаоса. По легенде добрые боги, которые создали расы, даровали им свободную волю для определения своей судьбы, зная, что добро нельзя навязать силой.
Злые же божества, создавшие другие расы, создавали себе рабов. У этих рас характер от рождения похож на характер их божеств. Большинство орков разделяет жестокую и дикую натуру своего бога, Груумша, и потому склонны к злу. Даже если орк выберет доброе мировоззрение, он всю свою жизнь будет бороться с врождёнными помыслами (даже полуорки чувствуют томительное влияние бога орков).
Мировоззрение — важная часть природы небожителей и исчадий. Дьяволы не сами решают быть законно-злыми, и у них нет врождённой склонности к законно-злому мировоззрению. Они законно-злы по своей сущности. Если дьявол перестанет быть законно-злым, он перестанет быть дьяволом.
Многие существа, лишённые рационального мышления, не имеют мировоззрения как такового. Такие существа не могут совершать моральный и этический выбор, и действуют согласно звериной природе. Акулы, например, дикие хищники, но они не злы; у них нет мировоззрения."""
!!!__''Языки''__
"""Ваша раса указывает языки, на которых ваш персонаж может говорить по умолчанию, а предыстория может дать ещё несколько языков на выбор. Запишите эти языки на листе персонажа.
Выберите языки из таблицы обычных языков или из тех, что считаются обычными в вашей кампании. С разрешения Мастера, вы можете выбрать язык из таблицы экзотических языков или тайный язык, такой как жаргон воров или язык друидов.
Некоторые из этих языков на деле являются семействами языков с многочисленными диалектами. Например, Первичный язык включает диалекты Акван, Ауран, Игнан, и Терран, по одному на каждый из четырёх стихийных планов. Существа, говорящие на разных диалектах одного языка могут общаться между собой."""
''Обычные языки''
<table>
<tr>
<th>Язык</th>
<th>Типичный представитель</th>
<th>Письменность</th>
</tr>
<tr>
<td>Великаний</td>
<td>Огры, великаны</td>
<td>Великанья</td>
</tr>
<tr>
<td>Гномий</td>
<td>Гномы</td>
<td>Дварфская</td>
</tr>
<tr>
<td>Гоблинский</td>
<td>Гоблиноиды</td>
<td>Дварфская</td>
</tr>
<tr>
<td>Дварфский</td>
<td>Дварфы</td>
<td>Дварфская</td>
</tr>
<tr>
<td>Общий</td>
<td>Люди</td>
<td>Общая</td>
</tr>
<tr>
<td>Орочий</td>
<td>Орки</td>
<td>Дварфская</td>
</tr>
<tr>
<td>Полуросликов</td>
<td>Полурослики</td>
<td>Общая</td>
</tr>
<tr>
<td>Эльфийский</td>
<td>Эльфы</td>
<td>Эльфийская</td>
</tr>
</table>
''Экзотические языки''
<table>
<tr>
<th>Язык</th>
<th>Типичный представитель</th>
<th>Письменность</th>
</tr>
<tr>
<td>Бездны</td>
<td>Демоны</td>
<td>Инфернальная</td>
</tr>
<tr>
<td>Глубинная Речь</td>
<td>Иллитиды, бехолдеры</td>
<td>—</td>
</tr>
<tr>
<td>Драконий</td>
<td>Драконы, драконорождённые</td>
<td>Драконья</td>
</tr>
<tr>
<td>Инфернальный</td>
<td>Дьяволы</td>
<td>Инфернальная</td>
</tr>
<tr>
<td>Небесный</td>
<td>Небожители</td>
<td>Небесная</td>
</tr>
<tr>
<td>Первичный</td>
<td>Элементали</td>
<td>Дварфская</td>
</tr>
<tr>
<td>Подземный</td>
<td>Купцы Подземья</td>
<td>Эльфийская</td>
</tr>
<tr>
<td>Сильван</td>
<td>Фейские существа</td>
<td>Эльфийская</td>
</tr>
</table>
''Дварфская письменность: Пример алфавита''
[img[https://i.imgur.com/vA7DAkF.png]]
''Драконья письменность: Пример алфавита''
[img[https://i.imgur.com/kFfZBHV.jpg]]
''Эльфийская письменность: Пример алфавита''
[img[https://i.imgur.com/FjaCf8F.png]]
!!!__''Персонализация''__
"""Конкретизируйте личность своего персонажа — определите его привычки, манеры, убеждения и недостатки, которые определяют его, как уникальную личность. Это поможет вам вдохнуть в него жизнь во время игры. Здесь представлены четыре категории персонализации: черты характера, идеалы, привязанности и слабости. Помимо этих категорий стоит подумать о типичных фразах, жестах, больных местах, в общем, обо всём, что вы можете представить.
Все предыстории, предложенные далее, включают в себя варианты, способные разжечь ваше воображение. Вы не обязаны выбирать только из них, но они являются хорошей отправной точкой."""
!!!''Черты характера''
"""Определите две черты характера своего персонажа. Черты характера это простой способ отличить вашего персонажа от любого другого. Эти черты должны рассказывать о вашем персонаже что-то интересное и забавное. Они должны рассказать нечто особенное, что могло бы выделить его среди остальных. «Я умный» — плохая черта, так как подходит многим персонажам. «Я прочёл все книги в Крепости Свечи» говорит об интересах вашего персонажа значительно больше.
Черты характера могут рассказывать о достижениях вашего персонажа, его пристрастиях или страхах, его манерах и самооценке. Они могут что-то рассказывать о его игровых характеристиках."""
<<<
!!!''Тика и Артемис: Персонализация''
"""У Тики и Артемиса имеются существенные отличия. Тика Вейлан не любит хвастунов и боится высоты из-за неудачного падения во время её карьеры в качестве вора. Артемис Энтрери всегда готов к худшему и двигается быстро и уверенно.
Рассмотрим их идеалы. Тика Вейлан по-детски невинна, она верит в ценность жизни и в то, что каждый может быть в чём-то хорош. Нейтрально-доброе мировоззрение разделяет её идеалы жизни и уважения. Артемис Энтрери никогда не поддаётся эмоциям, он постоянно испытывает себя, чтобы улучшить свои навыки. Его законно-злое мировоззрение даёт ему идеалы непредвзятости и жажды власти.
Привязанность Тики ведёт нас к таверне Последний Приют. Хозяин таверны дал ей шанс начать новую жизнь, и её дружба с искателями приключений началась в то время, пока она там работала. Разрушение таверны драконидами даёт Тике очень серьёзную причину ненавидеть их всей душой. Её привязанность может быть описана так: «Я сделаю всё, чтобы покарать драконидов за разрушение Последнего Приюта».
Привязанность Артемиса это странные, почти парадоксальные отношения с Дриззтом До’урденом, равного ему по фехтованию и мрачной решимости. В первом их сражении с Дриззтом Артемис увидел нечто особенное в своём противнике и понял, что его жизнь изменится к лучшему, если он будет больше походить на легендарного дроу. С той встречи Артемис стал не просто убийцей и преступником — соперничество с Дриззтом превратило его в настоящего антигероя. Его привязанность можно описать следующими словами: «Я не остановлюсь, пока не стану лучше, чем сам Дриззт До’урден».
У обоих персонажей есть слабости. Тика Вейлан наивна и эмоционально уязвима. Она моложе своих товарищей, и ей досадно, что они всё ещё думают о ней как о ребёнке, которого они встретили несколько лет назад. Она может даже пойти против своих принципов, если будет верить, что это позволит ей доказать свою зрелость перед друзьями. Артемис Энтрери ограждает себя от любых взаимоотношений и просто хочет, чтобы его оставили в покое."""
<<<
!!!''Идеалы''
"""Определите один идеал, что движет вашим персонажем. Идеалы это вещи, в которые вы верите настолько сильно, что они определяют ваши моральные принципы и линию поведения. Идеалы охватывают все аспекты жизни: от жизненных целей до убеждений.
Идеалы способны ответить на такие вопросы как: Какие принципы вы никогда не предадите? Что заставит вас пойти на жертвы? Что направляет все ваши усилия и амбиции? Что является самым важным, к чему стоит стремиться?
Вы можете выбрать любые идеалы, которые вам приглянулись, но отталкиваться от вашего мировоззрения при их выборе было бы правильным решением. Каждая предыстория включает в себя шесть вариантов идеалов, пять из которых связаны с возможным мировоззрением: закон, хаос, добро, зло, нейтральность. Последняя определяет предысторию без учёта моральных или этических норм."""
!!!''Привязанности''
"""Создайте одну привязанность для своего персонажа. Привязанности определяют взаимосвязь вашего персонажа с людьми, местами или историческими событиями. Они связывают вас с некоторыми вещами в вашей предыстории. Они могут вдохновить вас на подвиги, или же заставят вас действовать вопреки убеждениям, если вы вдруг окажетесь в опасности. Они могут влиять на личность персонажа так же сильно, как и его идеалы, определяя его цели и стремления.
Привязанности позволяют ответить на вопросы: Кто вам действительного дорог? Какое место имеет для вас особенное значение? О чём вы заботитесь?
Ваши привязанности могут быть переплетены с вашим классом, предысторией, расой и прочими аспектами вашей истории. Вы можете получать новые привязанности во время приключений."""
!!!''Слабости''
И, наконец, выберите слабость своего персонажа. Слабость вашего персонажа может выражаться в личном враге, страхе, страсти, недостатке — в общем, это всё то, что можно использовать против вас. Ваша слабость позволяет ответить на вопросы: Что вас бесит? Кто (или что) пугает вас? Кто считает вас своим врагом?
//1 уровень, Прорицание, Бард/Волшебник (ритуал)//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (жемчужина, стоящая как минимум 100 зм, и перо совы)
:''Длительность:'' Мгновенная
"""Вы выбираете один предмет, не переставая касаться его во время всего накладывания заклинания. Если это магический предмет, вы узнаёте его свойства, способ их использования, требуется ли для использования настройка на него, и сколько осталось зарядов, если они есть. Вы узнаёте, действуют ли в данный момент заклинания на этот предмет, и что это за заклинания. Если предмет был создан заклинанием, вы узнаёте, что это было за заклинание.
Если вы вместо этого во время накладывания заклинания касаетесь существа, вы узнаёте, какие заклинания в данный момент действуют на него."""
!!!__''Опутанный''__
* Скорость опутанного существа равна 0, и оно не получает выгоды ни от каких бонусов к скорости.
* Броски атаки по такому существу совершаются с преимуществом, а его броски атаки — с помехой.
* Существо совершает с помехой спасброски Ловкости.
//1 уровень, Вызов, Друид//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Из точки в пределах дистанции на площади квадрата с длиной стороны в 20 футов вырастают цепкие травы и плети. Пока заклинание активно, эти растения превращают землю в труднопроходимую местность.
Существа, находящиеся в этой области, когда вы накладываете заклинание, должны преуспеть в спасброске Силы, иначе они станут опутанными растениями до окончания действия заклинания. Опутанное растениями существо может действием совершать проверки Силы против Сл ваших заклинаний. В случае успеха оно освобождается.
Когда заклинание оканчивается, вызванные растения увядают."""
//1 уровень, Вызов, Следопыт//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Когда вы в следующий раз попадёте по существу атакой рукопашным оружием, пока заклинание активно, в точке удара появляется извивающаяся масса растений с шипами, и цель должна преуспеть в спасброске Силы, иначе она станет опутана магическими плетьми, пока заклинание активно. Существа с размером Большое и ещё больше совершают этот спасбросок с преимуществом. Если цель преуспевает в спасброске, плети усыхают.
Будучи опутанной этим заклинанием, цель получает колющий урон 1к6 в начале каждого своего хода. Опутанное существо или существо, способное коснуться его, может действием совершить проверку Силы против Сл ваших заклинаний. При успехе цель освобождается."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше первого.
В этом разделе представлены опции, меняющие механику отдыха, а также добавляющие в кампанию необычные вещи, такие как современное оружие.
!!__''Страх и ужас''__
Правила для страха и ужаса могут помочь поддерживать атмосферу тревоги в кампании в стиле тёмного фэнтези.
!!!''Страх''
Когда персонажи теряют надежду на победу, вы можете попросить их совершить спасбросок Мудрости. Установите Сл в зависимости от ситуации. Персонаж, проваливший спасбросок, становится испуганным на 1 минуту. Персонаж может повторять этот спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе.
!!!''Ужас''
Ужас это нечто большее, чем просто страх. Он ломает психику и причиняет невыразимые страдания. Чаще всего он возникает когда искатель приключений видит что-то, что противоречит его видению картины миры, или когда он осознаёт ужасающую правду.
В этом случае можете попросить персонажа совершить спасбросок Харизмы, чтобы противостоять ужасу. Установите Сл согласно масштабу ситуации. При провале персонаж получает кратковременное или долговременное безумие, которое вы выбираете самостоятельно или случайным образом.
!!__''Лечение''__
Эти опциональные правила облегчают или усложняют для персонажей восстановление после ранений, увеличивая или уменьшая количество времени, которое должно пройти, прежде чем те смогут отдохнуть.
!!!''Зависимость от комплекта целителя''
Персонаж не может тратить Кости Хитов по завершению короткого отдыха, пока кто-нибудь не потратит одно использование комплекта целителя, чтобы обработать и забинтовать раны.
!!!''Второе дыхание''
Это опциональное правило позволяет персонажам лечиться прямо в ходе сражения, и прекрасно подходит для отрядов, в которых персонажи с лечащей магией отсутствуют или малочисленны, а также кампаний, в которых магическое лечение встречается редко.
Персонаж может действием использовать второе дыхание и потратить вплоть до половины своих Костей Хитов. За каждую такую потраченную Кость Хитов игрок кидает кость, добавляя к ней модификатор Телосложения. Персонаж восстановит итоговое число хитов. После каждого броска игрок решает, будет ли он тратить ещё Кости Хитов.
Персонаж не может использовать второе дыхание повторно, пока не окончит короткий или продолжительный отдых.
При этом опциональном правиле персонаж восстанавливает в конце продолжительного отдыха все потраченные Кости Хитов. После короткого отдыха персонаж восстанавливает количество Костей Хитов, равное своему уровню, разделённому на четыре (минимум 1 кость).
Для достижения ощущения супергероизма можете позволить персонажам использовать второе дыхание бонусным действием, а не обычным.
!!!''Медленное естественное лечение''
Персонажи не восстанавливают хиты в конце продолжительного отдыха. Вместо этого персонаж может тратить Кости Хитов в конце продолжительного отдыха, как после отдыха короткого.
Это опциональное правило увеличивает время, необходимое персонажам для избавления от ран без использования магии, и подходит для суровых, реалистичных кампаний.
!!__''Варианты отдыха''__
Правила короткого и продолжительного отдыха из 8 главы Книги игрока хороши для героической кампании. Персонажи могут уничтожать смертельно опасных врагов, чудом оставаться в живых от ран, но уже на следующий день они снова будут в строю. Если в вашей кампании это будет неуместным, рассмотрите описанные ниже варианты.
!!!''Эпический героизм''
В этом варианте короткий отдых длится 5 минут, а продолжительный отдых — 1 час. Эти изменения сделают сражения более обыденными, так как персонажи будут легко восстанавливаться после каждого сражения. Чтобы это скомпенсировать, можете сделать боевые сцены более сложными.
При таком подходе заклинатели могут перестать экономить ячейки заклинаний, особенно на больших уровнях. Вы можете позволить заклинателям восстанавливать только половину от максимума ячеек заклинаний (округляя в меньшую сторону) в конце продолжительного отдыха, и сделать так, чтобы восстанавливались только ячейки с уровнем не больше 5-го. Только полноценный 8часовой отдых позволит заклинателям восстанавливать все ячейки заклинаний всех уровней.
!!!''Суровый реализм''
В этом варианте короткий отдых длится 8 часов, а продолжительный отдых — 7 дней. Это сильно замедляет кампанию, требуя от игроков, чтобы те тщательно взвешивали преимущества и недостатки сражений. Персонажи не смогут участвовать в нескольких сражениях подряд, и их приключения должны быть тщательно спланированы.
Этот подход подталкивает персонажей проводить время вдалеке от подземелий. Он хорош для кампаний, делающих акцент на интригах, политике и взаимодействии с персонажами других игроков, и сражения в которых редки или как минимум нежелательны.
!!__''Огнестрельное оружие''__
Если хотите передать бесшабашный дух Трёх Мушкетёров и подобных романов, можете ввести в свою кампанию в стиле эпохи Возрождения пороховое оружие. То же самое касается кампаний, в которых разбились космические корабли или присутствуют элементы современной Земли.
В таблице «огнестрельное оружие» приводятся примеры для всех этих трёх периодов. Для современного и футуристичного оружия цены не указаны.
!!!!''Огнестрельное оружие''
<table>
<tr>
<th>Предмет эпохи Возрождения<br></th>
<th>Стоимость</th>
<th>Урон</th>
<th>Вес</th>
<th>Свойства</th>
</tr>
<tr>
<th colspan="5"><span style="font-style:italic">Воинское дальнобойное оружие</span></th>
</tr>
<tr>
<td>Пистоль</td>
<td>250 зм</td>
<td>1к10 колющий</td>
<td>3 фнт.</td>
<td>Боеприпас (дис. 30/90), перезарядка</td>
</tr>
<tr>
<td>Мушкет</td>
<td>500 зм</td>
<td>1 к12 колющий</td>
<td>10 фнт.</td>
<td>Боеприпас (дис. 40/120), двуручное, перезарядка</td>
</tr>
<tr>
<th colspan="5">Боеприпасы</th>
</tr>
<tr>
<td>Пули (10)</td>
<td>3 зм</td>
<td>—</td>
<td>2 фнт.</td>
<td>—</td>
</tr>
<tr>
<th>Современный предмет</th>
<th>Стоимость</th>
<th>Урон</th>
<th>Вес</th>
<th>Свойства</th>
</tr>
<tr>
<th colspan="5">Воинское дальнобойное оружие</th>
</tr>
<tr>
<td>Пистолет, автоматический</td>
<td>—</td>
<td>2к6 колющий</td>
<td>3 фнт.</td>
<td>Боекомплект (15 выстрелов), боеприпас (дис. 50/150)</td>
</tr>
<tr>
<td>Револьвер</td>
<td>—</td>
<td>2к8 колющий</td>
<td>3 фнт.</td>
<td>Боекомплект (6 выстрелов), боеприпас (дис. 40/120)</td>
</tr>
<tr>
<td>Винтовка, охотничья</td>
<td>—</td>
<td>2к10 колющий</td>
<td>8 фнт.</td>
<td>Боекомплект (5 выстрелов), боеприпас (дис. 80/240), двуручное</td>
</tr>
<tr>
<td>Винтовка, автоматическая</td>
<td>—</td>
<td>2к8 колющий</td>
<td>8 фнт.</td>
<td>Боекомплект (30 выстрелов), боеприпас (дис. 80/240), двуручное, очередь</td>
</tr>
<tr>
<td>Дробовик</td>
<td>—</td>
<td>2к8 колющий</td>
<td>7 фнт.</td>
<td>Боекомплект (2 выстрела), боеприпас (дис. 30/90), двуручное</td>
</tr>
<tr>
<th colspan="5">Боеприпасы</th>
</tr>
<tr>
<td>Патроны (10)</td>
<td>—</td>
<td>—</td>
<td>1 фнт.</td>
<td>—</td>
</tr>
<tr>
<th>Футуристический предмет</th>
<th>Стоимость</th>
<th>Урон</th>
<th>Вес</th>
<th>Свойства</th>
</tr>
<tr>
<th colspan="5">Воинское дальнобойное оружие</th>
</tr>
<tr>
<td>Лазерный пистолет</td>
<td>—</td>
<td>3к6 излучение</td>
<td>2 фнт.</td>
<td>Боекомплект (50 выстрелов), боеприпас (дис. 40/120)</td>
</tr>
<tr>
<td>Винтовка на антиматерии</td>
<td>—</td>
<td>6к8 некротическая энергия </td>
<td>10 фнт.</td>
<td>Боекомплект (2 выстрела), боеприпас (дис. 120/360), двуручное</td>
</tr>
<tr>
<td>Лазерная винтовка</td>
<td>—</td>
<td>3к8 излучение</td>
<td>7 фнт.</td>
<td>Боекомплект (30 выстрелов), боеприпас (дис. 100/300), двуручное</td>
</tr>
<tr>
<th colspan="5">Боеприпасы</th>
</tr>
<tr>
<td>Батарея</td>
<td>—</td>
<td>—</td>
<td>5 унц.</td>
<td>—</td>
</tr>
</table>
!!!''Владение''
Вы сами решаете, владеет ли персонаж обращением с огнестрельным оружием. У персонажей в большинстве миров таких навыков нет. Во время простоя персонажи могут использовать правила обучения из Книги игрока, чтобы получить владение этим навыком, при условии, что у них есть достаточное количество боеприпасов, чтобы оружие можно было использовать во время обучения.
!!!''Свойства''
Огнестрельное оружие использует особые боеприпасы, и у некоторых из них есть свойства «боекомплект» и «очередь».
://''Боекомплект.''// Из оружия с этим свойством можно совершить ограниченное число выстрелов. После этого персонаж должен перезарядить его действием или бонусным действием (на свой выбор).
://''Боеприпас.''// Боеприпасы огнестрельного оружия уничтожаются при использовании. Современное оружие и оружие эпохи Возрождения использует пули и патроны. Футуристическое оружие использует особые боеприпасы, называемые батареями. В одной батарее достаточно энергии, чтобы сделать все выстрелы, которые способно совершить оружие.
://''Очередь.''// Оружие с этим свойством может совершать как обычные атаки по одной цели, так и атаки по области 10-футового куба в пределах обычной дистанции. Все существа в этой области должны совершить спасбросок Ловкости со Сл 15, иначе они получат обычный урон этого оружия. Такое действие использует десять боеприпасов.
!!__''Взрывчатка''__
В кампании могут встречаться взрывчатые вещества из эпохи Возрождения или современного мира (для последних цены не указаны), представленные в таблице «взрывчатка».
!!!!''Взрывчатка''
<table>
<tr>
<th>Предмет эпохи Возрождения</th>
<th>Цена</th>
<th>Вес</th>
</tr>
<tr>
<td>Бомба</td>
<td>150 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Порох, бочонок</td>
<td>250 зм</td>
<td>20 фнт.</td>
</tr>
<tr>
<td>Порох, рожок</td>
<td>35 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<th>Современный предмет</th>
<th>Цена</th>
<th>Вес</th>
</tr>
<tr>
<td>Граната, дымовая</td>
<td>—</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Граната, осколочная</td>
<td>—</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Гранатомёт</td>
<td>—</td>
<td>7 фнт.</td>
</tr>
<tr>
<td>Динамит (шашка)</td>
<td>—</td>
<td>1 фнт.</td>
</tr>
</table>
!!!''Бомба''
Персонаж может действием поджечь бомбу и бросить её на расстояние до 60 футов. Все существа в пределах 5 футов от этой точки должны преуспеть в спасброске Ловкости со Сл 12, иначе они получат урон огнём 3к6.
!!!''Порох''
Порох преимущественно используется для приведения в движение пули в стволе пистолета или винтовки, а также для изготовления бомб. Порох продаётся в маленьких деревянных бочонках или водонепроницаемых рожках.
Поджигание контейнера с порохом может вызвать взрыв, причиняющий урон огнём всем существам в пределах 10 футов от него (3к6 от рожка, 7к6 от бочонка). Успешный спасбросок Ловкости со Сл 12 уменьшает урон вдвое. Подожжённая унция пороха просто горит 1 раунд, распространяя яркий свет в радиусе 30 футов и тусклый свет в пределах ещё 30 футов.
!!!''Динамит''
Существо может действием поджечь динамитную шашку и бросить её на расстояние до 60 футов.
Все существа в пределах 5 футов от этой точки должны совершить спасбросок Ловкости со Сл 12, получая дробящий урон 3к6 при провале или половину этого урона при успехе.
Персонаж может связать вместе несколько динамитных шашек, чтоб они взорвались одновременно. Каждая добавленная шашка увеличивает урон на 1к6 (максимум — 10к6), а радиус взрыва — на 5 футов (максимум — 20 футов).
Динамит может быть переделан на удлинённый фитиль, чтоб взорваться через определённое время, обычно от 1 до 6 раундов. Совершите проверку инициативы за динамит. После того, как пройдёт указанное количество раундов, динамит взорвётся при своей инициативе.
!!!''Гранаты''
Персонаж может действием кинуть гранату на расстояние до 60 футов. Имея гранатомёт, можно запустить её на расстояние до 120 футов.
Все существа в пределах 20 футов от места взрыва ''осколочной гранаты'' должны совершить спасбросок Ловкости со Сл 15, получая при провале колющий урон 5к6 или половину этого урона при успехе.
Спустя раунд после приземления ''дымовой гранаты'' появляется облако дыма, создающее сильно заслонённую местность с радиусом 20 футов. Умеренный ветер (по крайней мере, 10 миль в час) разгоняет дым за 4 раунда, сильный ветер (20 или больше миль в час) разгоняет его за 1 раунд.
!!__''Чуждые технологии''__
Когда искатели приключений находят образец технологии, который принадлежит другому миру или временному периоду, игроки могут понять, чем является предмет, но персонажи — вряд ли. Для имитации незнания персонажей, пусть они совершают серию проверок Интеллекта, чтобы разобраться в этой технологии.
Для определения того, как работает технология, персонаж должен преуспеть в нескольких проверках Интеллекта, количество которых зависит от сложности предмета: две для простого предмета (зажигалка, калькулятор или револьвер) и четыре для сложного предмета (такого как компьютер, бензопила или летательный аппарат). После этого обратитесь к таблице «определение чуждой технологии». Вы можете объявить, что предмет сломался, если персонаж до совершения продолжительного отдыха получил четыре или больше провала.
Персонаж, видевший, как предмет используют, или уже управлявший подобным предметом, совершает эти проверки Интеллекта с преимуществом.
!!!!''Определение чуждой технологии''
<table>
<tr>
<th>Проверка Инт.</th>
<th>Результат</th>
</tr>
<tr>
<td>9 или меньше</td>
<td>Один провал; один заряд или использование тратится впустую, если это возможно; следующую проверку персонаж совершает с помехой</td>
</tr>
<tr>
<td>10-14</td>
<td>Один провал</td>
</tr>
<tr>
<td>15-19</td>
<td>Один успех</td>
</tr>
<tr>
<td>20 или выше</td>
<td>Один успех; следующую проверку персонаж совершает с преимуществом</td>
</tr>
</table>
!!__''Очки сюжета''__
Очки сюжета позволяют игрокам менять курс кампании, вводить осложнения сюжета, изменять мир и даже брать на себя роль Мастера Если вашей первой реакцией на это опциональное правило стало беспокойство из-за того, что игроки могут злоупотреблять им, то оно, вероятно, не для вас.
Использование очков сюжета
Каждый игрок начинает с 1 очком сюжета За время собрания игрок может потратить это очко на один эффект. Результат эффекта зависит от подхода вашей группы к этому опциональному правилу. Ниже представлены три варианта
Игрок может потратить не больше 1 очка сюжета за сессию. При желании вы можете увеличить этот лимит, особенно если хотите, чтобы игроки больше влияли на сюжет. Как только все игроки за столом потратили свои очки сюжета, они все получают по 1 новому очку сюжета.
!!!''Вариант 1: Вот это поворот!''
Потратив очко сюжета, игрок может добавить какой-нибудь элемент к окружению или ситуации, который группа (включая вас) должна принять как истину. Например, игрок может потратить очко сюжета и заявить, что его персонаж нашёл потайную дверь, что появился определённый ПМ, или что чудовище оказалось давно забытым союзником, превращённым в ужасного зверя.
Игроку, который хочет потратить очко сюжета таким образом, следует уделить минуту на обсуждение этой идеи с остальными сидящими за столом, и послушать отзывы, прежде чем устанавливать подобное развитие сюжета.
!!!''Вариант 2: Интрига нарастает''
Каждый раз, когда игрок тратит очко сюжета, игрок справа от него должен добавить осложнение в сцену. Например, если игрок тратит очко сюжета, чтобы его персонаж нашёл секретную дверь, игрок справа может заявить, что открытие двери вызывает срабатывание магической ловушки, перемещающей отряд в другую часть подземелья.
!!!''Вариант 3: Должно быть, боги сошли с ума ''
При таком подходе нет постоянного Мастера. Каждый создаёт персонажа, но один из игроков выступает в роли Мастера, и игра идёт как обычно. Персонаж этого игрока становится ПМ, который может или следовать за группой, или остаться в стороне, в зависимости от желания команды.
В любой момент игрок может потратить очко сюжета, чтоб стать Мастером. Персонаж этого игрока становится ПМ, и игра продолжается. Возможно, не стоит меняться ролями посреди сражения, но такое может произойти, если ваша группа может дать время новому Мастеру, чтобы освоиться в своей новой роли и продолжить с того же места, где остановился предыдущий Мастер.
Такое использование очков сюжета может создать захватывающую кампанию, ведь каждый Мастер направляет игру в неожиданном направлении. Это также отличный способ для желающих попробовать себя в ведении игры в небольших контролируемых дозах.
В группе, использующей очки сюжета подобным образом, все должны приходить на игру с небольшим подготовленным материалом или задумками для сцен. Игрок, который не подготовился заранее, или не в настроении вести игру, может отказаться тратить очко сюжета на этом собрании.
Чтобы этот подход сработал, хорошо было бы заранее обговорить некоторые общие предположения о ходе кампании, чтобы Мастера не дублировали усилия и не мешали планам друг друга.
В этом разделе приведены альтернативные способы ведения сражения. Основной риск в добавлении некоторых из этих правил заключается в замедлении хода игры.
!!__''Варианты инициативы''__
В этом разделе предлагаются другие способы отслеживания инициативы.
!!!''Значение инициативы''
При этом опциональном правиле существа не совершают броски для определения инициативы в начале сражения. Вместо этого у каждого существа есть значение инициативы, равное пассивной проверке Ловкости: 10 + модификатор Ловкости.
Убрав броски костей, и сократив процесс опроса и записи показателей, вы можете значительно ускорить игру ценой предсказуемого порядка инициативы.
!!!''Инициатива сторон''
Запись инициативы за каждого персонажа и чудовища, выстраивание всех в верном порядке и запоминание того, кто после кого ходит, может замедлить игру. Если вы хотите сделать сражения быстрее, рискуя сделать их несбалансированными, попробуйте использовать правило инициативы сторон.
При таком варианте игроки кидают к20 на инициативу своей группы или стороны. Вы тоже кидаете к20. К броскам не добавляются никакие модификаторы. Тот, у кого выпадет большее число, выигрывает в инициативе. В случае ничьей продолжайте кидать, пока не будет определён победитель.
Во время хода стороны, её участники могут действовать в любом желаемом порядке. Когда одна сторона заканчивает ход, вторая сторона начинает свой. Раунд заканчивается, когда обе стороны закончили ходы.
Если в бою участвует больше двух сторон, каждая из них определяет свою инициативу. Они действуют в порядке от самого высокого показателя до самого низкого. Бой проходит согласно инициативе, пока не закончится.
Такой вариант поощряет командную работу и облегчает вашу жизнь, ведь вам будет проще координировать чудовищ. С другой стороны, выигравшие в инициативе могут зажать врагов и вывести их из строя ещё до возможности подействовать.
!!!''Фактор скорости''
Некоторые Мастера считают постоянную последовательность инициативы слишком предсказуемой. Игроки могут использовать своё знание порядка действий для определения своих решений. Например, раненый воин может атаковать тролля, потому что знает, что жрец ходит до чудовища и сможет его вылечить.
Фактор скорости — вариация инициативы, позволяющая внести больше неожиданности в процесс боя ценой скорости игры. Пользуясь этим правилом, инициатива определяется в бою каждый раунд. При этом перед каждым броском инициативы все персонажи и чудовища должны выбрать свои действия.
://''Модификаторы инициативы.''// Модификаторы инициативы существа могут зависеть от его размера и действия, которое оно решит совершить. Например, существо, сражающееся лёгким оружием или накладывающее простое заклинание, скорее всего, будет действовать до вооружённых тяжёлым или медленным оружием существ. Подробности смотрите в приведённой ниже таблице. Если для действия не указан модификатор, то это действие не влияет на инициативу. Если получается больше одного модификатора (например, используется двуручное тяжёлое рукопашное оружие), добавьте их все к броску инициативы.
!!!!''Модификаторы инициативы фактора скорости''
<table>
<tr>
<th>Фактор </th>
<th>Модификатор инициативы</th>
</tr>
<tr>
<td>Накладывание заклинания</td>
<td>Отнимите уровень заклинания</td>
</tr>
<tr>
<td>Рукопашное, тяжёлое оружие </td>
<td>−2</td>
</tr>
<tr>
<td>Рукопашное, лёгкое или фехтовальное оружие</td>
<td>+2</td>
</tr>
<tr>
<td>Рукопашное, двуручное оружие </td>
<td>−2</td>
</tr>
<tr>
<td>Дальнобойное, оружие с перезарядкой</td>
<td>-5</td>
</tr>
<tr>
<th>Размер существа</th>
<th>Модификатор инициативы</th>
</tr>
<tr>
<td>Крохотный</td>
<td>+5</td>
</tr>
<tr>
<td>Маленький</td>
<td>+2</td>
</tr>
<tr>
<td>Средний</td>
<td>+0</td>
</tr>
<tr>
<td>Большой</td>
<td>-2</td>
</tr>
<tr>
<td>Огромный</td>
<td>-5</td>
</tr>
<tr>
<td>Громадный</td>
<td>-8</td>
</tr>
</table>
:"""Не добавляйте один и тот же модификатор больше одного раза за ход существа. Например, атакующий двумя кинжалами плут получает только один бонус +2 за использование лёгкого или фехтовального оружия. При накладывании заклинания добавляйте только модификатор заклинания с самым большим уровнем.
Добавляйте модификаторы и за бонусные действия в ход существа, не забывая, что один и тот же модификатор не применяется дважды. Например, паладин накладывает заклинание 2 уровня бонусным действием, а после атакует коротким мечом. Он получает штраф -2 за заклинание и бонус +2 за использование лёгкого оружия, получая в итоге модификатор +0.
Таблица — лишь начало. Вы можете обращаться к ней при вынесении решений, когда персонаж совершает действия, которые, на ваш взгляд, должны совершаться быстрее или медленнее. Быстрые, простые действия должны получать бонус, в то время как медленные и сложные — штраф. Рекомендуется добавлять бонус или штраф за действие в пределах от 2 до 5.
Например, воин хочет повернуть ворот для поднятия решётки. Это сложное, долгое действие. Вы можете наложить за него штраф -5 к проверке инициативы."""
://''Проверка инициативы.''// После выбора действия все совершают проверку инициативы и добавляют модификаторы, держа результат в секрете. Затем вы объявляете номера инициативы, начиная с 30 и далее вниз (начать можете с оглашения крупных диапазонов чисел). Любые ничьи решаются в пользу участника сражения с наибольшим значением Ловкости. В противном случае участники совершают дополнительный бросок, чтобы определить очерёдность.
://''Ход.''// В своём ходу существо перемещается как обычно, но должно или совершить ранее выбранное действие, или никаких действий вообще.
Когда все действия выполнены, процесс повторяется. Все участники боя выбирают действие, совершают проверку инициативы и ходят в получившемся порядке.
!!__''Опциональные действия''__
Данный раздел представляет новые варианты действий в бою. В свою игру вы можете добавить их все или только часть.
!!!''Взбирание на большое существо.''
Если одно существо хочет запрыгнуть на другое, оно может сделать это с помощью захвата. У существа Маленького или Среднего размера мало шансов успешно захватить Огромное или Громадное существо, если только оно не обладает недюжинной силой или не находится под действием магии.
В качестве альтернативы, достаточно большой противник может считаться местностью для целей запрыгивания ему на спину или лазания по его конечностям. После совершения всех необходимых проверок меньшее существо действием совершает проверку Силы (Атлетика) или Ловкости (Акробатика), противопоставленную проверке Ловкости (Акробатика) цели. Если меньшее существо преуспевает, оно перемещается в пространство цели и цепляется за его тело. Находясь в пространстве цели, меньшее существо перемещается вместе с ней и совершает с преимуществом броски атаки по ней.
Меньшее существо может перемещаться по пространству большего существа, считая его труднопроходимой местностью. Способность большего существа атаковать меньшее зависит от местоположения меньшего существа и оставляется на ваше усмотрение. Большее существо может сбросить меньшее действием — стряхнув его, потеревшись о стену или схватив его и сбросив. Это действие требует от большего существа успеха в проверке Силы (Атлетика), противопоставленной проверке Силы (Атлетика) или Ловкости (Акробатика) меньшего существа. Меньшее существо само выбирает, проверку какой характеристики оно будет совершать.
!!!''Кувырок''
Существо может попытаться проскочить сквозь пространство враждебного существа, уворотами и кувырками уклоняясь от противника. Действием или бонусным действием уклоняющийся совершает проверку Ловкости (Акробатика), противопоставленную результату Ловкости (Акробатика) противника. Если уклоняющийся преуспевает, он может один раз в свой ход переместиться через пространство враждебного существа.
!!!''Метка''
Эта опция позволяет рукопашным бойцам лучше совершать провоцированные атаки.
Когда существо совершает рукопашную атаку, оно может также пометить цель. До конца своего следующего хода атакующий совершает по помеченной цели рукопашные атаки с преимуществом. Провоцированная атака не тратит реакцию атакующего, но атакующий не может совершить такую атаку, если что-то, например, состояние «недееспособен», или заклинание электрошок, не позволяет ему совершать реакции. Атакующий ограничен только одной провоцированной атакой в хм.
!!!''Обезоруживание''
Существо может использовать атаку оружием, чтобы выбить оружие или другой предмет из хватки цели. Атакующий совершает бросок атаки, которому противостоит проверка Силы (Атлетика) или Ловкости (Акробатика). Если атакующий выигрывает состязание, атака не причиняет ни урон, ни другие негативные эффекты, а цель просто роняет предмет.
Атакующий совершает бросок атаки с помехой, если цель держит предмет как минимум двумя руками. Цель совершает проверку характеристики с преимуществом, если она больше атакующего, или с помехой, если она меньше атакующего.
!!!''Пробегание''
Существо может попытаться переместиться через пространство враждебного существа. Оно совершает действием или бонусным действием проверку Силы (Атлетика), противопоставленную проверке Силы (Атлетика) враждебного существа. Пытающееся пробежать существо совершает свою проверку с преимуществом, если оно крупнее враждебного существа, или с помехой, если оно меньше. Если оно выигрывает состязание, то может в этом ходу один раз переместиться сквозь пространство враждебного существа.
!!!''Толкание в сторону''
С этой опцией существо может при помощи особой толкающей атаки из Книги игрока толкнуть цель в сторону, а не от себя. При этом атакующий совершает свою проверку Силы (Атлетика) с помехой. Если проверка была успешной, оно перемещает цель на 5 футов в другое пространство в пределах своей досягаемости.
!!__''Удар по укрытию''__
Если дальнобойная атака промахивается по цели, имеющей укрытие, вы можете воспользоваться этим опциональным правилом, чтоб определить, попала ли атака по укрытию.
Для начала определите, попала ли бы атака, если бы цель была без укрытия. Если бросок атаки слишком низкий, чтобы попасть по цели, но достаточно высокий, чтоб попасть по ней, если бы укрытия не было, то атака попадает по объекту, используемому в качестве укрытия. Если укрытие предоставлено существом, и бросок атаки превышает его КД, то атака попадает по укрывающему существу.
!!__''Прорубание сквозь врагов''__
Если персонажи ваших игроков регулярно сражаются с полчищами низкоуровневых чудовищ, это опциональное правило ускорит такие сражения.
Если рукопашная атака уменьшает до 0 хиты существа с полными хитами, «лишний» урон от атаки можно перенести на другое существо поблизости. Атакующий нацеливается на другое существо в пределах досягаемости, и, если исходный бросок атаки может попасть и по нему тоже, причиняет ему оставшийся урон. Если хиты того существа тоже были полными, и тоже опустились до 0, повторите процесс, перенося остатки урона, пока не кончатся доступные цели или пока этот урон не сможет опустить хиты здорового существа до 0.
!!__''Травмы''__
Обычно урон не оставляет долговременных эффектов, но эта опция вводит в игру травмы.
Вы сами решаете, когда совершать проверку на травму. Существо может получить травму при следующих обстоятельствах:
* При получении критического попадания
* Когда хиты опустились до 0, но оно не убито
* При провале спасброска от смерти на 5 и более единиц
Чтобы определить характер травмы, обратитесь к приведённой таблице. Эта таблица предполагает физиологию гуманоида, но вы можете адаптировать результаты для существ с другими телами.
!!!!''Длительные травмы''
<table>
<tr>
<th class="SpecHead2">к20</th>
<th>Травма</th>
</tr>
<tr>
<td>1</td>
<td>Потеря глаза. Вы совершаете с помехой проверки Мудрости (Внимательность), полагающиеся на зрение, а также броски дальнобойных атак. Магия, такая как заклинание регенерация, может восстановить утерянный глаз. Если после этой травмы у вас не осталось глаз, вы становитесь слепым.</td>
</tr>
<tr>
<td>2</td>
<td>Потеря руки или ладони. Вы больше не можете ничего держать двумя руками, и теперь можете держать одновременно только один предмет. Магия, такая как заклинание регенерация, может восстановить утерянную конечность.</td>
</tr>
<tr>
<td>3</td>
<td>Потеря ноги или ступни. Ваша скорость хождения ногами уменьшена вдвое, и вы обязаны использовать посох или клюку, чтобы перемещаться, если у вас нет деревянной ноги или другого протеза. После действия Рывок вы падаете ничком. Вы совершаете с помехой проверки Ловкости, совершённые для сохранения равновесия. Магия, такая как заклинание регенерация, может восстановить утерянную конечность.</td>
</tr>
<tr>
<td>4</td>
<td>Хромота. Ваша скорость хождения ногами уменьшается на 5 футов. После действия Рывок вы должны совершать спасбросок Ловкости со Сл 10. При провале вы падаете ничком. Магическое лечение устраняет хромоту.</td>
</tr>
<tr>
<td>5-7</td>
<td>Внутренняя травма. Каждый раз, когда вы в бою пытаетесь совершить действие, вы должны совершать спасбросок Телосложения со Сл 15. При провале вы теряете своё действие и не можете совершать реакции до начала своего следующего хода. Травма исчезает после магического лечения или если вы проведёте десять дней, ничего не делая кроме отдыха.</td>
</tr>
<tr>
<td>8-10</td>
<td>Сломанные рёбра. Эффект такой же как у внутренней травмы, но Сл спасброска равна 10.</td>
</tr>
<tr>
<td>11-13</td>
<td>Ужасный шрам. Вы получаете рану, которую сложно скрыть. Вы совершаете с помехой проверки Харизмы (Убеждение) и с преимуществом проверки Харизмы (Запугивание). Магическое лечение как минимум 6 уровня, такое как полное исцеление и регенерация, устраняют шрам.</td>
</tr>
<tr>
<td>14-16</td>
<td>Гноящаяся рана. Максимум ваших хитов уменьшается на 1 за каждые 24 часа, пока рана есть. Если максимум хитов опустится до 0, вы умираете. Рана исчезает после магического лечения. В качестве альтернативы, кто-нибудь может заботиться о ране, совершая проверку Мудрости (Медицина) со Сл 15 каждые 24 часа. После десяти успехов рана исчезает.</td>
</tr>
<tr>
<td>17-20</td>
<td>Незначительный шрам. Этот шрам не даёт негативных эффектов. Магическое лечение как минимум 6 уровня, такое как полное исцеление и регенерация, устраняют шрам.</td>
</tr>
</table>
Вместо того, чтобы использовать эффект из таблицы, вы можете поручить описание эффектов травмы игроку. Совершите бросок по таблице как обычно, но вместо получения описанного эффекта персонаж получает слабость с таким же названием. Игрок сам решает, как проявлять травму в игре, так же как и другие слабости, и может получить вдохновение, если травма сыграет значительную роль в его жизни.
!!__''Массивный урон''__
Это опциональное правило облегчает уничтожение существ огромным уроном.
Если существо получает урон от одного источника, не меньше половины от максимума хитов, оно должно преуспеть в спасброске Телосложения со Сл 15, иначе оно получит случайный эффект из приведённой ниже таблицы. Например, существо с максимумом хитов 30, совершает этот спасбросок Телосложения, если получает урон 15 от одного источника.
!!!!''Шок организма''
<table>
<tr>
<th class="SpecHead2">к10</th>
<th>Эффект</th>
</tr>
<tr>
<td>1</td>
<td>Хиты существа опускаются до 0.</td>
</tr>
<tr>
<td>2-3</td>
<td>Хиты существа опускаются до 0, но оно остаётся стабилизированным.</td>
</tr>
<tr>
<td>4-5</td>
<td>Существо становится ошеломлённым до конца своего следующего хода.</td>
</tr>
<tr>
<td>6-7</td>
<td>Существо до конца своего следующего хода не может совершать реакции и совершает с помехой броски атаки и проверки характеристик.</td>
</tr>
<tr>
<td>8-10</td>
<td>Существо не может совершать реакции до конца своего следующего хода.</td>
</tr>
</table>
!!__''Мораль''__
Некоторые бойцы могут сбегать с поля боя, если сражение оборачивается против них. С помощью этого опционального правила вы можете определять, когда чудовища и ПМ будут сбегать.
Существо может сбегать при следующих условиях:
* Существо становится захваченным врасплох.
* Хиты существа впервые за сражение опускаются до половины от максимума или ниже.
* Существо не смогло в свой ход причинить вреда противнику.
Группа существ может сбегать при следующих условиях:
* Все существа в группе захвачены врасплох.
* Хиты лидера группы уменьшились до 0, он стал недееспособным, взят в плен или выведен из сражения.
* Группа уменьшилась вдвое, а у противника потерь нет.
Для того чтобы определить, сбегает ли существо или группа существ, совершите спасбросок Мудрости со Сл 10 за существо или лидера группы. Если превосходство противника бесспорно, спасбросок совершается с помехой, или же вы можете объявить автоматический провал. Если лидер группы по какой-то причине не может совершить спасбросок, вместо него спасбросок совершает существо в группе с самой высокой Харизмой.
При провале существо или группа сбегает самым коротким маршрутом. Если побег невозможен, существо или группа сдаются. Если сдавшееся существо или группа атаковано пленителями, сражение может продолжиться, и скорее всего они уже не сдадутся и не сбегут.
Проваленный спасбросок не всегда выгоден искателям приключений. Например, сбежавший огр может переполошить остальную часть подземелья или убежать вместе с сокровищем.
Опыт позволяет персонажам игроков получать уровни, и это самая распространённая награда за прохождение боевых сцен.
У каждого чудовища есть опыт, который приносит победа над ним, и это значение зависит от его показателя опасности. Когда искатели приключений побеждают одного или нескольких чудовищ — убив их, обхитрив или взяв в плен — они делят между собой поровну сумму опыта за всех чудовищ. Если отряд получил значительную помощь от одного или нескольких ПМ, считайте их членами отряда, когда будете делить опыт (благодаря им бой был легче, и потому персонажам достанется меньше опыта).
В 3 главе есть рекомендации по созданию боевых сцен на основе опыта.
!!__''Отсутствующие персонажи''__
Обычно искатели приключений получают опыт только за те сцены, в которых они принимали участие. Если игрок отсутствует на собрании, его персонаж не получает опыт.
Со временем у вас может образоваться разрыв в уровнях между персонажами игроков, которые не пропускают собрания и игроков, иногда отсутствующих. Ничего страшного в этом нет. Разрыв в два-три уровня между персонажами одного отряда не испортит вашу игру. Некоторые Мастера считают опыт наградой за участие в игре, и благодаря ему все игроки будут стремиться приходить на все собрания.
В качестве альтернативы вы можете выдавать отсутствующим персонажам тот же опыт, что получили другие персонажи, и тогда весь отряд будет одного уровня. Мало кто будет пропускать игры только лишь из-за того, что они всё равно получат свою порцию опыта.
!!__''Небоевые вызовы''__
Вы сами решаете, награждать ли опытом персонажей за преодоление опасностей вне сражения. Если искатели приключений заканчивают переговоры с бароном, заключают торговое соглашение с кланом дварфов или находят выход из Каньона Рока, вы решаете, заслужили ли они при этом награду.
Чтобы было от чего отталкиваться, используйте правил а по созданию боевой сцены из 3 главы и рассчитайте сложность ситуации. Потом выдайте персонажам опыт, как если бы это была боевая сцена с такой же сложностью, но только если в сложившейся ситуации действительно был риск совершить ошибку и события сложились бы по-другому.
!!__''Вехи''__
Вы также можете выдавать опыт когда персонажи достигают значительных вех. Готовя приключение, обозначьте определённые события или препятствия как вехи, ориентируясь на следующие примеры:
* Выполнение серии целей, необходимых для завершения приключения.
* Обнаружение потайного места или информации, связанной с приключением.
* Достижение важного места
При выдаче опыта считайте важные вехи сложными сценами, а второстепенные вехи — лёгкими сценами.
Вы можете наградить игроков за продвижение вперёд чем-то большим, чем просто опыт и сокровище. Вот несколько примеров:
* Искатели приключений получают все выгоды короткого отдыха
* Персонажи могут восстановить по одной Кости Хитов или низкоуровневой ячейки заклинаний.
*Персонажи могут повторно использовать магические предметы с ограниченным числом использований.
!!__''Получение уровней вез опыта''__
Вы можете полностью отказаться от опыта и самостоятельно контролировать получение персонажами новых уровней. Продвижение может зависеть от числа посещённых собраний или выполнения сюжетных целей в кампании. В любом случае, вы сами будете сообщать игрокам, когда их персонажи получат уровень.
Этот метод будет полезен, если в вашей кампании мало сражений или наоборот, сражений так много, что сложно отслеживать весь полученный опыт.
!!!''Уровни за собрания''
Вот хороший пример скорости получения уровней. Пусть персонажи получат 2 уровень после первого же игрового собрания, 3 уровень в конце следующего собрания и 4 уровень через два собрания. После этого для получения нового уровня нужно присутствовать на двух или трёх играх. Такая скорость примерно равна стандартной, при условии, что собрание идёт примерно 4 часа
!!!''Уровни за сюжет''
Если получение уровней будет зависеть от сюжета кампании, награждайте искателей приключений уровнями за достижение важных целей в кампании.
Ваш класс предоставляет вам владение некоторыми видами оружия, отражая направленность вашего класса и инструменты, которые вы, скорее всего, будете использовать. И не важно, чем вы вооружены, мечом или луком, от вашего оружия и умения с ним обращаться зависит ваше выживание.
Таблица «Оружие» показывает самое распространённое в мирах D&D оружие, их цену, вес, урон, причиняемый при попадании, и их особые свойства. Все виды оружия делятся на рукопашное и дальнобойное. Рукопашное оружие используется для атаки целей, находящихся в пределах 5 футов от вас, а дальнобойное оружие используется для атаки целей, находящихся на расстоянии.
!!!__''Владение оружием''__
"""Ваша раса, класс и черты дают владение конкретными видами и целыми категориями оружия. Категорий две: ''простое оружие'' и ''воинское оружие''. Простым оружием могут пользоваться многие. В это оружие входят дубинки, булавы и прочее оружие, доступное обывателям. Воинское оружие включает мечи, топоры и древковое оружие, требующее для эффективного использования особых тренировок. Многие воители используют воинское оружие, потому что оно позволяет максимально использовать их стиль и обучение.
Владение оружием позволяет вам добавлять бонус мастерства к броскам атаки всех атак, совершённых этим оружием. Если вы совершаете бросок атаки, используя оружие, которым не владеете, вы не добавляете к броску атаки бонус мастерства."""
!!''Оружие''
<table>
<tr>
<th>Название</th>
<th>Стоимость</th>
<th>Урон</th>
<th>Вес</th>
<th>Свойства</th>
</tr>
<tr>
<th colspan="5">Простое рукопашное оружие</th>
</tr>
<tr>
<td>Боевой посох</td>
<td>2 см</td>
<td>1к6 дробящий</td>
<td>4 фнт.</td>
<td>Универсальное (1к8)</td>
</tr>
<tr>
<td>Булава</td>
<td>5 зм</td>
<td>1к6 дробящий</td>
<td>4 фнт.</td>
<td>—</td>
</tr>
<tr>
<td>Дубинка</td>
<td>1 см</td>
<td>1к4 дробящий</td>
<td>2 фнт.</td>
<td>Лёгкое</td>
</tr>
<tr>
<td>Кинжал</td>
<td>2 зм</td>
<td>1к4 колющий</td>
<td>1 фнт.</td>
<td>Лёгкое, метательное (дистанция 20/60), фехтовальное</td>
</tr>
<tr>
<td>Копьё</td>
<td>1 зм</td>
<td>1к6 колющий</td>
<td>3 фнт.</td>
<td>Метательное (дистанция 20/60), универсальное (1к8)</td>
</tr>
<tr>
<td>Лёгкий молот</td>
<td>2 зм</td>
<td>1к4 дробящий</td>
<td>2 фнт.</td>
<td>Лёгкое, метательное (дистанция 20/60)</td>
</tr>
<tr>
<td>Метательное копьё</td>
<td>5 см</td>
<td>1к6 колющий</td>
<td>2 фнт.</td>
<td>Метательное (дистанция 30/120)</td>
</tr>
<tr>
<td>Палица</td>
<td>2 см</td>
<td>1к8 дробящий</td>
<td>10 фнт.</td>
<td>Двуручное</td>
</tr>
<tr>
<td>Ручной топор</td>
<td>5 зм</td>
<td>1к6 рубящий</td>
<td>2 фнт.</td>
<td>Лёгкое, метательное (дистанция 20/60)</td>
</tr>
<tr>
<td>Серп</td>
<td>1 зм</td>
<td>1к4 рубящий</td>
<td>2 фнт.</td>
<td>Лёгкое</td>
</tr>
<tr>
<th colspan="5">Простое дальнобойное оружие</th>
</tr>
<tr>
<td>Арбалет, лёгкий</td>
<td>25 зм</td>
<td>1к8 колющий</td>
<td>5 фнт.</td>
<td>Боеприпас (дистанция 80/320), двуручное, перезарядка</td>
</tr>
<tr>
<td>Дротик</td>
<td>5 мм</td>
<td>1к4 колющий</td>
<td>1/4 фнт.</td>
<td>Метательное (дистанция 20/60), фехтовальное</td>
</tr>
<tr>
<td>Короткий лук</td>
<td>25 зм</td>
<td>1к6 колющий</td>
<td>2 фнт.</td>
<td>Боеприпас (дистанция 80/320), двуручное</td>
</tr>
<tr>
<td>Праща</td>
<td>1 см</td>
<td>1к4 дробящий</td>
<td>—</td>
<td>Боеприпас (дистанция 30/120)</td>
</tr>
<tr>
<th colspan="5">Воинское рукопашное оружие</th>
</tr>
<tr>
<td>Алебарда</td>
<td>20 зм</td>
<td>1к10 рубящий</td>
<td>6 фнт.</td>
<td>Двуручное, досягаемость, тяжёлое</td>
</tr>
<tr>
<td>Боевая кирка</td>
<td>5 зм</td>
<td>1к8 колющий</td>
<td>2 фнт.</td>
<td>—</td>
</tr>
<tr>
<td>Боевой молот</td>
<td>15 зм</td>
<td>1к8 дробящий</td>
<td>2 фнт.</td>
<td>Универсальное (1к10)</td>
</tr>
<tr>
<td>Боевой топор</td>
<td>10 зм</td>
<td>1к8 рубящий</td>
<td>4 фнт.</td>
<td>Универсальное (1к10)</td>
</tr>
<tr>
<td>Глефа</td>
<td>20 зм</td>
<td>1к10 рубящий</td>
<td>6 фнт.</td>
<td>Двуручное, досягаемость, тяжёлое</td>
</tr>
<tr>
<td>Двуручный меч</td>
<td>50 зм</td>
<td>2к6 рубящий</td>
<td>6 фнт.</td>
<td>Двуручное, тяжёлое</td>
</tr>
<tr>
<td>Длинное копьё</td>
<td>10 зм</td>
<td>1к12 колющий</td>
<td>6 фнт.</td>
<td>Досягаемость, особое</td>
</tr>
<tr>
<td>Длинный меч</td>
<td>15 зм</td>
<td>1к8 рубящий</td>
<td>3 фнт.</td>
<td>Универсальное (1к10)</td>
</tr>
<tr>
<td>Кнут</td>
<td>2 зм</td>
<td>1к4 рубящий</td>
<td>3 фнт.</td>
<td>Досягаемость, фехтовальное</td>
</tr>
<tr>
<td>Короткий меч</td>
<td>10 зм</td>
<td>1к6 колющий</td>
<td>2 фнт.</td>
<td>Лёгкое, фехтовальное</td>
</tr>
<tr>
<td>Молот</td>
<td>10 зм</td>
<td>2к6 дробящий</td>
<td>10 фнт.</td>
<td>Двуручное, тяжёлое</td>
</tr>
<tr>
<td>Моргенштерн</td>
<td>15 зм</td>
<td>1к8 колющий</td>
<td>4 фнт.</td>
<td>—</td>
</tr>
<tr>
<td>Пика</td>
<td>5 зм</td>
<td>1к10 колющий</td>
<td>18 фнт.</td>
<td>Двуручное, досягаемость, тяжёлое</td>
</tr>
<tr>
<td>Рапира</td>
<td>25 зм</td>
<td>1к8 колющий</td>
<td>2 фнт.</td>
<td>Фехтовальное</td>
</tr>
<tr>
<td>Секира</td>
<td>30 зм</td>
<td>1к12 рубящий</td>
<td>7 фнт.</td>
<td>Двуручное, тяжёлое</td>
</tr>
<tr>
<td>Скимитар</td>
<td>25 зм</td>
<td>1к6 рубящий</td>
<td>3 фнт.</td>
<td>Лёгкое, фехтовальное</td>
</tr>
<tr>
<td>Трезубец</td>
<td>5 зм</td>
<td>1к6 колющий</td>
<td>4 фнт.</td>
<td>Метательное (дистанция 20/60), универсальное (1к8)</td>
</tr>
<tr>
<td>Цеп</td>
<td>10 зм</td>
<td>1к8 дробящий</td>
<td>2 фнт.</td>
<td>—</td>
</tr>
<tr>
<th colspan="5">Воинское дальнобойное оружие</th>
</tr>
<tr>
<td>Арбалет, ручной</td>
<td>75 зм</td>
<td>1к6 колющий</td>
<td>3 фнт.</td>
<td>Боеприпас (дистанция 30/120), лёгкое, перезарядка</td>
</tr>
<tr>
<td>Арбалет, тяжёлый</td>
<td>50 зм</td>
<td>1к10 колющий</td>
<td>18 фнт.</td>
<td>Боеприпас (дистанция 100/400), двуручное, перезарядка, тяжёлое</td>
</tr>
<tr>
<td>Длинный лук</td>
<td>50 зм</td>
<td>1к8 колющий</td>
<td>2 фнт.</td>
<td>Боеприпас (дистанция 150/600), двуручное, тяжёлое</td>
</tr>
<tr>
<td>Духовая трубка</td>
<td>10 зм</td>
<td>1 колющий</td>
<td>1 фнт.</td>
<td>Боеприпас (дистанция 25/100), перезарядка</td>
</tr>
<tr>
<td>Сеть</td>
<td>1 зм</td>
<td>—</td>
<td>3 фнт.</td>
<td>Метательное (дистанция 5/15), особое</td>
</tr>
</table>
!!!__''Свойства оружия''__
"""У многих видов оружия есть особые свойства, отражённые в таблице «Оружие».
//''Боеприпас.''// Вы можете использовать оружие со свойством «боеприпас» для совершения дальнобойной атаки только если у вас есть боеприпасы для стрельбы. Каждый раз, когда вы совершаете атаку с помощью этого оружия, вы тратите один боеприпас. Вынимается боеприпас из колчана или другого контейнера частью атаки. Для зарядки одноручного оружия требуется одна свободная рука. В конце сражения вы восстанавливаете половину использованных боеприпасов, потратив минуту на поиски на поле боя.
Если вы используете оружие со свойством «боеприпас» для совершения рукопашной атаки, вы считаете его импровизированным оружием (смотрите ниже «Импровизированное оружие»). Праща при этом должна быть заряжена.
//''Двуручное.''// Это оружие нужно держать двумя руками, когда вы атакуете им.
//''Досягаемость.''// Это оружие добавляет 5 футов к расстоянию, на котором вы можете совершать этим оружием атаки, а также провоцированные атаки.
//''Дистанция.''// У оружия, с помощью которого могут совершаться дальнобойные атаки, указан диапазон в скобках после свойства «боеприпас» или «метательное». Диапазон состоит из двух чисел. Первое — это нормальная дистанция в футах, а второе указывает максимальную дистанцию оружия. При совершении атаки по цели, находящейся на расстоянии, превышающем нормальную дистанцию, бросок атаки совершается с помехой. Цель, находящуюся на расстоянии, превышающем максимальную дистанцию, атаковать нельзя.
//''Лёгкое.''// Лёгкое оружие маленькое и удобное, и идеально подходит для сражения двумя оружиями. Смотрите правила по сражению двумя оружиями в главе 9.
//''Метательное.''// Если у оружия есть свойство «метательное», вы можете совершать им дальнобойные атаки, метая его. Если это рукопашное оружие, вы используете для бросков атаки и урона тот же модификатор характеристики, что и при совершении рукопашной атаки этим оружием. Например, если вы метаете ручной топор, вы используете Силу, а если метаете кинжал, то можете использовать либо Силу, либо Ловкость, так как у кинжала есть свойство «фехтовальное».
//''Особое.''// Оружие со свойством «особое» используется по специальным правилам, указанным в описании этого оружия (смотрите ниже «Особое оружие»).
//''Перезарядка.''// Из-за долгой перезарядки этого оружия вы можете выстрелить из него только один боеприпас одним действием, бонусным действием или реакцией, вне зависимости от количества положенных атак.
//''Тяжёлое.''// Существа Маленького размера совершают броски атаки тяжёлым оружием с помехой. Из-за размера и веса Маленькие существа не могут использовать такое оружие эффективно.
//''Универсальное.''// Это оружие можно использовать как одной, так и двумя руками. Урон, указанный в скобках после этого свойства, означает урон при совершении рукопашной атаки двумя руками.
//''Фехтовальное.''// При совершении атаки фехтовальным оружием вы сами выбираете, какой модификатор использовать при совершении бросков атаки и урона — модификатор Силы или Ловкости. Для обоих бросков должен использоваться один и тот же модификатор."""
!!!''Импровизированное оружие''
"""Иногда при персонажах нет оружия, и им приходится атаковать тем, что окажется под рукой. В импровизированное оружие входят все предметы, которые можно держать одной или двумя руками, такие как разбитая бутылка, ножка от стола, сковорода, колесо от телеги, или мёртвый гоблин.
Во многих случаях импровизированное оружие подобно настоящему оружию, и потому может использоваться как оно. Например, ножка от стола похожа на дубинку. Если Мастер позволит, персонаж, владеющий оружием, может использовать похожий предмет как это оружие и потому использовать бонус мастерства.
Предмет, не похожий на оружие, причиняет урон 1к4 (Мастер назначает вид урона в зависимости от используемого предмета). Если персонаж использует дальнобойное оружие для совершения рукопашной атаки или метает рукопашное оружие, у которого нет свойства «метательное», оно причиняет урон 1к4. У импровизированного метательного оружия нормальная дистанция 20 футов и максимальная дистанция 60 футов."""
!!!''Серебрение оружия''
У некоторых чудовищ есть иммунитет или сопротивление немагическому оружию или уязвимость перед серебряным оружием, поэтому осторожные искатели приключений за дополнительную плату покрывают своё оружие серебром. Вы можете посеребрить одно оружие или десять боеприпасов за 100 зм. В эту стоимость входит серебро и работы по его внедрению в оружие без ухудшения качеств последнего.
!!!''Особое оружие''
"""Здесь описано оружие, использующее специальные правила.
//''Длинное копьё.''// Вы совершаете с помехой атаки длинным копьём по существам, находящимся в пределах 5 футов от вас. Кроме того, если вы не находитесь верхом, длинное копьё используется двумя руками.
//''Сеть.''// Существа Большого и меньшего размеров, по которым попала атака сетью, становятся опутанными, пока не высвободятся. Сеть не оказывает эффекта на бесформенных существ и тех, чей размер Огромный или ещё больше. Существо может действием совершить проверку Силы со Сл 10, чтобы высвободиться самому или освободить другое существо, находящееся в пределах его досягаемости. Причинение сети 5 единиц рубящего урона (КД 10) тоже освобождает существо, не причиняя ему вреда, оканчивая эффект и уничтожая сеть.
Если вы действием, бонусным действием или реакцией совершаете атаку сетью, вы можете совершить только одну атаку, вне зависимости от количества положенных атак."""
//Оружие (любое), необычное (требуется настройка)//
Это магическое оружие предупреждает вас об опасности. Пока это оружие находится у вас, вы совершаете с преимуществом проверки инициативы. Кроме того, вы и все ваши спутники в пределах 30 футов не можете быть захвачены врасплох, кроме случаев, когда недееспособны из-за чего угодно кроме немагического сна. Это оружие с помощью магии будит вас и ваших спутников, если кто-то из вас спит, когда начинается сражение.
//Оружие (любое), необычное (+1), редкое (+2) или очень редкое (+3)//
Вы получаете бонус к броскам атаки и урона, совершённым этим магическим оружием. Размер бонуса определяется редкостью оружия.
Осадное оружие создано для нападения на замки и прочие обнесённые стенами укрепления. Оно будет уместно в кампании с полномасштабной войной. Большая часть осадного оружия не может перемещаться по полю боя сама собой; требуется, чтобы существа перемещали его, а также заряжали, целились и стреляли.
!!''Баллиста''
//Большой предмет//
"""//''Класс Доспеха:''// 15
//''Хиты:''// 50
//''Иммунитет к урону:''// психическая энергия, яд"""
Баллиста это огромный арбалет, стреляющий тяжёлыми болтами. Прежде чем совершить выстрел, её нужно зарядить и навести на цель. Требуется одно действие для зарядки, одно действие для нацеливания и одно действие для выстрела.
://''Болт.''// Дальнобойная атака оружием: +6 к попаданию, дистанция 120/480 фт, одна цель. Попадание: Колющий урон 16 (3к10).
!!''Котёл, подвешенный''
//Большой предмет//
"""//''Класс Доспеха:''// 19
//''Хиты:''// 20
//''Иммунитет к урону:''// психическая энергия, яд"""
Этот железный котёл подвешен так, что его можно легко перевернуть, выливая содержимое. Опустошённый котёл нужно снова наполнить и, скорее всего, заново нагреть, и только тогда его можно использовать повторно. Котёл заполняется тремя действиями, а опрокидывается одним.
Котлы могут заполнять и другими жидкостями, такими как кислота или зелёная слизь, с другими эффектами.
://''Кипящее масло.''// Котёл выливает кипящее масло на площадь 10 х 10 футов непосредственно под ним. Все существа в этой области должны совершить спасбросок Ловкости со Сл 15, получая урон огнём 10 (3к6) при провале или половину этого урона при успехе.
!!''Мангонель''
//Большой предмет//
"""//''Класс Доспеха:''// 15
//''Хиты:''// 100
//''Иммунитет к урону:''// психическая энергия, яд"""
Мангонель это разновидность онагра, мечущая тяжёлые снаряды по высокой дуге. Эти снаряды могут попадать по целям, находящимся за укрытием. Прежде чем совершить выстрел, мангонель нужно зарядить и навести на цель. Требуется два действия для зарядки, два действия для нацеливания и одно действие для выстрела.
Обычно мангонель мечет тяжёлые камни, но может метать и другие снаряды, с другими эффектами.
://''Камень из мангонели.''// Дальнобойная атака оружием: +5 к попаданию, дистанция 200/800 фт. (не может атаковать цели в пределах 60 футов), одна цель. Попадание: Дробящий урон 27 (5к10).
!!''Осадная башня''
//Громадный предмет//
"""//''Класс Доспеха:''// 15
//''Хиты:''// 200
//''Иммунитет к урону:''// психическая энергия, яд"""
Осадная башня это передвижное деревянное сооружение из балок с трапами в одной стене. Большие деревянные колёса или ролики позволяют солдатам или животным тянуть её или толкать. Существа Среднего или меньшего размера могут с помощью осадной башни переходить на стены высотой до 40 футов. Находящееся в башне существо обладает полным укрытием от атак извне башни.
!!''Пушка''
//Большой предмет//
"""//''Класс Доспеха:''// 19
//''Хиты:''// 75
//''Иммунитет к урону:''// психическая энергия, яд"""
Пушка с помощью пороха мечет тяжёлые чугунные ядра с разрушительной скоростью. В кампаниях, где пороха нет, пушка может быть магическим устройством, построенным гномами или ма-гами-инженерами.
Обычно пушка покоится на деревянной раме с колёсами. Прежде чем совершить выстрел, её нужно зарядить и навести на цель. Требуется одно действие для зарядки, одно действие для нацеливания и одно действие для выстрела.
://''Пушечное ядро.''// Дальнобойная атака оружием: +6 к попаданию, дистанция 600/2400 фт., одна цель. Попадание: Дробящий урон 44 (8к10).
!!''Таран''
//Большой предмет//
"""//''Класс Доспеха:''// 15
//''Хиты:''// 100
//''Иммунитет к урону:''// психическая энергия, яд"""
Таран состоит из передвижной рамки, на которой подвешено тяжёлое бревно. Бревно оковано железом и с лёгкостью высаживает двери и ломает баррикады.
Требуется как минимум четыре существа Среднего размера, чтобы орудовать тараном. Благодаря крыше сверху эти существа обладают полным укрытием от атак сверху.
://''Таран.''// Рукопашная атака оружием: +8 к попаданию, досягаемость 5 фт., один предмет. Попадание: Дробящий урон 16 (ЗкЮ).
!!''Требушет''
//Огромный предмет//
"""//''Класс Доспеха:''// 15
//''Хиты:''// 150
//''Иммунитет к урону:''// психическая энергия, яд"""
Требушет это мощный онагр, мечущий тяжёлые снаряды по высокой дуге, и может попадать по целям за укрытиями. Прежде чем совершить выстрел, требушет нужно зарядить и навести на цель. Требуется два действия для зарядки, два действия для нацеливания и одно действие для выстрела Обычно требушет мечет тяжёлые камни, но может метать и другие снаряды, такие как бочки с маслом или нечистотами, с другими эффектами.
://''Камень из требушета.''// Дальнобойная атака оружием: +5 к попаданию, дистанция 300/1200 фт. (не может атаковать цели в пределах 60 футов), одна цель. Попадание: Дробящий урон 44 (8к10).
!!!__''Ослеплённый''__
* Ослеплённое существо ничего не видит и автоматически проваливает все проверки характеристик, связанные со зрением.
* Броски атаки по такому существу совершаются с преимуществом, а его броски атаки совершаются с помехой.
//3 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Когда вы в следующий раз попадёте по существу атакой рукопашным оружием, пока заклинание активно, ваше оружие вспыхивает ярким светом, и атака причиняет цели дополнительный урон излучением 3к8. Кроме того, цель должна преуспеть в спасброске Телосложения, иначе она станет ослеплённой до окончания заклинания.
Ослеплённое этим заклинанием существо совершает спасброски Телосложения в конце каждого своего хода. В случае успеха оно перестаёт быть ослеплённым."""
//9 уровень, Преобразование, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Мгновенная
"""Вы ненадолго останавливаете поток времени для всех кроме себя. Для всех остальных существ время перестаёт течь, а вы получаете 1к4 + 1 ход подряд, во время которых можете совершать действия и перемещаться как обычно.
Это заклинание оканчивается, если одно из ваших действий, совершённых за этот период, или любой из эффектов, созданных вами за этот период, воздействует на других существ или предмет, несомый или носимый кем-то другим. Кроме того, заклинание оканчивается, если вы перемещаетесь в место, находящееся более чем в 1 000 футов от того места, где вы его активировали."""
"""Искатели приключений героичны, но даже они не могут ежечасно заниматься исследованием, взаимодействием и сражениями. Им тоже нужен отдых, время на сон и еду, уход за ранами, освежение сознания и духа для заклинаний и подготовка к новым приключениям.
Искатели приключений могут совершать короткие отдыхи в течение дня и продолжительный отдых в конце каждого дня"""
!!!__''Короткий отдых''__
"""Короткий отдых это период длиной как минимум 1 час, во время которого персонаж не делает ничего напряжённого кроме поглощения пищи, питья, чтения и обработки ран.
В конце короткого отдыха персонаж может потратить одну или несколько Костей Хитов. Каждая потраченная кость позволяет совершить бросок соответствующей кости, добавить к ней модификатор Телосложения и восстановить получившееся количество хитов. После каждого броска можно решить, что будет потрачена ещё одна Кость Хитов. Потраченные Кости Хитов восстанавливаются в конце продолжительного отдыха, как описано ниже."""
!!!__''Продолжительный отдых''__
"""Продолжительный отдых это долгий период длительностью как минимум 8 часов, во время которого персонаж спит или совершает лёгкую деятельность: читает, разговаривает, ест и стоит на страже не более 2 часов. Если отдых прерывается напряжённой активностью (как минимум 1 час ходьбы, сражение, накладывание заклинаний или другая подобная деятельность), персонажи должны начать отдых с начала, чтобы получить от него преимущества.
В конце продолжительного отдыха персонаж восстанавливает все потраченные хиты, а также половину от максимума Костей Хитов (минимум 1). Например, если у персонажа восемь Костей Хитов, в конце продолжительного отдыха он может восстановить четыре из них.
Персонаж не может получить преимущества от второго продолжительного отдыха за 24-часовой период, и у персонажа должен быть хотя бы 1 хит в начале отдыха, чтобы получить от него преимущества."""
//6 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 300 футов
:''Компоненты:'' В, С, М (маленький хрустальный шар)
:''Длительность:'' Мгновенная
"""Шарик холодной энергии слетает с ваших пальцев и устремляется к точке на ваш выбор в пределах дистанции, где взрывается сферой с радиусом 60 футов. Все существа в этой области должны совершить спасбросок Телосложения. При провале существо получает урон холодом 10к6. При успехе оно получает половину урона.
Если шар попадает в воду или жидкость, состоящую в основном из воды (исключая водных существ), он замораживает жидкость на глубину 6 дюймов в пределах квадрата с длиной стороны 30 футов. Лёд существует 1 минуту. Существа, плававшие по поверхности замороженной воды, сковываются льдом. Скованное существо может действием совершать проверки Силы против Сл ваших заклинаний, чтобы высвободиться.
Если хотите, можете не метать шар после накладывания этого заклинания. В этом случае в вашей руке появляется маленький прохладный шарик размером со снаряд для пращи. В любое время вы или существо, которому вы отдадите шарик, можете метнуть его рукой (дистанция 40 футов) или из пращи (обычная дистанция пращи). При столкновении он взрывается с тем же эффектом, что и при обычном использовании этого заклинания. Вы можете уничтожить шарик, не взрывая его. Через 1 минуту, если шарик ещё не взорвался, он взрывается."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше шестого.
//4 уровень, Воплощение, Волшебник//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (полусферический кусочек чистого кристалла и такая же по размерам полусфера из гуммиарабика)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Сфера из мерцающей силы окружает находящееся в пределах дистанции существо или предмет с размером не больше Большого. Нежелающее существо должно совершить спасбросок Ловкости. При провале существо окружается сферой на время действия заклинания.
Ничто — ни физические предметы, ни энергия, ни эффекты прочих заклинаний — не могут проходить через этот барьер, как внутрь, так и наружу, хотя существо в сфере может дышать нормально. Сфера обладает иммунитетом ко всем видам урона, и находящееся внутри существо или предмет не может получать урон от атак и эффектов, исходящих снаружи, но и находящееся в сфере существо не может причинить урон ничему, что находится снаружи.
Сфера ничего не весит, и она достаточно велика, чтобы вместить существо или предмет. Окружённое существо может действием толкать стены сферы и таким образом перемещаться со скоростью, уменьшенной вдвое. Точно так же, сферу могут поднять и переносить другие существа.
Заклинание распад, нацеленное на сферу, уничтожает её, не причиняя вреда тому, что находится внутри."""
//2 уровень, Преобразование, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
"""Выберите предмет, видимый в пределах дистанции. Это может быть дверь, ящик, сундук, кандалы, навесной замок, или другой предмет, содержащий обычное или магическое средство, предотвращающее доступ.
Цель, запертая обычным замком, заклинившая или запертая на засов, становится незапертой, незаклинившей, а засовы сами открываются. Если на предмете было несколько замков, открывается только один из них.
Если вы выбрали цель, запертую волшебным замком, это заклинание подавляется на 10 минут, во время которых цель может открываться и закрываться как обычно.
Когда вы накладываете это заклинание, от цели исходит громкий стук, слышимый с расстояния в 300 футов."""
!!!__''Отравленный''__
Отравленное существо совершает с помехой броски атаки и проверки характеристик.
!!!''__Отражение снарядов__''
"""Начиная с 3 уровня вы можете реакцией отразить или поймать снаряд, если по вам попали атакой дальнобойным оружием. Если вы делаете это, урон снижается на 1к10 + модификатор Ловкости + уровень монаха.
Если вы снизили урон до 0, вы можете поймать снаряд в случае, если он достаточно мал, чтоб держать его одной рукой, и одна из ваших рук свободна. Если вы поймали снаряд с помощью этого умения, вы можете потратить одно очко ци, чтобы частью реакции совершить дальнобойную атаку пойманным оружием или боеприпасом с дистанцией 20/60 футов. Вы совершаете эту атаку с владением, вне зависимости от владения данным оружием, и этот снаряд считается для данной атаки монашеским оружием."""
//2 уровень, Иллюзия, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' 1 минута
"""В вашем пространстве появляются три ваших иллюзорных копии. Пока заклинание активно, копии перемещаются вместе с вами и подражают вашим действиям, двигаясь так, что невозможно понять, кто из вас настоящий. Вы можете действием распустить свои копии.
Каждый раз, когда существо нацеливается на вас атакой, пока заклинание активно, бросайте к20, чтобы определить, не попала ли атака вместо вас по одной из ваших копий.
Если у вас три копии, вы должны выбросить «6» или больше, чтобы сделать целью копию. Если копий две, выбросить нужно «8» или больше. Если копия одна, вы должны выбросить «11» или больше.
КД копии равен 10 + ваш модификатор Ловкости. Если атака попала по копии, она уничтожается. Копию может уничтожить только атака, попавшая по ней. Она игнорирует остальной урон и эффекты. Заклинание оканчивается, если все три копии будут уничтожены.
Существо не попадает под действие этого заклинания, если не может видеть, если полагается на другие чувства кроме зрения, например, на слепое зрение, или если может видеть сквозь иллюзию, например, при помощи истинного зрения."""
!!!''Отталкивающий заряд''
"""//Требование: заговор мистический заряд//
Если вы попадаете по существу мистическим зарядом, вы можете толкнуть его на 10 футов прочь от себя по прямой линии."""
Вы значительную часть своей жизни прожили в уединении — либо в закрытой общине, такой как монастырь, либо вообще в одиночестве. Вдали от шумного общества вы нашли тишину, спокойствие, а возможно, и ответы на важные вопросы.
;
:''Владение навыками:'' Медицина, Религия
:''Владение инструментами:'' Набор травника
:''Языки:'' Один на ваш выбор
;
:''Снаряжение:'' Контейнер для свитков, битком набитый вашими молитвами и изысканиями, тёплое одеяло, обычная одежда, набор травника, 5 зм
!!!''Жизнь в уединении''
Почему вы жили в изоляции, и из-за чего вы прервали своё уединение? Придумайте вместе с Мастером точную природу вашего уединения, либо определите её по таблице, случайным образом.
<table>
<tr>
<th>к8</th>
<th>Жизнь в уединении</th>
</tr>
<tr>
<td>1</td>
<td>Я искал духовное просветление.</td>
</tr>
<tr>
<td>2</td>
<td>Я жил в общине согласно предписаниям моей веры.</td>
</tr>
<tr>
<td>3</td>
<td>Я был изгнан за преступление, которого не совершал.</td>
</tr>
<tr>
<td>4</td>
<td>Я покинул общество после события, изменившего мою жизнь.</td>
</tr>
<tr>
<td>5</td>
<td>Мне нужно было тихое место для работы над картиной, книгой, музыкой или манифестом.</td>
</tr>
<tr>
<td>6</td>
<td>Мне нужна была община, близкая к природе, вдали от цивилизации.</td>
</tr>
<tr>
<td>7</td>
<td>Я был смотрителем древних руин или реликвии.</td>
</tr>
<tr>
<td>8</td>
<td>Я был пилигримом, ищущим существо, место или реликвию.</td>
</tr>
</table>
!!!''Умение: Откровение''
"""Тихое уединение в долгом отшельничестве дало вам доступ к великому откровению. Точная природа этого откровения зависит от характера вашего уединения. Это может быть истина о вселенной, божествах, влиятельных созданиях на внешних планах, или силах природы. Это может быть место, которое никто и никогда не видел. Вы могли обнаружить что-то, что давно было забыто, или найти реликвию прошлого, способную переписать историю. Это может быть информация, которая может причинить вред тем, кто изгнал вас, и тем самым ставшая причиной возвращения в общество.
Придумайте вместе с Мастером детали вашего откровения и его влияние на кампанию."""
!!!''Персонализация''
Некоторым отшельникам комфортно живётся в уединении, а другие жаждут вернуться в общество. Как бы вы ни относились к одиночеству, такая жизнь повлияла на вашу жизненную позицию и идеалы. Некоторые даже сходят с ума от долгих лет вдали от общества.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я так много прожил в изоляции, что редко говорю, предпочитая жесты и редкое мычание.</td>
</tr>
<tr>
<td>2</td>
<td>Я абсолютно безмятежен, даже в самых ужасных ситуациях.</td>
</tr>
<tr>
<td>3</td>
<td>У лидера моей общины были высказывания для любой ситуации, и я стремлюсь поделиться этой мудростью.</td>
</tr>
<tr>
<td>4</td>
<td>Я ужасно сопереживаю всем, кто страдает.</td>
</tr>
<tr>
<td>5</td>
<td>Мне чужд этикет и общественные ожидания.</td>
</tr>
<tr>
<td>6</td>
<td>Я связываю всё, что происходит со мной, с грандиозным замыслом космического масштаба.</td>
</tr>
<tr>
<td>7</td>
<td>Я часто погружаюсь в свои мысли, отвлекаясь от окружения.</td>
</tr>
<tr>
<td>8</td>
<td>Я работаю над великой философской теорией и люблю тех, кто разделяет мои идеи.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Всеобщее благо. Мои дары предназначены для всех, я не должен использовать их в одиночку. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Логика. Эмоции не должны затмевать наше видение того, что истинно и справедливо, а также наше логическое мышление. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Свободомыслие. Изыскания и любопытство — столпы прогресса. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Сила. Уединение и созерцание — путь к мистической и магической силе. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Сам живи и другим не мешай. Вмешиваясь в дела других, причиняешь одни лишь проблемы. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Самопознание. Познаешь себя — познаешь всё вокруг. (Любое)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Самое важное для меня — это другие отшельники, жившие рядом, или мой орден.</td>
</tr>
<tr>
<td>2</td>
<td>Я уединился, чтобы спрятаться от тех, кто мог охотиться за мной. Когда-нибудь я сам брошу им вызов.</td>
</tr>
<tr>
<td>3</td>
<td>Я всё ещё ищу просветление, которого не достиг в уединении, но оно по-прежнему ускользает от меня.</td>
</tr>
<tr>
<td>4</td>
<td>Я уединился, потому что влюбился в ту, с кем мне не суждено жить.</td>
</tr>
<tr>
<td>5</td>
<td>Если моё откровение сбудется, мир будет обречён на гибель.</td>
</tr>
<tr>
<td>6</td>
<td>Моя изоляция позволила познать великое зло, уничтожить которое могу один лишь я.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Теперь, вернувшись в мир, я слишком сильно увлекаюсь его радостями.</td>
</tr>
<tr>
<td>2</td>
<td>Я скрываю тёмные, кровожадные мысли, не ушедшие ни после изоляции, ни после медитаций.</td>
</tr>
<tr>
<td>3</td>
<td>Я категоричен в мыслях и подходе к жизни.</td>
</tr>
<tr>
<td>4</td>
<td>Я позволяю жажде победить в споре становиться сильнее дружбы и гармонии.</td>
</tr>
<tr>
<td>5</td>
<td>Я слишком сильно рискую, стремясь найти утраченные частички знаний.</td>
</tr>
<tr>
<td>6</td>
<td>Мне нравится хранить тайны, и я ими ни с кем не делюсь.</td>
</tr>
</table>
!!!''Другие отшельники''
Эта предыстория подразумевает созерцательное уединение в учениях и молитве. Если вы хотите играть жителем суровой дикой местности, избегающим других существ, попробуйте взять предысторию чужеземца. С другой стороны, если вам нужна более религиозная направленность, можете взять предысторию прислужника. Вы можете даже быть шарлатаном, выдающим себя за мудреца и святого, и дурачащим набожных глупцов.
!!!''Охотник''
Архетип охотника означает признание своего места в качестве оплота между цивилизацией и ужасами диких земель. Если вы пошли по пути охотника, вы обучаетесь специализированным техникам ведения боя с угрозами, встречаемыми вами, начиная неистовыми ограми и ордами орков, и заканчивая возвышающимися великанами и ужасающими драконами.
!!!''Добыча охотника''
На 3 уровне вы получаете одно из следующих умений на свой выбор:
"""//''Сокрушитель орд.''// Один раз в каждый свой ход, когда вы совершаете атаку оружием, вы можете совершить ещё одну атаку тем же оружием по другому существу, находящемуся в пределах 5 футов от первичной цели, и находящемуся в пределах досягаемости вашего оружия.
''//Убийца великанов.//'' Если Большое или ещё большее существо в пределах 5 футов попадает или промахивается по вам атакой, вы можете реакцией атаковать это существо сразу после его атаки, при условии, что вы можете видеть его.
''//Убийца колоссов.//'' Ваше упорство может повергнуть самых мощных врагов. Если вы попадаете по существу атакой оружием, это существо получает дополнительный урон 1к8, если его хиты уже ниже максимума. Вы можете причинить этот дополнительный урон только один раз в ход."""
!!!''Оборонительная тактика''
"""На 7 уровне вы получаете одно из следующих умений на свой на выбор:
''//Защита от мультиатаки.//'' Если существо попадает по вам атакой, вы получаете бонус +4 к КД против всех последующих атак этого существа до конца хода.
''//Побег от орды.//'' Провоцированные атаки по вам совершаются с помехой.
''//Стальная воля.//'' Вы совершаете с преимуществом спасброски от испуга."""
!!!''Мультиатака''
"""На 11 уровне вы получаете одно из следующих умений на свой выбор:
//''Вихревая атака.''// Вы можете действием совершить рукопашные атаки по любому количеству существ в пределах 5 футов от себя, совершая отдельный бросок атаки по каждой цели.
//''Залп.''// Вы можете действием совершить дальнобойные атаки по любому количеству видимых вами существ, находящихся в пределах 10 футов от одной точки, и находящихся в пределах дистанции вашего оружия. У вас должны быть боеприпасы для каждой атаки, как обычно, и вы должны совершить отдельный бросок атаки для каждой цели."""
!!!''Улучшенная защита охотника''
"""На 15 уровне вы получаете одно из следующих умений на свой выбор:
''//Невероятное уклонение.//'' Когда нападающий, которого вы можете видеть, попадает по вам атакой, вы можете реакцией уменьшить вдвое урон от этой атаки.
''//Стоять против течения.//'' Если враждебное существо промахивается по вам рукопашной атакой, вы можете реакцией заставить его повторить эту атаку по другому существу (кроме него самого) на ваш выбор.
''//Увёртливость.//'' Вы можете проворно уворачиваться от некоторых зональных эффектов, например, огненного дыхания красного дракона или заклинания молния. Если вы подвергаетесь эффекту, позволяющему совершить спасбросок Ловкости, чтобы получить только половину урона, вы вместо этого не получаете урона при успешном спасброске, или получаете лишь половину, если спасбросок был неудачным."""
//3 уровень, Ограждение, Бард/Волшебник/Жрец//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (благовония и растолчённый бриллиант, стоящий как минимум 200 зм, расходуемый заклинанием)
:''Длительность:'' Пока не будут рассеяны или пока не сработают
"""Когда вы накладываете это заклинание, вы рисуете руну, причиняющую вред другим существам, либо на поверхности (такой как стол или часть пола или стены) либо в предмете, который можно закрыть (книга, свиток или сундук с сокровищами), спрятав, таким образом, руну. Если вы выбрали поверхность, руна может покрывать площадь диаметром не больше 10 футов. Если вы выбрали предмет, он должен быть неподвижным; если предмет переместят более чем на 10 футов от того места, где вы активируете заклинание, руна сломается, и заклинание окончится, не срабатывая.
Руна практически невидимая, и для её обнаружения требуется успешная проверка Интеллекта (Анализ) против Сл ваших заклинаний.
Вы решаете, что вызовет срабатывание руны, когда накладываете заклинание. Руны, написанные на поверхности, обычно срабатывают от касания, вставания на неё, снимания предмета, стоящего на руне, приближения на определённое расстояние, или манипулирования предметом, на котором начертана руна. Для рун, начертанных внутри предметов, чаще всего выбирают открывание, приближение на определённое расстояние, взгляд, брошенный на руну или попытку её прочтения. После того как руна сработает, заклинание оканчивается.
Вы можете внести уточнения, чтобы заклинание срабатывало только в определённых обстоятельствах или при соблюдении внешних признаков (таких как рост и вес), вид существа (например, руна может защищать только от аберраций и дроу), или мировоззрение. Вы можете также определить условия, при которых существо не будет активировать руну, например, произношение пароля.
Когда вы наносите руну, выберите взрывную руну или заклинательную руну.
''//Взрывная руна.//'' Когда эта руна срабатывает, она испускает магическую энергию сферой с радиусом 20 футов с центром на руне. Эта сфера огибает углы. Все существа в этой области должны совершить спасбросок Ловкости. Существо получает урон звуком, кислотой, огнём, холодом или электричеством 5к8 при провале (вид урона вы выбираете при начертании руны), или половину этого урона при успехе.
//''Заклинательная руна.''// Вы можете сохранить подготовленное заклинание с уровнем не выше 3 в руне, наложив его частью начертания руны. Заклинание должно нацеливаться на одно существо или область. При этом заклинание временно не вступает в силу. Когда руна срабатывает, хранящееся заклинание активируется. Если у заклинания есть цель, целью становится существо, вызвавшее срабатывание руны. Если заклинание действует на область, центр этой области будет на этом существе. Если заклинание призывает враждебных существ или создаёт вредоносные предметы или ловушки, они появляются как можно ближе к нарушителю и атакуют его. Если заклинание требует концентрации, оно длится до конца своей максимальной длительности."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон от взрывной руны увеличивается на 1к8 за каждый уровень ячейки выше третьего. Если вы накладывали заклинательную руну, вы можете хранить в ней заклинание с уровнем, равным уровню ячейки, использованной для охранных рун
//2 уровень, Ограждение, Жрец//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (пара платиновых колец, стоящая как минимум 50 зм каждое, которые вы с целью должны носить на время действия заклинания)
:''Длительность:'' 1 час
"""Это заклинание защищает согласное существо, которого вы касаетесь, и создаёт мистическую связь между вами. Пока цель находится в пределах 60 футов от вас, она получает бонус +1 к КД и спасброскам, а также сопротивление ко всем видам урона. Кроме того, каждый раз, когда она получает урон, вы получаете такое же количество урона.
Это заклинание оканчивается, если ваши хиты опускаются до 0 или если расстояние между вами и целью становится больше 60 футов. Оно также заканчивается, если это заклинание наложить повторно на одно из связанных существ. Вы также можете окончить это заклинание действием."""
//1 уровень, Очарование, Бард/Волшебник/Друид/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 час
Вы пытаетесь очаровать гуманоида, которого видите в пределах дистанции. Он должен совершить спасбросок Мудрости, с преимуществом, если вы или ваши спутники сражаетесь с ним. Если он проваливает спасбросок, он очарован вами, пока заклинание активно или пока вы или ваши спутники не причините ему вред. Очарованное существо считает вас своим другом. Когда заклинание оканчивается, существо знает, что было очаровано вами.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше первого. Эти существа должны находиться в пределах 30 футов друг от друга, чтобы вы могли на них нацелиться.
!!!__''Очарованный''__
* Очарованное существо не может атаковать того, кто его очаровал, а также делать его целью умения или магического эффекта, причиняющего вред.
* Искуситель совершает с преимуществом все проверки характеристик при социальном взаимодействии с очарованным существом.
!!!''__Очищающее касание__''
"""Начиная с 14 уровня вы можете действием окончить действие заклинания на себе или на одном согласном существе, которого вы касаетесь.
Вы можете использовать это умение количество раз, равное вашему модификатору Харизмы (минимум 1). Вы восстанавливаете возможность использования после продолжительного отдыха."""
//1 уровень, Преобразование, Друид/Жрец/Паладин (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вся немагическая еда и питьё в пределах сферы с радиусом 5 футов с центром на точке, выбранной вами в пределах дистанции, очищается и избавляется от ядов и болезней.
//Чудесный предмет, необычный//
Эти кристаллические линзы размещаются напротив глаз. Пока вы их носите, вы видите лучше, чем обычно, в пределах 1 фута. Вы совершаете с преимуществом проверки Интеллекта (Анализ), полагающиеся на исследование местности или предмета в пределах 1 фута.
//Чудесный предмет, необычный (требуется настройка)//
Эти кристаллические линзы размещаются напротив глаз. Пока вы их носите, вы совершаете с преимуществом проверки Мудрости (Внимательность), полагающиеся на зрение. В условиях хорошей видимости вы можете разглядеть подробности даже у экстремально далёких существ и предметов, с размером не меньше 2 футов в поперечнике.
//Чудесный предмет, необычный (требуется настройка)//
Эти кристаллические линзы размещаются напротив глаз. У них есть 3 заряда. Если вы их носите, вы можете действием потратить 1 заряд, чтобы наложить заклинание очарование личности (Сл спасброска 13) на гуманоида в пределах 30 футов от себя, при условии, что вы с ним видите друг друга. Линзы восстанавливают ежедневно на рассвете все потраченные заряды.
!!!__''Ошеломлённый''__
* Ошеломлённое существо «недееспособно» (см. состояние), не способно перемещаться и говорит, запинаясь.
* Существо автоматически проваливает спасброски Силы и Ловкости.
* Броски атаки по существу совершаются с преимуществом.
!!!''__Ошеломляющий удар__''
Начиная с 5 уровня вы можете взаимодействовать с энергией ци, текущей в теле вашего противника. Если вы попали по другому существу атакой рукопашным оружием, вы можете потратить 1 очко ци, чтобы нанести ошеломляющий удар. Цель должна преуспеть в спасброске Телосложения, иначе она станет ошеломлённой до конца вашего следующего хода.
//1 уровень, Преобразование, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 реакция, совершаемая вами, когда вы или существо в пределах 60 футов от вас начинаете падать
:''Дистанция:'' 60 футов
:''Компоненты:'' В, М (небольшое перо или кусочек пуха)
:''Длительность:'' 1 минута
Выберите до пяти падающих существ в пределах дистанции. До окончания действия заклинания их скорость падения уменьшается на 60 футов в раунд. Если такое существо приземлится до окончания заклинания, оно не получает урон от падения и может приземлиться на ноги, и тогда заклинание оканчивает действие на него.
Закованный в латы, сверкающие на солнце, несмотря на пыль и грязь долгого путешествия, человек складывает свой меч и щит и касается ладонями смертельно раненного мужчины. Божественное сияние исходит из его рук, и раны мужчины затягиваются, а глаза широко раскрываются в изумлении.
Дварф пригнулся к земле за камнем. Его чёрный плащ делал его почти невидимым в ночи, и он смотрел, как шайка орков праздновала недавнюю победу. Он тихо крадётся к ним и шепчет свою присягу, и двое орков умирают ещё до того, как понимают, что он здесь был.
Серебряные волосы сверкают в лучах света, которые, кажется, льются только на торжественно смеющегося эльфа. Его копьё вспыхивает, подобно его глазам, когда он снова и снова наносит удары уродливому великану, до тех пор, пока его свет не преодолевает отвратительную тьму.
Вне зависимости от происхождения и миссии, паладинов объединяет их клятва противостоять силам зла. Принесённая ли перед алтарём бога и заверенная священником, или же на священной поляне перед духами природы и феями, или в момент отчаяния и горя смерти, присяга паладина — могущественный договор. Это источник силы, который превращает набожного воина в благословенного героя.
!!!''__Источник праведности__''
Паладин клянётся защищать справедливость и праведность, отстаивать добродетели мира перед вторжениями тьмы, и охотиться на силы зла, где бы они ни скрывались. Разные паладины сосредотачиваются на различных аспектах праведности, но все они связаны клятвой, которая даёт им силы для совершения их священного дела. Многие паладины преданы богам добра, но сила паладина происходит скорее от собственного стремления к справедливости, чем от божества.
Паладины тренируются годами, чтобы обучиться навыкам боя, осваивая владение различными видами оружия и доспехов. Тем не менее, их воинские навыки вторичны по сравнению с магической силой, которой они обладают: силой исцелять больных и раненых, карать нечестивцев и нежить, защищать невинных и тех, кто присоединился к ним в борьбе за справедливость.
!!!''__За мирской жизнью__''
Жизнь паладина это жизнь искателя приключений. Пока тяжёлые травмы не сделают их инвалидами, паладины проживают жизнь на линии фронта мировой борьбы со злом. В рядах ополчений и армий мира мало представителей класса воин, и ещё меньшее количество простых людей могут претендовать на истинное звание паладина. Услышав зов, эти воины оставляют прежнее ремесло и берут в руки оружие, чтобы бороться со злом. Иногда их клятвы приводят их на службу государям в качестве лидеров элитных групп рыцарей, но даже тогда их верность в первую очередь отдана делу праведности, а не короне или стране.
Ставшие искателями приключений паладины относятся к своему делу серьёзно. Поход в древние руины или пыльный склеп может быть обусловлен поиском более высокой цели, чем поход за сокровищами. Зло таится в подземельях и дремучих лесах, и даже самые скромные победы над ним могут удержать мировое равновесие от небытия.
{{Таблица развития Паладина}}
{{Создание Паладина}}
!!!!''Палочка Оркуса''
//Волшебная палочка, артефакт (требуется настройка)//
Эту жуткую волшебную палочку редко можно встретить без её хозяина, Оркуса. Это устройство, такое же злое как его создатель, разделяет стремление демонического повелителя к уничтожению всего живого и превращению Материального Плана в мир нежити. Иногда Оркус позволяет Палочке покидать его. Когда это происходит, Палочка появляется в месте, в котором её настоящий хозяин чувствует возможность добиться выполнения своих планов.
Сделанная из костей, твёрдых как железо, Палочка увенчана увеличенным магией черепом, который когда-то принадлежал человеческому герою, убитому Оркусом. Палочка при помощи магии меняет свой размер, чтобы подходить хватке своего текущего владельца. В присутствии Палочки растения засыхают, вода портится, плоть гниёт, а паразиты наоборот, плодятся с ужасающей скоростью.
Все существа кроме Оркуса, пытающиеся настроиться на Палочку, должны совершить спасбросок Телосложения со Сл 17. При успехе существо получает урон некротической энергией 10к6. При провале существо умирает и становится зомби.
В руках того, кто настроился на неё, Палочка может использоваться как магическая булава, предоставляющая бонус +3 к броскам атаки и урона ей. При попадании Палочка причиняет дополнительный урон некротической энергией 2к12.
;
://''Случайные свойства.''// Палочка Оркуса обладает несколькими свойствами, определяемыми случайным образом:
* 2 малых положительных свойства
* 1 основное положительное свойство
* 2 малых отрицательных свойства
* 1 основное отрицательное свойство
:Отрицательные свойства Палочки Оркуса подавляются, пока она настроена на самого Оркуса.
://''Защита.''// Вы получаете бонус +3 к Классу До-спеха, пока держите Палочку.
:"""//''Заклинания.''// У Палочки есть 7 зарядов. Держа её, вы можете действием потратить 1 или несколько зарядов, чтобы наложить ей одно из следующих заклинаний (Сл спасброска 18): восставший труп (1 заряд), круг смерти (3 заряда), перст смерти (3 заряда), разговор с мёртвыми (1 заряд), Слово Силы: смерть (4 заряда) или усыхание (2 заряда). Палочка ежедневно восстанавливает 1к4 + 3 заряда на рассвете.
Будучи настроенным на Палочку, Оркус или благословлённый им последователь может накладывать заклинания Палочки, тратя на 2 заряда меньше (минимум 0)."""
:"""//''Призыв нежити.''// Если вы держите Палочку, вы можете действием призвать скелетов и зомби, в любых пропорциях, но разделяя между ними 500 хитов. У каждой нежити среднее для неё число хитов (смотрите характеристики в Бестиарии). Нежить с помощью магии восстаёт из земли или как-то иначе формируется в пределах 300 футов от вас и подчиняется вашим командам, пока не будет уничтожена, но на рассвете следующего дня они рассыпаются обычными грудами костей и гниющими трупами. Использовав это свойство Палочки, вы не можете использовать его повторно до следующего рассвета.
Настроенный на эту Палочку Оркус может призывать любую нежить, не ограничиваясь скелетами и зомби. Эта нежить не погибает и не исчезает на рассвете следующего дня, она остаётся, пока Оркус не отпустит её."""
:"""//''Разум.''// Палочка Оркуса — разумный хаотичнозлой предмет с Интеллектом 16, Мудростью 12 и Харизмой 16. Он обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие может понимать языки Бездны и Общий, а также говорить и читать на них и телепатически общаться с владельцем."""
:"""//''Индивидуальность.''// Предназначение Палочки в утолении жажды Оркуса убивать всех подряд в мультивселенной. Она хладнокровна, жестока, лишена чувства юмора, и ей не чужд нигилизм.
Стремясь помочь своему настоящему хозяину, Палочка притворяется верной своему текущему владельцу и торжественно клянётся в этой верности, обещая, например, помогать в свержении Оркуса."""
:"""//''Уничтожение Палочки.''// Для уничтожения Палочку Оркуса должен отнести на Положительный План древний герой, чей череп и венчает её. Чтобы это произошло, этого героя нужно вначале воскресить — а это нелёгкая задача, учитывая тот факт, что Оркус заточил его душу в тайном, хорошо охраняемом месте.
Окунувшись в положительную энергию, Палочка покроется трещинами и взорвётся, но если главное условие с героем не соблюдено, Палочка мгновенно формируется на слое Оркуса в Бездне."""
//1 уровень, Воплощение, Паладин//
;
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Концентрация, вплоть до 1 минуты
Когда вы в следующий раз попадёте по существу рукопашной атакой оружием, пока заклинание активно, ваше оружие вспыхивает ярким белым светом, и атака причиняет цели дополнительный урон огнём 1к6 и поджигает её. Пока заклинание активно, цель в начале каждого своего хода должна совершать спасбросок Телосложения. При провале она получает урон огнём 1к6. При успехе заклинание заканчивается. Если цель или существо, находящееся в пределах 5 футов от неё, потратит действие на тушение пламени, или если какой-то другой эффект потушит пламя (например, погружение в воду), заклинание тоже закончится.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, первичный дополнительный урон от атаки увеличивается на 1к6 за каждый уровень ячейки выше первого.
//2 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы создаёте три огненных луча и направляете их на целей, находящихся в пределах дистанции. Это может быть одна или несколько целей.
Для каждого луча совершите дальнобойную атаку заклинанием. При попадании цель получает урон огнём 2к6."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, вы создаёте один дополнительный луч за каждый уровень ячейки выше второго.
!!!__''Парализованный''__
* Парализованное существо «недееспособно» (см. состояние) и не способно перемещаться и говорить.
* Существо автоматически проваливает спасброски Силы и Ловкости.
* Броски атаки по парализованному существу совершаются с преимуществом.
* Любая атака, попавшая по такому существу, считается критическим попаданием, если нападающий находится в пределах 5 футов от существа.
//Чудесный предмет, необычный//
Эта небольшая сфера толстого стекла весит 1 фунт. Находясь в пределах 60 футов от неё, вы можете произнести командное слово и заставить сферу излучать свет, как, если бы было наложено заклинание свет или дневной свет. Эффект, дублирующий заклинание дневной свет, нельзя использовать повторно до следующего рассвета.
Вы можете действием произнести второе командное слово, заставив светящуюся сферу подняться в воздух и парить на высоте не более 5 футов от земли. Сфера может парить пока вы или другое существо не схватите её. Если вы передвигаетесь более чем на 60 футов от парящей сферы, она следует за вами, оставаясь в пределах 60 футов от вас, выбирая при этом кратчайший маршрут. Если что-либо препятствует перемещению сферы, она мягко опускается на землю, становясь неактивной, и её свет тухнет.
//2 уровень, Преобразование, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (капля битума и паук)
:''Длительность:'' Концентрация, вплоть до 1 часа
Пока заклинание активно, одно согласное существо, которого вы касаетесь, получает возможность перемещаться вверх, вниз и вдоль вертикальных поверхностей, а также по потолкам, оставляя руки свободными. Цель также получает скорость лазания, равную своей скорости ходьбы.
//2 уровень, Вызов, Вошлшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусочек паутины)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы создаёте массу густой и клейкой паутины в точке на ваш выбор в пределах дистанции. Паутина заполняет куб с длиной ребра 20 футов на время длительности заклинания. Паутина является труднопроходимой местностью и слабо заслоняет местность.
Если паутина не прикована к двум прочным структурам (таким как стены или деревья) и не разложена по полу, стене или потолку, созданная паутина опадает сама, и заклинание оканчивается в начале вашего следующего хода. Паутина, разложенная по плоской поверхности, обладает толщиной 5 футов.
Все существа, начинающие ход в паутине, или входящие в неё в свой ход, должны совершать спасбросок Ловкости. При провале существо становится опутанным, пока остаётся в паутине, или пока не вырвется.
Существо, опутанное паутиной, может действием совершить проверку Силы против Сл ваших заклинаний. В случае успеха оно перестаёт быть опутанным.
Паутина огнеопасна. Любой 5-футовый куб паутины, соприкоснувшийся с огнём, сгорает за 1 раунд, причиняя урон огнём 2к4 всем существам, начинающим ход в огне."""
!!!''__Первозданная осведомлённость__''
Начиная с 3 уровня вы можете действием потратить одну ячейку заклинаний следопыта, чтобы сосредоточиться на познании пространства вокруг себя. В течение 1 минуты за каждый уровень использованной ячейки заклинаний вы можете ощутить присутствие следующих видов существ в пределах 1 мили (или в пределах 6 миль, если вы находитесь в избранной местности): аберрации, драконы, исчадия, небожители, нежить, феи и элементали. Это умение не раскрывает местоположение и количество существ.
"""Плавание по реке, ползание по коридорам подземелья, подъём на отвесный утёс — в приключениях важны все виды перемещения.
Мастер может подытожить перемещение без тщательных вычислений расстояний и скоростей: «Вы идёте по лесу, и к исходу третьего дня находите вход в подземелье». Даже в подземелье, если оно большое, Мастер может резюмировать перемещение между сценами: «Убив охранников у входа в древнюю крепость дварфов, вы сверяетесь с картой, по которой проходите пару километров по гулким коридорам и выходите к провалу, через который перекинут узкий каменный мост».
Однако иногда важно знать, сколько времени уйдёт на путешествие, и не важно, в чём измеряется ответ, в днях, часах или минутах. Правила по определению времени путешествия зависят от трёх факторов: скорости и темпа существ, а также местности, по которой они перемещаются."""
!!!''__Скорость__''
"""У всех персонажей и чудовищ есть скорость, которая измеряется в футах и показывает, как далеко персонаж или чудовище могут переместиться за 1 раунд. Это число предполагает ускоренное перемещение в угрожающих жизни обстоятельствах.
Вот правила, по которым определяется, как далеко персонаж или чудовище могут продвинуться за минуту, час и день."""
!!!''Темп перемещения''
"""Во время перемещения группа искателей приключений может перемещаться в нормальном, быстром или медленном темпе, как показано в приведённой ниже таблице. В таблице указано расстояние, на которое может переместиться отряд за это время и эффекты выбранного темпа, если они есть. Быстрый темп сказывается на внимательности, а медленный темп позволяет красться и тщательно осматривать местность (смотрите ниже «Деятельность во время путешествия»).
//''Форсированный марш.''// Таблица предполагает, что персонажи путешествуют по 8 часов в день. Они могут ускориться, рискуя своим здоровьем.
За каждый дополнительный час путешествия сверх 8 часов, персонажи покрывают расстояние, указанное в колонке «час» для их темпа, но все персонажи должны в конце каждого лишнего часа совершать спасброски Телосложения. Сл равна 10 + 1 за каждый час сверх 8. В случае провала персонаж получает одну степень истощения (смотрите приложение А).
//''Скакуны и транспорт.''// В течение небольших промежутков времени (в пределах часа) многие животные перемещаются значительно быстрее гуманоидов. Едущий верхом персонаж может в течение часа ехать галопом, покрывая двойное расстояние быстрого темпа. Если через каждые 8–16 километров есть свежие скакуны, персонажи могут покрывать в таком темпе большие расстояния, но такое возможно только в густонаселённых землях.
Персонажи в фургонах, каретах и прочем наземном транспорте, используют нормальный темп. Персонажи на водном транспорте ограничены скоростью судна (смотрите главу 5), и они не получают ни штрафы за быстрый темп, ни преимущества от медленного темпа. В зависимости от судна и размера экипажа, корабли могут перемещаться и по 24 часа в сутки.
Некоторые особые скакуны, такие как пегасы и грифоны, или особый транспорт, такой как ковёр-самолёт, позволяют перемещаться быстрее. В Руководстве Мастера есть дополнительная информация об особых методах перемещения."""
''Темп перемещения''
<table>
<tr>
<th rowspan="2">Темп</th>
<th colspan="3">Дистанция, пройдённая за...</th>
<th rowspan="2">Эффект</th>
</tr>
<tr>
<th>Минуту</th>
<th>Час</th>
<th>День</th>
</tr>
<tr>
<td>Быстрый</td>
<td>120 метров</td>
<td>4 мили (6 км)</td>
<td>30 миль (50 км)</td>
<td>Штраф −5 к пассивному значению Мудрости (Внимательность)</td>
</tr>
<tr>
<td>Нормальный</td>
<td>90 метров</td>
<td>3 мили (4,5 км)</td>
<td>24 мили (40 км)</td>
<td>—</td>
</tr>
<tr>
<td>Медленный</td>
<td>60 метров</td>
<td>2 мили (3 км)</td>
<td>18 миль (30 км)</td>
<td>Возможность идти скрытно</td>
</tr>
</table>
!!!''Труднопроходимая местность''
"""Скорость, указанная в таблице, подразумевает путешествие по относительно нормальной местности: дороги, открытые равнины или ровные коридоры подземелья. Однако искатели приключений часто забредают в густые леса, глубокие болота, заваленные булыжниками руины, крутые горы и закованные в ледяной панцирь реки — всё это труднопроходимая местность.
По труднопроходимой местности вы перемещаетесь с уменьшенной вдвое скоростью: перемещение на 1 фут совершается за счёт 2 футов скорости, так что за минуту, час или день вы пройдёте вдвое меньшее расстояние, чем обычно."""
!!!__''Особые виды перемещения''__
По опасным подземельям и глухим местам не ходят просто пешком. Искателям приключений приходится карабкаться, ползать, плавать и прыгать, чтобы добраться до нужного места.
!!!''Лазание, плавание и ползание''
Во время лазания и плавания каждый фут перемещения стоит 1 дополнительный фут (2 дополнительных фута при труднопроходимой местности), если у существа нет скорости лазания или плавания. Если Мастер решит, лазание по скользкой вертикальной поверхности или поверхности, где мало за что можно ухватиться, может требовать успешную проверку Силы (Атлетика). Точно так же, плавание в бурных водах может требовать успешную проверку Силы (Атлетика).
!!!''Прыжки''
"""Ваша Сила определяет, как далеко вы можете прыгать.
//''Прыжок в длину.''// Если вы совершаете прыжок в длину, вы покрываете количество футов, равное значению Силы, если непосредственно перед прыжком переместились минимум на 10 футов. Если вы совершаете прыжок в длину без разбега, прыгнуть можно только на половину этой дистанции. В любом случае, каждый фут, на который вы перенеслись прыжком, учитывается при подсчёте перемещения.
Это правило предполагает, что высота прыжка не имеет значения, как в случае перепрыгивания ручья или пропасти. Если Мастер решит, вы должны преуспеть в проверке Силы (Атлетика) со Сл 10, чтобы перепрыгнуть через препятствие (не выше четверти расстояния прыжка), такое как изгородь или невысокая стена. В противном случае вы ударяетесь об него.
Если вы приземляетесь в труднопроходимую местность, вы должны преуспеть в спасброске Ловкости (Акробатика) со Сл 10, чтобы приземлиться на ноги. В противном случае вы падаете ничком.
//''Прыжок в высоту.''// Если вы совершаете прыжок в высоту, вы поднимаетесь в воздух на количество футов, равное 3 + модификатор Силы, если непосредственно перед прыжком переместились минимум на 10 футов. Если вы совершаете прыжок в высоту без разбега, прыгнуть можно только на половину этой дистанции. В любом случае, каждый фут, на который вы перенеслись прыжком, учитывается при подсчёте перемещения. В некоторых случаях Мастер может позволить совершить проверку Силы (Атлетика), чтобы прыгнуть выше, чем обычно.
Руки можно вытянуть вверх на половину своего роста. Таким образом, вы дотягиваетесь до расстояния, равного высоте прыжка плюс полтора ваших роста."""
!!!__''Деятельность во время путешествия''__
Пока искатели приключений путешествуют по подземелью или пустошам, им нужно искать угрозы, а некоторые персонажи могут выполнять другие задачи для облегчения путешествия.
!!!''Походный строй''
"""Искатели приключений должны сформировать походный строй. Это поможет проще определить, кто попал в ловушку, кто заметит прячущихся врагов, и кто окажется ближе к врагам, когда начнётся сражение.
Персонаж может стоять в первом ряду, в одном из средних рядов, или в последнем ряду. Персонажам в первом и последнем ряду нужно достаточно пространства, чтобы идти рядом с теми, кто идёт в том же ряду. Если пространство становится тесным, походный строй может измениться, обычно, вытесняя персонажей в средние ряды.
//''Менее трёх рядов.''// Если отряд формирует только два ряда, то это и будут первый и последний ряд. Если ряд один, то он считается первым."""
<<<
!!!''Разделение отряда''
"""Иногда отряду искателей приключений есть смысл разделиться, хотя бы для разведки того, что происходит впереди. Вы можете формировать несколько отрядов, и каждый будет перемещаться со своей скоростью. У каждой группы будет свой первый, средний и последний ряд.
Недостатком данного метода является то, что отряд будет разделён на несколько групп в случае нападения. Преимуществом будет то, что группа скрытных персонажей, двигаясь медленно, может прокрасться мимо врагов, которых неуклюжие товарищи вспугнули бы. Плуту и монаху будет проще прокрасться, если они оставят паладина позади."""
<<<
!!!''Скрытность''
Путешествуя в медленном темпе, персонажи могут перемещаться скрытно. Если они не находятся на открытой местности, они могут застать других существ врасплох или подкрасться к ним. Правила по скрытности смотрите в главе 7.
!!!''Замечание угроз''
"""Используйте пассивное значение Мудрости (Внимательность) персонажей, чтобы определить, заметит ли группа скрытую угрозу. Мастер может решить, что угрозу могут заметить только персонажи в определённом ряду. Например, когда персонажи исследуют лабиринт туннелей, Мастер может решить, что только персонажи в последнем ряду могут услышать или заметить скрытное существо, идущее за группой, а персонажи в первом и средних рядах — не могут.
Путешествуя в быстром темпе, персонажи получают штраф −5 к пассивному значению Мудрости (Внимательность) при обнаружении скрытых угроз.
//''Столкновения с существами.''// Если Мастер решает, что искатели приключений встречают других существо во время путешествия, обе группы решают, что будет дальше. Одна из групп может решить напасть на другую, начать переговоры, убежать, или посмотреть, что будет делать другая группа.
//''Захват врасплох.''// Если искатели приключений встречают враждебное существо или группу, Мастер определяет, кто из персонажей и их врагов захвачен врасплох, когда начинается сражение. Подробности смотрите в главе 9."""
!!!''Прочая деятельность''
"""Персонажи, занимающиеся другими делами во время путешествия, не сосредоточены на поиске опасностей. Такие персонажи не используют пассивные значения Мудрости (Внимательность) при определении скрытых угроз. Зато такой персонаж может делать что-то другое, с разрешения Мастера.
//''Ориентирование.''// Персонаж может пытаться предотвратить блуждания, совершая проверки Мудрости (Выживание), когда призывает Мастер (в Руководстве Мастера есть правила по определению блужданий).
//''Рисование карты.''// Персонаж может рисовать карту, отображающую прогресс отряда и способную помочь персонажам вернуться обратно или выйти на путь, если они заблудятся. Проверки характеристик не требуются.
//''Выслеживание.''// Персонаж может искать следы другого существа, совершая проверку Мудрости (Выживание), когда призывает Мастер (правила по выслеживанию есть в Руководстве Мастера).
//''Сбор еды.''// Персонаж может искать источники еды и воды, совершая проверки Мудрости (Выживание), когда призывает Мастер (правила по сбору еды есть в Руководстве Мастера)."""
"""В бою персонажи и чудовища постоянно двигаются, используя перемещение и позиционирование для получения превосходства.
Вы можете в свой ход переместиться на расстояние, не превышающее вашу скорость, используя приведённые здесь правила.
Ваше перемещение может включать прыжки, лазание и плавание. Эти разные режимы перемещения можно объединять с ходьбой, либо всё перемещение может состоять из них. Как бы вы ни перемещались, вы вычитаете расстояние всех частей перемещения из скорости, пока не закончите перемещаться.
Раздел «Особые виды перемещения» в главе 8 приводит подробности по прыжкам, лазанию и плаванию."""
!!!__''Прерывание перемещения''__
Вы можете прерывать перемещение в свой ход, совершая что-то между двумя перемещениями. Например, если у вас скорость 30 футов, вы можете переместиться на 10 футов, совершить действие, а затем переместиться на 20 футов.
!!!''Перемещение между атаками''
Если вы совершаете действие, включающее более одной атаки оружием, вы можете дополнительно прерывать перемещение этими атаками. Например, воин, способный совершать две атаки за счёт умения Дополнительная атака, и имеющий скорость 25 футов, может переместиться на 10 футов, совершить атаку, переместиться на 15 футов, и атаковать ещё раз.
!!!''Использование разных скоростей''
"""Если у вас есть несколько скоростей, например, скорость ходьбы и скорость полёта, вы можете переключаться между ними во время перемещения. При каждом переключении вычитайте уже пройдённое расстояние из новой скорости. Разница покажет, на сколько ещё вы можете переместиться. Если результат равен 0 или меньше, вы не можете использовать эту новую скорость во время текущего перемещения.
Например, если у вас есть скорость 30 и скорость полёта 60 за счёт заклинания полёт, вы можете пролететь 20 футов, потом пройти 10 футов, Затем вновь подняться в воздух и пролететь ещё 30 футов."""
!!!__''Труднопроходимая местность''__
"""Сражения редко происходят в пустых комнатах и ровных полях. Окружение — щебень, кусты и крутые лестницы — может создавать труднопроходимую местность
Каждый фут перемещения по труднопроходимой местности стоит 1 дополнительный фут. Это правило действует даже если на одно и то же место действуют сразу несколько эффектов, делающих его труднопроходимым, таких как подлесок, крутые ступени, снег или мелкое болото. Пространство другого существа, как враждебного, так и нет, тоже считается труднопроходимой местностью."""
!!!__''Лежание ничком''__
"""Участники сражения часто оказываются лежащими, либо потому, что их сбили с ног, либо потому что они сами легли. В любом случае, они лежат ничком, и это состояние описано в приложении А.
Вы можете ''упасть ничком'', не тратя скорость. ''Вставание'' требует больше усилий, для него требуется потратить половину скорости. Например, если ваша скорость 30 футов, для вставания придётся потратить 15 футов перемещения. Вы не можете вставать, если у вас недостаточно перемещения или если скорость равна 0.
Для перемещения в положении лёжа нужно или ''ползти'' или использовать магию, такую как телепортация. Каждый фут перемещения во время ползания стоит 1 дополнительный фут. Таким образом, ползание на 1 фут по труднопроходимой местности стоит 3 фута перемещения."""
!!!__''Перемещение и другие существа''__
"""Вы можете проходить сквозь пространство невраждебных существ. Сквозь пространство враждебного существа можно пройти только если его размер как минимум на две категории больше или меньше вашего. Помните, что пространство других существ является для вас труднопроходимой местностью.
Вне зависимости от того, дружественное существо или нет, вы не можете добровольно закончить перемещение в его пространстве.
Если вы во время перемещения покидаете досягаемость враждебного существа, вы, как обычно, провоцируете атаку."""
<<<
!!!''Вариант: Игра на сетке''
"""Если вы отыгрываете сражения на разделённом на клетки поле с помощью миниатюр или жетонов, используйте следующие правила:
''Клетки.'' Каждая клетка поля изображает площадь 5 × 5 футов.
''Скорость.'' Вместо перемещения на футы вы перемещаетесь по клеткам. Скорость при этом делится на сегменты по 5 футов. Можно легко сконвертировать скорость из футов в клетки, разделив её на 5. Например, скорость 30 футов превращается в 6 клеток.
Если сетка используется часто, запишите скорость на листе персонажа сразу в клетках.
''Вход в клетку.'' Для того, чтобы войти в клетку, вы должны потратить как минимум 1 клетку перемещения, даже если двигались по диагонали (правила диагонального перемещения жертвуют реализмом ради скорости. В Руководстве Мастера присутствуют советы по более реалистичному подходу).
Если клетка стоит дополнительного перемещения, например, из-за труднопроходимой местности, у вас должно хватать перемещения, чтобы войти в эту клетку. Например, у вас должно быть как минимум 2 клетки перемещения, чтобы войти в клетку с труднопроходимой местностью.
''Углы.'' Диагональное перемещение не может пересекать углы стен, больших деревьев и прочих особенностей местности, заполняющих всю свою клетку.
''Расстояния.'' Для определения на сетке расстояния между двумя существами или предметами начните подсчёт с клетки, смежной с одним из них и считайте кратчайшим маршрутом до клетки, в которой находится другой, включительно."""
<<<
!!!__''Перемещение полётом''__
Летающие существа наслаждаются отсутствием большинства препятствий, но они постоянно находятся под угрозой падения. Если летающее существо сбито с ног, его скорость уменьшается до 0, или оно по какой-то другой причине теряет способность перемещаться, оно падает, если только не может парить или не летает за счёт магии, такой как заклинание полёт.
!!!__''Размер существа''__
Разные существа занимают разное пространство. Приведённая таблица показывает, какое пространство занимают существа разного размера. Иногда предметы используют эти же категории размеров.
''Категории размеров''
<table>
<tr>
<th>Размер</th>
<th>Пространство</th>
</tr>
<tr>
<td>Крошечный</td>
<td>2,5 × 2,5 фута</td>
</tr>
<tr>
<td>Маленький</td>
<td>5 × 5 футов</td>
</tr>
<tr>
<td>Средний</td>
<td>5 × 5 футов</td>
</tr>
<tr>
<td>Большой</td>
<td>10 × 10 футов.</td>
</tr>
<tr>
<td>Огромный</td>
<td>15 × 15 футов</td>
</tr>
<tr>
<td>Громадный</td>
<td>20 × 20 футов или больше</td>
</tr>
</table>
!!!''Пространство''
"""Указанное пространство это площадь, контролируемая существом в бою, а не его габариты. Например, большинство существ Среднего размера вовсе не 5 футов в ширину, но именно такое пространство в ширину они контролируют. Если хобгоблин Среднего размера стоит в дверном проёме шириной 5 футов, другие существа не могут проходить через него, пока он не разрешит им.
Пространство существа также отражает площадь, необходимую для эффективного сражения. Именно поэтому есть предел количества существ, которые могут окружать другое существо. Если бойцы Среднего размера, только восемь из них смогут окружить 5-футовое пространство своего противника.
Из-за того, что существам большего размера требуется больше пространства, ещё меньшее их количество может принимать участие в окружении. Если пять существ Большого размера столпятся вокруг одного Среднего, больше ни для кого места не останется. И наоборот, одно Громадное существо может быть окружено двадцатью существами Среднего размера."""
!!!''Протискивание в меньшее пространство''
Существо может протиснуться в пространство, достаточное для существа на одну категорию меньше его. Таким образом, Большое существо может протиснуться в проход шириной 5 футов. Протискиваясь, существо должно тратить 1 дополнительный фут за каждый фут перемещения, и совершает с помехой броски атаки и спасброски Ловкости. Броски атаки по существам, находящимся в тесном пространстве, совершаются с преимуществом.
//Чудесный предмет, редкий//
Эта тонкая чёрная ткань, гладкая как шёлк, складывается до размеров носового платка. Она разворачивается в круг диаметром 6 футов.
Вы можете действием развернуть переносную дыру и поместить её на твёрдую поверхность, после чего дыра создаёт межпространственное отверстие глубиной 10 футов. Цилиндрическое пространство внутри дыры находится на другом плане, поэтому с её помощью не получится создавать сквозные проходы. Все существа, находящиеся внутри открытой переносной дыры, могут покинуть её, просто вылезая из неё.
Вы можете действием закрыть переносную дыру, взявшись за края ткани и сложив её. Складывание ткани закрывает дыру, и все существа и предметы, находящиеся в ней, остаются в межпространстве. Что бы в ней ни находилось, дыра практически ничего не весит.
Если дыра сложена, существо, находящееся в её межпространстве, может действием совершить проверку Силы со Сл 10. При успехе существо вырывается наружу и появляется в пределах 5 футов от переносной дыры или существа, несущего её. Дышащее существо, находящееся в закрытой переносной дыре, может перетерпеть 10 минут, после чего начинает задыхаться.
Помещение переносной дыры в межпространство, созданное сумкой хранения, удобным рюкзаком Хеварда или подобным предметом, мгновенно уничтожает оба предмета и открывает врата в Астральный План. Врата появляются в месте, где один предмет пытались поместить в другой. Все существа в пределах 10 футов от врат затягиваются внутрь и помещаются в случайным образом определённое место на Астральном Плане. После этого врата закрываются. Врата односторонние, и повторно не открываются.
//4 уровень, Вызов, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 500 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
"""Вы телепортируетесь в другое пространство в пределах дистанции. Вы оказываетесь точно в выбранном месте. Это может быть место, которое вы видели, которое вы представляете, или которое вы можете описать указаниями направления и расстояния, например, «200 футов подо мной» или «на северо-запад, вверх под углом 45 градусов, на 300 футов».
Вы можете взять с собой предметы, если их вес позволяет вам их нести. Вы также можете взять с собой одно согласное существо, с размером не больше вашего, которое тоже может нести дозволенный вес предметов. При накладывании заклинания существо должно находиться в пределах 5 футов от вас.
Если вы должны оказаться в месте, уже занятом существом или предметом, вы и все перемещающиеся с вами существа получаете урон силовым полем 4к6, и заклинание вас не телепортирует."""
//Чудесный предмет, редкий//
Этот маленький предмет выглядит как перо. Существует несколько разновидностей таких предметов, и каждый из которых обладает своим особым эффектом, используемым один раз. Мастер сам определяет разновидность пера или определяет её случайным образом.
<table>
<tr>
<th>к100</th>
<th>Эффект</th>
<th>к100</th>
<th>Эффект</th>
</tr>
<tr>
<th>01-15</th>
<td>Веер</td>
<th>51-65</th>
<td>Лодка-лебедь</td>
</tr>
<tr>
<th>16-40</th>
<td>Дерево</td>
<th>66-80</th>
<td>Птица</td>
</tr>
<tr>
<th>41-40</th>
<td>Кнут</td>
<th>81-00</th>
<td>Якорь</td>
</tr>
</table>
;
:"""//''Веер.''// Если вы находитесь на корабле или лодке, то можете действием подбросить веер в воздух на расстояние до 10 футов. Этот предмет исчезнет, и на том месте, где это произошло, появится гигантский машущий веер. Этот веер парит в воздухе и создаёт ветер, достаточный для того, чтобы наполнить паруса корабля, увеличивая его скорость на 5 миль в час в течение 8 часов.
Вы можете действием прервать этот эффект."""
://''Дерево.''// Для использования этого пера вы должны находиться на открытом воздухе. Вы можете действием коснуться свободного пространства на поверхности земли. Перо исчезает, и на том месте, где вы коснулись земли, вырастет дуб, не обладающий никакими магическими свойствами. Высотой дерево будет достигать 60 футов при диаметре ствола 5 футов и радиусе кроны 20 футов.
:"""//''Кнут.''// Вы можете действием бросить это перо в любую точку пространства в пределах 10 футов от себя. Перо исчезает, и на его месте появится парящий над землёй кнут. После этого вы можете бонусным действием совершить рукопашную атаку заклинанием по существу, находящемуся в пределах 10 футов от кнута, с бонусом атаки +9. При попадании цель получает урон силовым полем 1к6 + 5.
В свой ход вы можете бонусным действием приказать кнуту переместиться на 20 футов и повторить атаку по существу, находящемуся в пределах 10 футов от него. Кнут исчезает через 1 час, либо после того, как вы действием отпустите его, либо же если вы станете недееспособным или умрёте."""
://''Лодка-лебедь.''// Вы можете действием прикоснуться этим предметом к водоёму с диаметром как минимум 60 футов. Перо исчезнет, и вместо него появляется лодка в форме лебедя длиной 50 и шириной 20 футов. Эта лодка может самостоятельно двигаться по водной глади со скоростью 6 миль в час. Находясь на лодке, вы можете действием отдавать ей команды двигаться или совершить поворот на 90 градусов. Лодка может перевозить 32 существа Среднего или меньшего размера. Большое существо считается за четыре Средних, а Огромное за девять. Лодка остаётся в вашем распоряжении 24 часа, после чего исчезает. Вы также можете действием прервать действие магии досрочно.
://''Птица.''// Вы можете действием подбросить перо в воздух на 5 футов. Перо исчезает, и на его месте появляется огромная, разноцветная птица. Используйте для неё блок статистики рух (смотрите Бести-арий), но она исполняет ваши простые приказания и не может атаковать. Она может переносить до 500 фунтов, летя со своей максимальной скоростью (16 миль в час при максимуме в 144 мили в день, с часовыми отдыхами через каждые 3 часа), или 1000 фунтов с уменьшенной вдвое скоростью. Птица исчезнет после того, как пролетит свою максимальную дневную дистанцию или, если её хиты опустятся до 0. Вы также можете отпустить её действием.
://''Якорь.''// Вы можете действием коснуться этим пером лодки или корабля. В течение следующих 24 часов это судно не может двинуться с места, какие бы средства не использовались для этого. Повторное прикосновение прекращает эффект. Когда эффект заканчивается, перо исчезает.
ПМ могут присоединиться к отряду, в надежде получить свою долю сокровищ, и будут наравне со всеми рисковать своей жизнью, или же они могут последовать за искателями приключений из-за верности, благодарности или любви. Таких ПМ можете контролировать вы, а можете передать контроль над ними игрокам. Даже если его действиями управляют игроки, вы отвечаете за то, чтобы персонаж выглядел реалистично, а не как слуга, которым игроки могут пользоваться как хотят.
ПМ, сопровождающие искателей приключений, действуют как часть отряда и получают полную долю опыта. При определении сложности боевой сцены (смотрите в главе 3) убедитесь, что учли и ПМ в отряде.
!!__''Низкоуровневые последователи''__
Ваша кампания может позволять персонажам игроков брать низкоуровневых ПМ в качестве последователей. Например, у паладина может быть паладин 1 уровня в качестве оруженосца, волшебник может принять волшебника 2 уровня в качестве ученика, жрец может взять (или ему могут назначить) жреца 3 уровня в качестве послушника, бард может взять барда 4 уровня в качестве помощника.
Одним из преимуществ этого в том, что у игроков будут запасные персонажи, если основные будут отдыхать, отойдут от дел или умрут. Одним из недостатков является то, что вам и игрокам придётся следить за большим количеством персонажей.
Поскольку низкоуровневые члены отряда будут получать полную порцию опыта, они будут получать уровни быстрее чем искатели приключений (преимущество обучения под руководством более опытных товарищей), и даже могут догнать их.
Это также означает, что продвижение искателей приключений замедлится, так как они делятся опытом с персонажами, которые оказывают посильный вклад.
Сильные чудовища, представляющие умеренную угрозу для высокоуровневых персонажей, могут причинить такой урон, что мгновенно убьют или выведут из строя последователя низкого уровня. Предполагается, что искатели приключений будут тратить усилия и ресурсы по опеке низкоуровневых ПМ и будут их лечить.
!!__''ПМ как искатели приключений''__
Если у вас не набирается достаточно игроков для полноценного отряда, можете заполнить отсутствующие позиции персонажами Мастера. Эти ПМ будут с уровнем самого низкоуровневого искателя приключений в отряде и создаются (либо вами, либо игроками), используя правила создания персонажей и получения уровней из Книги игрока. Вам же будет проще, если игроки сами будут создавать и управлять этими персонажами поддержки.
Поощряйте достоверный отыгрыш игроками персонажей поддержки, с их особенностями характера, идеалами, привязанностями и слабостями, чтобы они не походили на бездушных болванчиков. Если вам кажется, что ПМ отыгрывается неудачно, можете перехватить управление, дать его другому игроку или просто заставить ПМ покинуть отряд.
Персонажей поддержки будет проще отыгрывать, если ограничить им выбор классовых опций. Отличными кандидатами на роль поддержки станут жрец с доменом Жизни, воин с архетипом Чемпион, плут с архетипом Вор или волшебник, специализирующийся на школе Воплощения.
!!__''Опциональное правило: Верность''__
Верность это опциональное правило, которое вы можете использовать для определения того, насколько далеко ПМ, ставший членом отряда, может пойти, чтобы защитить других членов отряда или помочь им (даже если они ему не нравятся). Если персонажа эксплуатируют или игнорируют, он скоро покинет отряд, а если ему спасают жизнь или у него есть единомышленники, он будет сражаться за товарищей до смерти. Верность можно просто отыгрывать, а можно симулировать этим правилом.
!!!''Показатель верности''
Верность ПМ измеряется по шкале от 0 до 20. Максимальное значение верности равняется максимальному значению Харизмы среди всех членов отряда, а стартовый показатель равен половине этого значения. Если наивысшее значение Харизмы изменится (персонаж может умереть или покинуть отряд), измените показатель верности ПМ.
!!!''Отслеживание верности''
Отслеживайте показатель верности ПМ тайком, чтобы игроки не знали, насколько предан им ставший членом отряда ПМ (даже если он находится под контролем игроков).
Показатель верности увеличивается на 1к4, если остальные члены отряда помогают ПМ выполнить цель, связанную с его привязанностями. Показатель верности также увеличивается на 1к4, если персонажи игроков обращаются с ним хорошо (например, дарят ему магическое оружие) или спасают его. Показатель верности ИП никогда не может подняться выше его максимального значения.
Если другие члены отряда ведут себя, противореча мировоззрению или привязанностям ПМ, уменьшите его показатель верности на 1к4. Уменьшите показатель верности на 2к4, если с персонажем плохо обращаются, обманывают его или подвергают опасности из чистого эгоизма
ПМ, чья верность опустилась до 0, перестаёт быть предан отряду и может уйти. Показатель верности не может опускаться ниже 0.
ПМ с показателем верности 10 и выше будет рисковать жизнью и здоровьем за товарищей по отряду. Если показатель верности находится между 1 и 10, он колеблется. ПМ, чья верность опустилась до 0, не будет действовать в интересах отряда. Непокорный ПМ либо покидает отряд (нападая на персонажей, пытающихся его остановить), либо тайком вредит отряду.
//7 уровень, Некромантия, Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы посылаете негативную энергию в видимое вами существо в пределах дистанции, вызывая у него сильную боль. Цель должна совершить спасбросок Телосложения. В случае провала она получает урон некротической энергией 7к8 + 30, или половину этого урона в случае успеха.
Гуманоид, убитый этим заклинанием, воскресает в начале вашего следующего хода как зомби, постоянно находящийся под вашим командованием и выполняющий ваши устные команды."""
//Чудесный предмет, необычный//
Эти перчатки невидимы, пока вы носите их. Пока вы носите их, вы получаете бонус +5 к проверкам Ловкости (Ловкость рук) и проверкам Ловкости, совершённым для вскрывания замков.
//Чудесный предмет, необычный (требуется настройка)//
Эти перчатки практически сливаются с вашими руками, когда вы их надеваете. Если по вам попадает дальнобойная атака оружием, когда вы их носите, вы можете реакцией уменьшить урон на 1к10 + ваш модификатор Ловкости, при условии, что у вас есть одна свободная рука. Если вы уменьшили урон до 0, вы можете поймать снаряд, если он достаточно маленький, чтобы его можно было держать одной рукой.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эти перчатки, лазание и плавание не требует от вас траты дополнительного перемещения, и вы получаете бонус +5 к проверкам Силы (Атлетика), совершённым, чтобы лазать или плавать.
!!!''__Песнь отдыха__''
"""Начиная со 2 уровня вы с помощью успокаивающей музыки или речей можете помочь своим раненым союзникам восстановить их силы во время короткого отдыха. Если вы, или любые союзные существа, способные слышать ваше исполнение, восстанавливаете хиты в конце короткого отдыха, каждый из вас восстанавливает дополнительно 1к6 хитов. Для того, чтобы восстановить дополнительные хиты, существо должно потратить в конце короткого отдыха как минимум одну Кость Хитов.
Количество дополнительно восстанавливаемых хитов растёт с вашим уровнем в этом классе: 1к8 на 9 уровне, 1к10 на 13 уровне и 1к12 на 17 уровне."""
//6 уровень, Вызов, Друид/Жрец//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (инкрустируемая драгоценными камнями чаша, стоящая как минимум 1 000 зм, расходуемая заклинанием)
:''Длительность:'' Мгновенная
"""Вы организовываете шикарный пир, включая великолепные пищу и питьё. Пир совершается в течение 1 часа, и исчезает по прошествии этого времени, но положительные эффекты не вступают в силу, пока этот час не пройдёт. В пире могут принимать участие до двенадцати других существ.
Существо, принявшее участие в пиршестве, получает несколько преимуществ. Оно излечивается от всех болезней и ядов, приобретает иммунитет к ядам и состоянию испуга, совершает спасброски Мудрости с преимуществом. Максимум его хитов увеличивается на 2к10, и оно получает такое же количество хитов. Все эти преимущества длятся 24 часа."""
//5 уровень, Ограждение, Бард/Волшебник/Друид/Жрец//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (ювелирное украшение, стоящее как минимум 1 000 зм, расходуемое заклинанием)
:''Длительность:'' 24 часа
"""При помощи этого заклинания вы можете попытаться подчинить исчадие, небожителя, фею или элементаля. Существо должно находиться в пределах дистанции весь период накладывания заклинания (обычно для этого существо призывается в центр вывернутого магического круга). В конце накладывания заклинания цель должна совершить спасбросок Харизмы. При провале она должна служить вам, пока заклинание активно. Если существо было призвано или создано другим заклинанием, то длительность того заклинания увеличивается, чтобы совпадать с длительностью этого заклинания.
Подчинённое существо должно выполнять ваши инструкции. Вы можете приказать ему сопровождать вас в приключении, охранять место, или передать послание. Существо выполняет ваши инструкции буквально, и если оно враждебно по отношению к вам, оно будет искать возможность помешать вам. Если существо выполняет ваши инструкции до того как заклинание оканчивается, оно отправляется к вам, чтобы сообщить об этом, если вы с ним находитесь на одном плане существования. Если вы находитесь на разных планах, оно возвращается к месту, где вы подчинили его, и остаётся там, пока заклинание не окончится."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку большего уровня, длительность увеличивается до 10 дней при использовании ячейки 6 уровня, 30 дней при использовании ячейки 7 уровня, 180 дней при использовании ячейки 8 уровня, и года и одного дня при использовании ячейки 9 уровня.
//6 уровень, Вызов, Жрец//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы просите иномировую сущность оказать помощь. Сущность должна быть известна вам: это может быть бог, предтеча, демонический повелитель или другая сущность космического масштаба. Эта сущность посылает вам своего верного небожителя, элементаля или исчадие, создавая его в свободном пространстве в пределах дистанции. Если вы знаете имя конкретного существа, вы можете произнести его в момент накладывания заклинания, чтобы попросить прислать его, но вы всё равно можете получить другое существо (на выбор Мастера).
Когда существо появляется, оно не обязано что-либо делать. Вы можете просить его выполнить услугу в обмен на некую плату, но оно не обязано соглашаться. Услуга может быть как простой (перелёт над пропастью, помощь в сражении), так и комплексной (слежка за врагом, защита во время исследования подземелья). Для заключения сделки вы должны иметь возможность как-то общаться с существом.
Плата может быть разной. Небожитель может потребовать пожертвования золота или магических предметов для храма, а исчадие может потребовать жертвоприношение существа или сокровища в дар. Некоторые существа могут обменивать свои услуги на ваши услуги.
Обычно задание, длительность которого можно измерить минутами, стоит по 100 зм за минуту. Задание, измеряемое часами, требует 1 000 за час. Задача, измеряемая днями (не более 10 дней) требует 10 000 зм за каждый день. Мастер может корректировать размер оплаты, основываясь на обстоятельствах, в которых вы используете это заклинание. Если задача связана с характером существа, оплата может быть уменьшена вдвое или вообще устранена. Неопасные задачи обычно требуют половину оплаты, а особо опасные поручения могут требовать увеличенной награды. Существа редко соглашаются на самоубийственные задания.
Выполнив поручение, или после оговорённого срока существо возвращается на свой домашний план после отчёта вам, если это не противоречит задаче и вообще возможно. Если вы не сошлись в цене, существо мгновенно возвращается на домашний план.
Существо, которому поручено войти в состав вашего отряда, считается его членом, и получает свою долю опыта."""
Различные планы существования — это миры мифов и тайн. Это не просто другие миры, а измерения, сформированные и управляемые духовными и стихийными правилами.
Внешние Планы — это намерения, мысли и стремления. Они являются сферами бытия, где живут боги, небожители и порождения зла. Например, план Элизиум — это не просто место, где обитают добрые сущности, или куда попадают души праведников. Это воплощённый план добра, духовный мир, где зло просто не может процветать. Это большее похоже на состояние разума и бытия, и в то же время это материальное место.
Внутренние Планы служат примером физического воплощения стихийной природы воздуха, земли, огня и воды. Например, всё на Плане Огня пропитано основополагающей сущностью огня: это энергия, страсть, постоянное преобразование и разрушение. Даже предметы из твёрдой латуни или базальта в видимом и осязаемом спектре чувств будто объяты пламенем.
На этом фоне Материальный План является средоточием, где все философские и стихийные силы сталкиваются, образуя смесь смертной жизни и её сущности. Миры D&D сосредоточены в основном на Материальном Плане, что делает их отправной точкой для большинства кампаний и приключений. Остальная же часть мультивселенной определяется в сравнении с Материальным Планом.
!!__''Категории планов''__
Планы стандартной космологии D&D можно разделить на следующие категории:
;Материальный План и его отражения.
:Страна Фей и Царство Теней — это отражения, или эхо Материального Плана.
;Переходные Планы.
:Эфирный План и Астральный План практически лишены каких-либо особенностей, но зато они предоставляют пути для перехода с одного плана на другой.
;Внутренние Планы.
:Четыре Стихийных Плана — Вода, Воздух, Земля и Огонь — формируют кольцо вокруг Материального Плана, находясь при этом в кипящем Стихийном Хаосе.
;Внешние Планы.
:Шестнадцать Внешних Планов соответствуют восьми мировоззрениям (исключая нейтральность) и промежуточным философским состояниям между ними.
;Планы Позитивной и Негативной Энергии.
:Эти два Плана охватывают оставшуюся часть космологии, обеспечивая энергией силы жизни и смерти, лежащие в основе всего сущего в мультивселенной.
!!__''Соединяя планы вместе''__
Описанная в Книге игрока космология D&D включает в себя более двух дюжин планов. Для своей кампании вы сами решаете, какие планы в неё добавить, черпая вдохновение в описании обычных планов и мифах нашего мира, или пользуясь исключительно своим воображением.
Кампании D&D включают в себя следующий минимальный набор элементов:
* План исчадий, таких как демоны и дьяволы
* План для небожителей, вроде ангелов и пегасов
* План для элементалей
* Место обитания божеств, которые могут совпадать с тремя предыдущими планами
* Место, куда отправляются души смертных, которые могут совпадать с тремя первыми планами
* Путь, с помощью которого можно путешествовать между различными планами
* Путь, через который черпают силу чудовища и заклинания, использующие Астральный и Эфирный планы
После того, как вы решили, какие планы хотите использовать в своей кампании, вполне разумно было бы сложить их в организованную космологию. Поскольку основным способом путешествия между планами являются магические порталы, то взаимосвязи между различными Планами — вопрос теоретический. Ни одно создание в мультивселенной не может взглянуть себе под ноги и увидеть планы, расстановленные по порядку, как на диаграмме в книге. Ни один смертный не в состоянии подтвердить, что Гора Целестия находится между Битопией и Аркадией, как котлета в сэндвиче, но это удобная теоретическая конструкция, объясняющая важность взаимосвязи между законопослушным и добрым мировоззрениями.
Мудрецы создали много подобных теоретических конструкций, дабы привнести ясность в беспорядок таких планов как Внешние Планы. Наиболее популярные из них: Великое Колесо, Мировое Древо и Ось Мира. Для своей игры вы можете создать или адаптировать любую другую модель.
<<<
Изобретение собственных планов
Каждый из планов, описанных здесь, имеет как минимум один значительный эффект, влияющий на путешествующих по нему персонажей. При создании собственных планов было бы неплохо придерживаться подобной модели. Создайте одну простую, запоминающуюся черту, которая не создаёт особых проблем за столом, и, тем не менее, хорошо запоминается. Постарайтесь отразить философию и настроение плана, а не только его физические характеристики.
<<<
!!!''Великое Колесо''
Стандартное космологическое распределение, представленное в Книге игрока. Представляет собой группу концентрических колец с Материальным Планом и его отражениями в центре. Внутренние Планы, из колеса вокруг Материального Плана, окружают Эфирный План. И, наконец, Внешние Планы, расположенные в соответствии с различными мировоззрениями, с Внешними Землями, связывающими их, образуют другое колесо, позади остальных.
Такое расположение объясняет путь реки Стикс. Она как нитка соединяет бусины-миры: Ахерон, Девять Преисподних, Геенну, Гадес, Кар-цери, Бездну и Пандемониум. Но это далеко не единственное объяснение расположения русла Стикса.
!!!''Мировое Древо''
При другом подходе планы располагаются среди корней и ветвей великого космического дерева, либо буквально, либо фигурально.
Например, космология древних скандинавов базируется на Мировом Дереве Иггдрасиль. Три корня Мирового Древа касаются трёх миров: Ас-гарда (Внешний План, включающий Вальхаллу, Ванахейм, Альвхейм и прочие области), Мидгарда (Материальный План) и Нифльхейма (преисподняя). Биврёст, радужный мост, это уникальный переходный план, соединяющий Асгард и Мидгард.
Точно так же можно считать планы небожителей Забытых Королевств располагающимися среди ветвей Мирового Древа, а планы исчадий будут связаны межу собой Рекой Крови. Нейтральные планы будут находиться в стороне от них. Каждый из таких планов будет доменом одного или нескольких божеств, а также родным миром для небожителей или исчадий.
!!!''Мировая Ось''
В этой схеме строения вселенной Материальный План и его отражения находятся между двумя противоположными мирами. Астральный План (или Астральное Море) парит над ними, заключая в себе божественные домены (Внешние Планы). Под Материальным Планом находится Стихийный Хаос, единый план, в котором смешаны все стихии. На дне Стихийного Хаоса находится Бездна, подобная дыре в ткани вселенной.
!!!''Прочие теории''
Создавая свою собственную космологию, ознакомьтесь со следующими альтернативами:
;
://''Метавселенная.''// Эта простая космология содержит самый минимум: Материальный План; Переходные Планы; единый Стихийный Хаос; Небеса, где живут добрые божества и небожители; и Преисподняя, где живут злые божества и исчадия.
://''Бесчисленные планы.''// В этой космологии многочисленные планы липнут друг к другу как мыльные пузыри, пересекаясь друг с другом в случайных местах.
://''Планетарий.''// Внутренний и Внешний планы вращаются вокруг Материального Плана, оказывая на него то большее, то меньшее влияние, приближаясь и отдаляясь, соответственно. Мир Эберрон использует именно такую модель космологии.
://''Извилистая дорога.''// В этой космологии каждый план является остановкой на обочине бесконечной дороги. Каждый план соседствует с двумя другими, но связь между ними не такая прямолинейная; путник может перейти со склонов Горы Це-лестия сразу на склоны Геенны.
://''Гора Олимп.''// В греческой мифологии гора Олимп находится в центре мира (Материального Плана), и она такая высокая, что в действительности является другим планом существования: Олимпом, домом богов. Все греческие боги кроме Аида имели свои домены на Олимпе. В царстве Аида, Гадесе, души смертных существовали какое-то время в виде неосязаемых теней, после чего растворялись в ничто. Тартар, в бесконечной темноте которого были заключены титаны, находится под Гадесом. А далеко на западе известного мира, на Материальном Плане, находятся Благословенные Поля Элизиума. Там обитают души великих героев.
://''Солнечная лодка.''// Египетская космология определяется движением солнца в течение дня — по небу Материального Плана, на благословенные западные Поля Подношений, где души праведных заслуженно ведут вечное существование, а потом под миром, сквозь кошмарные Двенадцать Ночных Часов. Солнечная лодка это крохотный самостоятельный Внешний План, путешествующий в Астральном Плане и других Внешних Планах во время разных фаз своего движения.
://''Единый мир.''// В этой модели нет других планов существования, и Материальный План содержит в себе такие места как чёрная Бездна, сияющая Гора Целестия, странный город Механус, крепость Ахерон и так далее. Все планы это конкретные места в мире, куда можно совершить обычное путешествие — хотя для этого могут потребоваться огромные усилия; например, чтобы попасть на благословенные острова Элизиума, понадобится пересечь море.
://''Иной мир.''// В этой модели у Материального Плана есть двойник, играющий роль всех остальных планов. Так же как Страна Фей, он накладывается на Материальный План, и туда можно проникнуть через «тонкие места»: пещеры, моря и грибные кольца в лесах. Там есть тёмные, злые области (родина исчадий и злых богов), островки святости (родина небожителей и духов достойной смерти) и регионы стихийной ярости. Этим иным миром часто правит вечный город, или четыре города, отвечающие за разные аспекты реальности. В кельтской мифологии есть Тир на Ног, а в космологиях некоторых религий, вдохновенных азиатскими мифами, есть аналогичный Духовный Мир.
//Чудесный предмет, необычный (требуется настройка)//
Вы получаете бонус +1 к КД и к спасброскам, пока носите этот плащ.
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите этот плащ, вы совершаете с преимуществом проверки Ловкости (Скрытность). В области тусклого освещения или темноте вы можете схватить края плаща обеими руками и использовать его для полёта со скоростью 40 футов. Если вы отпустите плащ во время полёта или перестанете находиться в области тусклого света или тьмы, вы теряете эту скорость полёта.
Если вы носите этот плащ, и находитесь в области тусклого освещения или темноте, вы можете действием наложить на себя превращение и стать летучей мышью. Пока вы находитесь в облике летучей мыши, вы сохраняете свои значения Интеллекта, Мудрости и Харизмы. Это свойство плаща нельзя использовать повторно до следующего рассвета.
//Чудесный предмет, легендарный (требуется настройка)//
Если вы носите этот плащ, вы можете надеть на голову капюшон и стать невидимым. Пока вы невидимы, всё, что вы несёте и носите, становится невидимым вместе с вами. Вы видимы, если не надеваете капюшон. Капюшон надевается и снимается действием.
Суммируйте время, в течение которого вы остаётесь невидимы, порциями по 1 минуте. После 2 накопленных часов невидимости плащ перестаёт действовать. За каждые 12 часов, пока плащ не используется, он восстанавливает 1 час использования.
//Чудесный предмет, очень редкий (требуется настройка)//
Этот прекрасный плащ сделан из чёрного шёлка, переплетённого тонкими серебристыми нитями. Пока вы его носите, вы обладаете следующими преимуществами:
* Вы получаете сопротивление к урону ядом.
* Вы получаете скорость лазания, равную скорость ходьбы.
* Вы можете перемещаться вверх, вниз и вдоль вертикальных поверхностей, а также вверх ногами по потолку, оставляя руки свободными.
* Вы не можете запутаться ни в какой паутине, и можете перемещаться сквозь паутину как если бы она была просто труднопроходимой местностью.
* Вы можете действием наложить заклинание паутина (Сл спасброска 13). Паутина, создаваемая этим заклинанием, заполняет в два раза большую площадь чем обычно. Это свойство нельзя использовать повторно до следующего рассвета.
//Чудесный предмет, необычный//
Пока вы носите этот плащ с накинутым капюшоном, вы можете дышать под водой и у вас появляется скорость плавания 60 футов. Накидывание и снятие капюшона совершается действием.
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите этот плащ, он создаёт иллюзию, что вы находитесь немного в стороне от настоящего местонахождения, отчего существа совершают броски атаки по вам с помехой. Если вы получаете урон, это свойство перестаёт действовать . до начала вашего следующего хода.
Это свойство подавляется, пока вы недееспособны, опутаны или не можете перемещаться по другой причине.
//Чудесный предмет, редкий//
Этот плащ слабо пахнет серой. Пока вы его носите, вы можете действием наложить заклинание переносящая дверь. Это свойство плаща нельзя использовать повторно до следующего рассвета.
Когда вы исчезаете, вы оставляете после себя облачко дыма, и в пункте назначения появляетесь тоже в клубах дыма. Дым слабо заслоняет покинутое и новое пространство и исчезает в конце вашего следующего хода. Лёгкий или более сильный ветер рассеивает этот дым.
Дав спутникам сигнал ждать, полурослик крадётся по подземному залу. Он прижимает ухо к двери, потом вытаскивает набор инструментов и вскрывает замок в мгновение ока. Затем он исчезает в тени, пока его друг воин идёт вперёд, чтобы пинком открыть дверь.
Человек скрывается в тени переулка, в то время как его сообщница готовит свою часть засады. Когда их цель — известный работорговец — проходит по переулку, сообщница издаёт крик, работорговец начинает выяснять, что произошло, и лезвие убийцы перерезает его горло прежде, чем он может издать звук.
Подавив смешок, гномиха шевелит пальцами и с помощью магии снимает ключи с пояса охранника. Через миг ключи в её руке, дверь камеры открыта, она и её спутники могут спокойно совершать побег.
Плуты полагаются на мастерство, скрытность и уязвимые места врагов, чтобы взять верх в любой ситуации. У них достаточно сноровки для нахождения решения в любой ситуации, демонстрируя находчивость и гибкость, которые являются краеугольным камнем любой успешной группы искателей приключений.
!!!''__Навык и точность__''
Плуты прилагают больше усилий для освоения различных навыков, а также совершенствуют свои боевые способности, дающие им большой набор приёмов, каким мало какие персонажи могут похвастаться. Многие плуты сосредотачиваются на скрытности и обмане, в то время как другие совершенствуют навыки, помогающие им в подземельях, такие как лазание, поиск и обезвреживание ловушек, и вскрытие замков.
Когда дело доходит до боя, плуты отдают предпочтение хитрости, а не грубой силе. Плуту достаточно сделать один точный удар туда, где нападение наиболее повредит цели, а не одолевать врага шквалом атак. Плуты обладают почти сверхъестественной ловкостью для избегания опасностей, а некоторые обучились магическим трюкам в дополнение к своим способностям.
!!!''__Теневая жизнь__''
В каждом городе и посёлке есть своя доля плутов. Большинство из них живёт согласно худшим стереотипам класса, зарабатывая на жизнь грабежами, убийствами, срезанием кошельков и мошенничеством. Часто эти негодяи объединяются в гильдии воров или преступные кланы. Многие плуты действуют самостоятельно, но и они иногда берут учеников, помогающих в мошенничестве и грабеже. Некоторые плуты живут честной жизнью слесарей, следователей или крысоловов, работа которых очень опасна из-за обитающих в канализации лютых крыс и веркрыс.
Плуты искатели приключений встречаются по обе стороны закона. Часть из них — закоренелые преступники, которые решили искать удачу и клады, а другая часть живёт жизнью искателей приключений, чтобы уйти от закона. Некоторые обрели и усовершенствовали свои навыки с целью проникновения в древние руины и скрытые склепы в поисках сокровищ.
{{Таблица развития Плута}}
{{Создание Плута}}
//6 уровень, Воплощение, Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (кусочек меха; кусок янтаря, стекла или кристаллический жезл; три серебряные булавки)
:''Длительность:'' Мгновенная
"""Вы создаёте разряд молнии, которая дугой бьёт цель, выбранную и видимую вами в пределах дистанции. Затем три разряда перепрыгивают с неё на другие цели, которых может быть не больше трёх, каждая из которых должна находиться в пределах 30 футов от первой цели. Цель может быть существом или предметом, и может быть целью только одного разряда.
Цель должна совершить спасбросок Ловкости. Цель получает урон электричеством 10к8 при провале спасброска или половину этого урона в случае успеха."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, из первой цели бьёт дополнительный разряд в другую цель за каждый уровень ячейки выше шестого.
//Заговор, Воплощение, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (кусочек фосфора, гнилушка или светлячок)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте до четырёх огоньков размером с факел в пределах дистанции, делая их похожими на факелы, фонари или светящиеся сферы, парящие в воздухе. Вы можете также объединить четыре огонька в одну светящуюся человекоподобную фигуру Среднего размера. Какую бы форму вы не выбрали, каждый огонёк излучает тусклый свет в радиусе 10 футов.
Вы можете бонусным действием в свой ход переместить огоньки на 60 футов в новое место в пределах дистанции. Каждый огонёк должен находиться в пределах 20 футов от другого огонька, созданного этим заклинанием, и огонёк тухнет, если оказывается за пределами дистанции заклинания."""
!!!''__Повелитель зверей__''
Архетип повелителя зверей воплощает в себе дружбу между цивилизацией и зверями дикого мира. Объединяя усилия, зверь и следопыт работают как одно целое, борясь с чудовищными врагами, угрожающими цивилизации и дикой природе. Следование пути повелителя зверей означает посвящение себя этому идеалу, сотрудничество с животным в качестве спутника и друга.
!!!''Спутник следопыта''
"""На 3 уровне вы получаете зверя-спутника, который сопровождает вас во время приключений и обучен сражаться вместе с вами. Выберите зверя, с размером не больше Среднего, ПО которого 1/4 или ниже (приложение Г представляет параметры ястреба, мастиффа и пантеры в качестве примеров). Добавьте свой бонус мастерства к КД, броскам атаки и урона зверя, а также к спасброскам и навыкам, которыми он владеет. Максимум его хитов равен его обычному максимуму или вашему четырёхкратному уровню следопыта, в зависимости от того, что выше.
Зверь подчиняется вашим командам так хорошо, как только может. Он совершает ход с вашей инициативой, хотя и не совершает действий, если вы не прикажете обратное. Как любые другие существа, зверь может тратить Кости Хитов во время короткого отдыха. Во время своего хода вы можете устно командовать зверем, куда ему двигаться (для этого не требуется никаких действий от вас). Вы можете действием дать устную команду зверю совершить Атаку, Отход, Помощь, Рывок или Уклонение. Если у вас есть умение Дополнительная атака, вы можете сами совершить одну атаку оружием, когда приказываете зверю совершить действие Атака. Если вы недееспособны или отсутствуете, зверь самостоятельно совершает действия, сосредотачиваясь на защите вас и себя. Для того, чтобы он совершал реакции, ваша команда не требуется, в том числе и при совершении провоцированной атаки.
Путешествуя по избранной местности только вдвоём со зверем, вы можете передвигаться скрытно в нормальном темпе.
Если зверь умирает, вы можете получить другого, потратив 8 часов на волшебное связывание себя со зверем, не враждебным к вам, того же вида, либо другого."""
!!!''Исключительная дрессировка''
Начиная с 7 уровня, если в ваш ход зверь-спутник не нападает, вы можете бонусным действием приказать зверю совершить Отход, Помощь, Рывок или Уклонение в его ход.
!!!''Звериная ярость''
Начиная с 11 уровня, когда вы приказываете своему зверю использовать действие Атака, он может совершить либо две атаки, либо действие Мультиатака, если у него оно есть.
!!!''Общие заклинания''
Начиная с 15 уровня, когда вы накладываете заклинание, направленное на себя, вы также можете распространить его эффект на зверя-спутник, если он находится в пределах 30 футов от вас.
//Чудесный предмет, необычный (требуется настройка)//
Значение вашего Интеллекта равно 19, пока вы носите эту повязку. Она не оказывает на вас эффект, если ваш Интеллект без неё и так уже 19 или выше.
Строгое следование правилам перемещения может превратить захватывающую погоню в унылое и предсказуемое занятие. Более быстрые существа всегда ловят более медленных, а существа с одинаковой скоростью не смогут сократить расстояние между друг другом. Представленный ниже набор правил может сделать погоню более захватывающей, вводя элемент случайности.
!!__''Начало погони''__
Для погони требуется преследуемый и как минимум один преследователь. Все участники, отсутствующие пока в порядке инициативы, должны совершить проверку инициативы. Так же как в сражении, все участники погони могут в свой ход переместиться и совершить одно действие. Погоня оканчивается, когда одна из сторон сдаётся или если преследуемый сбегает.
Когда погоня начинается, определите начальное расстояние между преследуемым и преследователями. Отслеживайте расстояние между ними, и назначьте ближайшего к жертве преследователя головным. В каждом раунде может быть свой головной преследователь.
!!__''Проведение погони''__
Участники погони будут испытывать желание в каждом раунде совершать действие Рывок. Преследователь, остановившийся, чтобы наложить заклинание или совершить атаку, рискует упустить жертву, а решившаяся на это жертва рискует попасться в руки преследователям.
!!!''Рывки''
Во время погони участники могут без риска совершить действие Рывок не чаще чем (3 + их модификатор Телосложения) раза. Каждое действие Рывок, совершённое в погоне сверх нормы, требует, чтобы существо в конце своего хода преуспело в проверке Телосложения со Сл 10, иначе оно получит одну степень истощения.
Участник покидает погоню, если получает истощение 5 степени, так как его скорость становится равной 0. Существо может избавиться от всех степеней истощения, полученных во время погони, окончив короткий или продолжительный отдых.
!!!''Заклинания и атаки''
Участник погони может совершать атаки и накладывать заклинания на других существ, находящихся в пределах дистанции. При этом используются обычные правила по укрытию, местности и прочие правила.
Обычно участники погони не могут совершать провоцированные атаки друг по другу, так как считается, что все они одновременно перемещаются в одном и том же направлении.
Однако участники погони всё равно могут быть целями провоцированных атак существ, не участвующих в погоне. Например, искатели приключений, бегущие за вором мимо банды головорезов в аллее, могут спровоцировать атаки.
!! __''Завершение погони''__
Погоня завершается, если одна из сторон покидает её, если преследуемый сбегает, или если преследователь догоняет жертву.
Если ни одна из сторон не покинула погоню, жертва в конце каждого раунда совершает проверку Ловкости (Скрытность), после того как все участники погони совершили свои ходы. Результат сравнивается с пассивным значением Мудрости (Внимательность) преследователей. Если жертвами являются сразу несколько существ, проверку совершают все они.
Если жертва никогда не покидала линию обзора головного преследователя, проверка автоматически проваливается. В противном случае, если результат проверки жертвы превышает максимальное пассивное значение, добыча сбегает. Если нет, то погоня продолжается ещё один раунд.
Жертва совершает проверку с помехой или преимуществом, в зависимости от преобладающих обстоятельств, показанных в приведённой ниже таблице. Если разные обстоятельства дают одновременно и преимущество и помеху, то, как обычно, не будет ни того, ни другого.
!!!!''Обстоятельства побега''
<table>
<tr>
<th>Обстоятельство</th>
<th>Проверка совершается с...</th>
</tr>
<tr>
<td>У жертвы есть много мест, где спрятаться</td>
<td>преимуществом</td>
</tr>
<tr>
<td>Жертва находится в очень людном или шумном месте</td>
<td>преимуществом</td>
</tr>
<tr>
<td>У жертвы мало мест, где спрятаться</td>
<td>помехой</td>
</tr>
<tr>
<td>Жертва находится в малолюдном или тихом месте</td>
<td>помехой</td>
</tr>
<tr>
<td>Головной преследователь — следопыт, владеющий навыком Выживание</td>
<td>помехой</td>
</tr>
</table>
На ваше усмотрение, попытке сбежать жертвы могут мешать или помогать и другие обстоятельства Например, жертва, на которую наложено заклинание огонь фей, может совершать проверки Скрытности с помехой, так как её легко заметить.
Побег не обязательно означает, что жертва оторвалась от преследователей. Например, в городском окружении побег может означать, что жертва смешалась с толпой или скрылась за углом, не оставив после себя никаких следов.
!!__''Осложнения погони''__
Во время погони могут происходить неожиданные осложнения, которые делают преследование более захватывающим. В приведённых ниже таблицах для города и дикой местности есть несколько примеров.
Осложнения происходят случайным образом. Каждый участник погони бросает к20 в конце своего хода Посмотрите в соответствующей таблице, произошло ли осложнение. Если произошло, то оно действует на следующего участника погони в порядке инициативы, а не на того, кто кинул кость. Участник, бросавший кость, или тот, кому выпало осложнение, может потратить вдохновение, чтобы устранить осложнение.
Персонажи могут создавать свои собственные осложнения, чтобы оторваться от преследователей (например, накладывать заклинание паутина на узкий коридор). Обыграйте эти препятствия так, как посчитаете нужным.
!!!!''Осложнения погонь в городе''
<table>
<tr>
<th class="SpecHead2">к20</th>
<th>Осложнение</th>
</tr>
<tr>
<td>1</td>
<td>Ваш путь преграждает большое препятствие, такое как лошадь или телега. Совершите проверку Ловкости (Акробатика) со Сл 15, чтобы обогнуть препятствие. При провале препятствие считается за 10 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>2</td>
<td>Ваш путь преграждает толпа. Совершите проверку Силы (Атлетика) или проверку Ловкости (Акробатика) со Сл 10 (на свой выбор), чтобы пробраться через толпу без задержек. При провале толпа считается за 10 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>3</td>
<td>Ваш путь преграждает большое грязное окно или подобное препятствие. Совершите спасбросок Силы со Сл 10, чтобы пробиться сквозь препятствие и продолжить бег. При провале вы отскакиваете от препятствия и падаете ничком.</td>
</tr>
<tr>
<td>4</td>
<td>На вашем пути возникает лабиринт из бочек, ящиков или подобных препятствий. Совершите проверку Ловкости (Акробатика) или Интеллекта со Сл 10 (на свой выбор), чтобы сориентироваться. При провале лабиринт считается за 10 футов труднопро-ходимой местности.</td>
</tr>
<tr>
<td>5</td>
<td>Пол под вашими ногами скользкий после дождя, пролитого масла или другой жидкости. Совершите спасбросок Ловкости со Сл 10. При провале вы падаете ничком.</td>
</tr>
<tr>
<td>6</td>
<td>Вы натолкнулись на свору собак, дерущихся за еду. Совершите проверку Ловкости (Акробатика) со Сл 10, чтобы прорваться через стаю. При провале вы получаете колющий урон 1к4 от укусов, и собаки считаются за 5 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>7</td>
<td>Вы ворвались в драку. Совершите проверку Силы (Атлетика), Ловкости (Акробатика) или Харизмы (Запугивание) со Сл 15 (на свой выбор), чтобы прорваться мимо драчунов. При провале вы получаете футов труднопроходимой местности.</td>
</tr>
<tr>
<td>8</td>
<td>Ваш путь преграждает нищий. Совершите проверку Силы (Атлетика), Ловкости (Акробатика) или Харизмы (Запугивание) со Сл 10 (на свой выбор), чтобы прорваться мимо нищего. Вы автоматически преуспеете, если бросите ему монетку. При провале нищий считается за 5 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>9</td>
<td>Бдительный страж (смотрите характеристики в Бестиарии) ошибочно принимает вас за кого-то другого. Если вы в свой ход переместитесь на 20 футов или больше, страж совершает по вам провоцированную атаку копьём (+3 к попаданию; колющий урон 1к6 + 1 при попадании).</td>
</tr>
<tr>
<td>10</td>
<td>Вам нужно резко свернуть в сторону, чтобы не столкнуться с препятствием. Совершите спасбросок Ловкости со Сл 10, чтобы выполнить манёвр. При провале вы ударяетесь обо что-то твёрдое и получаете дробящий урон 1к4.</td>
</tr>
<tr>
<td>11–20</td>
<td>Без осложнений.</td>
</tr>
</table>
!!!!''Осложнения погонь в дикой местности''
<table>
<tr>
<th>к20</th>
<th>Осложнение</th>
</tr>
<tr>
<td>1</td>
<td>Вам предстоит продраться сквозь густые кусты. Совершите проверку Силы (Атлетика) или Ловкости (Акробатика) со Сл 10 (на свой выбор), чтобы пробраться через кусты. При провале куст считается за 5 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>2</td>
<td>Перед вами участок неровной земли. Совершите проверку Ловкости (Акробатика) со Сл 10, чтобы проложить свой путь. При провале земля считается за 10 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>3</td>
<td>Вы пробегаете сквозь рой насекомых (смотрите характеристики в Бестиарии, и Мастер выбирает насекомых, которые будут уместны). Рой совершает по вам провоцированную атаку (+3 к попаданию; колющий урон 4к4 при попадании).</td>
</tr>
<tr>
<td>4</td>
<td>Ваш путь преграждает ручей, ущелье или каменный пласт. Совершите проверку Силы (Атлетика) или Ловкости (Акробатика) со Сл 10 (на свой выбор), чтобы пересечь это место. При провале препятствие считается за 10 футов труднопроходимой местности.</td>
</tr>
<tr>
<td>5</td>
<td>Совершите спасбросок Телосложения со Сл 10. При провале вы до конца своего хода ослеплены песком, грязью, пеплом, снегом или пыльцой. Пока вы ослеплены этим эффектом, ваша скорость уменьшена вдвое.</td>
</tr>
<tr>
<td>6</td>
<td>Перед вами внезапно оказывается яма. Совершите спасбросок со Сл 10, чтобы обогнуть её. При провале вы падаете на 1к4 х 5 футов, получая дробящий урон 1к6 за каждые 10 футов падения, как обычно, и падаете ничком.</td>
</tr>
<tr>
<td>7</td>
<td>Вы попадаете в охотничий силок. Совершите спасбросок Ловкости со Сл 15, чтобы избежать его. При провале вы пойманы в сеть и опутаны. Смотрите в 5 главе Книги игрока правила по высвобождению из сети.</td>
</tr>
<tr>
<td>8</td>
<td>Вы вызвали панику у группы животных. Совершите спасбросок Ловкости со Сл 10. При провале вы сбиваетесь с ног и получаете дробящий урон 1к4 и колющий урон 1к4.</td>
</tr>
<tr>
<td>9</td>
<td>Ваш путь проходит мимо участка, заросшего бритвенной лозой. Совершите спасбросок Ловкости со Сл 15 или используйте 10 футов перемещения (на свой выбор), чтобы избежать бритвенной лозы. При провале вы получаете рубящий урон 1к10.</td>
</tr>
<tr>
<td>10</td>
<td>В погоню за вами устремляется местное существо. Мастер сам определяет вид существа.</td>
</tr>
<tr>
<td>11-20</td>
<td>Без осложнений.</td>
</tr>
</table>
!!!''Создание своих собственных таблиц погони''
Представленные таблицы не учитывают всё многообразие возможного окружения. Погоня в канализации Врат Балдура или завешанных паутиной аллеях Мензоберранзана может вдохновить вас на создание своих собственных таблиц.
!!!''Разделение''
Существа, за которыми идёт погоня, могут разделиться на меньшие группы. Это заставит преследователей или тоже разделиться, или упустить кого-то из жертв. Если погоня разделяется на несколько погонь, отслеживайте каждую отдельно. Проведите раунд одной погони, потом раунд второй, и так далее, отслеживая дистанцию каждой группы.
!!!''Карта погони''
Если у вас есть возможность запланировать погоню заранее, потратьте время и нарисуйте примерную карту, изображающую маршрут. Расставьте в определённых местах препятствия, особенно те, что требуют совершения проверок характеристики или спасбросков, чтобы не задержаться и не остановиться, или используйте таблицу случайных осложнений. Если карты не будет, ничего страшного, можно импровизировать по ходу игры.
Осложнения могут быть как барьерами, мешающими продвигаться вперёд, так и потенциальными возможностями устроить суматоху. Персонажи, за которыми по лесу гонятся медвежатники, могут заметить осиное гнездо и немного замедлиться, чтобы атаковать гнездо или кинуть в него камень, создавая, таким образом, препятствие для своих преследователей. Карта погони может быть линейной, а может иметь ответвления, в зависимости от характера погони. Например, в погоне в вагонетках может быть мало ответвлений (если они вообще будут), а вот погоня в канализации может быть весьма ветвистой.
!!!''Смена ролей''
Во время погони преследователи сами могут стать преследуемыми. Например, персонажи, гонящиеся за вором по рынку, могут привлечь нежелательное внимание других представителей гильдии воров. Преследуя убегающего вора, они сами должны оторваться от преследующих их воров. Совершите проверку инициативы для вновь прибывших, и ведите обе погони одновременно. В другом сценарии убегающий вор может добежать до своих, и теперь уже оставшиеся в меньшинстве персонажи игроков должны будут убегать от разбойников.
//3 уровень, Преобразование, Волшебник/Друид/Следопыт/Чародей (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (камыш или соломинка)
:''Длительность:'' 24 часа
Это заклинание дарует на время своего действия до десяти существам, видимым вами в пределах дистанции, способность дышать под водой. Эти существа сохраняют и обычное дыхание.
"""Если искатели приключений преследуют сахуагинов до их подводных жилищ, сражаются с акулами на месте древнего кораблекрушения или оказываются в затопленной комнате подземелья, им придётся сражаться в необычном окружении. Под водой применяются следующие правила:
При совершении ''атаки рукопашным оружием'' существо, у которого нет скорости плавания (врождённой или дарованной магией) совершает броски атаки с помехой, кроме случаев, когда в качестве оружия используется кинжал, копьё, короткий меч, метательное копьё или трезубец.
''Атаки дальнобойным оружием'' автоматически промахиваются по целям, находящимся за пределами нормальной дистанции оружия. Но даже по целям в пределах нормальной дистанции броски атаки совершаются с помехой, кроме случаев, когда используется арбалет, сеть или метательное оружие, такое как метательное копьё (включает копьё, трезубец и дротик).
Существа и предметы, полностью погруженные в воду, получают сопротивление к урону огнём."""
Некоторые подземелья это старые крепости, заброшенные теми, кто их построил. Другие это естественные пещеры или жуткие логова отвратительных чудовищ. Они привлекают злые культы, племена чудовищ и отчуждённых существ. В подземельях также можно найти древние сокровища: монеты, самоцветы, магические предметы и прочие ценности, спрятанные во тьме и часто охраняемые ловушками или собравшими их здесь чудовищами.
!!__''Создание подземелья''__
Вознамерившись создать подземелье, подумайте о его отличительных качествах. Например, подземелье, которое служит крепостью хобгоблинам, будет отличаться от древнего храма, в котором обитают юань-ти. Этот раздел показывает процесс создания подземелья и насыщение его деталями.
!!!''Местонахождение подземелья''
Используйте приведённую таблицу для определения местонахождения вашего подземелья. Можете совершить бросок костей, а можете выбрать вариант самостоятельно.
{{$:/Местонахождение подземелья (кнопка)}}
!!!''Создатель подземелья''
Подземелье является отражением его создателя. В затерянном храме юань-ти, заросшем лианами, вместо лестниц могут быть наклонные трапы. В пещере, вырезанной лучом злобоглаза, стены могут быть неестественно гладкими, а в центре логова может быть вертикальная шахта, соединённая с разными этажами. Амфибии, такие как куо-тоа и аболеты, могут с помощью воды защищать самые тайные части своего логова от дышащих воздухом чужаков.
Детали делают окружение подземелья реалистичным. На дверях крепости дварфов могут быть вырезаны огромные бородатые лица, и они же будут обезображены захватившими это место гнол-лами. В жилище дроу часто будут встречаться камеры пыток, загоны для рабов и изображения паутины, что много говорит об этих местах и их обитателях.
Приведённая ниже таблица включает существ, обычно строящих подземелья. Можете выбрать создателя самостоятельно, можете совершить бросок, или выберите создателя, подходящего вашей кампании.
<<Button "$:/Создатель подземелья""Создатель подземелья">>
{{$:/Класс и Мировоззрение ПМ (Кнопка)}}
!!!''Предназначение подземелья''
Если исключить вариант с естественной пещерой, подземелье строится и заселяется ради конкретной цели, влияющей на его воплощение и обустройство. Можете выбрать предназначение подземелья из таблицы, можете совершить бросок костей, а можете придумать свою собственную идею.
{{$:/Предназначение подземелья}}
;
://''Крепость.''// Подземелье-крепость это надёжная база для операций злодеев и чудовищ. Обычно ей управляет влиятельный индивидуум, такой как волшебник, вампир или дракон, и она крупнее обычного логова и устроена сложнее.
://''Лабиринт.''// Лабиринт предназначен для дезориентирования тех, кто входит в него. Некоторые лабиринты это хорошо придуманные препятствия, защищающие сокровище, а другие представляют собой испытание для пленников, которых в случае неудачи пожирают чудовища.
://''Логово.''// Логово это место, где живут чудовища. Обычно логовами являются руины и пещеры.
://''Планарные врата.''// Подземелья, построенные вокруг планарных порталов, часто искажены энергией, сочащейся из этих самых порталов.
://''Склеп.''// Склепы манят охотников за сокровищами, а также чудовищ, жаждущих получить кости мертвецов.
://''Смертельная ловушка.''// Такое подземелье создаётся с целью уничтожить существ, осмелившихся войти в него. Смертельная ловушка может охранять сокровище или безумного волшебника, а может манить искателей приключений с целью погубить, например, чтобы напитать филактерий лича Храм или святыня. Такое подземелье посвящено божеству или другой планарной сущности. Подземелье контролируется последователями и здесь же проводятся ритуалы.
://''Хранилище сокровищ.''// Такое подземелье, построенное для защиты важных магических предметов и материальных богатств, хорошо охраняется чудовищами и ловушками.
://''Шахта.''// Заброшенная шахта может быстро заполниться чудовищами, а забравшиеся глубоко шахтёры могут прорваться в Подземье.
!!!''История''
В большинстве случаев, первоначальные строители подземелья уже сгинули, и вопрос о том, что с ними стало, может помочь понять текущее состояние подземелья.
Приведённая таблица указывает ключевые события, способные превратить исходную постройку в подземелье, пригодное для исследования искателями приключений. У чрезвычайно старых подземелий история может состоять из нескольких событий, и каждое будет как-то менять это место.
{{$:/История подземелья}}
!!__''Обитатели подземелья''__
После того как создатели подземелья исчезают, там может поселиться кто и что угодно. В подземелья стекаются разумные чудовища, безмозглые падальщики, хищники и их добыча.
Чудовища в подземелье это не просто набор случайных чудовищ, живущих бок о бок. Грибы, насекомые, падальщики и хищники могут сосуществовать в сложной экосистеме, наряду с разумными существами, отбивающими себе жилое пространство сражениями, переговорами или за счёт приказов свыше.
Персонажи могут проникнуть в подземелье, заключить союз с одной из фракций, или стравить фракции между собой, чтобы уменьшить общий уровень угрозы для себя. Например, в подземелье, населённом свежевателями разума и их гоблиноид-ными рабами, искатели приключений могут попробовать побудить гоблинов, хобгоблинов и медвежатников на поднятие восстания.
!!!''Фракции подземелья''
Иногда подземелье находится под контролем одной группы разумных гуманоидов, такой как племя орков, захвативших пещерный комплекс, или толпа троллей, населивших руины на поверхности. В других случаях, особенно в больших подземельях, несколько групп существ делят общее пространство и соперничают за ресурсы.
Например, орки, обитающие в шахтах разрушенной цитадели дварфов, могут постоянно совершать налёты на хобгоблинов, удерживающих верхние этажи этой же цитадели. Свежеватели разума, основавшие колонию на нижних уровнях шахты, могут манипулировать ключевыми хобгоблинами, стараясь тем самым уничтожить орков. И в довершение ко всему, разведчики дроу могут наблюдать за свежевателями разума, намереваясь их убить, а потом поработить всех оставшихся существ.
Подземелье можно представить в виде серии сцен, где искатели приключений вышибают дверь за дверью и убивают всех, кто находится за ними. Однако изменения расклада среди группировок подземелья дают множество вариантов более утончённого воздействия. Обитатели подземелья могут заключать самые невероятные союзы, и искатели приключений могут стать джокером, способным изменить положение дел.
У разумных обитателей подземелья есть свои цели, будь то просто выживание или амбициозное желание захватить весь комплекс как первый шаг в основании своей империи. Такие существа могут первыми обратиться к искателям приключений с предложением союза, чтобы те не уничтожили их логово и помогли бороться с врагами. Создайте подробно прописанного лидера такой группировки, как описано в главе 4, дав ему черты характера, цели и идеалы. Затем с учётом их продумайте его реакцию на приход искателей приключений на его территорию.
!!!''Экология подземелья''
У обитаемого подземелья есть своя экосистема. Живущим там существам нужно есть, пить, дышать и спать, так же как и существам на поверхности. Хищникам нужно искать добычу, а разумные существа ищут логово, в котором была бы лучшая комбинация воздуха, пищи, воды и безопасности. Помните об этих факторах, когда захотите создать реалистичное подземелье. Если в подземелье отсутствует внутренняя логика, искателям приключений будет сложно принять правильные решения.
Например, если персонажи найдут водоём с пресной водой в подземелье, они могут предположить, что существа, обитающие здесь, приходят сюда как на водопой. Искатели приключений могут организовать здесь засаду. Точно так же, запертые двери — или даже просто двери, требующие для открытия наличие руки — ограничивают перемещения некоторых существ. Если все двери в подземелье закрыты, игроки могут удивиться, как же здесь выжили ползающие падальщики или кровопийцы, которых они так часто встречают.
!!!''Сложность сцен''
Вы можете увеличивать сложность по мере прохода искателей приключений вглубь подземелья, чтобы игра продолжала оставаться сложной, несмотря на рост уровней персонажей, или чтобы поддерживать напряжение. Однако этот подход делает подземелье однообразным. Гораздо лучше делать сцены с разной сложностью. Контраст между лёгкими и сложными, а также простыми и комплексными сценами поощряет персонажей применять разную тактику и делает сцены разнообразными.
//Чудесный предмет, очень редкий//
Эти железные подковы изготавливаются комплектом по четыре штуки. Если все четыре прикрепить к копытам лошади или подобного существа, они позволят ему перемещаться как обычно, но паря в 4 дюймах от земли. Этот эффект позволяет существу пересекать нетвёрдые и неустойчивые субстанции, такие как вода и лава, а также стоять на них. Существо не оставляет следы и игнорирует труднопроходимую местность. Кроме того, оно может перемещаться с обычной скоростью до 12 часов в день, не получая истощение за форсированный марш.
//Чудесный предмет, редкий//
Эти железные подковы изготавливаются комплектом по четыре штуки. Если все четыре прикрепить к копытам лошади или подобного существа, они увеличивают скорость ходьбы этого существа на 30 футов.
//2 уровень, Ограждение, Жрец/Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (полоска белой ткани)
:''Длительность:'' 8 часов
Ваше заклинание наделяет союзников стойкостью и решимостью. Выберите до трёх существ в пределах дистанции. На время длительности максимум хитов и текущие хиты всех целей увеличиваются на 5.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, хиты целей увеличиваются ещё на 5 за каждый уровень ячейки выше второго.
//7 уровень, Иллюзия, Волшебник//
;
:''Время накладывания:'' 12 часов
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (снег или лёд в количестве, достаточном для создания точной копии существа; немного волос, обрезков ногтей или других частей тела этого существа, помещаемые в снег или лёд; и толчёный рубин стоимостью 1 500 зм, которым посыпается копия, и который расходуется заклинанием)
:''Длительность:'' Пока не рассеется
"""Вы создаёте иллюзорную копию зверя или гуманоида, который находится в пределах дистанции всё время, пока активируется заклинание. Копия является существом, частично реальным, созданным изо льда или снега, и она может совершать действия и вести себя как настоящее существо. Оно выглядит так же, как оригинал, но у него только половина от максимума хитов, и оно создаётся без снаряжения. Во всём остальном иллюзия использует все параметры копируемого существа.
Копия дружелюбна по отношению к вам и указанным вами существам. Она подчиняется вашим устным командам, перемещается и действует согласно вашей воле, и в сражении действует в ваш ход. Копия не может обучаться и становиться сильнее, так что она никогда не повышает уровень и характеристики, и не может восстанавливать использованные ячейки заклинаний.
Если копия получает урон, вы можете исправлять его в алхимической лаборатории, используя редкие травы и минералы стоимостью 100 за каждый восстанавливаемый хит. Копия существует, пока её хиты не опустятся до 0, после чего она превращается в снег и мгновенно тает.
Если вы используете это заклинание ещё раз, существующие активные копии, созданные вами этим заклинанием, мгновенно уничтожаются."""
//3 уровень, Прорицание, Бард/Волшебник/Жрец/Чародей//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 1 миля
:''Компоненты:'' В, С, М (фокусировка, стоящая как минимум 100 зм, и либо украшенный камнями рог для подслушивания, либо стеклянный глаз для подсматривания)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте невидимый сенсор в пределах дистанции в известном вам месте (месте, которое вы уже видели или посещали) или очевидном месте, незнакомом вам (например, за дверью, за углом, или в роще деревьев). Сенсор остаётся на месте, и его нельзя атаковать или как-то с ним взаимодействовать.
Накладывая заклинание, вы выбираете зрение или слух. Вы можете использовать выбранное чувство через сенсор, как если бы вы находились на его месте. Вы можете действием переключаться между зрением и слухом.
Существо, способное увидеть сенсор (например, находящееся под заклинанием видение невидимого или с истинным зрением) видит светящийся нематериальный шарик размером с ваш кулак."""
//4 уровень, Очарование, Друид/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь взять под контроль зверя, которого видите в пределах дистанции. Зверь должен преуспеть в спасброске Мудрости, иначе он станет очарован вами на время действия заклинания. Если вы или дружественные вам существа сражаются с ним, он совершает спасбросок с преимуществом.
Пока зверь очарован, вы обладаете телепатической связью с ним, пока вы оба находитесь на одном плане существования. При помощи этой связи вы можете отдавать ему команды, пока находитесь в сознании (действие не требуется), и он должен будет их выполнять. Вы можете указать общее действие, такое как «атакуй вон то существо», «беги отсюда» или «принеси вот это». Если существо выполняет приказ и не получает дальнейших указаний от вас, оно в меру своих сил обороняется и защищает себя.
Вы можете действием захватить полный контроль над целью. До конца вашего следующего хода существо совершает только выбранные вами действия, и не делает ничего, что вы ему не позволяете. В это время вы можете заставлять существо совершать реакции, но при этом вы тратите и свою реакцию тоже.
Каждый раз, когда цель получает урон, она совершает новый спасбросок Мудрости от этого заклинания. В случае успеха заклинание оканчивается."""
;На больших уровнях:
:Если вы накладываете это заклинание с уровнем ячейки 5, концентрацию можно поддерживать до 10 минут. Если вы накладываете это заклинание с уровнем ячейки 6, концентрацию можно поддерживать до 1 часа. Если вы накладываете это заклинание с уровнем ячейки 7 или выше, концентрацию можно поддерживать до 8 часов.
//5 уровень, Очарование, Бард/Волшебник/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь взять под контроль гуманоида, которого видите в пределах дистанции. Он должен преуспеть в спасброске Мудрости, иначе станет очарованным вами на время действия заклинания. Если вы или дружественные вам существа сражаются с ним, он совершает спасбросок с преимуществом.
Пока существо очаровано, вы обладаете телепатической связью с ним, пока вы оба находитесь на одном плане существования. При помощи этой связи вы можете отдавать ему команды, пока находитесь в сознании (действие не требуется), и оно должно будет их выполнять. Вы можете указать общее действие, такое как «атакуй вон то существо», «беги отсюда» или «принеси вот это». Если существо выполняет приказ и не получает дальнейших указаний от вас, оно в меру своих сил обороняется и защищает себя.
Вы можете действием захватить полный контроль над целью. До конца вашего следующего хода существо совершает только выбранные вами действия, и не делает ничего, что вы ему не позволяете. В это время вы можете заставлять существо совершать реакции, но при этом вы тратите и свою реакцию тоже.
Каждый раз, когда цель получает урон, она совершает новый спасбросок Мудрости от этого заклинания. В случае успеха заклинание оканчивается."""
;На больших уровнях:
:Если вы накладываете это заклинание с уровнем ячейки 6, концентрацию можно поддерживать до 10 минут. Если вы накладываете это заклинание с уровнем ячейки 7, концентрацию можно поддерживать до 1 часа. Если вы накладываете это заклинание с уровнем ячейки 8 или выше, концентрацию можно поддерживать до 8 часов.
//8 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы пытаетесь взять под контроль существо, которого видите в пределах дистанции. Существо должно преуспеть в спасброске Мудрости, иначе оно станет очарованным вами на время действия заклинания. Если вы или дружественные вам существа сражаются с ним, оно совершает спасбросок с преимуществом.
Пока существо очаровано, вы обладаете телепатической связью с ним, пока вы оба находитесь на одном плане существования. При помощи этой связи вы можете отдавать ему команды, пока находитесь в сознании (действие не требуется), и оно должно будет их выполнять. Вы можете указать общее действие, такое как «атакуй вон то существо», «беги отсюда» или «принеси вот это». Если существо выполняет приказ и не получает дальнейших указаний от вас, оно в меру своих сил обороняется и защищает себя.
Вы можете действием захватить полный контроль над целью. До конца вашего следующего хода существо совершает только выбранные вами действия, и не делает ничего, что вы ему не позволяете. В это время вы можете заставлять существо совершать реакции, но при этом вы тратите и свою реакцию тоже.
Каждый раз, когда цель получает урон, она совершает новый спасбросок Мудрости от этого заклинания. В случае успеха заклинание оканчивается."""
;На больших уровнях:
:Если вы накладываете это заклинание с уровнем ячейки 9, концентрацию можно поддерживать до 8 часов.
//2 уровень, Прорицание, Бард/Друид/Следопыт (ритуал)//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (кусочек меха ищейки)
:''Длительность:'' Мгновенная
Назовите определённый вид зверя или растения. Сконцентрировавшись на голосе природы в окружении, вы узнаёте направление и расстояние до ближайшего существа или растения этого вида в пределах 5 миль, если они вообще есть.
//2 уровень, Прорицание, Друид/Жрец/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы чувствуете присутствие любых ловушек в пределах дистанции, находящихся в пределах линии обзора. Для этого заклинания ловушкой считается всё, что причиняет неожиданный эффект, считающийся для вас вредным или нежелательным, и специально подготовленный таким своим создателем. Таким образом, это заклинание почувствует область, защищённую заклинанием сигнал тревоги, охранные руны, или механической ловушкой, но не распознает ветхий пол, неустойчивый потолок, или промоину в земле.
Это заклинание просто даёт знать, что ловушка присутствует. Вы не узнаёте местоположение всех ловушек, но зато знаете общий характер опасности, исходящей от почувствованной вами ловушки."""
//2 уровень, Прорицание, Бард/Волшебник/Друид/Жрец/Следопыт/Паладин//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (раздвоенная веточка)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Опишите или назовите известный вам предмет. Вы чувствуете направление к этому предмету, пока он находится в пределах 1 000 футов от вас. Если предмет перемещается, вы узнаёте его направление.
Это заклинание может искать конкретный известный вам предмет, если вы хотя бы раз видели его вблизи (в пределах 30 футов). В качестве альтернативы, это заклинание может искать ближайший предмет определённого вида, например, особый предмет одежды, ювелирное украшение, мебель, инструмент или оружие.
Это заклинание не может обнаружить предмет, если прямой путь между вами перерезан свинцом, пусть даже самым тонким листом."""
//6 уровень, Прорицание, Бард/Друид/Жрец//
;
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (набор инструментов для ворожбы — такой как кости, палочки из слоновой кости, карты, зубы или резные руны — стоящий 100 зм, а также предмет из места, которое вы хотите найти)
:''Длительность:'' Концентрация, до 1 дня
"""Это заклинание позволяет найти кратчайший и самый прямой путь к определённому месту, знакомому вам, находящемуся на том же плане существования. Если искомое место находится на другом плане существования, если это место перемещается (например, это передвижная крепость), или это не конкретное место (например, «логово зелёного дракона»), заклинание проваливается.
Пока заклинание активно, и пока вы находитесь на одном плане существования с искомым местом, вы знаете, как далеко, и в каком направлении оно находится. Пока вы направляетесь туда, каждый раз, когда у вас появляются разные варианты направления, вы автоматически определяете, какой путь самый короткий и прямой (но не обязательно самый безопасный) к искомому месту."""
//2 уровень, Вызов, Паладин//
;
:''Время накладывания:'' 10 минут
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Вы вызываете дух, принимающий облик невероятно умного, сильного и верного скакуна, создавая долгосрочную связь с ним. Появляясь в свободном пространстве в пределах дистанции, скакун принимает выбранный вами облик, такой как боевой конь, пони, верблюд, лось или мастифф (Мастер может позволить призывать в качестве скакунов других животных). Скакун приобретает характеристики выбранной формы, хотя на самом деле он является небожителем, феей или исчадием (на ваш выбор). Кроме того, если у вашего скакуна Интеллект 5 или меньше, его Интеллект становится равен 6, и он получает способность понимать один язык на ваш выбор, на котором вы разговариваете.
Ваш скакун служит вам как в бою, так и вне его, и у вас с ним есть инстинктивная связь, позволяющая сражаться как единое целое. Находясь верхом на скакуне, вы можете делать так, что наложенные вами заклинания, нацеливающиеся только на вас, будут нацелены ещё и на скакуна.
Когда хиты скакуна опускаются до 0, он исчезает, не оставляя физического тела. Вы можете также в любое время отпустить скакуна действием, заставляя его исчезнуть. В любом случае, повторное использование этого заклинания призывает этого же скакуна, восстанавливая хиты до максимума.
Пока скакун находится в пределах 1 мили от вас, вы можете общаться с ним телепатически.
У вас не может быть больше одного скакуна, призванного этим заклинанием, одновременно. Вы можете действием навсегда отпустить скакуна, освободив его от уз и заставляя исчезнуть."""
//4 уровень, Прорицание, Бард/Волшебник/Друид/Жрец/Паладин/Следопыт//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (кусочек меха ищейки)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Опишите или назовите известное вам существо. Вы чувствуете направление к этому существу, пока оно находится в пределах 1 000 футов от вас. Если существо перемещается, вы узнаёте, в какую сторону оно направляется.
Это заклинание может искать конкретное известное вам существо, или ближайшее существо конкретного вида (например, человек или единорог), если вы хотя бы раз видели такое существо вблизи (в пределах 30 футов). Если описанное или названное вами существо находится в другом обличье, например, под эффектом заклинания превращение, это заклинание не найдёт это существо.
Это заклинание не может обнаружить существ, если прямой путь между вами перерезан текущей водой шириной как минимум 10 футов."""
//1 уровень, Вызов, Волшебник (ритуал)//
;
:''Время накладывания:'' 1 час
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (стоящие 10 зм уголь, благовония и травы, сжигаемые в огне или латунной жаровне)
:''Длительность:'' Мгновенная
"""Вы получаете в услужение фамильяра — духа, принимающего облик выбранного вами животного: ворона, кошки, краба, крысы, летучей мыши, лягушки (жабы), морского конька, осьминога, паука, рыбы (пиранья), совы, хорька, ядовитой змеи, ястреба или ящерицы. Появившись в свободном пространстве в пределах дистанции, фамильяр приобретает характеристики выбранной формы, хотя он не зверь, а небожитель, фея или исчадие (на ваш выбор).
Ваш фамильяр действует независимо от вас, но всегда повинуется вашим командам. В сражении оно определяет свою инициативу и действует в свой ход. Фамильяр не может атаковать, но может совершать другие действия как обычно.
Когда хиты фамильяра опускаются до 0, он исчезает, не оставляя физического тела. Он возвращается, когда вы используете это заклинание ещё раз.
Пока фамильяр находится в пределах 100 футов, вы можете общаться с ним телепатически. Кроме того, вы можете действием начать смотреть глазами фамильяра и слушать его ушами до начала своего следующего хода, получая преимущество от особых чувств, которыми может обладать фамильяр. В это время для своих собственных чувств вы слепы и глухи.
Вы можете действием временно отпустить своего фамильяра. Тот исчезает в карманном измерении, где будет ждать, пока вы его не призовёте. В качестве альтернативы, вы можете отпустить его насовсем. Пока фамильяр временно отпущен, вы можете действием вернуть его в свободное пространство в пределах 30 футов от себя.
У вас не может быть больше одного фамильяра одновременно. Если вы накладываете это заклинание, уже имея фамильяра, вы заставляете принять его новый облик. Выберите один из описанных выше обликов. Ваш фамильяр становится этим существом.
Если вы накладываете заклинание с дистанцией «касание», его может передать фамильяр, как если бы это он его накладывал. Ваш фамильяр должен при этом находиться в пределах 100 футов от вас, и он использует свою реакцию, когда вы накладываете его. Если заклинание требует броска атаки, вы используете свой модификатор атаки."""
//3 уровень, Преобразование, Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (перо из крыла любой птицы)
:''Длительность:'' Концентрация, вплоть до 10 минут
Вы касаетесь согласного существа. Цель получает на время длительности заклинания скорость полёта 60 футов. Когда заклинание оканчивается, цель падает, если всё ещё находится в полёте и ничем не может остановить падение.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше 3.
//6 уровень, Воплощение, Друид/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Выберите существо, видимое в пределах дистанции. Поток положительной энергии омывает его, восстанавливая 70 хитов. Это заклинание также отменяет слепоту, глухоту и все болезни, действующие на цель. Это заклинание не оказывает эффекта на конструктов и нежить.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, количество восстанавливаемых хитов увеличивается на 10 за каждый уровень ячейки выше шестого.
//9 уровень, Преобразование, Волшебник/Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (нефритовый обруч, стоящий как минимум 1 500 зм, который вы должны надеть на голову перед накладыванием заклинания)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы принимаете на время действия заклинания облик другого существа. Новый облик может принадлежать существу с показателем опасности не больше вашего уровня. Это не может быть конструкт или нежить, и вы должны хотя бы раз видеть такое существо. Вы превращаетесь в среднестатистического представителя таких существ, без уровней классов и умения Использование заклинаний.
Ваши игровые параметры заменяются параметрами выбранного существа, хотя у вас остаётся мировоззрение и значения Интеллекта, Мудрости и Харизмы. Вы также сохраняете все владения навыками и спасбросками, но также получаете те, что есть у нового облика. Если у вас и существа есть совпадающие владения, и указанный для него бонус выше вашего, вы используете бонус существа. Вы не можете использовать легендарные действия и действия в логове нового облика.
Вы принимаете хиты и Кость Хитов нового облика. Когда вы возвращаете свой облик, ваши хиты будут такими же, как до превращения. Если вы возвращаете облик из-за того, что хиты опустились до 0, весь излишний урон переносится на ваш облик. Если излишний урон не опустил ваши хиты до 0, вы не теряете сознание.
Вы сохраняете все преимущества от умений класса, расы и прочих источников, и можете использовать их, при условии, что новый облик физически на это способен. Вы не можете использовать особые чувства (например, тёмное зрение), если их нет и у нового облика. Вы можете говорить только если существо в естественных условиях может говорить.
Когда вы превращаетесь, вы выбираете, свалится ли ваше снаряжение на землю, сольётся с новым обликом или окажется на него надетым. Носимое снаряжение функционирует как обычно. Мастер определяет, сможет ли новый облик использовать тот или иной предмет снаряжения, в зависимости от формы и размера существа. Ваше снаряжение не меняет форму и размер, и снаряжение, которое не может быть надето на новый облик, должно либо свалиться на землю, либо слиться с новым обликом. Слившееся снаряжение не оказывает никакого эффекта.
Пока это заклинание активно, вы можете действием принимать новые облики, подчиняющиеся тем же самым ограничениям, с одним исключением: если у нового облика больше хитов чем у вашего текущего, количество хитов остаётся прежним."""
"""
//Вождь Муррен поднялся с мехов, на которых он лежал со своими женщинами, и натянул короткую кольчугу из тяжёлых стальных колец на свой мощный мускулистый торс. Обычно он вставал раньше своих воинов, так как в нём была сильна примесь человеческих кровей, и он лучше переносил дневной свет. У Кровавых Черепов о воине судили по его силе, бесстрашию и уму. Человеческое происхождение — не недостаток для воина, при условии, что он был таким же сильным, выносливым и кровожадным, как его чистокровные собратья. Полуорки, которые были слабее, чем их собратья, недолго прожили бы среди Кровавых Черепов, как и в любом другом орочьем племени. Но часто оказывалось, что человеческая кровь давала воину правильное сочетание хитрости, амбиций и самодисциплины, чтобы добиться многого, как это сделал Муррен. Он был хозяином племени, которое могло насчитать две тысячи копий, и имело сильнейшего вождя в Таре.//
— Ричард Бейкер, Маг меча
"""
Находясь ли под предводительством могучего колдуна, или стараясь установить мир после многолетнего конфликта, орки и племена людей иногда заключали союзы, объединяя силы в огромные орды, терроризирующие более цивилизованные государства по соседству. Когда такие союзы скреплялись узами брака, появлялись полуорки. Некоторые полуорки возвышались, становясь гордыми вождями племён. Их человечья кровь давала им преимущество над их чистокровными соперниками. Другие отправлялись в мир, чтоб доказать своё превосходство над представителями более цивилизованных народов. Многие из них становились искателями приключений, достигая величия благодаря своим могучим свершениям, и дурной славы, благодаря варварским нравам и дикарской ярости.
!!!''__Крепкие и покрытые шрамами__''
Серый цвет кожи, плоский лоб, выступающая челюсть, торчащие клыки и могучее телосложение не оставляет сомнений в орочьем происхождении для любого, кто смотрит на полуорка. Рост полуорков между 6 и 7 футами (183 и 213 сантиметрами), а вес обычно колеблется между 180 и 250 фунтов (80 и 113 килограммами).
Орки гордятся своими боевыми шрамами, а узоры, составленные из шрамов, украшают их тела. Другие шрамы могут отмечать бывшего раба или изгнанника. Все полуорки, живущие с орками, или поблизости от них, имеют шрамы, следы унижений и поводы для гордости, отмечающие их победы и ранения. Живущие же среди людей полуорки могут как выставлять свои шрамы на обозрение с гордостью, так и со стыдом прятать их.
!!!''__Метка Груумша__''
Одноглазый бог Груумш создал орков, и даже те орки, кто отвернулся от поклонения ему, не могут полностью избежать его влияния. То же самое можно сказать и про полуорков, хотя их человеческая кровь и снижает воздействие орочьего наследия. Некоторые полуорки слышат шёпот Груумша в своих снах, взывающий высвободить ярость, что вскипает в них. Другие чувствуют ликование Груумша когда они вступают в бой и либо ликуют вместе с ним, либо трясутся от страха и ненависти. Полуорки по природе своей не являются злыми, но зло скрывается в них, принимают ли они его или сопротивляются ему.
В ярости Груумша полуорки чувствуют сильное возбуждение. Ярость не только ускоряет их пульс, она заставляет их тела пылать. Колкие оскорбления действуют на них как яд, и печаль истощает их силы. Но когда они смеются, то делают это громко и от души, и простые физические наслаждения — пиры, выпивка, борьба, барабанный бой и дикие пляски — наполняют их сердца радостью. Они, как правило, вспыльчивы, иногда угрюмы, более склонны к действию, чем к созерцанию и к борьбе, чем к спору. Наиболее культурными полуорками являются те, у кого достаточно самоконтроля, чтобы проживать в цивилизованных землях.
!!! ''__Племена и трущобы__''
Полуорки наиболее часто живут среди орков. Среди других рас люди наиболее терпимо принимают полуорков, поэтому полуорки, которые не живут среди орков, чаще всего живут среди людей. Заслуживая ли признание среди жестоких варварских племен, или борясь за выживание в трущобах крупных городов, полуорки достигают всего своей физической мощью, выносливостью и решительностью, унаследованной от человеческих предков.
<<<
"""
''Неприязненное отношение''
Каждый полуорк находит способ, как добиться признания тех, кто ненавидит орков. Некоторые из них скрытны, и стараются не привлекать к себе никакого внимания. Некоторые из них демонстрируют благочестие и добросердечность настолько публично, насколько это возможно (независимо от того, насколько искренни эти демонстрации). А некоторые просто стараются быть настолько жестокими, что остальные просто избегают их.
"""
<<<
!!! ''__Имена полуорков__''
Полуорки обычно имеют имена, соответствующие культуре, в которой они были выращены. Полуорк, который хочет находиться среди людей, может поменять орочье имя на человеческое. Некоторые полуорки с человеческими именами решают принять гортанное орочье имя, потому что считают, что это сделает их более устрашающими.
;Мужские орочьи имена:
:Гел, Денч, Имш, Кет, Краск, Муррен, Ронт, Токк, Фенг, Хенк, Холг, Шамп
;Женские орочьи имена:
:Багги, Вола, Волен, Евельда, Кансиф, Мев, Нига, Овак, Оунка, Сута, Шаута, Эмен, Энгонг
!!! ''__Особенности полуорков__''
"""
Благодаря орочьему происхождению, ваш персонаж-полуорк обладает следующими особенностями.
''Увеличение характеристик.'' Значение вашей Силы увеличивается на 2, а значение Телосложения увеличивается на 1.
''Возраст.'' Полуорки взрослеют немного быстрее людей, достигая зрелости к 14 годам. Стареют они заметно быстрее, и редко живут дольше 75 лет.
''Мировоззрение.''Полуорки унаследовали склонность к хаосу от своих орочьих предков, и не особо склонны к добру. Полуорки, выросшие среди орков и желающие прожить с ними всю жизнь, обычно злы.
''Размер.'' Полуорки несколько выше и массивнее людей. Их рост находится в промежутке от 5 до 6 футов (от 152 до 185 сантиметров). Ваш размер — Средний.
''Скорость.'' Ваша базовая скорость перемещения составляет 30 футов.
''Тёмное зрение.'' Благодаря орочьей крови, вы обладаете превосходным зрением в темноте и при тусклом освещении. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Угрожающий вид.'' Вы владеете навыком Запугивание.
''Непоколебимая стойкость.'' Если ваши хиты опустились до нуля, но вы при этом не убиты, ваши хиты вместо этого опускаются до 1. Вы не можете использовать эту способность снова, пока не завершите длительный отдых.
''Свирепые атаки.'' Если вы совершили критическое попадание рукопашной атакой оружием, вы можете добавить к урону ещё одну кость урона оружия.
''Языки.'' Вы можете говорить, читать и писать на Общем и Орочьем языках. Орочий язык резкий и грубый, полный твёрдых согласных. Он не имеет собственного алфавита и использует дварфский.
"""
"""
//Реджис, единственный полурослик на протяжении сотен миль, в какую сторону ни посмотри, сцепил ладони за головой и откинулся на густо заросший мхом ствол дерева. Реджис был чрезвычайно мал ростом даже по меркам собственного весьма миниатюрного народца. Верхние кончики волос его торчавшей во все стороны буйной гривы едва достигали трёх футов, однако живот Реджиса ясно свидетельствовал о том, что его обладатель любит съесть хороший обед, а то и несколько, смотря по обстоятельствам. Длинная кривая палка, служившая Реджису удилищем, приподнялась, чуть дрогнула, пристроилась поудобнее между мохнатыми пальцами полурослика и повисла над спокойными водами, безупречно отражаясь в зеркальной поверхности озера.//
"""
— Р. А. Сальваторе, Магический кристалл
Целью большинства полуросликов является домашний уют. Место, где можно поселиться в покое и тишине, подальше от мародёрствующих чудовищ и сражающихся армий. Огонь очага, сытная пища, добрая выпивка и добрая беседа. Хотя некоторые полурослики проживают свой век в удалённых сельских общинах, другие сбиваются в постоянно кочующие общины, влекомые открытыми дорогами, широкими горизонтами и возможностью открыть чудеса новых мест и новых людей. Но даже такие кочевники любят покой, вкусную еду, свой очаг и свой дом, даже если это повозка, трясущаяся по пыльной дороге или плот, плывущий по течению реки.
!!!__''Маленькие и практичные''__
Крошечные полурослики выживают в мире, полном более крупных существ, стараясь избегать внимания, а если это оказывается невозможным, то избегая враждебности. Имея рост около 3 футов (90 сантиметров), они кажутся относительно безвредными, и благодаря этому успешно существуют столетиями, оставаясь в тени империй, войн и политической борьбы. Они склонны к полноте, и весят от 40 до 45 фунтов (от 18 до 20 килограмм).
Кожа у полуросликов встречается от смуглой до бледной, с румянцем. Волосы обычно коричневые или рыже-коричневые, вьющиеся. Глаза полуросликов карие или ореховые. Мужчины часто отпускают длинные бакенбарды, но бороды носят редко, а усы тем более. Они любят носить простую, удобную одежду, предпочитая яркие цвета.
Практичность полуросликов распространяется не только на их одежду. Они довольствуются удовлетворением основных потребностей и простых радостей, уделяя совсем мало внимания роскоши. Даже богатейшие из них предпочитают хранить своё добро в закрытых сундуках и подвалах, а не выставлять его на всеобщее обозрение. Полурослики умеют находить простые решения своих проблем, и являются весьма решительными.
!!! ''__Добрые и любопытные__''
Полурослики — приветливый и дружелюбный народ. Они ценят дружбу и родственные связи так же как собственный дом и очаг, лишь в тайне мечтая о золоте и славе. И даже те из них, кто стали искателями приключений, обычно отправляются в путь, преследуя цели дружбы или общества, тяги к переменам или любопытства. Они любят открывать для себя что-то новое, даже если это совсем простые вещи, вроде экзотической еды или незнакомого стиля одежды.
Полурослики легко поддаются жалости, и не выносят вида чужих страданий. Они щедры, и с радостью делятся тем, что имеют, даже в трудные времена.
!!! ''__Единые с толпой__''
Полурослики легко вливаются в сообщества людей, дварфов или эльфов, где их ценят и всегда им рады. Сочетание их врождённых скрытности и скромности позволяют им легко избегать ненужного внимания.
Полурослики охотно работают с другими, и они верны своим друзьям, вне зависимости от их вида. Однако, если кто-то из их друзей, семьи или общины оказывается под угрозой, они способны проявить удивительную свирепость.
!!! ''__Пасторальные удовольствия__''
Большинство полуросликов живёт в маленьких, мирных общинах с большими фермами, среди ухоженных рощ. Они редко создают собственные королевства, и не держат земель за пределами своих тихих владений. Они обычно не признают среди себя какого-либо рода знати или королевской власти, вместо этого прислушиваясь к семейным старейшинам, руководствуясь их мнением. Семьи сохраняют свой традиционный уклад, несмотря на подъёмы и падения империй.
Множество полуросликов живёт среди других рас, где усердная работа и надёжные перспективы принесут им обильное вознаграждение и земные блага. Некоторые общины полуросликов ведут кочевой образ жизни, путешествуя на повозках или плавая на суднах от одного места к другому, не оседая на одном месте постоянно.
<<<
"""
''Приветливые и положительные''
Полурослики стараются поладить с кем угодно, и не склонны выносить поспешные суждения — особенно отрицательные.
''О дварфах:'' «Дварфы — верные друзья, и вы можете рассчитывать на то, что они всегда держат своё слово. Но им бы не помешало хотя бы иногда улыбаться».
''Об эльфах:'' «Они так прекрасны! Их лица, их музыка, их грация, всё в них. Они как будто явились из чудесного сна. Но никто не сможет сказать, что происходит за их улыбающимися лицами — наверняка больше, чем они нам показывают».
''О людях:'' «Люди, на самом деле, во многом похожи на нас. По крайней мере, некоторые из них. Отойдите от замков и цитаделей, поговорите с фермерами и скотоводами, и вы обнаружите хороший, надёжный народ. Нет ничего плохого в баронах и солдатах — вы должны восхищаться их убеждённостью. И, защищая свои земли, они также защищают нас».
"""
<<<
!!! ''__Поиск возможностей__''
Полурослики обычно становятся на путь искателя приключений, чтобы защитить свои общины или поддержать своих друзей или исследовать огромный наполненный чудесами мир. Для них авантюризм в меньшей степени карьера, скорее это возможность, а иногда и необходимость.
!!! ''__Имена полуросликов__''
Полурослику даётся имя, фамилия, и, возможно, прозвище. Фамилии часто являются прозвищами, которые прилипли так сильно, что стали передаваться через поколения.
;''Мужские имена:''
:Альтон, Андер, Гаррет, Кейд, Коррин, Лайл, Линдал, Майло, Меррик, Осборн, Перрин, Рид, Роско, Уэллби, Финнан, Элдон, Эррих
;''Женские имена:''
:Бри, Вани, Верна, Джиллиан, Китри, Кора, Кэлли, Лавиния, Лидда, Мерла, Недда, Паэла, Портия, Серафина, Трим, Шаэна, Эндри, Юфемия
;''Фамилии:''
:Вверхтормашкин, Высокохолм, Галькоброс, Добробочка, Зеленофляг, Кустосбор, Лугодуг, Подветкин, Репейник, Чайнолист
!!! ''__Особенности полуросликов__''
"""
Как и другие полурослики, ваш персонаж обладает определёнными качествами.
''Увеличение характеристик.'' Значение вашей Ловкости повышается на 2.
''Возраст.'' Полурослики достигают зрелости к 20 годам, и обычно живут до середины своего второго столетия.
''Мировоззрение.'' Большинство полуросликов законно-добрые. Как правило, они добросердечны и любезны, не выносят чужой боли и не терпят притеснения. Также они являются поборниками порядка и традиций, сильно полагаясь на общество и предпочитая проверенные пути.
''Размер.'' Полурослики в среднем примерно 3 фута (90 сантиметров) ростом и весят около 40 фунтов (18 килограмм). Ваш размер — Маленький.
''Скорость.'' Ваша базовая скорость передвижения составляет 25 футов.
''Везучий.'' Если при броске атаки, проверке характеристики или спасброске у вас выпало «1», вы можете перебросить кость, и должны использовать новый результат.
''Храбрый. ''Вы совершаете с преимуществом спасброски от испуга.
''Проворство полуросликов.'' Вы можете проходить сквозь пространство, занятое существами, чей размер больше вашего.
''Языки.'' Вы можете говорить, читать и писать на Общем и языке Полуросликов. Их язык не является секретным, но они не торопятся делиться им с остальными. Пишут они мало, и почти не создали собственной литературы, но устные предания у них очень распространены. Почти все полурослики знают Общий, чтобы общаться с людьми в землях, куда они направляются, или по которым странствуют.
''Разновидности.'' Существует два основных вида полуросликов. Они скорее являются двумя крупными родами, нежели разными видами. Выберите один из них.
"""
!!! ''Коренастый''
"""
Коренастые полурослики выносливее других и обладают некоторой устойчивостью к ядам. Поговаривают, что в их жилах течёт толика дварфской крови. В мире Забытых Королевств таких полуросликов зовут сильными сердцем, и чаще всего они встречаются на юге.
''Увеличение характеристик.'' Значение вашего Телосложения увеличивается на 1.
''Устойчивость коренастых.'' Вы совершаете с преимуществом спасброски от яда, и вы получаете сопротивление к урону ядом.
"""
!!! ''Легконогий''
"""
Легконогие полурослики умеют отлично скрываться, в том числе используя других существ как укрытие. Они приветливы и хорошо ладят с другими. В мире Забытых Королевств легконогие являются самой распространённой ветвью полуросликов.
Легконогие более других склонны к перемене мест, и часто селятся по соседству с другими народами, или ведут кочевую жизнь. В мире Серого Ястреба таких полуросликов называют мохноногими или великанчиками.
''Увеличение характеристик.'' Значение вашей Харизмы увеличивается на 1.
''Естественная скрытность.'' Вы можете предпринять попытку скрыться даже если заслонены только существом, превосходящими вас в размере как минимум на одну категорию.
"""
//"""Флинт щурился, вглядываясь против света. Он увидел человека, шедшего к нему по склону. Поднявшись, Флинт отступил в тень высокой сосны, чтобы свет не так бил в глаза. Походка человека была упругой и лёгкой — на эльфийский лад, подумалось Флинту, — но тело выглядело мускулистым и крепким, — черта не вполне эльфийская. Зелёный капюшон мешал разглядеть лицо. Флинт видел только загорелые щёки и рыжевато-русую бороду, какие у эльфов не растут никогда. При бедре у человека висел меч, а на плече — длинный лук. На нём была одежда из мягкой кожи с тиснёным узором. Узор был эльфийским. Но борода? Погодите-ка...
— Танис? — окликнул Флинт неуверенно.
— А кто же ещё! — Бородатая физиономия расплылась в широченной улыбке. Танис сгрёб гнома в охапку, оторвав его от земли. Флинт ответил объятием на объятие, но тут же вспомнил о своём достоинстве и высвободился из рук полуэльфа."""//"""
—Маргарет Уэйс и Трейси Хикмэн,Драконы осенних сумерек
"""
Бродящие по двум мирам, но в действительности, не принадлежащие ни одному из них. Полуэльфы сочетают в себе, как некоторые говорят, лучшие качества обеих рас: человеческие любознательность, изобретательность и амбиции, приправленные изысканными чувствами, любовью к природе и ощущением прекрасного, свойственными эльфам. Некоторые полуэльфы живут среди людей, отгороженные эмоциональными и физическими различиями, наблюдая за старением друзей и возлюбленных, лишь слегка тронутые временем. Другие живут с эльфами в неподвластных времени эльфийских королевствах. Они стремительно растут, и достигают зрелости, пока их сверстники ещё остаются детьми. Многие полуэльфы не способны ужиться ни в одном обществе, и выбирают жизнь одиноких странников или объединяются с другими изгнанниками и неудачниками, чтобы отправиться к приключениям.
!!!''__Меж двух миров__''
Для людей полуэльфы выглядят эльфами, а для эльфов они люди. Их рост примерно посередине между людьми и эльфами, и составляет от 5 до 6 футов (от 155 до 183 сантиметров). Полуэльфы не такие стройные, как эльфы, но и не такие широкоплечие как люди. Их вес колеблется между 100 и 180 фунтами (45 и 80 килограммами), и мужчины лишь немного превосходят женщин в росте и весе. У мужчин полуэльфов на лицах растут волосы, и некоторые отращивают бороды, чтобы скрыть своё эльфийское происхождение. Цвет волос и кожи у них примерно посередине между их людскими и эльфийскими родителями, и таким образом разнообразие даже выше, чем у исходных рас. Цвет глаз они обычно наследуют у эльфийских родителей.
!!!''__Дипломаты или странники__''
Полуэльфы не имеют собственных государств, но их радушно принимают в людских городах, и чуть менее радушно в эльфийских лесах. В крупных городах, в регионах, где люди и эльфы живут рядом, численность полуэльфов иногда возрастает настолько, что они организовывают свои собственные маленькие коммуны. Они рады обществу других полуэльфов, единственных существ, которые по-настоящему понимают, каково это, жить меж двух миров.
Впрочем, в большей части мира полуэльфы настолько редки, что могут годами не встречаться друг с другом. Некоторые полуэльфы предпочитают вообще избегать компании, и живут на природе как охотники, лесники или искатели приключений, посещая цивилизованные места лишь изредка. Как и эльфы, благодаря своему долголетию они движимы тягой к перемене мест и нигде не остаются подолгу. Другие же наоборот, бросаются в гущу социальной жизни, используя свою харизму и социальные навыки на поприще дипломата или мошенника.
!!!''__Имена полуэльфов__''
Полуэльфы используют и человеческие и эльфийские имена. Как бы подчёркивая, что они в действительности не принадлежат ни одному из этих обществ, полуэльфы, выросшие среди людей, получают эльфийские имена, а те, кто вырос среди эльфов, наоборот — берут человеческие.
<<<
"""
''Превосходные послы''
Многие полуэльфы учатся ещё в раннем возрасте преодолевать враждебность и находить со всеми общий язык. Как раса они обладают эльфийской грацией без эльфийской отчуждённости, и человеческой энергичностью без человеческой грубости. Из них часто выходят превосходные послы и посредники (за исключением переговоров между людьми и эльфами, так как каждая сторона подозревает полуэльфа в приверженности другой).
"""
<<<
!!!''__Особенности полуэльфов__''
"""
Ваш персонаж-полуэльф обладает некоторыми качествами, обычными для эльфов, и некоторыми, присущими только полуэльфам.
''Увеличение характеристик.'' Значение вашей Харизмы увеличивается на 2, а значения двух других характеристик на ваш выбор увеличиваются на 1.
''Возраст. ''Полуэльфы взрослеют с той же скоростью, что и люди, и достигают зрелости к 20 годам. Они живут гораздо дольше людей, часто пересекая рубеж в 180 лет.
''Мировоззрение.'' Полуэльфы унаследовали склонность к хаосу от своих эльфийских предков. Они одинаково ценят и личную свободу и творческое самовыражение, не проявляя ни тяги к лидерству, ни желания следовать за лидером. Их раздражают правила и чужие требования, и иногда они оказываются ненадёжными и непредсказуемыми.
''Размер.'' Полуэльфы почти такого же размера, как и люди. Их рост колеблется от 5 до 6 футов (от 155 до 183 сантиметров). Ваш размер — Средний.
''Скорость.'' Базовая скорость вашего перемещения равна 30 футам.
''Тёмное зрение.'' Благодаря вашей эльфийской крови, вы обладаете превосходным зрением в темноте и при тусклом освещении. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Фейское происхождение.'' Вы совершаете с преимуществом спасброски от очарования, и вас невозможно магически усыпить.
''Универсальность навыков.'' Вы получаете владение двумя навыками на ваш выбор.
''Языки.'' Вы можете говорить, читать и писать на Общем, Эльфийском, и ещё одном языке на ваш выбор.
"""
//Чудесный предмет, необычный//
Это деревянное помело весит 3 фунта и действует как обычная метла, пока вы не сядете на неё верхом и не произнесёте командное слово. После этого она начинает парить и может подняться в воздух. У неё скорость полёта 50 футов. Она может поднимать до 400 фунтов, но при весе 200 фунтов её скорость уже уменьшается до 30 футов. Помело перестаёт парить, когда вы приземляетесь.
Вы можете отправить помело в другое место, находящееся в пределах 1 мили, если произнесёте командное слово и назовёте место, знакомое вам. Помело вернётся к вам, когда вы произнесёте второе командное слово, при условии, что помело всё ещё находится в пределах 1 мили.
//1 уровень, Прорицание, Волшебник/Колдун/Чародей (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (щепотка сажи и соли)
:''Длительность:'' 1 час
"""Пока заклинание активно, вы понимаете буквальный смысл всех услышанных речей на любых языках. Вы также понимаете письмена на любых языках, но вы должны касаться поверхности, на которой записаны слова. Требуется примерно 1 минута для чтения одной страницы текста.
Это заклинание не расшифровывает тайные послания в текстах и символы, такие как магические знаки, не являющиеся частью текста."""
//6 уровень, Некромантия, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы насылаете смертельную болезнь на существо, которое видите в пределах дистанции. Цель должна совершить спасбросок Телосложения. В случае провала она получает урон некротической энергией 14к6, или половину этого урона в случае успеха. Этот урон не может опустить хиты цели ниже 1. Если цель проваливает спасбросок, максимум её хитов уменьшается на 1 час на количество, равное полученному урону некротической энергией. Все эффекты, лечащие болезнь, позволяют досрочно вернуть максимум хитов.
//Чудесный предмет, необычный//
Найденный в маленьком мешочке, этот порошок выглядит как очень мелкий песок, но его количества будет достаточно для разового применения. Если вы действием развеете порошок в воздухе вокруг себя, то вы и все существа, и предметы в пределах 10 футов от вас становитесь невидимыми на 2к4 минуты. Эта продолжительность одинакова для всех существ и предметов. Как только магический эффект начинает действовать, порошок исчезает. Если существо, находящееся под действием порошка, совершает атаку или накладывает заклинание, невидимость для него заканчивается.
//Чудесный предмет, необычный//
Этот небольшой мешочек содержит 1к6 + 4 щепоток порошка. Вы можете действием распылить щепотку этого порошка над водой. Порошок превращает куб воды с длиной ребра 15 футов в крошечную гранулу, которая плавает на поверхности воды, где был просыпан порошок, или лежит рядом с ней. Вес гранулы незначителен.
Впоследствии кто угодно может действием разбить гранулу об твёрдую поверхность, в результате чего она разрушается и высвобождает воду, заключённую в ней, после чего действие магии заканчивается.
Элементали, состоящие преимущественно из воды, и не защищённые от попадания этого порошка, должны совершить спасбросок Телосложения со Сл 13, получая урон некротической энергией 10к6 при провале или половину этого урона при успехе.
//Чудесный предмет, необычный//
Этот порошок, хранящийся в маленьком контейнере, напоминает очень мелкий песок. Он похож на порошок исчезновения, и даже заклинание опознание показывает, что он им является. Его количества достаточно для одного применения.
Если вы действием бросаете горсть этого порошка в воздух, вы и все дышащие существа в пределах 30 футов от вас должны преуспеть в спасброске Телосложения со Сл 15, иначе они не смогут дышать и начнут безудержно чихать. Существо, попавшее под действие этого порошка, становится недееспособным и начинает задыхаться. Пока существо находится в сознании, оно может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе. Заклинание малое восстановление тоже оканчивает этот эффект на существе.
//1 уровень, Очарование, Бард/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (капля крови)
:''Длительность:'' Концентрация, вплоть до 1 минуты
До трёх существ в пределах дистанции, которых вы видите, должны совершить спасброски Харизмы. Пока заклинание активно, каждый раз, когда цель, провалившая этот спасбросок, совершает бросок атаки или спасбросок, она должна бросать к4 и вычитать выпавший результат из броска атаки или спасброска.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше первого.
//2 уровень, Воплощение, Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (60-футовая линия)
:''Компоненты:'' В, С, М (семя гороха)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Порыв сильного ветра длиной 60 футов и шириной 10 футов исходит от вас в выбранном направлении, пока заклинание активно. Все существа, начинающие ход в этой линии, должны преуспеть в спасброске Силы, иначе их оттолкнёт на 15 футов от вас в направлении движения ветра.
Все существа в линии должны тратить 2 фута перемещения за каждый 1 фут, на который они перемещаются в вашу сторону.
Ветер рассеивает газы и испарения, а также тушит свечи, факелы и другие незащищённые источники огня. Защищённый огонь, например, в фонарях, он заставляет трепетать, и существует 50% шанс, что потухнут и они.
Пока заклинание активно, вы можете в каждом своём ходу бонусным действием менять направление, в котором дует ветер."""
Обычно боевая сцена это схватка двух сторон, яростные выпады оружия, финты, парирование, маневрирование и накладывание заклинаний. Игра организовывает этот хаос в циклы раундов и ходов. Раунд представляет примерно 6 секунд, прошедших в игровом мире. Во время раунда все участники сражения совершают ходы. Порядок ходов определяется в начале боевой сцены, когда все совершают проверку инициативы. Когда все совершат свои ходы, начинается новый раунд, если одна сторона пока не победила другую.
<<<
!!!''Сражение по шагам''
# ''Определение неожиданности.'' Мастер определяет, захвачен ли врасплох кто-то из участвующих в сражении.
# ''Определение позиций.'' Мастер определяет, где стоят все персонажи и чудовища. В зависимости от походного строя и заявленных позиций Мастер расставляет противников — как далеко и где именно они находятся.
# ''Определение инициативы.'' Все участники сцены совершают проверки инициативы, определяя порядок своих ходов.
# ''Совершение ходов.'' Все участники сражения совершают ходы в порядке инициативы.
# ''Начало следующего раунда.'' Когда все совершили свои ходы, раунд оканчивается. Возвращайтесь к шагу 4, пока сражение не окончится.
<<<
!!!__''Неожиданность''__
"""Отряд искателей приключений прокрадывается в лагерь разбойников и выскакивает из-за деревьев. Студенистый куб скользит по коридору и поглощает одного из персонажей. В этих ситуациях одна из сторон сражения застаёт другую врасплох.
То, кто захвачен врасплох, определяет Мастер. Если ни одна из сторон не старалась вести себя тихо, группы автоматически замечают друг друга. В противном случае Мастер сравнивает проверки Ловкости (Скрытность) тех, кто прячется, с пассивным значением Мудрости (Внимательность) противоположной стороны. Все персонажи и чудовища, не заметившие угрозы, в начале сцены захвачены врасплох.
Если вы захвачены врасплох, вы не можете перемещаться и совершать действия в первом ходу сражения, и пока этот ход не окончится, вы не можете совершать реакции. Член отряда может быть захваченным врасплох, даже если остальные члены отряда не захвачены."""
!!!__''Инициатива''__
"""Инициатива определяет порядок совершения ходов во время сражения. Когда сражение начинается, все участники совершают проверки Ловкости, чтобы определить свою позицию в порядке инициативы. Мастер совершает один бросок для целой группы одинаковых существ, чтобы все они действовали одновременно.
Мастер располагает участников сражения в порядке от обладателя наивысшего результата до обладателя наименьшего результата. Это порядок (называемый порядком инициативы), в котором они действуют в раунде. Порядок инициативы остаётся одним и тем же каждый раунд.
В случае ничьей Мастер определяет порядок среди соперничающих существ, управляемых им, а игроки определяют порядок среди своих персонажей. Если ничья возникает между чудовищем и персонажем игрока, порядок определяет Мастер. В качестве альтернативы, Мастер может бросить за всех соперничающих к20, чтобы определить порядок среди тех, у кого выпала ничья."""
!!!__''Ваш ход''__
"""В свой ход вы можете ''переместиться'' на расстояние, не превышающее вашу скорость, и ''совершить одно действие''. Вы сами решаете, до или после действия вы будете перемещаться. Ваша скорость, называемая также скоростью ходьбы, указана на листе персонажа.
Самые распространённые действия описаны ниже, в разделе [[«Действия в бою»|03. Действия в бою]]. Многие классовые умения предоставляют дополнительные варианты действий.
В разделе [[«Перемещения и позиция»|02. Перемещения и позиция]] приводятся правила по перемещению.
Вы можете в свой ход отказаться от перемещения и совершения действий. Если не можете решить, что делать, попробуйте совершить Уклонение или Подготовку, описанные в разделе «Действия в бою»."""
!!!''Бонусные действия''
"""Разнообразные классовые умения, заклинания и прочие эффекты позволяют вам совершать в ход дополнительное действие, называемое бонусным действием. «Хитрое действие», например, позволяет плуту совершать бонусные действия. Бонусное действие можно совершать только если особое умение или заклинание напрямую разрешает делать что-то бонусным действием. В противном случае бонусное действие совершать нельзя.
В свой ход вы можете совершить только одно бонусное действие, так что если у вас есть несколько вариантов, вы должны выбрать, какое бонусное действие совершить.
Вы сами выбираете, в какой момент хода совершить бонусное действие, если только его описание не указывает чёткие условия его применения, и все эффекты, запрещающие вам совершать действия, запрещают также совершать бонусные действия."""
!!!''Прочие действия в свой ход''
"""Ваш ход может содержать множество других мелких действий, не являющихся при том перемещением.
Вы можете общаться любыми доступными вам средствами, короткими фразами и жестами.
Вы можете также свободно взаимодействовать с одним предметом или особенностью местности во время другого действия. Например, вы можете открыть дверь во время перемещения, или вынуть оружие из ножен частью того же действия, которым совершаете атаку.
Если вы хотите взаимодействовать со вторым предметом, вам нужно потратить на это действие. Некоторые магические и другие особые предметы всегда используются действием, что указывается в их описании.
Мастер может потребовать, чтобы вы потратили действие на такую деятельность, если предмет требует особого обращения или вам мешают необычные обстоятельства. Например, Мастер может резонно решить, что нужно потратить действие, чтобы открыть заклинившую дверь или повернуть ворот для опускания моста."""
<<<
!!!''Взаимодействие с предметами вокруг вас''
Вот несколько примеров того, что вы можете совершать параллельно с перемещением и совершением действий:
* вынимание или убирание в ножны меча
* открывание или закрывание двери
* доставание зелья из рюкзака
* поднимание упавшего топора
* взятие безделушки со стола
* снятие кольца с пальца
* помещение еды в рот
* втыкание знамени в землю
* вынимание нескольких монет из кошеля
* выпивание пива из кувшина
* нажатие на рычаг
* вынимание факела из крепления на стене
* доставание книги с полки, до которой вы дотягиваетесь
* тушение небольшого пламени
* надевание маски
* накидывание капюшона на голову
* прикладывание уха к двери
* пинание небольшого камня
* поворачивание ключа в замке
* прощупывание пола 10-футовым шестом
* передача предмета другому персонажу
<<<
!!!''Реакции''
"""Некоторые особые умения, заклинания и ситуации позволяют совершать особые действия, называемые реакциями. Реакция это мгновенный ответ на срабатывание некоего условия, который может происходить как в ваш, так и в чужой ход. Провоцированная атака, которая будет описана ниже, — самый распространённый пример реакции.
Если вы совершили реакцию, вы не сможете совершить вторую реакцию до начала своего следующего хода. Если реакция прерывала ход другого существа, это существо может продолжить свой ход после реакции."""
Деревня, посёлок или город — прекрасный фон для приключения. Искателей приключений могут попросить найти скрывающегося преступника, раскрыть убийство, уничтожить банду веркрыс или доппельгангеров, или спасти поселение, находящееся под осадой.
При создании поселения для своей кампании сосредоточьтесь на местах, наиболее важных для приключения. Вам не нужны названия для всех улиц и описание всех обитателей всех зданий; это было бы безумием.
!!__''Случайные поселения''__
Приведённые таблицы помогут вам быстро создать поселение. Они подразумевают, что вы уже определились с его размером и формой правления.
<<Button "$:/Отношения между расами""Отношения между расами">>
<<Button "$:/Статус правителя""Статус правителя">>
<<Button "$:/Достопримечательности""Достопримечательности">>
<<Button "$:/Славится...""Славится...">>
<<Button "$:/Текущее несчастье""Текущее несчастье">>
!!__''Случайные здания''__
Стремительные погони в черте города могут заставлять персонажей иногда вбегать в здания. Если вам срочно нужно описать случайное здание, воспользуйтесь приведённой ниже таблицей. Затем добавьте детали, воспользовавшись таблицей для соответствующего здания.
Если результат броска не имеет смысла в текущих обстоятельствах («роскошный особняк» в трущобах), можете совершить ещё один бросок или самостоятельно выбрать новый результат. Однако такие неожиданные результаты стимулируют воображение и создают запоминающиеся места в городских сценах.
<<Button "$:/Тип здания""Тип здания">>
<<Button "$:/Жилище""Жилище">>
<<Button "$:/Религиозное здание""Религиозное здание">>
<<Button "$:/Таверна""Таверна">>
<<Button "$:/Название таверны""Название таверны">>
<<Button "$:/Склад""Склад">>
<<Button "$:/Магазин""Магазин">>
//3 уровень, Воплощение, Бард/Волшебник/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Неограниченная
:''Компоненты:'' В, С, М (кусок тонкой медной проволоки)
:''Длительность:'' 1 раунд
"""Вы посылаете короткое сообщение длиной не больше 25 слов существу, известному вам. Это существо слышит послание в сознании, распознаёт вас в качестве отправителя, если оно вас знает, и может тут же ответить. Это заклинание позволяет существам с Интеллектом как минимум 1 понимать смысл вашего послания.
Вы можете передать послание на любое расстояние, и даже на другие планы существования, но если цель находится на ином плане, существует 5-процентный шанс, что послание не будет доставлено."""
"""
Когда ваш персонаж отправляется в приключение и преодолевает испытания, он получает опыт, выраженный в виде очков опыта. Персонаж, который получает определённое количество очков опыта, улучшает свои способности. Это улучшение называется достижением ''уровня''.
Когда ваш персонаж достигает определённого уровня, его класс часто предоставляет дополнительные умения, которые указаны в описании класса. Некоторые из этих умений позволяют увеличить значения характеристик: либо увеличив два значения на 1, либо увеличив одно значение на 2. Максимальное значение характеристики — 20, сделать значение больше этого показателя нельзя. Кроме того, на определённых уровнях у каждого персонажа увеличивается бонус мастерства.
Каждый раз, когда вы получаете уровень, вы получаете 1 дополнительную Кость Хитов. Совершите бросок этой кости, добавьте ваш бонус Телосложения к результату и прибавьте полученное число к максимальному числу хитов. Вместо этого вы можете прибавлять фиксированное значение, указанное в начале описания вашего класса, которое является усреднённым результатом броска кости (округлённым в большую сторону).
Когда ваш модификатор Телосложения увеличивается на 1, максимум ваших хитов увеличивается на 1 за каждый достигнутый вами уровень. Например, когда Бруенор достигает 8 уровня, он повышает значение своего Телосложения с 17 до 18, тем самым повышая модификатор Телосложения с +3 до +4. Максимальное число его хитов повышается на 8.
Таблица «Развитие персонажа» содержит информацию о количестве опыта, нужного для повышения уровня с 1 по 20, и бонус мастерства для персонажа соответствующего уровня. Обратитесь к информации, включённой в описание вашего класса, чтобы увидеть, какие ещё улучшения вы получаете на каждом уровне.
"""
!!!'' __Этапы игры__''
"""
Заливкой в таблице «Развитие персонажа» выделены четыре этапа игры. Этапы никак не связаны с правилами игры; они дают общее представление о том, как меняется игровой опыт по мере получения персонажами уровней.
Персонажи первого этапа (уровни 1–4) — начинающие искатели приключений. Они обучаются умениям, которые характеризуют их как представителей определённого класса, включая важный выбор разновидности развития классовых умений (например, Магические традиции волшебника или Воинский архетип воина). Опасности, с которыми они сталкиваются, относительно несерьёзны и обычно связаны с угрозами для местных ферм или деревень.
Персонажи второго этапа (уровни 5–10) уже реализовали себя. Многие заклинатели в начале этого этапа получают доступ к заклинаниям 3 уровня, достигая нового уровня магического могущества с такими заклинаниями как //огненный шар// и //молния//. Персонажи этого этапа с классами, специализирующимися на применении оружия, получают возможность совершать несколько атак в раунд. Эти герои становятся важными при столкновении с опасностями, которые угрожают городам и королевствам.
Персонажи третьего этапа (уровни 11–16) достигают уровня могущества, который ставит их высоко над обычными людьми и делает их особенными даже среди искателей приключений. На 11 уровне многие заклинатели получают доступ к 6 уровню заклинаний, которые создают эффекты, недостижимые для игроков ранее. Другие персонажи получают умения, которые позволяют им совершать больше атак или делать их более впечатляющими. Эти могущественные искатели приключений часто противостоят угрозам, нависшим над целыми регионами и континентами.
Персонажи четвёртого этапа (уровни 17–20) достигают вершин умений своих классов, становясь архетипами героев (или злодеев). Судьба мира или даже фундаментальные законы мультивселенной могут зависеть от результата их приключений.
"""
!!! ''Развитие персонажа''
|!Опыт|!Уровень|!Бонус мастерства|
| 0 | 1 | +2 |
| 300 | 2 | +2 |
| 900 | 3 | +2 |
| 2 700 | 4 | +2 |
| !6 500 | !5 | !+3 |
| !14 000 | !6 | !+3 |
| !23 000 | !7 | !+3 |
| !34 000 | !8 | !+3 |
| !48 000 | !9 | !+4 |
| !64 000 | !10 | !+4 |
| 85 000 | 11 | +4 |
| 100 000 | 12 | +4 |
| 120 000 | 13 | +5 |
| 140 000 | 14 | +5 |
| 165 000 | 15 | +5 |
| 195 000 | 16 | +5 |
| !225 000 | !17 | !+6 |
| !265 000 | !18 | !+6 |
| !305 000 | !19 | !+6 |
| !355 000 | !20 | !+6 |
//Посох, редкий (требуется настройка бардом, волшебником, друидом, жрецом, колдуном или чародеем)//
Держа этот посох, вы можете действием потратить 1 из его 10 зарядов на то, чтобы наложить им очарование личности, понимание языков или приказ, используя свою Сл спасброска от заклинания. Этот посох также может использоваться как магический боевой посох.
Если вы держите этот посох и проваливаете спасбросок от заклинания школы Очарования, нацеленного только на вас, вы можете превратить проваленный спасбросок в успешный. Вы не можете использовать это свойство повторно до следующего рассвета. Если вы преуспели в спасброске от заклинания, нацеленного только на вас, вне зависимости от того, пришлось ли для этого прибегнуть к помощи посоха, вы можете реакцией потратить 1 заряд из посоха и отразить заклинание в того, кто его наложил, как если бы вы сами наложили это заклинание.
Посох ежедневно восстанавливает 1к8 + 2 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох становится немагическим боевым посохом.
//Посох, необычный (требуется настройка друидом, жрецом или колдуном)//
Вы можете бонусным действием произнести командное слово посоха, чтобы сделать на 1 минуту его навершие головой ядовитой змеи. Произнеся бонусным действием командное слово ещё раз, вы делаете посох обычным.
Вы можете совершить рукопашную атаку головой змеи, у которой досягаемость 5 футов. К броску атаки применяется ваш бонус мастерства. При попадании цель получает колющий урон 1к6 и должна преуспеть в спасброске Телосложения со Сл 15, иначе получит урон ядом 3к6.
Голову змеи можно атаковать, пока она жива. У неё Класс Доспеха 15 и 20 хитов. Если хиты головы уменьшатся до 0, посох уничтожается. Если посох пока не уничтожен, и вы делаете его неоживлённым, он восстанавливает все свои хиты.
//Посох, очень редкий (требуется настройка)//
Этот посох можно использовать как магический боевой посох, предоставляющий бонус +2 к броскам атаки и урона им. Он также обладает описанными ниже дополнительными свойствами. Каждое из свойств не может быть повторно использовано до следующего рассвета.
;
://''Молния.''// Если вы попали рукопашной атакой, используя этот посох, вы можете причинить цели дополнительный урон электричеством 2к6.
://''Гром.''// Если вы попали рукопашной атакой, используя этот посох, вы можете заставить посох издать громовой рокот, слышный в пределах 300 футов. Цель, по которой вы попали, должна преуспеть в спасброске Телосложения со Сл 17, иначе она станет ошеломлённой до конца вашего следующего хода.
://''Удар молнии.''// Вы можете действием выпустить из кончика посоха молнию линией шириной 5 футов и 120 футов длиной. Все существа в этой линии должны совершить спасбросок Ловкости со Сл 17, получая урон электричеством 9к6 при провале или половину этого урона при успехе.
://''Удар грома.''// Вы можете действием заставить посох издать громовой гул, слышный в пределах 600 футов. Все существа в пределах 60 футов от вас (исключая вас) должны совершить спасбросок Телосложения со Сл 17. При провале существо получает урон звуком 2к6 и становится оглохшим на 1 минуту. При успехе существо получает половину урона и не становится оглохшим.
://''Гром и молния.''// Вы можете действием использовать одновременно свойства «удар молнии» и «удар грома». Это не учитывается при подсчёте того, использовали ли вы эти свойства в этот день, тратится использование лишь непосредственно этого свойства.
//Посох, редкий (требуется настройка друидом, жрецом или колдуном)//
У этого посоха 3 заряда, и он ежедневно восстанавливает 1к3 заряда на рассвете.
Этот посох можно использовать как магический боевой посох. При попадании он причиняет урон как обычный боевой посох, и вы можете потратить 1 заряд, чтобы причинить цели дополнительный урон некротической энергией 2к10. Кроме того, цель должна преуспеть в спасброске Телосложения со Сл 15, иначе она в течение 1 часа будет совершать с помехой проверки характеристик и спасброски, использующие Силу или Телосложение.
//Посох, редкий (требуется настройка друидом)//
Этот посох можно использовать как магический боевой посох, предоставляющий бонус +2 к броскам атаки и урона им. Держа его, вы получаете бонус +2 к броскам атаки заклинаниями.
У посоха есть 10 зарядов для описанных ниже свойств. Он ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох теряет все свои свойства и становится немагическим боевым посохом.
:"""//''Заклинания.''// Вы можете действием потратить 1 или несколько зарядов посоха, чтобы наложить им одно из следующих заклинания, используя свою Сл спасброска от заклинания: дружба с животными (1 заряд), дубовая кора (2 заряда), поиск животных или растений (2 заряда), пробуждение разума (5 зарядов), разговор с животными (1 заряд), разговор с растениями (3 заряда) или терновая стена (6 зарядов).
Вы также можете действием накладывать посохом заклинание бесследное передвижение, не тратя зарядов."""
:"""//''Древесный облик.''// Вы можете действием воткнуть посох в плодородную землю и потратить 1 заряд, чтобы превратить посох в здоровое дерево. Высота дерева 60 футов, диаметр ствола — 5 футов, а ветви на макушке раскинуты в радиусе 20 футов. Это дерево выглядит обычным, но излучает слабую магию школы Преобразования, если становится целью обнаружения магии. Прикоснувшись к дереву и произнеся действием командное слово, вы возвращаете посоху его обычный облик. Все находящиеся на дереве существа при этом падают."""
//Посох, редкий (требуется настройка бардом, друидом или жрецом)//
У этого посоха есть 10 зарядов. Держа его, вы можете действием потратить часть зарядов и наложить им одно из следующих заклинаний, используя свою Сл спасброска от заклинания и базовую характеристику: лечение ран (1 заряд за каждый уровень заклинания, максимум 4 уровень), малое восстановление (2 заряда) или множественное лечение ран (5 зарядов).
Посох ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох исчезает во вспышке света, теряясь навсегда.
//Посох, легендарный (требуется настройка волшебником, колдуном или чародеем)//
Этот посох можно использовать как магический боевой посох, предоставляющий бонус +2 к броскам атаки и урона им. Держа его, вы получаете бонус +2 к броскам атаки заклинаниями.
У посоха есть 50 зарядов для описанных ниже свойств. Он ежедневно восстанавливает 4к6 + 2 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «20», посох восстановит 1к12 + 1 заряд.
Впитывание заклинаний. Пока вы держите посох, вы совершаете спасброски от заклинаний с преимуществом. Кроме того, вы можете использовать реакцию, когда другое существо накладывает заклинание, целью которого являетесь только вы. Если вы это делаете, посох впитывает магию этого заклинания, отменяя его эффект и восстанавливая количество зарядов, равное уровню поглощённого заклинания. Однако если из-за этого сумма зарядов в посохе превысит 50, посох взорвётся, как если бы вы активировали его «карающий удар» (смотрите ниже).
;
:"""//''Заклинания.''// Если вы держите этот посох, вы можете действием потратить часть зарядов, чтобы наложить им одно из следующих заклинаний (Сл спасброска 17): град (4 заряда), молния (версия 7 уровня, 7 зарядов), невидимость (2 заряда), огненная стена (4 заряда), огненный шар (версия 7 уровня, 7 зарядов), открывание (2 заряда), паутина (2 заряда), призыв элементаля (7 зарядов), пылающий шар (2 заряда), рассеивание магии (3 заряда), создание прохода (5 зарядов), телекинез (5 зарядов) или уход в иной мир (7 зарядов).
Вы также можете действием наложить посохом одно из следующих заклинаний, не тратя зарядов: волшебная рука, волшебный замок, защита от добра и зла, обнаружение магии, свет или увеличение/уменьшение."""
:"""//''Карающий удар.''// Вы можете действием сломать посох о колено или твёрдую поверхность, совершая, таким образом, карающий удар. Посох уничтожается, испуская оставшуюся в нём магию взрывом, заполняющим сферу радиусом 30 футов с центром на нём.
У вас есть 50-процентный шанс мгновенно перенестись на случайный план существования, избежав взрыва. Если вы его не избегаете, то получаете урон силовым полем, равный 16 х количество зарядов в посохе. Все другие существа в области взрыва должны совершить спасбросок Ловкости со Сл 17. При провале существо получает урон, зависящий от того, как далеко оно находится от исходной точки взрыва, как показано в таблице. При успехе существо получает половину этого урона."""
<table>
<tr>
<th>Расстояние от исходной точки</th>
<th>Урон</th>
</tr>
<tr>
<td>10 фт. или ближе 8 х количество зарядов в посохе</td>
<td>8 × количество зарядов в посохе</td>
</tr>
<tr>
<td>от 11 до 20 фт.</td>
<td>6 х количество зарядов в посохе</td>
</tr>
<tr>
<td>от 21 до 30 фт.</td>
<td>4 х количество зарядов в посохе</td>
</tr>
</table>
//Посох, очень редкий (требуется настройка волшебником, друидом, колдуном или чародеем)//
Вы получаете сопротивление к урону холодом, пока держите этот посох.
У этого посоха есть 10 зарядов. Держа его, вы можете действием потратить часть зарядов и наложить им одно из следующих заклинаний, используя свою Сл спасброска от заклинания: град (4 заряда), конус холода (5 зарядов), ледяная стена (4 заряда) или туманное облако (1 заряд).
Посох ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох превращается в воду и уничтожается.
//Посох, очень редкий (требуется настройка волшебником, друидом, колдуном или чародеем)//
Вы получаете сопротивление к урону огнём, пока держите этот посох.
У этого посоха есть 10 зарядов. Держа его, вы можете действием потратить часть зарядов и наложить им одно из следующих заклинаний, используя свою Сл спасброска от заклинания: огненная стена (4 заряда), огненные ладони (1 заряд) или огненный шар (3 заряда).
Посох ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох чернеет, разваливается на угли и уничтожается.
//Посох, необычный (требуется настройка друидом, жрецом ил колдуном)//
Вы можете действием произнести командное слово и бросить посох на пол в пределах 10 футов от себя. Посох становится гигантским удавом (смотрите характеристики в Бестиарии) под вашим контролем и у него есть своё место в порядке инициативы. Произнеся бонусным действием командное слово ещё раз, вы возвращаете посоху его естественный облик, и он будет лежать в пространстве, ранее занимаемом удавом.
В свой ход вы можете мысленно отдавать команды удаву, если он находится в пределах 60 футов от вас и дееспособен. Вы определяете, какие действия ему совершать и куда перемещаться в следующем ходу, или же можете отдать общую команду, такую как «нападай на врагов» или «охраняй место». Если хиты змеи опустятся до 0, она умирает и становится посохом.
Посох при этом раскалывается на куски и уничтожается. Если змея становится посохом до того как потеряет все хиты, она их тут же восстанавливает.
//Посох, редкий (требуется настройка бардом, волшебником, друидом, жрецом, колдуном или чародеем)//
У этого посоха 10 зарядов, и он ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», рой насекомых пожирает посох, уничтожая его, и рассеивается.
Заклинания. Если вы держите этот посох, вы можете действием потратить часть зарядов, чтобы наложить им одно из следующих заклинаний, используя свою Сл спасброска от заклинания: гигантское насекомое (4 заряда) или нашествие насекомых (5 зарядов).
Облако насекомых. Если вы держите посох, вы можете действием потратить 1 заряд, чтобы окружить себя роем летучих насекомых с 30-футовым радиусом. Насекомые остаются на 10 минут, делая эту область сильно заслонённой для всех существ кроме вас. Рой перемещается с вами, оставаясь с центром на вас. Ветер со скоростью как минимум 10 миль в час (16 километров в час) рассеивает рой и оканчивает этот эффект.
//Посох, очень редкий (требуется настройка волшебником, колдуном или чародеем)//
Этот посох можно использовать как магический боевой посох, предоставляющий бонус +3 к броскам атаки и урона им. Держа его, вы получаете бонус +2 к Классу Доспеха, спасброскам и броскам атаки заклинаниями.
У посоха есть 20 зарядов для описанных ниже свойств. Он ежедневно восстанавливает 2к8 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох сохраняет бонус +2 к броскам атаки и урона, но теряет все остальные свойства. Если выпадет «20», посох восстанавливает 1к8 + 2 заряда.
;
://''Силовой удар.''// Если вы попадаете рукопашной атакой этим посохом, вы можете потратить 1 заряд, чтобы причинить цели дополнительный урон силовым полем 1к6.
://''Заклинания.''// Если вы держите этот посох, вы можете действием потратить часть зарядов, чтобы наложить им одно из следующих заклинаний, используя свою Сл спасброска от заклинания и бонус броска атаки заклинанием: волшебная стрела (1 заряд), конус холода (5 зарядов), левитация (2 заряда), луч слабости (1 заряд), молния (версия 5 уровня, 5 зарядов), огненный шар (версия 5 уровня, 5 зарядов), силовая стена (5 зарядов), сфера неуязвимости (6 зарядов) или удержание чудовища (5 зарядов).
:"""//''Карающий удар.''// Вы можете действием сломать посох о колено или твёрдую поверхность, совершая, таким образом, карающий удар. Посох уничтожается, испуская оставшуюся в нём магию взрывом, заполняющим сферу радиусом 30 футов с центром на нём.
У вас есть 50-процентный шанс мгновенно перенестись на случайный план существования, избежав взрыва. Если вы его не избегаете, то получаете урон силовым полем, равный 16 х количество зарядов в посохе. Все другие существа в области взрыва должны совершить спасбросок Ловкости со Сл 17. При провале существо получает урон, зависящий от того, как далеко оно находится от исходной точки взрыва, как показано в таблице. При успехе существо получает половину этого урона."""
<table>
<tr>
<th>Расстояние от исходной точки</th>
<th>Урон</th>
</tr>
<tr>
<td>10 фт. или ближе</td>
<td>8 х количество зарядов в посохе</td>
</tr>
<tr>
<td>от 11 до 20 фт.</td>
<td>6 х количество зарядов в посохе</td>
</tr>
<tr>
<td>от 21 до 30 фт.</td>
<td>4 х количество зарядов в посохе</td>
</tr>
</table>
//Посох, очень редкий (требуется настройка)//
Этот посох можно использовать как магический боевой посох, предоставляющий бонус +3 к броскам атаки и урона им.
У этого посоха есть 10 зарядов. Если вы попадаете им рукопашной атакой, вы можете потратить до 3 зарядов. За каждый потраченный заряд цель получает дополнительный урон силовым полем 1к6. Посох ежедневно восстанавливает 1к6 + 4 заряда на рассвете. Если вы истратили последний заряд, бросьте к20. Если выпадет «1», посох становится немагическим боевым посохом.
//1 уровень, Преобразование, Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
Это заклинание позволяет перемещаться с невероятной скоростью. Когда вы накладываете это заклинание, а также в последующие ходы, бонусным действием, пока активно заклинание, вы можете совершать действие Рывок.
!!''Потусторонние покровители''
"""Существа, выступающие покровителями колдунов, являются могущественными обитателями других планов существования. Не боги, но почти равные богам в своих силах. Разные покровители предоставляют колдунам доступ к разным силам и воззваниям, и ожидают определённых услуг взамен.
Некоторые покровители коллекционируют колдунов, раздавая мистические знания относительно свободно, или похваляются возможностью подчинять смертных своей воле. Другие покровители даруют свои силы неохотно, и могут заключить договор лишь с одним колдуном. Колдуны, служащие общему покровителю, могут относиться друг к другу как к союзникам, родственникам или соперникам."""
<<Button "Архифея (Колдун)" "Архифея">>
<<Button "Исчадие (Колдун)" "Исчадие">>
<<Button "Великий Древний (Колдун)" "Великий Древний">>
!!!__''Потусторонний покровитель''__
На 1 уровне вы заключаете сделку с потусторонним существом на ваш выбор: Архифея, Исчадие или Великий Древний. Подробности смотрите в конце описания класса. Ваш выбор определит умения, предоставляемые на 1, 6, 10 и 14 уровнях.
!!!''Потусторонний прыжок''
"""//Требование: 9 уровень//
Вы можете неограниченно накладывать на себя заклинание прыжок, не тратя ячейки заклинаний и материальные компоненты."""
//Заговор, Преобразование, Бард/Волшебник/Друид/Жрец/Чародей//
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (два магнетита)
:''Длительность:'' Мгновенная
"""Это заклинание чинит одно повреждение или разрыв на предмете, которого касаетесь, например, разорванное звено цепи, две половинки сломанного ключа, порванный плащ или протекающий бурдюк. Если повреждение или разрыв не больше 1 фута в длину, вы чините его, не оставляя следов.
Это заклинание может физически починить магический предмет или конструкта, но не может восстановить магию в таких предметах."""
//2 уровень, Очарование, Бард/Друид/Следопыт (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (кусочек пищи)
:''Длительность:'' 24 часа
"""При помощи этого заклинания вы передаёте через животное сообщение. Выберите Крохотного зверя, которого видите в пределах дистанции, такого как белку, сойку или летучую мышь. Вы указываете место, которое когда-то уже посещали, и получателя, описывая его признаки, такие как «мужчина или женщина в униформе городской стражи» или «рыжий дварф в остроконечной шляпе». Вы также произносите сообщение длиной не более 25 слов. Зверь в течение длительности заклинания двигается в указанное место, покрывая примерно 50 миль за 24 часа при полёте или 25 миль при других видах перемещения.
Прибыв на место, зверь передаёт ваше сообщение описанному вами существу, изображая звук вашего голоса. Зверь передаст послание только существу, подходящему данному вами описанию. Если зверь не достигнет места до окончания действия заклинания, сообщение будет утеряно, а зверь начнёт возвращаться к тому месту, где вы наложили на него заклинание."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, его длительность увеличивается на 48 часов за каждый уровень ячейки выше второго.
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите этот пояс, вы получаете следующие преимущества:
* Ваше Телосложение увеличивается на 2, с максимумом 20.
* Вы совершаете с преимуществом проверки Харизмы (Убеждение) при взаимодействии с дварфами.
Кроме того, пока вы настроены на этот пояс, у вас каждый день есть 50-процентный шанс отрастить бороду, если она у вас вообще растёт, или же ваша борода станет гораздо гуще, если она уже есть.
Если вы — не дварф, вы получаете следующие дополнительные преимущества, пока носите этот пояс.
*Вы совершаете с преимуществом спасброски от яда и получаете сопротивление к урону ядом.
* Вы получаете тёмное зрение в пределах 60 футов.
* Вы можете говорить, читать и писать на Дварфском языке.
//Чудесный предмет, редкость варьируется (требуется настройка)//
Пока вы носите этот пояс, значение вашей Силы изменяется до значения, даруемого этим поясом. Если ваша Сила без него и так уже равна или превышает силу пояса, тогда пояс не оказывает на вас никакого эффекта.
Пояс бывает шести разновидностей, каждый со своей редкостью и с привязкой к своему виду великана. Пояс силы каменного великана и пояс силы ледяного великана выглядят по-разному, но оказывают одинаковый эффект.
<table>
<tr>
<th>Вид</th>
<th>Сила</th>
<th>Редкость</th>
</tr>
<tr>
<td>Холмовой великан</td>
<td>21</td>
<td>Редкий</td>
</tr>
<tr>
<td>Каменный/ледяной великан</td>
<td>23</td>
<td>Очень редкий</td>
</tr>
<tr>
<td>Огненный великан</td>
<td>25</td>
<td>Очень редкий</td>
</tr>
<tr>
<td>Облачный великан</td>
<td>27</td>
<td>Легендарный</td>
</tr>
<tr>
<td>Штормовой великан</td>
<td>29</td>
<td>Легендарный</td>
</tr>
</table>
В идеале, игроки собираются за столом с общей целью: интересно провести время. В этом разделе будут приведены рекомендации по правилам, которые вы можете установить, чтобы эта цель была достигнута. Вот основные моменты:
;
://''Проявляйте уважение.''// Не позволяйте за столом межличностные конфликты и не допускайте эскалации разногласий. Не трогайте кости других игроков, если те ревностно к этому относятся.
://''Не отвлекайтесь.''// Отключите телевизор и уберите видеоигры. Если у вас есть маленькие дети, наймите няньку. Убрав отвлекающие моменты, вы поможете игрокам оставаться в роли и наслаждаться сюжетом. Какие-то игроки могут выходить из-за стола и возвращаться обратно, но другие предпочитают запланированные перерывы.
://''Приготовьте перекус.''// Перед игрой договоритесь, кто принесёт еду и напитки. Чаще всего за это отвечают игроки.
!!__''Разговоры за столом''__
Определитесь, как игроки будут разговаривать за столом:
* Пусть будет понятно, кто говорит: персонаж или игрок (вне образа).
* Как вы отнесётесь к тому, что персонажи могут выдавать информацию о том, что их персонажи не могут знать, или не могут рассказать, так как лежат без сознания, мертвы или просто далеко находятся.
* Как вы отнесётесь к игрокам, которые описывают действия своего персонажа и тут же всё отменяют и описывают уже по-другому?
!!__''Броски костей''__
Определитесь, как будут бросаться кости. Хороший вариант бросать так, чтобы всем хорошо было видно результаты. Если заметите, что игрок бросает кость и тут же её хватает, не давая другим разглядеть, попросите его быть менее скрытным.
Если кость упадёт на пол, вы засчитаете её или попросите перебросить? Если кость встанет на ребро, ударившись о книгу, вы отодвинете книгу, чтобы увидеть результат, или попросите перебросить?
А как быть с вашими костями? Вы совершаете свои броски открыто или за ширмой? Имейте в виду следующее:
* Если вы бросаете кости в открытую, игроки будут знать, что вы играете непредвзято и не подтасовываете результаты.
* Броски за ширмой заставят игроков гадать о силе противников. Почему чудовище всё время попадает: оно очень сильное, или просто у вас выпадают большие числа?
* Броски за ширмой позволяют при необходимости подтасовывать результаты. Если два критических попадания подряд убьют персонажа, вы можете сделать второе попадание обычным, или даже можете сделать его промахом. Не искажайте результаты бросков слишком часто, и не позволяйте игрокам узнать об этом. В противном случае игроки подумают, что им ничего не угрожает, или, что хуже, решат, что у вас есть любимчики.
* Броски за ширмой помогут сохранять тайну. Например, если игрок думает, что рядом прячется невидимка, и совершает проверку Мудрости (Внимательность), сделайте бросок за ширмой, даже если невидимки нет. Пусть игрок продолжает думать, что невидимка есть, но хорошо прячется. Однако этим трюком тоже не стоит злоупотреблять.
* Вы можете совершать броски за игрока, если не хотите, чтобы он знал, насколько хороший результат у него выпал. Например, если игрок подозревает, что баронесса очарована, и хочет совершить проверку Мудрости (Проницательность), можете совершить этот бросок втайне от игрока. Если игрок увидит большой результат, а его персонаж не найдёт признаков очарования, игрок будет убеждён, что баронесса не очарована. При низком результате отрицательный ответ будет менее информативным. А скрытые броски сохраняют интригу.
!!__''Броски атаки и урона''__
Обычно игроки вначале совершают бросок атаки, и потом уже бросок урона. Если они начнут бросать кости атаки и урона одновременно, получится сэкономить немного времени.
!!__''Обсуждение правил''__
Вы можете установить ограничения на обсуждение правил во время игры. Кто-то может без проблем отложить игру, чтобы обсудить разные интерпретации правил. Другие предпочитают, чтобы Мастер принял решение и игра продолжилась. Если вы столкнулись с проблемой в трактовке правил, сделайте заметку об этом (можно поручить это другому игроку) и вернитесь к этой проблеме позже.
!!__''Метаигровое мышление''__
Метаигровое мышление это когда во время игры постоянно помнят, что происходит игра. Как будто персонаж в фильме знает, что находится в фильме, и действует соответствующе. Например, игрок может сказать: «Мастер на нас такого сильного врага не выпустит!» или же вы можете услышать: «Он так долго описывал пол. Давайте осмотрим его ещё раз!»
Противопоставляйте метаигровому мышлению игроков простой вопрос: «А что на этот счёт думает твой персонаж?» Вы можете пресекать метаигровое мышление, создавая сложные для персонажей ситуации, в которых, чтобы выжить, нужно устраивать переговоры или отступать.
!!__''Отсутствующие игроки''__
Как вы поступите с персонажами, игроки которых отсутствуют? Рассмотрите следующие варианты:
* Пусть другой игрок возьмёт под свой контроль персонажа отсутствующего игрока. Игрок с дополнительным персонажем должен стараться сделать так, чтобы его временный персонаж выжил и должен экономно тратить его ресурсы.
* Управляйте персонажем сами. Это дополнительная нагрузка на вас, но это может сработать.
* Решите, что персонажа сейчас нет. Придумайте хорошую причину, по которой персонаж пропускает приключение, и оставьте его в городе или пусть он продолжит заниматься деятельностью во время простоя. При этом оставьте персонажу возможность догнать отряд, когда игрок вернётся.
* Пусть персонаж отойдёт на второй план. Это решение требует ото всех немного поступиться реализмом и подавить неверие, но зато это самое простое решение. Вы действуете так, словно персонажа вообще нет, но никак при этом не оправдываете его отсутствие. Чудовища не атакуют его, а он — их. Вернувшись, игрок продолжает играть, как если бы вовсе не отсутствовал.
!!__''Маленькие группы''__
Обычно у каждого игрока есть по одному персонажу. Так игра проходит ровно, никого не нагружая сверх меры. Однако, если у вас маленькая группа, у игроков может быть несколько персонажей. Как вариант, вы можете дополнить отряд последователями, используя рекомендации из 4 главы. Вы также можете сделать персонажей более живучими, используя опциональное правило «второе дыхание» из 9 главы.
Не заставляйте игрока брать дополнительного персонажа, если он того не желает, и не делайте любимчиков, позволяя это только кому-то одному. Если один персонаж является наставником другого, игрок может сосредоточиться на отыгрыше только одного персонажа. В противном же случае игроки будут вести себя странно, разговаривать сами с собой, от лица своих же персонажей, и будут меньше взаимодействовать между собой.
Многочисленные персонажи станут хорошим выходом в игре, в которой много опасных моментов и высока смертность персонажей. Если ваша группа согласна, пусть у каждого игрока будет один или два дополнительных персонажа, готовые войти в игру на случай смерти текущего персонажа. Каждый раз, когда основной персонаж получает уровень, дополнительные персонажи тоже его получают.
!!__''Новые игроки''__
Если к группе присоединяется новый игрок, позвольте ему создать персонажа с таким же уровнем, что и у самого низкоуровневого члена отряда. Единственным исключением является случай, когда новый игрок абсолютно незнаком с D&D. В этом случае пусть игрок начнёт с персонажем 1 уровня. Если разница в уровнях с остальной частью отряда будет слишком большой, попробуйте сделать в кампании небольшой перерыв и попросите всех временно поиграть персонажами 1 уровня, пока новый игрок не освоится.
Трудно внедрить нового игрока в группу посреди приключения. Вот советы, способные облегчить эту задачу:
* Новый персонаж является другом или родственником одного из искателей приключений, ищущим группу.
* Новый персонаж является пленником врагов, с которыми сражаются остальные персонажи. После спасения этот персонаж присоединяется к группе.
* Новый персонаж является единственным выжившим представителем другой группы искателей приключений.
!!!''__Превосходное вдохновение__''
При достижении 20 уровня, если на момент броска инициативы у вас не осталось неиспользованных вдохновений, вы получаете одно.
//Чудесный предмет, легендарный//
Эта тягучая, молочно-белая субстанция может склеить два любых предмета. Она должна храниться в сосуде или фляге, покрытой изнутри маслом скольжения. В найденном контейнере находится 1к6 + 1 унция клея.
Одна унция клея может покрыть 1 квадратный фут поверхности. Клей затвердевает через 1 минуту. После этого связь двух предметов можно разорвать только нанесением универсального растворителя или масла эфирности, либо же заклинанием исполнение желаний.
//4 уровень, Преобразование, Бард/Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кокон гусеницы)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Это заклинание придаёт новый облик существу, которое вы видите в пределах дистанции. Несогласное существо должно совершить спасбросок Мудрости, чтобы избежать эффекта. Перевёртыши автоматически преуспевают в этом спасброске. Это заклинание не может подействовать на цель, у которой 0 хитов.
Превращение длится, пока активно заклинание, или пока хиты цели не опустятся до 0, или она не умрёт. Новый облик может принадлежать зверю, чей ПО не превышает ПО цели (или уровень цели, если у неё нет показателя опасности). Игровые характеристики цели, включая значения ментальных характеристик, заменяются характеристиками выбранного зверя. У цели остаётся мировоззрение и характер.
Цель принимает хиты нового облика. При возвращении в естественный облик количество её хитов будет как до превращения. Если она возвращается в свой облик от того, что хиты опустились до 0, весь излишний урон перенесётся на естественный облик. Если излишний урон не опускает хиты естественного облика существа до 0, оно не теряет сознание.
Действия существа в новом облике ограничены теми, что доступны ей, и она не может говорить, накладывать заклинания и совершать другие действия, требующие рук или речи.
Снаряжение цели сливается с её новым обликом. Существо не может активировать, использовать, надевать или получать какие-то иные преимущества от своего снаряжения."""
//8 уровень, Преобразование, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 24 часов
"""Ваша магия превращает существ в зверей. Выберите любое число согласных существ, которых видите в пределах дистанции. Вы меняете облик каждой цели на облик зверя Большого или меньшего размера с показателем опасности не больше 4. В последующие ходы вы можете действием дать этим существам новый облик.
Превращение держится всю длительность заклинания, или пока хиты цели не опустятся до 0, или она не умрёт. У каждой цели может быть свой облик. Игровые параметры целей меняются на параметры выбранных зверей, но у них остаётся своё мировоззрение и значения Интеллекта, Мудрости и Харизмы. Цель принимает хиты нового облика, а по возвращении в свой облик у неё будут хиты как перед превращением. Если свой облик возвращается в результате опускания хитов до 0, весь излишний урон переносится на хиты естественного облика. Если излишний урон не опустил хиты естественного облика ниже 0, существо не теряет сознание. Действия существа ограничены теми, что доступны новому облику, и оно не может разговаривать и накладывать заклинания.
Снаряжение цели сливается с новым обликом. Цель не может активировать, использовать своё снаряжение и получать от него преимущества."""
//5 уровень, Ограждение, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (10-футовый радиус)
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""От вас исходит мерцающий барьер с радиусом 10 футов, перемещающийся вместе с вами, остающийся с центром на вас, и защищающий вас от всех существ кроме нежити и конструктов. Барьер существует всё время, пока активно заклинание.
Этот барьер не даёт указанным существам проходить и тянуться через него. Указанные существа могут накладывать заклинания и совершать атаки сквозь преграду дальнобойным оружием и оружием со свойством «досягаемость».
Если вы перемещаетесь так, что указанное существо будет вынуждено пройти сквозь барьер, заклинание оканчивается."""
//8 уровень, Ограждение, Волшебник/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (сфера радиусом 10 футов)
:''Компоненты:'' В, С, М (щепотка толчёного железа или железная стружка)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вас окружает невидимая сфера антимагии с радиусом 10 футов. Эта область отделена от магической энергии, пронизывающей мультивселенную. В пределах этой сферы нельзя накладывать заклинания, призванные существа исчезают, и даже магические предметы становятся обычными. Пока заклинание активно, сфера перемещается вместе с вами, оставаясь с центром на вас.
Заклинания и прочие магические эффекты, кроме тех, что созданы артефактами и божествами, в сфере подавляются, и не могут проникать в неё. Ячейка, потраченная на накладывание подавленного заклинания, всё равно тратится. Пока эффект подавлен, он не действует, но время в подавленном состоянии всё равно учитывается при определении его длительности.
//''Эффекты с целью.''// Заклинания и прочие магические эффекты, такие как волшебная стрела и очарование личности, нацеленные на существо или предмет, находящиеся в сфере, не оказывают на цель никакого эффекта.
//''Области магии.''// Область магических эффектов и других заклинаний, таких как огненный шар, не может проникать в сферу. Если сфера оказывается в области магии, область, находящаяся в сфере, подавляется. Например, пламя, созданное огненной стеной, подавляется внутри сферы, создавая брешь в стене, если позволяют габариты.
//''Заклинания.''// Все активные заклинания и прочие магические эффекты на существах и предметах подавляются, пока они находятся в сфере.
//''Магические предметы.''// Свойства и таланты магических предметов в сфере подавляются. Например, длинный меч +1 в сфере будет обычным длинным мечом.
Свойства и таланты магического оружия подавляются, если используются против цели в сфере или используются атакующим, находящимся в сфере. Если магическое оружие или боеприпас полностью покидает сферу (например, если вы выстрелите магической стрелой или метнёте магическое копьё в цель, находящуюся вне сферы), магия предмета возвращается.
//Магическое перемещение.// В сфере не работают телепортация и перемещение между планами, вне зависимости от того, в сферу или из сферы пытаются перенестись. Порталы в другие места, миры и планы существования, а также входы в межпространство, такие как созданные заклинанием трюк с верёвкой, временно закрываются, пока они находятся в сфере.
//''Существа и предметы.''// Существа и предметы, призванные или созданные магией, временно прекращают существовать, пока они находятся в сфере. Существа возвращаются обратно, когда сфера покидает место, занимаемое ими до исчезновения.
//''Рассеивание магии.''// Заклинания и магические эффекты, такие как рассеивание магии, не оказывают на сферу никакого воздействия. Сферы, созданные разными заклинаниями преграда магии, не отменяют друг друга."""
//9 уровень, Прорицание, Бард/Волшебник/Друид/Колдун//
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (перо колибри)
:''Длительность:'' 8 часов
"""Вы касаетесь согласного существа, даруя ограниченную способность предвидеть будущее. Пока заклинание активно, цель нельзя застать врасплох, и она совершает с преимуществом броски атаки, проверки характеристик и спасброски. Кроме того, пока заклинание активно, другие существа совершают по цели броски атаки с помехой.
Это заклинание мгновенно оканчивается, если вы активируете его ещё раз до окончания длительности."""
!!!__''Предмет договора''__
На 3 уровне потусторонний покровитель дарует вам подарок за верную службу. Вы получаете одно из следующих умений на выбор:
<<<
!!!''Ваш предмет договора''
"""Получаемые вами от договора блага отражают природу вашего покровителя.
Договор гримуара. Ваша «Книга Теней» может быть изящным золочёным томом с заклинаниями очарования и иллюзий, дарованным высокомерной Архифеей. Она может быть тяжёлым, переплетённым в кожу демонов и отделанным железом томом, содержащим заклинания вызова и драгоценные, но запретные знания о зловещих уголках мироздания. Таким может быть дар Исчадия. Или это может быть изорванный дневник безумца, коснувшегося разума Великого Древнего. Этот дневник содержит обрывки заклинаний, понять которые позволяет только ваше собственное растущее безумие.
Договор клинка. Если вашим покровителем является Архифея, ваше оружие может быть узким клинком, покрытым лозами. Если вы служите Исчадию, ваше оружие будет топором чёрного металла, украшенным изображением языков пламени. Если ваш покровитель — Великий Древний, вашим оружием может стать древнее копьё с самоцветом в наконечнике, выглядящим как ужасный, немигающий глаз.
Договор цепи. Ваш фамильяр смышлёнее чем обычные. Его внешность может отражать сущность вашего покровителя. Так, спрайт или псевдодракон относится к Архифее, а бес или квазит к Исчадию. Поскольку сущность Великого Древнего не поддаётся пониманию, ему подходит любая форма фамильяра."""
<<<
<<Button "Договор гримуара (Колдун)" "Договор гримуара">>
<<Button "Договор клинка (Колдун)" "Договор клинка">>
<<Button "Договор цепи (Колдун)" "Договор цепи">>
Если персонажам нужно разрубить верёвки, разбить окно или взломать гроб вампира, есть одно простое правило: при наличии времени и правильных инструментов персонажи могут уничтожить любой разрушаемый предмет. Используйте здравый смысл при определении того, может ли персонаж причинить урон предмету. Сможет ли воин прорубиться через каменную стену мечом? Нет, меч сломается раньше стены.
В дальнейшем, при описании правил, под «предметом» понимается неживой предмет, такой как окно, дверь, меч, книга, стол, стул или камень, а не здание или транспортное средство, состоящее из множества других предметов.
!!!''Характеристики предмета''
Если время — важный фактор, можете назначить разрушаемому предмету Класс Доспеха и хиты. Можете дать ему иммунитеты, сопротивления и уязвимости к определённым видам урона.
://''Класс доспеха.''// Класс Доспеха предмета это мера того, насколько сложно причинить предмету урон, попав по нему (предмет ведь не может уклониться). В приведённой ниже таблице есть значения КД для разных материалов.
!!!!''Класс Доспеха предмета''
<table>
<tr>
<th>Материя</th>
<th>КД</th>
</tr>
<tr>
<td>Бумага, верёвка, ткань</td>
<td>11</td>
</tr>
<tr>
<td>Кристалл, лёд, стекло</td>
<td>13</td>
</tr>
<tr>
<td>Дерево, кость</td>
<td>15</td>
</tr>
<tr>
<td>Камень</td>
<td>17</td>
</tr>
<tr>
<td>Железо, сталь</td>
<td>19</td>
</tr>
<tr>
<td>Мифрил</td>
<td>21</td>
</tr>
<tr>
<td>Адамантин</td>
<td>23</td>
</tr>
</table>
://''Хиты.''// Хиты предмета определяют, сколько урона он выдержит, прежде чем потеряет целостность. У крепких предметов хитов больше, чем у хрупких. У больших предметов хитов обычно тоже больше, чем у маленьких, если только у крупных нет при этом хрупких уязвимых мест. В приведённой ниже таблице есть значения хитов для хрупких и крепких предметов разного размера.
!!!!''Хиты предмета''
<table>
<tr>
<th>Размер</th>
<th>Хрупкий</th>
<th>Крепкий</th>
</tr>
<tr>
<td>Крохотный (бутылка, замок)</td>
<td>2 (1к4)</td>
<td>5 (2к4)</td>
</tr>
<tr>
<td>Маленький (лютня, сундук)</td>
<td>3 (1к6)</td>
<td>10 (3к6)</td>
</tr>
<tr>
<td>Средний (бочка, люстра)</td>
<td>4 (1к8)</td>
<td>18 (4к8)</td>
</tr>
<tr>
<td>Большой (телега, окно 10x10 фт.)</td>
<td>5 (1к10)</td>
<td>27 (5к10)</td>
</tr>
</table>
://''Огромные и Громадные предметы.''// Обычное оружие практически бесполезно против Огромных и Громадных предметов, таких как статуи, каменные колонны и массивные валуны. С другой стороны, факел может сжечь Огромный гобелен, а заклинание землетрясение может превратить статую в груду булыжников. Если хотите, можете отслеживать хиты Огромных и Громадных предметов, а можете просто решить, сколько этот предмет выстоит против оружия или силы, разрушающей его. Если вы отслеживаете хиты предмета, разделите его на несколько секций Большого (или меньшего) размера, и отслеживайте хиты каждой секции отдельно. Уничтожение лишь одной секции может уничтожить весь объект. Например, Громадная статуя человека может упасть, если хиты её Больших ног уменьшатся до 0.
://''Предметы и виды урона.''// Предметы обладают иммунитетом к урону ядом и психической энергией. Вы можете решить, что некоторые виды урона будут эффективнее других. Например, дробящий урон прекрасно подходит для крушения предметов, но им не выйдет перерезать верёвку или кожу. Бумажные и тканевые предметы могут быть уязвимы к урону огнём и электричеством. Кирка может колоть камень, но не сможет срубить дерево. Как всегда, используйте здравый смысл.
://''Порог урона.''// У больших предметов, таких как стены замка, может быть дополнительная стойкость, представленная в виде порога урона. Предмет с порогом урона обладает иммунитетом ко всем видам урона, если только это не урон от единичной атаки или эффекта, размером не меньше порога урона, в случае чего урон причиняется в полной мере. Весь урон, что не достигает порога урона предмета, считается незначительным, и не уменьшает хиты предмета.
//6 уровень, Воплощение, Волшебник//
:''Время накладывания:'' 10 минут
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (ваша статуэтка, вырезанная из слоновой кости, украшенная драгоценными камнями и стоящая как минимум 1 500 зм)
:''Длительность:'' 10 дней
"""Выберите заклинание 5 уровня или ниже, которое вы можете сотворить, у которого время накладывания 1 действие, и которое может нацеливаться на вас. Вы активируете это заклинание частью накладывания предосторожности, тратя ячейки заклинаний для обоих, но эффект заготовленного заклинания не проявляется. Этот эффект вступает в силу когда произойдёт определённое условие. Вы описываете это условие когда накладываете оба заклинания. Например, предосторожность, сотворённая в паре с подводным дыханием, может сделать так, что подводное дыхание начнёт действовать когда вы окажетесь в воде или подобной жидкости.
Заготовленное заклинание вступает в действие мгновенно после того как условие впервые будет выполнено, хотите вы того или нет, и после этого предосторожность заканчивается.
Заготовленное заклинание оказывает эффект только на вас, даже если в обычных обстоятельствах может нацеливаться на других. Вы можете использовать только одно заклинание предосторожность одновременно. Если вы накладываете это заклинание ещё раз, эффект предыдущей предосторожности оканчивается. Кроме того, предосторожность заканчивается, если материальный компонент перестанет быть в вашем распоряжении."""
//4 уровень, Прорицание, Жрец (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (благовония и жертвенное подношение, подходящее вашей религии, стоящие вместе как минимум 25 зм, расходуемые заклинанием)
:''Длительность:'' Мгновенная
"""Ваша магия и жертвоприношение связывают вас с богом или его слугой. Вы задаёте один вопрос о конкретной цели, событии, или деятельности, которая произойдёт в течение следующих 7 дней. Мастер даёт на это честный ответ. Это может быть короткая фраза, загадочный стих или знамение.
Это заклинание не учитывает всевозможные обстоятельства, способные изменить исход событий, такие как накладывание дополнительных заклинаний и потеря и приобретение спутников.
Если вы накладываете это заклинание несколько раз до завершения продолжительного отдыха, существует накопительный шанс 25 процентов за каждое использование, начиная со второго, что вы получите случайный ответ. Мастер совершает этот бросок скрытно."""
!!''Предыстории''
"""Каждая история имеет своё начало. Истоки истории вашего персонажа могут описывать, почему он выбрал дорогу приключений, и как он стал тем, кем является. Ваш воин может быть благородным рыцарем или седым суровым солдатом. Ваш волшебник может быть мудрецом или ремесленником. Ваш плут может быть агентом гильдии воров или замаскированным шутом.
Выбор предыстории предоставляет вам важные сюжетные элементы в самобытности вашего персонажа. Что изменилось в жизни вашего персонажа после предыстории? Что заставило бросить вашу деятельность и отправиться на поиски приключений? Где вы взяли деньги на покупку своего снаряжения, или, если у вас предыстория богача, почему у вас нет больше денег? Как вы узнали навыки своего класса? Что отличает вас от обычных людей, которые имеют такую же предысторию?"""
<<<
!!!''Тика и Артемис: Предыстории''
"""И Тика Вейлан и Артемис Энтрери провели свои детские годы как беспризорники. Позже Тика подрабатывала в баре, но это не изменило её привычек, что даёт ей владение навыками Ловкость рук и Скрытность, а также владение воровскими инструментами. Артемис пошёл по пути преступности, что даёт ему владение навыками Обман и Скрытность, а также владение воровскими инструментами и инструментами отравителя.
Образцы предысторий, описанных в этой главе, предоставляют как конкретные преимущества (умения, владения и дополнительные языки), так и рекомендации к отыгрышу."""
<<<
!!!''Владения''
"""Каждая предыстория даёт вашему персонажу владение двумя навыками. Навыки описаны в главе 7.
Кроме того, большинство предысторий даёт персонажу владение одним или несколькими инструментами. Инструменты и владение ими описаны в главе 5.
Если персонаж получает владение одним и тем же из двух разных источников, он может выбрать другое владение того же вида (навыком или инструментом)."""
!!!''Языки''
Некоторые предыстории также дают вам возможность выучить языки в дополнение к тем, которые даёт ваша раса. Смотрите раздел «Языки» выше в этой главе.
!!!''Снаряжение''
Каждая предыстория подразумевает владение некоторым имуществом. Если вы используете опциональное правило из главы 5, и приобретаете начальное снаряжение за золото, вы не получаете начальное снаряжение от предыстории.
!!!''Персонализация''
Каждая предыстория имеет набор персональных качеств, основанных на ней. Вы можете выбрать их самостоятельно, бросить кость, чтобы определить их случайно, или использовать в качестве рекомендаций, чтобы создать собственные.
!!!''Собственная предыстория''
Возможно, вы захотите изменить некоторые особенности предыстории, чтобы они лучше подходили вашему персонажу или игровому миру. Для создания собственной предыстории вы можете изменить одно умение на любое другое, выбрать два любых навыка и выбрать владение инструментами и языками, чтобы в сумму их было не больше двух, из образцов других предысторий. Вы можете взять набор снаряжения из выбранной предыстории или потратить золото для закупки снаряжения, как сказано в главе 5 (если вы покупаете снаряжение за золото, то уже не получаете начальное снаряжение, даруемое для вашего класса). И наконец, выберите две черты характера, один идеал, одну привязанность и одну слабость. Если вы не можете выбрать умение предыстории, которое подходит именно вам, посоветуйтесь с Мастером и создайте свою собственную.
"""Иногда особое умение или заклинание гласит, что вы совершаете проверку характеристики, спасбросок или бросок атаки с преимуществом или помехой. Когда такое происходит, вы бросаете второй к20. Используйте наибольший результат, если у вас есть преимущество, и наименьший, если есть помеха. Например, если у вас есть помеха, и выпало «17» и «5», вы используете «5». Если бы у вас было преимущество, вы бы использовали «17».
Если на бросок влияют сразу несколько факторов, и все дают преимущество или помеху, бросается всё равно только один дополнительный к20. Например, если сразу несколько благоприятных обстоятельств предоставляют преимущество, вы всё равно кидаете только один дополнительный к20.
Если обстоятельства создают одновременно и преимущество и помеху, то считается, что их нет, и вы бросаете только один к20. Это справедливо даже для обстоятельств, когда негативных факторов много, а положительный только один, и наоборот. В такой ситуации у вас нет ни преимущества, ни помехи.
Если у вас есть преимущество или помеха, и некое особое правило, такое как особенность полуросликов Везучий, позволяет перебросить к20, вы можете перебросить только одну кость. Вы сами выбираете, какую. Например, если полурослик совершает с преимуществом проверку характеристики и выпадает «1» и «13», полурослик может использовать особенность Везучий и перебросить «1».
Обычно преимущества и помехи вызваны особыми умениями, действиями или заклинаниями. Вдохновение (смотрите главу 4) тоже может дать персонажу преимущество в проверке, связанной с его личностью, идеалами или привязанностями. Мастер тоже может решить, что обстоятельства положительно или негативно влияют на проверки и дать преимущество или помеху соответственно."""
Вы опытный преступник с большим послужным списком. Вы провели много времени, вращаясь в преступных кругах, и до сих пор имеете связи с подпольным миром. В отличие от обычных людей вы близко познакомились с убийствами, воровством и жестокостью, что пропитывают низшие слои общества. Вы научились выживать, пренебрегая правилами и ограничениями, которым подчиняются другие.
;
:''Владение навыками:'' Обман, Скрытность
:''Владение инструментами:'' Воровские инструменты, один игровой набор.
;
:''Снаряжение:'' Ломик, комплект обычной тёмной одежды с капюшоном, поясной кошель с 15 зм.
!!!''Преступная направленность''
Существует много разновидностей преступников: в воровской гильдии или другой похожей организации отдельные члены занимаются различным промыслом и играют разные роли. И даже преступники-одиночки обычно занимаются чем-то конкретным.
<table>
<tr>
<th>к8</th>
<th>Направленность</th>
<th>к8</th>
<th>Направленность</th>
</tr>
<tr>
<td>1</td>
<td>Взломщик</td>
<td>5</td>
<td>Контрабандист</td>
</tr>
<tr>
<td>2</td>
<td>Вымогатель</td>
<td>6</td>
<td>Наёмный убийца</td>
</tr>
<tr>
<td>3</td>
<td>Грабитель с большой дороги</td>
<td>7</td>
<td>Скупщик краденого</td>
</tr>
<tr>
<td>4</td>
<td>Карманник</td>
<td>8</td>
<td>Шантажист</td>
</tr>
</table>
!!!''Умение: Криминальные связи''
У вас есть надёжное доверенное лицо, которое выступает в роли вашего связного в криминальных кругах. Вы умеете получать и отправлять сведения связному, даже через большие расстояния: например, вы знаете местных посыльных, продажных караванщиков и нечистых на руку матросов, которые могут доставить сообщение для вас.
!!!''Персонализация''
Преступники на первый взгляд могут выглядеть злодеями, и многие из них действительно злы. Но у некоторых есть такие черты, за которые их можно и простить. Даже среди воров есть честь, но преступники редко относятся с уважением к властям и их представителям.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>У меня всегда есть план на случай, если всё пойдёт не так как задумано.</td>
</tr>
<tr>
<td>2</td>
<td>Я всегда хладнокровен, несмотря ни на что. Я никогда не повышаю голоса и не позволяю эмоциям управлять мной.</td>
</tr>
<tr>
<td>3</td>
<td>На новом месте я первым делом подмечаю, где находятся различные ценности — или места, где они могут быть спрятаны.</td>
</tr>
<tr>
<td>4</td>
<td>Я предпочту обзавестись ещё один другом, нежели ещё одним врагом.</td>
</tr>
<tr>
<td>5</td>
<td>У меня проблемы с доверием. Те, кто выглядят самыми порядочными, зачастую скрывают множество грязных секретов.</td>
</tr>
<tr>
<td>6</td>
<td>Мне наплевать на риск. Никогда не говорите мне о возможных последствиях.</td>
</tr>
<tr>
<td>7</td>
<td>Наилучший способ заставить меня сделать что-то — сказать мне этого не делать.</td>
</tr>
<tr>
<td>8</td>
<td>Я срываюсь даже от малейшего оскорбления.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Честь. Я не краду у своих «коллег». (Законный)</td>
</tr>
<tr>
<td>2</td>
<td>Свобода. Любые оковы должны быть сломлены, как и те, кто их выковал. (Хаотичный)</td>
</tr>
<tr>
<td>3</td>
<td>Милосердие. Я краду у богачей, чтобы помочь людям в беде. (Добрый)</td>
</tr>
<tr>
<td>4</td>
<td>Жадность. Я сделаю всё что угодно, лишь бы разбогатеть. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Друзья. Я верен не каким-то там идеалам, но своим друзьям. А все остальные могут катиться к чертям. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Искупление. В каждом есть что-то хорошее. (Добрый)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я пытаюсь оплатить старый долг одному щедрому благодетелю.</td>
</tr>
<tr>
<td>2</td>
<td>Свои нечестно заработанные деньги я трачу на помощь своей семье.</td>
</tr>
<tr>
<td>3</td>
<td>У меня забрали нечто важное, и я намереваюсь выкрасть это обратно.</td>
</tr>
<tr>
<td>4</td>
<td>Я стану величайшим вором из всех, когда-либо живших.</td>
</tr>
<tr>
<td>5</td>
<td>Я виновен в ужасающем преступлении. Надеюсь, я смогу простить себя за это.</td>
</tr>
<tr>
<td>6</td>
<td>Близкий человек погиб из-за ошибки, которую я совершил. Это не повториться вновь.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Когда я вижу что-то ценное, я не могу думать ни о чём другом, кроме мыслей о том, как это украсть.</td>
</tr>
<tr>
<td>2</td>
<td>Когда я становлюсь перед выбором между друзьями и деньгами, я обычно выбираю деньги.</td>
</tr>
<tr>
<td>3</td>
<td>Если есть какой-то план, я его наверняка забуду. А если не забуду, то попросту проигнорирую.</td>
</tr>
<tr>
<td>4</td>
<td>У меня есть привычка, которая выдаёт меня, когда я вру.</td>
</tr>
<tr>
<td>5</td>
<td>Я поджимаю хвост и убегаю, когда всё складывается плохо.</td>
</tr>
<tr>
<td>6</td>
<td>Невинный человек находится в тюрьме из-за преступления, что я совершил. Меня это не беспокоит.</td>
</tr>
</table>
!!!''Разновидность преступника: Шпион''
Несмотря на то, что ваши способности не слишком отличаются от способностей взломщика или контрабандиста, вы научились применять их в другом ключе: в качестве специалиста по шпионажу. Вполне возможно, что вы — официально уполномоченный агент короны, или же вы просто продаёте добытые сведения тому, кто больше заплатит.
!Добро пожаловать в мою башню рулежного мастерства!
Здесь ты сможешь найти обилие необходимой тебе информации по прекрасному миру правил настольной ролевой игры DnD пятой редакции на русском языке в переводе студии "Фантом". Я, Батя Мотя, настоятельно рекомендую тебе не стесняться пользоваться поиском в правой части страницы (или сверху, если ты используешь современные технологии интернетов на волшебных звонительных плашках), а также удобным оглавлением под ним.
И хотя на данный момент сей компендиум все еще находится в разработке, за исключением всего лишь нескольких неактуальных для игры приложений к книгам вся информация по [[Книге Мастера|$:/DMG]] и [[Книге Игрока|$:/PHB]] здесь имеется.
Если же ты впечатлен проделанной мною работой и испытываешь желание возблагодарить меня, то тогда милости прошу к этому [[ящику для подаяний|$:/Ящик для подаяний]], в который ты можешь опустить любую сумму, которую сочтешь нужным.
//3 уровень, Иллюзия, Волшебник (ритуал)//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 час
"""На полу в свободном пространстве на ваш выбор в пределах дистанции появляется Большое полуреальное похожее на лошадь существо. Вы сами определяете его внешность, но у него есть седло, удила и уздечка. Всё снаряжение, созданное этим заклинанием, исчезает в клубах дыма, если его отнести на 10 футов от скакуна.
Пока заклинание активно, вы или выбранное вами существо можете ехать на скакуне верхом. Используются характеристики ездовой лошади, за исключением того, что скорость существа 100 футов, и оно может проскакать 10 миль за час или 13 миль в быстром темпе. Когда заклинание заканчивается, скакун медленно исчезает, давая ездоку 1 минуту на спешивание. Заклинание оканчивается, если вы окончите его действием или если скакун получит какой-либо урон."""
//3 уровень, Вызов, Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы вызываете фейских духов, принимающих облик зверей и появляющихся в свободном видимом вами пространстве в пределах дистанции. Выберите один из вариантов того, кто появляется:
* Один зверь с показателем опасности 2 или ниже
* Два зверя с показателем опасности 1 или ниже
* Четыре зверя с показателем опасности 1/2 или ниже
* Восемь зверей с показателем опасности 1/4 или ниже
"""Все звери считаются также феями, и они исчезают, когда их хиты опускаются до 0 или когда заклинание оканчивается.
Призванные существа дружественны к вам и вашим спутникам. Совершите проверку инициативы за призванных существ как за одну группу, и они будут совершать свои собственные ходы. Они подчиняются отданным вами устно командам (действие не требуется). Если вы не отдаёте команду, они защищаются от враждебных существ, но действий не совершают.
Параметры существ есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейки большего уровня, вы выбираете один из описанных выше вариантов, но появляется в два раза больше существ при ячейке 5 уровня, в три раза больше при ячейке 7 уровня, и в четыре раза больше при ячейке 9 уровня.
//3 уровень, Вызов, Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (60-футовый конус)
:''Компоненты:'' В, С, М (метательное оружие или один боеприпас)
:''Длительность:'' Мгновенная
Вы метаете немагическое оружие или выстреливаете немагический боеприпас в воздух, создавая конус одинакового оружия, летящего вперёд и потом исчезающего. Все существа в 60-футовом конусе должны преуспеть в спасброске Ловкости. При провале существо получает урон 3к8, а при успехе половину этого урона. Вид урона такой же, как у оружия или боеприпаса, использованного в качестве компонента.
//5 уровень, Вызов, Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С , M (метательное оружие или один боеприпас)
:''Длительность:'' Мгновенная
Вы метаете немагическое оружие или выстреливаете немагический боеприпас в воздух и выбираете точку в пределах дистанции. Сотни экземпляров такого же оружия или боеприпаса падают залпом и потом исчезают. Все существа в цилиндре с радиусом 40 футов и высотой 20 футов должны совершить спасбросок Ловкости. При провале существо получает урон 8к8, а при успехе половину этого урона. Вид урона такой же, как у оружия или боеприпаса, использованного в качестве компонента.
//4 уровень, Вызов, Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (по одной ягоде падуба за каждое призываемое существо)
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы призываете фейских существ, которые появляются в свободном пространстве, которое вы видите в пределах дистанции. Выберите один из вариантов того, кто появляется:
* Одно фейское существо с показателем опасности 2 или ниже
* Два фейских существа с показателем опасности 1 или ниже
* Четыре фейских существа с показателем опасности 1/2 или ниже
* Восемь фейских существ с показателем опасности 1/4 или ниже.
"""Призванное существо исчезает, когда его хиты опускаются до 0, или когда заклинание оканчивается.
Призванные существа дружественны к вам и вашим спутникам. Совершите проверку инициативы за призванных существ как за одну группу, и они будут совершать свои собственные ходы. Они подчиняются отданным вами устно командам (действие не требуется). Если вы не отдаёте команду, они защищаются от враждебных существ, но действий не совершают.
Параметры существ есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейки большего уровня, вы выбираете один из описанных выше вариантов, но появляется в два раза больше существ при ячейке 6 уровня, и в три раза больше при ячейке 8 уровня.
:Параметры существ есть у Мастера.
//4 уровень, Вызов, Волшебник/Друид//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы призываете элементалей, которые появляются в свободном пространстве, которое вы видите в пределах дистанции. Выберите один из вариантов того, кто появляется:
* Один элементаль с показателем опасности 2 или ниже
* Два элементаля с показателем опасности 1 или ниже
* Четыре элементаля с показателем опасности 1/2 или ниже
* Восемь элементалей с показателем опасности 1/4 или ниже
"""Элементаль исчезает, когда его хиты опускаются до 0, или когда заклинание оканчивается.
Призванные существа дружественны к вам и вашим спутникам. Совершите проверку инициативы за призванных существ как за одну группу, и они будут совершать свои собственные ходы. Они подчиняются отданным вами устно командам (действие не требуется). Если вы не отдаёте команду, они защищаются от враждебных существ, но действий не совершают.
Параметры существ есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейки большего уровня, вы выбираете один из описанных выше вариантов, но появляется в два раза больше существ при ячейке 6 уровня, и в три раза больше при ячейке 8 уровня.
//3 уровень, Вызов, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Появляется туча в форме цилиндра 10 футов в высоту и с радиусом 60 футов, с центром в точке, которую вы видите в 100 футах над головой. Заклинание проваливается, если вы не видите точку в воздухе, где должна появиться туча (например, если вы находитесь в комнате, в которой туча не поместится).
Активировав заклинание, выберите видимую точку в пределах дистанции, из тучи в эту точку бьёт разряд молнии. Все существа в пределах 5 футов от этой точки должны совершить спасброски Ловкости. Существо получает урон электричеством 3к10 при провале или половину этого урона в случае успешного спасброска. Пока заклинание активно, вы можете в каждый свой ход действием вызывать новую молнию, в ту же или другую точку.
Если в момент накладывания заклинания вы находитесь на открытом воздухе во время грозы, заклинание не создаёт новую тучу, а даёт контроль над существующей. В такой ситуации урон от заклинания увеличивается на 1к10."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к10 за каждый уровень ячейки выше третьего.
//7 уровень, Вызов, Жрец//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы призываете небожителя с показателем опасности 4 или меньше, появляющегося в свободном месте, которое вы видите в пределах дистанции. Небожитель исчезает, когда его хиты опускаются до 0, или когда заклинание оканчивается.
Небожитель дружественен к вам и вашим спутникам, пока заклинание активно. Совершите проверку инициативы за небожителя, и он будет совершать свои собственные ходы. Он подчиняется отданным вами устно командам (действие не требуется), если они не противоречат его мировоззрению. Если вы не отдаёте команду, он защищается от враждебных существ, но действий не совершает.
Параметры небожителя есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 9 уровня, вы призываете небожителя с показателем опасности 5 или ниже.
//6 уровень, Вызов, Друид/Колдун//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы призываете фейское существо с показателем опасности 6 или меньше, или фейского духа, который принимает облик зверя с показателем опасности 6 или меньше. Существо появляется в свободном месте, которое вы видите в пределах дистанции. Оно исчезает, когда его хиты опускаются до 0, или когда заклинание оканчивается.
Фейское существо дружественно к вам и вашим спутникам, пока заклинание активно. Совершите проверку инициативы за существо, и оно будет совершать свои собственные ходы. Оно подчиняется отданным вами устно командам (действие не требуется), если они не противоречат его мировоззрению. Если вы не отдаёте команду, оно защищается от враждебных существ, но действий не совершает.
Если ваша концентрация нарушена, существо не исчезает. Вместо этого вы теряете над ним контроль, и оно становится враждебным к вам и вашим спутникам, и может напасть. Неуправляемое существо не может быть отпущено вами, но он исчезает через 1 час после того, как оно было призвано.
Параметры фейского существа есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, показатель опасности увеличивается на 1 за каждый уровень ячейки выше шестого.
//5 уровень, Вызов, Волшебник/Друид//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (вода и песок для водяного, горящее благовоние для воздушного, мягкая глина для земляного или сера и фосфор для огненного)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы вызываете прислуживающего элементаля. Выберите область воды, воздуха, земли или огня, помещающуюся в куб с длиной ребра 10 футов. В свободном пространство в пределах 10 клеток от выбранной области появляется соответствующий местности элементаль с показателем опасности 5 или меньше. Например, из костра выходит огненный элементаль, а земляной элементаль выбирается из-под земли. Элементаль исчезает, когда его хиты опускаются до 0, или когда заклинание оканчивается.
Элементаль дружественен к вам и вашим спутникам, пока заклинание активно. Совершите проверку инициативы за элементаля, и он будет совершать свои собственные ходы. Он подчиняется отданным вами устно командам (действие не требуется). Если вы не отдаёте команду, он защищается от враждебных существ, но действий не совершает.
Если ваша концентрация нарушена, элементаль не исчезает. Вместо этого вы теряете над ним контроль, и он становится враждебным к вам и вашим спутникам, и может напасть. Неуправляемый элементаль не может быть отпущен вами, но он исчезает через 1 час после того, как был призван.
Параметры элементаля есть у Мастера."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, показатель опасности увеличивается на 1 за каждый уровень ячейки выше пятого.
//1 уровень, Очарование, Жрец/Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' 1 раунд
"""Вы произносите команду из одного слова существу, которое видите в пределах дистанции. Цель должна преуспеть в спасброске Мудрости, иначе в свой следующий ход будет исполнять эту команду. Заклинание не оказывает эффект, если цель — нежить, если цель не понимает ваш язык, или если ваша команда ему напрямую вредит.
Ниже описаны самые типичные команды и их эффекты. Вы можете отдавать и другие команды. В этом случае поведение цели определяет Мастер. Если цель не может выполнить вашу команду, заклинание оканчивается.
''//Брось.//'' Цель роняет то, что держит, и оканчивает ход.
//''Падай.''// Цель падает ничком и оканчивает ход.
//''Подойди.''// Цель перемещается ближе к вам по кратчайшему и самому прямому маршруту, оканчивая ход, если оказывается в пределах 5 футов от вас.
''//Стой.//'' Цель не перемещается и не совершает никаких действий. Летающее существо продолжает лететь, при условии, что может это делать. Если оно должно лететь, чтобы не упасть, то пролетает минимально необходимое расстояние.
//''Убегай.''// Цель тратит ход на то, что перемещается прочь от вас самым быстрым способом."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете воздействовать на одно дополнительное существо за каждый уровень ячейки выше первого. Существа должны находиться в пределах 30 футов друг от друга, чтобы стать целями.
"""
Игра D&D заключается в том, что группа персонажей пускается в приключение, которое им представляет Мастер. Каждый персонаж привносит в приключение определённые способности в виде характеристик и навыков, классовых умений, расовых особенностей, снаряжения и магических предметов. Каждый персонаж уникален, со своими сильными и слабыми сторонами, поэтому лучший отряд искателей приключений — тот, в котором персонажи дополняют друг друга и прикрывают слабые места своих компаньонов. Искатели приключений должны сотрудничать, чтобы успешно завершить приключение.
Приключение — это сердце игры, история с началом, серединой и концом. Приключение может быть создано Мастером или приобретено в готовом виде, откорректировано и изменено в соответствии с потребностями и желаниями Мастера. В любом случае, приключение происходит в фантастическом окружении, будь то подземелье, рушащийся замок, участок дикой территории или шумный город.
В приключении участвует множество персонажей: искатели приключений, созданные и отыгрываемые игроками за столом; а также неигровые персонажи (НИП). Такие персонажи могут быть покровителями, союзниками, врагами, наёмниками или просто дополнительными декорациями в приключении. Часто один из НИП — злодей, чьи планы побуждают искателей приключений к действию.
В течение своих приключений персонажи сталкиваются с различными существами, объектами, и ситуациями, с которыми они должны взаимодействовать тем или иным образом. Иногда искатели приключений и другие существа делают всё возможное, чтобы убить или взять в плен друг друга в сражении. В другой раз искатели приключений разговаривают с другим существом (или даже с магическим предметом) с определённой целью. Искатели приключений часто решают головоломки, обходят препятствия, ищут что-нибудь спрятанное или разрешают текущую ситуацию. В то же время они исследуют мир, принимают решения о том, какими дорогами путешествовать и что они станут делать дальше.
Приключения различаются по длине и сложности. Короткое приключение может представлять только несколько испытаний и занимать не более одного игрового собрания. Длинное приключение может включать сотни сражений, взаимодействий и других испытаний и занимать десятки собраний протяжённостью в несколько недель или месяцев реального времени. Как правило, приключение заканчивается тем, что герои возвращаются к цивилизации, чтобы отдохнуть и насладиться заработанной добычей.
Но это ещё не конец истории. Вы можете представить, что приключение — один эпизод телесериала, состоящий из нескольких захватывающих сцен. Кампания — ряд серий, цепочка объединённых приключений, включающих группу искателей приключений, присутствующих в центре повествования от начала до конца.
"""
!!! __''Три столпа приключения''__
"""
Искатели приключений могут попытаться сделать всё, что могут вообразить себе игроки, однако будет полезно свести любую деятельность в три основные категории: исследование, социальное взаимодействие и сражение.
''Исследование ''включает в себя путешествия искателей приключений по миру и их взаимодействие с объектами и ситуациями, которые требуют их внимания. Исследование является двусторонним способом взаимодействия: игроки описывают, что совершают их персонажи, а Мастер рассказывает игрокам, что происходит в результате. В большом масштабе это может включать в себя то, как персонажи пересекают холмистую равнину или пробираются в течение часа через подземные пещеры. В малых масштабах исследование может означать то, как один персонаж тянет за рычаг в комнате подземелья, чтобы посмотреть, что произойдёт.
''Социальное взаимодействие'' описывает то, как искатели приключений общаются с кем-либо (или чем-либо). Это может быть требование, чтобы захваченный разведчик раскрыл секретный вход в логово гоблинов, получение информации от спасённого узника, мольба о пощаде, обращённая к вождю орков или попытка убедить разговорчивое волшебное зеркало показать отдалённое место.
В правилах в главах 7 и 8 есть дополнительные сведения по исследованию и социальному взаимодействию, а также вам пригодятся классовые умения в главе 3 и особенности личности из главы 4.
''Сражение ''рассматривается в главе 9, его правила затрагивают персонажей и других существ, размахивающих оружием, накладывающих заклинания, маневрирующих в попытке сокрушить своих противников вне зависимости от того, означает ли это убийство всех врагов, взятие в плен или обращение в бегство. Сражение является наиболее структурированным элементом игры, где существа ходят по очереди, чтобы каждый получил возможность действовать. Даже в пылу ожесточённого сражения у искателей приключений остаётся обилие возможностей: попытаться совершить дурацкий трюк, вроде попытки съехать вниз по лестнице на щите; исследовать окружающую обстановку (например, потянуть загадочный рычаг); начать взаимодействовать с другими существами, в том числе с союзниками, врагами и нейтральными сторонами.
"""
!!! __''Чудеса магии''__
"""
Редкое приключение обходится без каких-либо магических событий. В жизни искателя приключений встречается и полезная и вредоносная магия, и ей посвящены главы 10 и 11.
В мирах D&D практикующие магию персонажи редки, они живут отдельно от большинства людей из-за своего необычайного таланта. Обыватели могут видеть свидетельства магии регулярно, но они обычно незначительны — фантастическое чудовище, видение, снизошедшее молящемуся, волшебник, пересекающий улицу с оживлённым стражем в качестве телохранителя.
Для искателей приключений же магия является ключом к выживанию. Без исцеляющей магии жрецов и паладинов искатели приключений могут быстро умереть от ранений. Без волшебной поддержки бардов и жрецов воины могут быть сокрушены могучими противниками. Без чистой магической мощи и разносторонности волшебников и друидов любая угроза может возрасти десятикратно.
Магия — также любимый инструмент злодеев. Множество приключений основано на интригах заклинателей, которые безрассудно используют магию, пока не случится катастрофа. Лидер культа стремится пробудить бога, дремлющего в пучинах моря; ведьма похищает юношей, чтобы поглотить их энергию; безумный волшебник трудится, чтобы сколотить армию магически оживлённых големов; дракон начинает мистический ритуал, чтобы возвыситься до божества разрушения — всё это только несколько примеров угроз магической природы, с которыми искатели приключений могут столкнуться. Но с магией в своём арсенале в виде заклинаний и волшебных предметов, искатели приключений могут одержать победу!
"""
//3 уровень, Некромантия, Волшебник/Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Касание вашей окутанной тенями рукой может вытягивать жизненные силы у других, залечивая ваши раны. Совершите рукопашную атаку заклинанием по существу в пределах вашей досягаемости. При попадании цель получает урон некротической энергией 3к6, а вы восстанавливаете количество хитов, равное половине причинённого урона некротической энергией. Пока заклинание активно, вы в каждом ходу можете действием совершать эту атаку.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше третьего.
"""Состояния различными способами изменяют возможности существа и могут являться следствием заклинания, классового умения, атаки чудовища или другого эффекта. Большинство состояний, вроде состояния «ослеплённый», негативны, но некоторые из них, например, «невидим», могут быть полезны.
Состояние длится до тех пор, пока не будет прервано (например, состояние «сбитый с ног» прерывается, когда существо встаёт) или в течение времени, которое указано в эффекте, вызвавшем это состояние.
Если разные эффекты вводят существо в одно и то же состояние, каждый из случаев имеет отдельную длительность, но эффекты состояния не становятся сильнее. Существо либо имеет состояние, либо не имеет его.
Приведённые ниже описания определяют, что происходит с персонажем в том или ином состоянии."""
{{Истощение}}
{{Бессознательный}}
{{Испуганный}}
{{Невидимый}}
{{Недееспособный}}
{{Оглохший}}
{{Окаменевший}}
{{Опутанный}}
{{Ослеплённый}}
{{Отравленный}}
{{Очарованный}}
{{Схваченный}}
{{Ошеломлённый}}
{{Сбитый с ног/ Лежащий ничком}}
{{Парализованный}}
"""Религия — важная часть жизни миров мультивселенной D&D. Когда боги путешествуют по миру, жрецы призывают божественную силу, злые культы исполняют тёмные ритуалы в подземельях, а паладины в сияющих доспехах, подобно маякам, встают против тьмы, сложно сомневаться и отрицать существование богов.
В мирах D&D многие люди в разное время и при разных обстоятельствах поклоняются разным богам. Жители Забытых Королевств, к примеру, могут вознести молитву Сьюни на удачу в любви, принести дар Вокину, перед тем как отправиться на рынок, а во время сильного шторма помолиться, чтобы умиротворить Талоса — и всё это в один и тот же день. Многие люди выделяют среди богов фаворита, того, чьи идеалы и учения становятся их собственными. А некоторые всецело посвящают себя служению одному богу. Как правило, это жрецы или поборники идеалов этого бога.
Ваш Мастер решает, каким богам, если они есть, поклоняются в его кампании. Из их числа вы можете выбрать божество для своего персонажа, которому он будет служить, поклоняться или делать вид, что поклоняется. Также вы можете выбрать нескольких богов, которым ваш персонаж молится чаще, или просто запомните, каким богам поклоняются в кампании вашего Мастера, чтобы при необходимости упомянуть их имена. Если вы играете жрецом или персонажем с предысторией Прислужник, решите, какому божеству вы служите или служили, и примите во внимание домены, связанные с этим божеством, при выборе домена персонажа."""
!!!__''Пантеоны D&D''__
В каждом мире мультивселенной D&D свои пантеоны богов, начиная от обширных пантеонов Забытых Королевств и Серого Ястреба, заканчивая более централизованными религиями миров Эберрон и Сага о Копье. Многие нечеловеческие расы поклоняются одним и тем же богам в разных мирах. Морадина, например, почитают дварфы Забытых Королевств, Серого Ястреба и многих других миров.
<<<
!!!''Домены жизни и смерти''
"""Многие божества отвечают за домен жизни, особенно те, что связаны с лечением, защитой, рождением, воспитанием или плодородием. Однако, как описано в главе 3, домен Жизни невероятно широк, и его могут выбирать жрецы любого незлого божества.
Множество других божеств, особенно злых, отвечают за домен Смерти, который описан в Руководстве Мастера. Большинство жрецов, выбравших этот домен — злые НИП, но если хотите поклоняться богу смерти, посоветуйтесь с Мастером."""
<<<
!!!''Забытые Королевства''
В мире Забытых Королевств множество богов вызывают почтение, благоговейный трепет или страх. В Королевствах широко известны по меньшей мере тридцать богов, и куда большему числу богов поклоняются отдельные племена, небольшие культы или некоторые секты более крупных религиозных храмов.
!!!''Серый Ястреб''
Боги мира Серого Ястреба происходят, по меньшей мере, из четырёх пантеонов, представляющих верования различных этнических групп, населявших материк Орик на протяжении веков. В результате у пантеонов много общего: например, Пелор — это фланаэсский, бог солнца, а Фолтус — оридианский бог солнца.
!!!''Сага о Копье''
Боги мира Кринн делятся на три группы: семь богов добра во главе с Паладайном и Мишакаль, семь богов равновесия во главе с Гилеаном и семь богов зла во главе с Такхизис и Саргоннасом. На протяжении истории мира эти божества сменили множество имён, их почитали и проклинали разные народы и культуры, но лишь они являются богами этого мира, и место их на небе, среди звёзд.
!!!''Эберрон''
"""В мире Эберрон много различных религий, но наиболее важная из них связана с пантеоном Верховных Владык и их пагубной тенью — Тёмной Шестёркой. Считается, что Верховные Владыки обладают властью над всеми аспектами существования и единодушны в своих решениях, а Тёмная Шестёрка — грубые, кровавые и жестокие боги, которые не сходятся во взглядах.
Другие религии Эберрона весьма отличаются от традиционных пантеонов D&D. Монотеистическая Церковь Серебряного пламени посвятила себя искоренению зла в мире, но её собственные ряды поражены порчей. Философия Крови Вол учит тому, что божественность присуща всем смертным, и почитает нежить, которая обрела это бессмертие. Всевозможные безумные культы поклоняются демонам и ужасам, заключённым в Подземье Эберрона (которое называют Хайбером, Драконом Глубин). Последователи Пути Света верят, что мир движется к светлому будущему, в котором тени, окутавшие мир, обратятся в свет. А два родственных государства эльфов поклоняются своим духовным предкам: Бессмертному Двору, сохранившемуся в форме духов и даже нежити, и прославленным Духам Прошлого — великим героям войн древности."""
!!!''Не-человеческие боги''
Некоторым богам, ассоциирующимся с не-человеческими расами, поклоняются во многих мирах, пусть и не всегда одинаково. Такие боги есть у не-человеческих рас Забытых Королевств и мира Серого Ястреба. К примеру, помимо Морадина к богам дварфов относится его жена — Берронар Истинное Серебро и ряд других богов, которые считаются их детьми и внуками: Аббатор, Клангеддин Сребробородый, Дагмарен Светлая Мантия, Думатойн, Горм Галтин, Хаэла Светлый Топор, Мартаммор Дьюин, Шариндлар, Тард Харр и Вергадейн. Отдельные кланы и королевства дварфов могут почитать некоторых, всех или ни одного из этих богов, а у некоторых другие боги — неизвестные посторонним (или известные под другими именами).
<$reveal type="nomatch" state="$:/state/FGRGods" text="show">
<$button set="$:/state/FGRGods" setTo="show">''Боги мира Забытых Королевств''</$button>
</$reveal>
<$reveal type="match" state="$:/state/FGRGods" text="show">
<$button set="$:/state/FGRGods" setTo="hide">Боги мира Забытых Королевств (Скрыть)</$button>
!!!''Боги мира Забытых Королевств''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Азут, бог волшебников</td>
<td>ЗН</td>
<td>Знание</td>
<td>Очерченная огнём левая рука</td>
</tr>
<tr>
<td>Амберли, богиня морей</td>
<td>ХЗ</td>
<td>Буря</td>
<td>Волны, расходящиеся влево и вправо</td>
</tr>
<tr>
<td>Баал, бог убийства</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Череп, окружённый кольцом капель крови</td>
</tr>
<tr>
<td>Бешаба, богиня несчастья</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Чёрные оленьи рога</td>
</tr>
<tr>
<td>Бэйн, бог тирании</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Чёрная кисть правой руки, собранная в кулак</td>
</tr>
<tr>
<td>Вокин, богиня торговли</td>
<td>Н</td>
<td>Знание, Обман</td>
<td>Монета с изображением Вокин в профиль, смотрящей влево</td>
</tr>
<tr>
<td>Гонд, бог ремёсел</td>
<td>Н</td>
<td>Знание</td>
<td>Зубчатая шестерёнка с четырьмя спицами</td>
</tr>
<tr>
<td>Денеир, бог письменности</td>
<td>НД</td>
<td>Знание</td>
<td>Горящая свеча с открытым глазом</td>
</tr>
<tr>
<td>Ильматер, бог стойкости</td>
<td>ЗД</td>
<td>Жизнь</td>
<td>Руки, на запястьях связанные красным шнуром</td>
</tr>
<tr>
<td>Келемвор, бог смерти</td>
<td>ЗН</td>
<td>Смерть</td>
<td>Рука скелета, держащая уравновешенные весы</td>
</tr>
<tr>
<td>Латандер, бог рождения и обновления</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Дорога, ведущая к восходу</td>
</tr>
<tr>
<td>Лейра, богиня иллюзий</td>
<td>ХН</td>
<td>Обман</td>
<td>Направленный вниз треугольник с вихрем тумана</td>
</tr>
<tr>
<td>Ллиира, богиня веселья</td>
<td>ХД</td>
<td>Жизнь</td>
<td>Треугольник из трёх шестиконечных звёзд</td>
</tr>
<tr>
<td>Ловиатар, богиня боли</td>
<td>ЗЗ</td>
<td>Смерть</td>
<td>Девятихвостая плеть с шипами</td>
</tr>
<tr>
<td>Майликки, богиня лесов</td>
<td>НД</td>
<td>Природа</td>
<td>Голова единорога</td>
</tr>
<tr>
<td>Малар, бог охоты</td>
<td>ХЗ</td>
<td>Природа</td>
<td>Когтистая лапа</td>
</tr>
<tr>
<td>Маск, бог воров</td>
<td>ХН</td>
<td>Обман</td>
<td>Чёрная маска</td>
</tr>
<tr>
<td>Милил, бог поэзии и песен</td>
<td>НД</td>
<td>Свет</td>
<td>Пятиструнная арфа из листьев</td>
</tr>
<tr>
<td>Миркул, бог смерти</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Белый человеческий череп</td>
</tr>
<tr>
<td>Мистра, богиня магии</td>
<td>НД</td>
<td>Знание</td>
<td>Круг из семи звёзд или девять звёзд, окружающих текущий красный туман, или одна звезда</td>
</tr>
<tr>
<td>Огма, богиня знаний</td>
<td>Н</td>
<td>Знание</td>
<td>Чистый свиток</td>
</tr>
<tr>
<td>Ориль, богиня зимы</td>
<td>НЗ</td>
<td>Буря, Природа</td>
<td>Шестиконечная снежинка</td>
</tr>
<tr>
<td>Саврас, бог предсказаний и судьбы</td>
<td>ЗН</td>
<td>Знание</td>
<td>Хрустальный шар с множеством глаз</td>
</tr>
<tr>
<td>Селунэ, богиня луны</td>
<td>ХД</td>
<td>Жизнь, Знание</td>
<td>Глаза, окружённые семью звёздами</td>
</tr>
<tr>
<td>Сильванус, бог дикой природы</td>
<td>Н</td>
<td>Природа</td>
<td>Дубовый лист</td>
</tr>
<tr>
<td>Сьюни, богиня любви и красоты</td>
<td>ХД</td>
<td>Жизнь, Свет</td>
<td>Лицо прекрасной рыжеволосой женщины</td>
</tr>
<tr>
<td>Талона, богиня болезней и ядов</td>
<td>ХЗ</td>
<td>Смерть</td>
<td>Три капли в треугольнике</td>
</tr>
<tr>
<td>Талос, бог бурь</td>
<td>ХЗ</td>
<td>Буря</td>
<td>Три молнии, бьющие из одной точки</td>
</tr>
<tr>
<td>Темпус, бог войны</td>
<td>Н</td>
<td>Война</td>
<td>Вертикальный пламенеющий меч</td>
</tr>
<tr>
<td>Торм, бог отваги и самопожертвования</td>
<td>ЗД</td>
<td>Война</td>
<td>Правая латная рукавица белого цвета</td>
</tr>
<tr>
<td>Тимора, богиня удачи</td>
<td>ХД</td>
<td>Обман</td>
<td>Монета, решкой вверх</td>
</tr>
<tr>
<td>Тир, бог правосудия</td>
<td>ЗД</td>
<td>Война</td>
<td>Сбалансированные весы на боевом молоте</td>
</tr>
<tr>
<td>Хельм, бог защиты</td>
<td>ЗН</td>
<td>Жизнь, Свет</td>
<td>Глаз на левой латной рукавице</td>
</tr>
<tr>
<td>Цирик, бог лжи</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Белый череп без нижней челюсти в ореоле чёрных или фиолетовых лучей</td>
</tr>
<tr>
<td>Чонтиа, богиня земледелия</td>
<td>НД</td>
<td>Жизнь</td>
<td>Пучок колосьев или цветущая роза перед колосьями</td>
</tr>
<tr>
<td>Шар, богиня тьмы и утрат</td>
<td>НЗ</td>
<td>Обман, Смерть</td>
<td>Чёрный диск с фиолетовым контуром</td>
</tr>
<tr>
<td>Эльдат, богиня мира</td>
<td>НД</td>
<td>Жизнь, Природа</td>
<td>Водопад, низвергающийся в спокойный пруд</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/GHGods" text="show">
<$button set="$:/state/GHGods" setTo="show">''Боги мира Серый Ястреб''</$button>
</$reveal>
<$reveal type="match" state="$:/state/GHGods" text="show">
<$button set="$:/state/GHGods" setTo="hide">Боги мира Серый Ястреб (Скрыть)</$button>
!!!''Боги мира Серый Ястреб''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Беори, богиня природы</td>
<td>Н</td>
<td>Природа</td>
<td>Зелёный диск</td>
</tr>
<tr>
<td>Боккоб, бог магии</td>
<td>Н</td>
<td>Знание</td>
<td>Глаз в пентаграмме</td>
</tr>
<tr>
<td>Векна, бог злых тайн</td>
<td>НЗ</td>
<td>Знание</td>
<td>Рука с глазом на ладони</td>
</tr>
<tr>
<td>Ви Джас, богиня магии и смерти</td>
<td>ЗН</td>
<td>Знание, Смерть</td>
<td>Красный череп на фоне огненного шара</td>
</tr>
<tr>
<td>Инкабулос, бог мора и голода</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Глаз рептилии в ромбе, расположенном горизонтально</td>
</tr>
<tr>
<td>Истус, богиня рока и судьбы</td>
<td>Н</td>
<td>Знание</td>
<td>Веретено с тремя нитями</td>
</tr>
<tr>
<td>Иуз, бог боли и угнетения</td>
<td>ХЗ</td>
<td>Смерть</td>
<td>Ухмыляющийся человеческий череп</td>
</tr>
<tr>
<td>Корд, бог атлетики и спорта</td>
<td>ХД</td>
<td>Буря, Война</td>
<td>Четыре копья и четыре булавы, расходящиеся по кругу из одной точки</td>
</tr>
<tr>
<td>Нерулл, бог смерти</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Череп с серпом или косой</td>
</tr>
<tr>
<td>Обад-Хай, бог природы</td>
<td>Н</td>
<td>Природа</td>
<td>Дубовый лист и жёлудь</td>
</tr>
<tr>
<td>Олидаммара, бог веселья</td>
<td>ХН</td>
<td>Обман</td>
<td>Смеющаяся маска</td>
</tr>
<tr>
<td>Пелор, бог солнца и исцеления</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Солнце</td>
</tr>
<tr>
<td>Ралишаз, бог несчастья и безумия</td>
<td>ХН</td>
<td>Обман</td>
<td>Три гадальных кости</td>
</tr>
<tr>
<td>Рао, бог мира и разума</td>
<td>ЗД</td>
<td>Знание</td>
<td>Белое сердце</td>
</tr>
<tr>
<td>Святой Кутберт, бог здравого смысла и рвения</td>
<td>ЗН</td>
<td>Знание</td>
<td>Круг со звездой и исходящими от неё лучами</td>
</tr>
<tr>
<td>Селестиан, бог звёзд и путников</td>
<td>Н</td>
<td>Знание</td>
<td>Дуга из семи звёзд внутри круга</td>
</tr>
<tr>
<td>Тариздун, бог вечной тьмы</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Тёмная спираль или перевёрнутый зиккурат</td>
</tr>
<tr>
<td>Тритерион, бог свободы и возмездия</td>
<td>ХД</td>
<td>Война</td>
<td>Трискелион (знак, представляющий собой три бегущие ноги, выходящие из одной точки)</td>
</tr>
<tr>
<td>Ула, богиня холмов и гор</td>
<td>ЗД</td>
<td>Война, Жизнь</td>
<td>Гора с кругом посредине</td>
</tr>
<tr>
<td>Фарлангун, бог горизонтов и путешествий</td>
<td>НД</td>
<td>Знание, Обман</td>
<td>Круг, пересечённый искривлённой линией горизонта</td>
</tr>
<tr>
<td>Фолтус, бог света и закона</td>
<td>ЗД</td>
<td>Свет</td>
<td>Серебряное солнце или полная луна, частично перекрытая меньшим полумесяцем</td>
</tr>
<tr>
<td>Хекстор, бог войны и раздоров</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Шесть стрел, расположенные веером и направленные наконечниками вниз</td>
</tr>
<tr>
<td>Хиронеус, бог рыцарства и доблести</td>
<td>ЗД</td>
<td>Война</td>
<td>Молния</td>
</tr>
<tr>
<td>Элонна, богиня лесов</td>
<td>НД</td>
<td>Жизнь, Природа</td>
<td>Рог единорога</td>
</tr>
<tr>
<td>Эритнул, бог зависти и убийства</td>
<td>ХЗ</td>
<td>Война</td>
<td>Капля крови</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/DLGods" text="show">
<$button set="$:/state/DLGods" setTo="show">''Боги мира Саги о Копье''</$button>
</$reveal>
<$reveal type="match" state="$:/state/DLGods" text="show">
<$button set="$:/state/DLGods" setTo="hide">Боги мира Саги о Копье (Скрыть)</$button>
!!!''Боги мира Саги о Копье''
<table>
<tr>
<th>Боги Добра</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Паладайн, бог правителей и защитников</td>
<td>ЗД</td>
<td>Война</td>
<td>Серебряный треугольник</td>
</tr>
<tr>
<td>Бранчала, бог музыки</td>
<td>НД</td>
<td>Свет</td>
<td>Арфа барда</td>
</tr>
<tr>
<td>Хаббакук, бог животного мира и моря</td>
<td>НД</td>
<td>Буря, Природа</td>
<td>Синяя птица</td>
</tr>
<tr>
<td>Кири-Джолит, бог отваги и войны</td>
<td>ЗД</td>
<td>Война</td>
<td>Рог бизона</td>
</tr>
<tr>
<td>Маджере, бог медитации и порядка</td>
<td>ЗД</td>
<td>Знание</td>
<td>Медный паук</td>
</tr>
<tr>
<td>Мишакаль, богиня исцеления</td>
<td>ЗД</td>
<td>Жизнь, Знание</td>
<td>Синий символ бесконечности</td>
</tr>
<tr>
<td>Солинари, бог доброй магии</td>
<td>ЗД</td>
<td>Нет жрецов</td>
<td>Белый круг или сфера</td>
</tr>
<tr>
<th>Боги Равновесия</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Гилеан, бог знаний</td>
<td>Н</td>
<td>Знание</td>
<td>Открытая книга</td>
</tr>
<tr>
<td>Числев, богиня природы</td>
<td>Н</td>
<td>Природа</td>
<td>Перо</td>
</tr>
<tr>
<td>Реоркс, бог ремёсел</td>
<td>Н</td>
<td>Знание</td>
<td>Кузнечный молот</td>
</tr>
<tr>
<td>Шинаре, богиня богатства и торговли</td>
<td>Н</td>
<td>Знание, Обман</td>
<td>Крыло грифона</td>
</tr>
<tr>
<td>Сиррион, бог огня и изменения</td>
<td>Н</td>
<td>Природа</td>
<td>Разноцветный огонь</td>
</tr>
<tr>
<td>Зивилин, бог мудрости</td>
<td>Н</td>
<td>Знание</td>
<td>Большое зелёное или золотое древо</td>
</tr>
<tr>
<td>Лунитари, богиня нейтральной магии</td>
<td>Н</td>
<td>Нет жрецов</td>
<td>Красный круг или сфера</td>
</tr>
<tr>
<th>Боги Зла</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Такхизис, богиня ночи и ненависти</td>
<td>ЗЗ</td>
<td>Смерть</td>
<td>Чёрный полумесяц</td>
</tr>
<tr>
<td>Кемош, бог нежити</td>
<td>ЗЗ</td>
<td>Смерть</td>
<td>Жёлтый череп</td>
</tr>
<tr>
<td>Хиддукель, бог лжи и жадности</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Сломанные весы</td>
</tr>
<tr>
<td>Моргион, бог болезни и тайн</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Капюшон с двумя красными глазами</td>
</tr>
<tr>
<td>Саргоннас, бог мести и огня</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Стилизованный красный кондор</td>
</tr>
<tr>
<td>Зебоим, богиня морей и бурь</td>
<td>ХЗ</td>
<td>Буря</td>
<td>Черепаший панцирь</td>
</tr>
<tr>
<td>Нуитари, бог злой магии</td>
<td>ЗЗ</td>
<td>Нет жрецов</td>
<td>Чёрный круг или сфера</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/EbGods" text="show">
<$button set="$:/state/EbGods" setTo="show">''Боги мира Эберрон''</$button>
</$reveal>
<$reveal type="match" state="$:/state/EbGods" text="show">
<$button set="$:/state/EbGods" setTo="hide">Боги мира Эберрон (Скрыть)</$button>
!!!''Боги мира Эберрон''
<table>
<tr>
<th>Верховные Владыки</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Аравай, богиня плодородия</td>
<td>НД</td>
<td>Жизнь, Природа</td>
<td>Сноп пшеницы, связанный зелёной лентой</td>
</tr>
<tr>
<td>Балинор, бог зверей и охоты</td>
<td>Н</td>
<td>Жизнь, Природа</td>
<td>Оленьи рога</td>
</tr>
<tr>
<td>Болдрей, богиня общества и дома</td>
<td>ЗД</td>
<td>Жизнь</td>
<td>Огонь в каменном сердце</td>
</tr>
<tr>
<td>Дол Арра, богиня солнечного света и отваги</td>
<td>ЗД</td>
<td>Война, Свет</td>
<td>Восходящее солнце</td>
</tr>
<tr>
<td>Дол Дорн, бог физической силы</td>
<td>ХД</td>
<td>Война</td>
<td>Длинный меч на щите</td>
</tr>
<tr>
<td>Кол Корран, бог торговли и богатства</td>
<td>Н</td>
<td>Обман</td>
<td>Девятигранная золотая монета</td>
</tr>
<tr>
<td>Олладра, богиня удачи</td>
<td>НД</td>
<td>Жизнь, Обман</td>
<td>Домино</td>
</tr>
<tr>
<td>Онатар, бог ремёсел</td>
<td>НД</td>
<td>Знание</td>
<td>Скрещённые молот и клещи</td>
</tr>
<tr>
<td>Ореон, бог закона и знаний</td>
<td>ЗН</td>
<td>Знание</td>
<td>Открытая книга</td>
</tr>
<tr>
<th>Тёмная Шестёрка</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Насмешник, бог насилия и предательства</td>
<td>НЗ</td>
<td>Война</td>
<td>Пять инструментов, забрызганных кровью</td>
</tr>
<tr>
<td>Пожиратель, бог гнева природы</td>
<td>НЗ</td>
<td>Буря</td>
<td>Связка из пяти заострённых костей</td>
</tr>
<tr>
<td>Странник, бог хаоса и изменений</td>
<td>ХН</td>
<td>Знание, Обман</td>
<td>Четыре скрещённые, исписанные рунами кости</td>
</tr>
<tr>
<td>Тень, бог тёмной магии</td>
<td>ХЗ</td>
<td>Знание</td>
<td>Обсидиановая башня</td>
</tr>
<tr>
<td>Хранитель, бог жадности и смерти</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Осколок дракона в форме клыка</td>
</tr>
<tr>
<td>Ярость, богиня гнева и безумия</td>
<td>НЗ</td>
<td>Война</td>
<td>Крылатый змей с головой и торсом женщины</td>
</tr>
<tr>
<th>Другие боги</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Серебряное Пламя, божество защиты и добра</td>
<td>ЗД</td>
<td>Война, Жизнь, Свет</td>
<td>Пламя, нарисованное на серебре или отлитое из серебра</td>
</tr>
<tr>
<td>Кровь Вол, философия бессмертия и нежити</td>
<td>ЗН</td>
<td>Жизнь, Смерть</td>
<td>Стилизованный драконий череп на красной каплевидной жемчужине</td>
</tr>
<tr>
<td>Культы Дракона Глубин, божества безумия</td>
<td>НЗ</td>
<td>Обман</td>
<td>Различные</td>
</tr>
<tr>
<td>Путь Света, философия света и самосовершенствования</td>
<td>ЗН</td>
<td>Жизнь, Свет</td>
<td>Блестящий кристалл</td>
</tr>
<tr>
<td>Бессмертный Двор, эльфийские предки</td>
<td>НД</td>
<td>Жизнь, Знание</td>
<td>Различные</td>
</tr>
<tr>
<td>Духи Прошлого, эльфийские предки</td>
<td>ХД</td>
<td>Война</td>
<td>Различные</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/OtherGods" text="show">
<$button set="$:/state/OtherGods" setTo="show">''Не-человеческие Боги''</$button>
</$reveal>
<$reveal type="match" state="$:/state/OtherGods" text="show">
<$button set="$:/state/OtherGods" setTo="hide">Не-человеческие Боги (Скрыть)</$button>
!!!''Не-человеческие божества''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Багамут, драконий бог добра</td>
<td>ЗД</td>
<td>Война, Жизнь</td>
<td>Профиль драконьей головы</td>
</tr>
<tr>
<td>Блибдулпулп, богиня куо-тоа</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Голова лобстера или чёрная жемчужина</td>
</tr>
<tr>
<td>Гарл Златоблеск, гномий бог обмана и уловок</td>
<td>ЗД</td>
<td>Обман</td>
<td>Золотой самородок</td>
</tr>
<tr>
<td>Глубинный Сашелас, эльфийский бог морей</td>
<td>ХД</td>
<td>Буря, Природа</td>
<td>Дельфин</td>
</tr>
<tr>
<td>Гролантор, бог войны холмовых великанов</td>
<td>ХЗ</td>
<td>Война</td>
<td>Деревянная дубинка</td>
</tr>
<tr>
<td>Груумш, орочий бог бурь и войны</td>
<td>ХЗ</td>
<td>Буря, Война</td>
<td>Немигающий глаз</td>
</tr>
<tr>
<td>Йондалла, богиня плодородия и защиты полуросликов</td>
<td>ЗД</td>
<td>Жизнь</td>
<td>Щит</td>
</tr>
<tr>
<td>Кореллон Ларетиан, эльфийский бог искусства и магии</td>
<td>ХД</td>
<td>Свет</td>
<td>Месяц или звезда</td>
</tr>
<tr>
<td>Куртулмак, кобольдский бог войны и горного дела</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Гномий череп</td>
</tr>
<tr>
<td>Лаогзед, троглодитский бог голода</td>
<td>ХЗ</td>
<td>Смерть</td>
<td>Изображение бога ящерицы/ жабы</td>
</tr>
<tr>
<td>Лолс, богиня пауков дроу</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Паук</td>
</tr>
<tr>
<td>Маглубиет, гоблинский бог войны</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Окровавленный топор</td>
</tr>
<tr>
<td>Морадин, дварфский гном создания</td>
<td>ЗД</td>
<td>Знание</td>
<td>Молот и наковальня</td>
</tr>
<tr>
<td>Риллифэйн Раллатил, бог природы лесных эльфов</td>
<td>ХД</td>
<td>Природа</td>
<td>Дуб</td>
</tr>
<tr>
<td>Сеанин Лунный Лук, эльфийская богиня луны</td>
<td>ХД</td>
<td>Знание</td>
<td>Полумесяц</td>
</tr>
<tr>
<td>Секола, сахуагинский бог охоты</td>
<td>ЗЗ</td>
<td>Буря, Природа</td>
<td>Акула</td>
</tr>
<tr>
<td>Семуанья, богиня выживания людоящеров</td>
<td>Н</td>
<td>Жизнь</td>
<td>Яйцо</td>
</tr>
<tr>
<td>Скеррит, бог природы кентавров и сатиров</td>
<td>Н</td>
<td>Природа</td>
<td>Дуб, растущий из жёлудя</td>
</tr>
<tr>
<td>Скориус Камнекост, бог каменных великанов и искусства</td>
<td>Н</td>
<td>Знание</td>
<td>Сталактит</td>
</tr>
<tr>
<td>Сурт, бог огненных великанов и ремёсел</td>
<td>ЗЗ</td>
<td>Война, Знание</td>
<td>Пламенеющий меч</td>
</tr>
<tr>
<td>Трим, бог морозных великанов и силы</td>
<td>ХЗ</td>
<td>Война</td>
<td>Белый меч с двумя клинками</td>
</tr>
<tr>
<td>Тиамат, драконья богиня зла</td>
<td>ЗЗ</td>
<td>Обман</td>
<td>Драконья голова с пятью метками от когтей</td>
</tr>
<tr>
<td>Хруггек, бог жестокости багбиров</td>
<td>ХЗ</td>
<td>Война</td>
<td>Моргенштерн</td>
</tr>
<tr>
<td>Эадро, мерфолкский бог морей</td>
<td>Н</td>
<td>Буря, Природа</td>
<td>Спиральный узор</td>
</tr>
</table>
</$reveal>
!!!__''Фэнтезийно-исторические пантеоны''__
Кельтские, египетские, греческие и скандинавские пантеоны — фэнтезийная интерпретация древних религий нашего мира. В них включены боги, наиболее подходящие для использования в D&D. Для потребностей игры они извлечены из исторического контекста и объединены в пантеоны.
!!!''Кельтский пантеон''
Говорят, что в сердце каждой души скрыто нечто первозданное, место, что небезразлично к крикам гусей в ночи, шёпоту ветра в соснах и красной омеле на дубе — это то место, где живут кельтские боги. Они вышли из ручьёв и рек, их могущество подпитывается силой дуба и красотой лесов и вересковых пустошей. Когда первый лесной житель решился наделить именем лик, увиденный в стволе дерева, или голос, журчащий в ручье, эти боги обрели плоть и кровь.
Кельтским богам чаще служат друиды, чем жрецы, поскольку они тесно связаны с силами природы, которые почитают друиды.
!!!''Греческий пантеон''
Боги Олимпа проявляются в нежном биении волн о берег и в раскатах грома у скрывающихся в облаках горных пиков. Их следы видны в населённых кабанами лесах и в оливковых рощах. Они проявляются во всех аспектах естества, и тоже селятся в человеческих сердцах.
!!!''Египетский пантеон''
"""Эти боги — молодая династия, унаследовавшая правление миром и поддерживание божественного порядка Маат — фундаментального закона истины, справедливости и порядка, расставляющего богов, фараонов и обычных мужчин и женщин на положенное им место.
Египетский пантеон необычен тем, что в нём есть сразу три божества домена Смерти с разными мировоззрениями. Анубис — законно-нейтральный бог загробной жизни, судивший души мертвецов. Сет — хаотично-злой бог убийств, прославившийся убийством своего брата Осириса. Нефтида — хаотично-добрая богиня скорби. Таким образом, несмотря на то, что жрецы домена Смерти (описан в Руководстве Мастера) это чаще всего злодеи, прислужники Анубиса и Нефтиды не обязаны быть такими."""
!!!''Скандинавский пантеон''
"""Там, где заснеженные холмы переходят в ледяные фьорды, там, где на пляж вытаскивают ладьи, там, где ледники то наступают, то отступают, там земли викингов, дом скандинавского пантеона. Там суровый климат и суровая жизнь. Воинам этих земель пришлось приспособиться к таким условиям, чтобы выжить. Учитывая необходимость постоянно совершать набеги в поисках пропитания и богатств, удивительно, что смертные остались сами собой. Их сила отражает необходимость этих воителей в сильном правлении и решительных действиях. Именно поэтому они видели божеств в изгибах рек, слышали их в раскатах грома и рокоте ледников, и чувствовали их в дыме горящих жилищ.
В скандинавский пантеон входят два семейства, Асы (божества войны и судьбы) и Ваны (божества плодородия и процветания). Бывшие ранее врагами, теперь эти семейства объединились против общих врагов, великанов (включая богов Сурта и Трима). Так же как боги мира Серого Ястреба, божества из разных семейств иногда имеют общие сферы влияния. Например, и Фрейя (из Ванов) и Од (из Асов) связаны с солнцем."""
<$reveal type="nomatch" state="$:/state/KGods" text="show">
<$button set="$:/state/KGods" setTo="show">''Кельтские боги''</$button>
</$reveal>
<$reveal type="match" state="$:/state/KGods" text="show">
<$button set="$:/state/KGods" setTo="hide">Кельтские боги (Скрыть)</$button>
!!!''Кельтские боги''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Дагда, бог погоды и посевов</td>
<td>ХД</td>
<td>Обман, Природа</td>
<td>Кипящий котёл или щит</td>
</tr>
<tr>
<td>Араун, бог жизни и смерти</td>
<td>НЗ</td>
<td>Жизнь, Смерть</td>
<td>Чёрная звезда на сером поле</td>
</tr>
<tr>
<td>Беленус, бог солнца, света и тепла</td>
<td>НД</td>
<td>Свет</td>
<td>Солнечный диск и стоящие камни</td>
</tr>
<tr>
<td>Бригантия, богиня рек и домашнего скота</td>
<td>НД</td>
<td>Жизнь</td>
<td>Мостик</td>
</tr>
<tr>
<td>Гоибниу, бог кузнецов и исцеления</td>
<td>НД</td>
<td>Жизнь, Знание</td>
<td>Гигантский молот над мечом</td>
</tr>
<tr>
<td>Диан Кехт, бог медицины и исцеления</td>
<td>ЗД</td>
<td>Жизнь</td>
<td>Скрещённые ветви дуба и омелы</td>
</tr>
<tr>
<td>Дунатис, бог гор и скал</td>
<td>Н</td>
<td>Природа</td>
<td>Красный скала с солнцем на вершине</td>
</tr>
<tr>
<td>Луг, бог искусств, путешествий и торговли</td>
<td>ХН</td>
<td>Жизнь, Знание</td>
<td>Пара длинных рук</td>
</tr>
<tr>
<td>Мананнан Мак Лир, бог океанов и морских созданий</td>
<td>ЗН</td>
<td>Буря, Природа</td>
<td>Волна белой воды на зелёном поле</td>
</tr>
<tr>
<td>Морриган, богиня битв</td>
<td>ХЗ</td>
<td>Война</td>
<td>Два скрещённых копья</td>
</tr>
<tr>
<td>Мэт Матонви, бог магии</td>
<td>НЗ</td>
<td>Знание</td>
<td>Посох</td>
</tr>
<tr>
<td>Нуада, бог войны и воинов</td>
<td>Н</td>
<td>Война</td>
<td>Серебряная рука на чёрном поле</td>
</tr>
<tr>
<td>Огма, бог устной и письменной речи</td>
<td>НД</td>
<td>Знание</td>
<td>Развёрнутый свиток</td>
</tr>
<tr>
<td>Сильванус, бог природы и лесов</td>
<td>Н</td>
<td>Природа</td>
<td>Летний дуб</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/GRGods" text="show">
<$button set="$:/state/GRGods" setTo="show">''Греческие боги''</$button>
</$reveal>
<$reveal type="match" state="$:/state/GRGods" text="show">
<$button set="$:/state/GRGods" setTo="hide">Греческие боги (Скрыть)</$button>
!!!''Греческие боги''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Зевс, бог неба, правитель богов</td>
<td>Н</td>
<td>Буря</td>
<td>Кулак, полный молний</td>
</tr>
<tr>
<td>Аид, бог подземного мира</td>
<td>ЗЗ</td>
<td>Смерть</td>
<td>Чёрный баран</td>
</tr>
<tr>
<td>Аполлон, бог света, музыки и исцеления</td>
<td>ХД</td>
<td>Жизнь, Знание, Свет</td>
<td>Лира</td>
</tr>
<tr>
<td>Арес, бог войны и раздоров</td>
<td>ХЗ</td>
<td>Война</td>
<td>Копьё</td>
</tr>
<tr>
<td>Артемида, богиня охоты и рождения</td>
<td>НД</td>
<td>Жизнь, Природа</td>
<td>Лук и стрела на лунном диске</td>
</tr>
<tr>
<td>Афина, богиня мудрости и цивилизации</td>
<td>ЗД</td>
<td>Война, Знание</td>
<td>Сова</td>
</tr>
<tr>
<td>Афродита, богиня любви и красоты</td>
<td>ХД</td>
<td>Свет</td>
<td>Морская раковина</td>
</tr>
<tr>
<td>Геката, богиня магии и луны</td>
<td>ХЗ</td>
<td>Знание, Обман</td>
<td>Прибывающая луна</td>
</tr>
<tr>
<td>Гера, богиня брака и интриг</td>
<td>ХН</td>
<td>Обман</td>
<td>Опахало из павлиньих перьев</td>
</tr>
<tr>
<td>Геракл, бог силы и приключений</td>
<td>ХД</td>
<td>Буря, Война</td>
<td>Львиная голова</td>
</tr>
<tr>
<td>Гермес, бог путешествий и торговли</td>
<td>ХД</td>
<td>Обман</td>
<td>Кадуцей (крылатый посох и змеи)</td>
</tr>
<tr>
<td>Гестия, богиня дома и семьи</td>
<td>НД</td>
<td>Жизнь</td>
<td>Очаг</td>
</tr>
<tr>
<td>Гефест, бог кузнечного дела и ремёсел</td>
<td>НД</td>
<td>Знание</td>
<td>Молот и наковальня</td>
</tr>
<tr>
<td>Деметра, богиня сельского хозяйства</td>
<td>НД</td>
<td>Жизнь</td>
<td>Голова лошади</td>
</tr>
<tr>
<td>Дионис, бог веселья и вина</td>
<td>ХН</td>
<td>Жизнь</td>
<td>Тирс (посох, увенчанный шишкой)</td>
</tr>
<tr>
<td>Ника, богиня победы</td>
<td>ЗН</td>
<td>Война</td>
<td>Крылатая женщина</td>
</tr>
<tr>
<td>Пан, бог природы</td>
<td>ХН</td>
<td>Природа</td>
<td>Сиринкс (свирель Пана)</td>
</tr>
<tr>
<td>Посейдон, бог морей и землетрясений</td>
<td>ХН</td>
<td>Буря</td>
<td>Трезубец</td>
</tr>
<tr>
<td>Тюхе, богиня счастливого случая</td>
<td>Н</td>
<td>Обман</td>
<td>Красная пентаграмма</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/EGods" text="show">
<$button set="$:/state/EGods" setTo="show">''Египетские боги''</$button>
</$reveal>
<$reveal type="match" state="$:/state/EGods" text="show">
<$button set="$:/state/EGods" setTo="hide">Египетские боги (Скрыть)</$button>
!!!''Египетские боги''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Ра-Хорахти, бог солнца, правитель богов</td>
<td>ЗД</td>
<td>Жизнь, Свет</td>
<td>Солнечный диск, окружённый змеёй</td>
</tr>
<tr>
<td>Анубис, бог суда и смерти</td>
<td>ЗН</td>
<td>Смерть</td>
<td>Чёрный шакал</td>
</tr>
<tr>
<td>Апеп, бог зла, огня и змей</td>
<td>НЗ</td>
<td>Обман</td>
<td>Змея в пламени</td>
</tr>
<tr>
<td>Баст, богиня кошек и возмездия</td>
<td>ХД</td>
<td>Война</td>
<td>Кошка</td>
</tr>
<tr>
<td>Бес, бог удачи и музыки</td>
<td>ХН</td>
<td>Обман</td>
<td>Изображение уродливого бога</td>
</tr>
<tr>
<td>Имхотеп, бог ремёсел и медицины</td>
<td>НД</td>
<td>Знание</td>
<td>Ступенчатая пирамида</td>
</tr>
<tr>
<td>Исида, богиня плодородия и магии</td>
<td>НД</td>
<td>Жизнь, Знание</td>
<td>Анкх и звезда</td>
</tr>
<tr>
<td>Небетхет, богиня смерти и горя</td>
<td>ХД</td>
<td>Смерть</td>
<td>Рога вокруг лунного диска</td>
</tr>
<tr>
<td>Осирис, бог природы и подземного мира</td>
<td>ЗД</td>
<td>Жизнь, Природа</td>
<td>Крюк и цеп</td>
</tr>
<tr>
<td>Пта, бог ремёсел, знаний и тайн</td>
<td>ЗН</td>
<td>Знание</td>
<td>Бык</td>
</tr>
<tr>
<td>Себе́к, бог воды и крокодилов</td>
<td>ЗЗ</td>
<td>Буря, Природа</td>
<td>Голова крокодила с рогами и перьями</td>
</tr>
<tr>
<td>Сет, бог тьмы и пустынных бурь</td>
<td>ХЗ</td>
<td>Буря, Обман, Смерть</td>
<td>Извивающаяся кобра</td>
</tr>
<tr>
<td>Тот, бог знаний и мудрости</td>
<td>Н</td>
<td>Знание</td>
<td>Ибис</td>
</tr>
<tr>
<td>Хатор, богиня любви, музыки и материнства</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Голова коровы и лунный диск</td>
</tr>
</table>
</$reveal>
<$reveal type="nomatch" state="$:/state/SCGods" text="show">
<$button set="$:/state/SCGods" setTo="show">''Скандинавские боги''</$button>
</$reveal>
<$reveal type="match" state="$:/state/SCGods" text="show">
<$button set="$:/state/SCGods" setTo="hide">Скандинавские боги (Скрыть)</$button>
!!!''Скандинавские боги''
<table>
<tr>
<th>Божество</th>
<th>Мировоззрение</th>
<th>Рекомендуемые домены</th>
<th>Символ</th>
</tr>
<tr>
<td>Один, бог знаний и войны</td>
<td>НД</td>
<td>Война, Знание</td>
<td>Наблюдающий голубой глаз</td>
</tr>
<tr>
<td>Эгир, бог морей и бурь</td>
<td>НЗ</td>
<td>Буря</td>
<td>Волны океана</td>
</tr>
<tr>
<td>Бальдр, бог красоты и поэзии</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Украшенная самоцветами серебряная чаша</td>
</tr>
<tr>
<td>Форсети, бог закона и правосудия</td>
<td>Н</td>
<td>Свет</td>
<td>Голова бородатого мужчины</td>
</tr>
<tr>
<td>Фрей, бог плодородия и солнца</td>
<td>НД</td>
<td>Жизнь, Свет</td>
<td>Светло-голубой двуручный меч</td>
</tr>
<tr>
<td>Фрейя, богиня плодородия и любви</td>
<td>НД</td>
<td>Жизнь</td>
<td>Сокол</td>
</tr>
<tr>
<td>Фригг, богиня рождения и плодородия</td>
<td>Н</td>
<td>Жизнь, Свет</td>
<td>Кошка</td>
</tr>
<tr>
<td>Хеймдалль, бог бдительности и верности</td>
<td>ЗД</td>
<td>Война, Свет</td>
<td>Скручивающийся музыкальный рог</td>
</tr>
<tr>
<td>Хель, богиня подземного мира</td>
<td>НЗ</td>
<td>Смерть</td>
<td>Женское лицо, гниющее с одной стороны</td>
</tr>
<tr>
<td>Хермод, бог удачи</td>
<td>ХН</td>
<td>Обман</td>
<td>Крылатый свиток</td>
</tr>
<tr>
<td>Локи, бог воров и обмана</td>
<td>ХЗ</td>
<td>Обман</td>
<td>Пламя</td>
</tr>
<tr>
<td>Ньорд, бог морей и ветров</td>
<td>НД</td>
<td>Буря, Природа</td>
<td>Золотая монета</td>
</tr>
<tr>
<td>Од, бог света и солнца</td>
<td>ХД</td>
<td>Свет</td>
<td>Солнечный диск</td>
</tr>
<tr>
<td>Сиф, богиня войны</td>
<td>ХД</td>
<td>Война</td>
<td>Поднятый меч</td>
</tr>
<tr>
<td>Скади, бог земли и гор</td>
<td>Н</td>
<td>Природа</td>
<td>Горный пик</td>
</tr>
<tr>
<td>Сурт, бог огненных великанов и войны</td>
<td>ЗЗ</td>
<td>Война</td>
<td>Пламенеющий меч</td>
</tr>
<tr>
<td>Тор, бог бурь и грома</td>
<td>ХД</td>
<td>Буря, Война</td>
<td>Молот</td>
</tr>
<tr>
<td>Трим, бог огненных великанов и холода</td>
<td>ХЗ</td>
<td>Война</td>
<td>Белый двусторонний топор</td>
</tr>
<tr>
<td>Тюр, бог отваги и стратегии</td>
<td>ЗН</td>
<td>Война, Знание</td>
<td>Меч</td>
</tr>
<tr>
<td>Улль, бог охоты и зимы</td>
<td>ХН</td>
<td>Природа</td>
<td>Длинный лук</td>
</tr>
</table>
</$reveal>
Все задачи, которые персонаж или чудовище могут предпринять, охватываются одной из шести характеристик. В этом разделе приведены подробные описания характеристик и способы их использования в игре.
!!__''Сила''__
Сила означает физическую силу и атлетические тренировки.
!!!''Проверки Силы''
"""Проверки Силы могут моделировать попытки поднять, толкнуть, подтянуть или сломать что-то, попытки втиснуть своё тело в некое пространство или другие попытки применения грубой силы. Навык Атлетика отражает особую склонность к некоторым проверкам Силы.
//''Атлетика.''// Проверки Силы (Атлетика) покрывают разнообразные ситуации, в которых вы лазаете, прыгаете или плаваете. Примеры включают следующие действия:"""
* Вы пытаетесь взобраться на крутой утёс, избегая при этом опасностей, или попытки удержаться за что-то, когда вас пытаются стряхнуть.
* Вы пытаетесь прыгнуть на большое расстояние или совершить трюк в середине прыжка.
* Вы пытаетесь плыть или оставаться на плаву в бурных водах, во время шторма или среди зарослей водорослей. Другое существо может попытаться толкнуть или затянуть вас под воду, или как-то иным способом помешать вашему плаванию.
//''Прочие проверки Силы.''// Мастер может призвать к проверке Силы, если вы пытаетесь сделать что-то из следующего:
* Попытка открыть застрявшую, запертую или заложенную на засов дверь
* Попытка вырваться из оков
* Попытка протиснуться по узкому туннелю
* Попытка удержаться за фургон, не отцепившись от него во время движения
* Опрокидывание статуи
* Попытка удержать валун от падения
!!!''Броски атаки и урона''
Вы добавляете модификатор Силы к броскам атаки и урона при совершении атак рукопашным оружием, таким как булава, секира или метательное копьё. Рукопашным оружием совершаются рукопашные атаки, а некоторые его виды можно метать, совершая, таким образом, дальнобойные атаки.
!!!''Подъём и перенос''
"""Значение Силы определяет вес, который вы можете переносить. Пи этом используются следующие термины:
//''Грузоподъёмность.''// Ваша грузоподъёмность это ваше значение Силы, умноженное на 15. Такой вес (в фунтах) вы можете носить, и это достаточно много, так что большинству персонажей не нужно об этом заботиться.
//''Толкание, волочение и подъём.''// Вы можете толкать, тянуть и отрывать от земли вес в фунтах, вдвое превышающий вашу грузоподъёмность (или значение Силы, умноженное на 30). Если вы толкаете или тянете вес, превышающий грузоподъёмность, ваша скорость падает до 5 футов.
//''Размер и Сила.''// Существа большого размера могут тащить больше, а Крохотные существа — меньше. За каждую категорию размера выше Средней удвойте его грузоподъёмность и вес, который оно может толкать, тянуть и поднимать. Для существа Крохотного размера уменьшите эти значения вдвое."""
!!!''Вариант: Нагрузка''
"""Правила по грузоподъёмности и перемещению предметов упрощены намеренно. Этот вариант предлагает детализированные правила по определению того, как на персонажа влияет груз его снаряжения. При использовании этого варианта игнорируйте колонку «Сила» в таблице «доспехи» из главы 5.
Если вы несёте вес, превышающий пятикратное значение Силы, вы становитесь ''нагруженным'', что означает, что ваша скорость уменьшается на 10 футов.
Если вы несёте вес, превышающий десятикратное значение Силы, вы становитесь вместо этого ''сильно нагруженным'', что означает, что ваша скорость уменьшается на 10 футов, и вы совершаете с помехой проверки характеристик, броски атаки и спасброски, использующие Силу, Ловкость или Телосложение."""
!!__''Ловкость''__
Ловкость отвечает за проворство, реакцию и равновесие.
!!!''Проверки Ловкости''
"""Проверка Ловкости может моделировать любую попытку перемещаться ловко, быстро или тихо, либо попытку не упасть с шаткой опоры. Навыки Акробатика, Ловкость рук и Скрытность отражают особую склонность к некоторым проверкам Ловкости.
//''Акробатика.''// Проверки Ловкости (Акробатика) охватывают попытки устоять на ногах в неудобной ситуации, например, когда вы пытаетесь пробежаться по льду, балансируете на натянутом канате или стоите на палубе корабля в шторм. Мастер может также призвать к проверке Ловкости (Акробатика), чтобы увидеть, можете ли вы выполнить акробатический трюк, включая ныряние, кувырки, сальто и перекаты.
//''Ловкость рук.''// Если вы пытаетесь жонглировать или сделать ловкий трюк, например, подбросить что-то другому или спрятать что-то на своём теле, совершите проверку Ловкости (Ловкость рук). Мастер может призвать совершить проверку Ловкости (Ловкость рук) чтобы определить, можете ли вы срезать у ротозея кошелёк или подбросить что-то другому в карман.
//''Скрытность.''// Совершите проверку Ловкости (Скрытность), когда пытаетесь спрятаться от врагов, прокрасться мимо стражи, сбежать незамеченным или незаметно и неслышно подобраться к кому-то."""
<<<
!!!''Скрытность''
"""Когда вы пытаетесь спрятаться, совершите проверку Ловкости (Скрытность). Пока вас не найдут или вы не прекратите прятаться, результат этой проверки будет противостоять проверкам Мудрости (Внимательность) существ, активно ищущих вас.
Возможно ли в той или иной ситуации спрятаться, решает Мастер. Вопрос не в том, может ли существо увидеть вас, а в том, может ли оно видеть вас достаточно хорошо. Вы не можете прятаться от существа, которое видит вас, и если вы издадите шум (например, прокричите предупреждение или уроните вазу), вы выдаёте своё местоположение. Невидимое существо нельзя увидеть, поэтому оно всегда может попытаться спрятаться. Его можно заметить по другим признакам, поэтому ему тоже приходится вести себя тихо.
В бою большинство существ постоянно ищут опасность вокруг себя, поэтому если вы выходите из укрытия и приближаетесь к существу, обычно оно замечает вас. Однако в некоторых обстоятельствах Мастер может позволить вам оставаться скрытым от существа, к которому вы приближаетесь, если оно отвлечено, что позволяет вам совершить атаку с преимуществом, прежде чем вас заметят.
Пассивная Внимательность. Если вы прячетесь, есть шанс, что вас заметят даже без активных поисков. Для определения того, заметило ли вас существо, Мастер сравнивает результат вашей проверки Ловкости (Скрытность) с пассивным значением Мудрости (Внимательность), которое равно 10 + модификатор Мудрости существа, плюс все уместные бонусы и штрафы. Если у существа есть преимущество, добавьте 5. Если есть помеха, вычтите 5.
Например, если персонаж 1 уровня (с бонусом мастерства +2) обладает Мудростью 15 (модификатор +2) и владеет Внимательностью, его пассивное значение Мудрости (Внимательность) равно 14.
Что вы можете видеть? Одним из основных факторов в определении того, можете ли вы обнаружить скрытое существо или предмет, является то, насколько хорошо вы видите в области, которая может быть слабо или сильно заслонённой, что объясняется в главе 8."""
<<<
//''Прочие проверки Ловкости.''// Мастер может призвать к проверке Ловкости, если вы пытаетесь сделать что-то из следующего:
* Вы спускаетесь с тяжело нагруженной тачкой по крутому склону
* Вы закладываете крутой вираж на карете
* Вы вскрываете замок
* Вы обезвреживаете ловушку
* Вы связываете пленника
* Вы пытаетесь высвободиться из пут
* Вы играете на струнном инструменте
* Вы создаёте мелкий или высокодетализированный предмет
!!!''Броски атаки и урона''
Вы добавляете модификатор Ловкости к броскам атаки и урона при совершении атак дальнобойным оружием, таким как праща или длинный лук. Вы также можете добавлять модификатор Ловкости к броскам атаки и урона при совершении атак рукопашным оружием со свойством «фехтовальное», таким как кинжал и рапира.
!!!''Класс Доспеха''
В зависимости от доспеха, который вы носите, вы можете добавлять модификатор Ловкости или его часть к Классу Доспеха, как описано в главе 5.
!!!''Инициатива''
В начале каждого сражения вы совершаете проверку инициативы, совершая проверку Ловкости. Инициатива определяет порядок ходов существ в сражении, как описано в главе 9.
!!''__Телосложение__''
Телосложение измеряет ваше здоровье, выносливость и жизненные силы.
!!!''Проверки Телосложения''
"""Проверки Телосложения совершаются не часто, и от него не зависят никакие навыки, так как выносливость, которую отражает эта характеристика, пассивна, и персонаж или чудовище не может активно её использовать. Однако проверка Телосложения может моделировать вашу попытку сделать что-то необычное.
Мастер может призвать к проверке Телосложения, если вы пытаетесь сделать что-то из следующего:"""
* Вы задерживаете дыхание
* Вы совершаете марш-бросок или несколько часов без перерыва работаете
* Вы долго не спите
* У вас нет еды и воды
* Вы пытаетесь осушить кружку пива одним махом
!!!''Хиты''
"""Модификатор Телосложения участвует в определении ваших хитов. Обычно вы добавляете модификатор Телосложения ко всем Костям Хитов, брошенным для определения хитов.
Если ваш модификатор Телосложения изменяется, изменяется и максимум ваших хитов, как если бы новый модификатор был у вас с 1 уровня. Например, если вы повышаете значение Телосложения, когда достигаете 4 уровня, и ваш модификатор Телосложения увеличивается с +1 до +2, вы изменяете максимум хитов так, как будто этот модификатор всегда был +2. Вы добавляете 3 хита за первые три уровня, а затем определяете хиты за 4 уровень, используя уже новый модификатор. И наоборот, если на 7 уровне некий эффект уменьшит ваше значение Телосложения, уменьшив модификатор Телосложения на 1, максимум ваших хитов уменьшится на 7."""
!!__''Интеллект''__
Интеллект измеряет силу ума, точность воспоминаний и способность здраво рассуждать.
!!!''Проверки Интеллекта''
"""Проверки Интеллекта происходят когда вы используете логику, образование, память или дедуктивное мышление. Навыки Анализ, История, Магия, Природа и Религия отражают особую склонность к некоторым проверкам Интеллекта.
//''Анализ.''// Если вы ищете подсказки и делаете на их основе выводы, вы совершаете проверку Интеллекта (Анализ). Вы можете вычислить местоположение спрятанного предмета, понять по виду раны, каким оружием она была нанесена или определить самую слабую точку в туннеле, способную его обрушить. Рассматривание древних свитков в поисках тайного знания тоже может требовать совершения проверки Интеллекта (Анализ).
//''История.''// Проверка Интеллекта (История) определяет вашу способность вспомнить знания об исторических событиях, легендарных личностях, древних королевствах, былых спорах, недавних войнах и утерянных цивилизациях.
//''Магия.''// Проверка Интеллекта (Магия) определяет вашу способность вспомнить знания о заклинаниях, магических предметах, мистических символах, магических традициях, планах существования и обитателях этих планов.
//''Природа.''// Проверка Интеллекта (Природа) определяет вашу способность вспомнить знания о местности, о растениях и животных, о погоде и естественных циклах.
//''Религия.''// Проверка Интеллекта (Религия) определяет вашу способность вспомнить знания о божествах, ритуалах и молитвах, религиозных иерархиях, священных символах и практиках тайных культов.
//''Прочие проверки Интеллекта.''// Мастер может призвать к проверке Интеллекта, если вы пытаетесь сделать что-то из следующего:"""
* Вы общаетесь с существом без использования слов
* Вы оцениваете стоимость ценного предмета
* Вы маскируетесь под городского стража
* Вы подделываете документ
* Вы вспоминаете знание о ремесле или торговле
* Вы соревнуетесь с кем-то другим
!!!''Базовая характеристика заклинаний''
Волшебники используют Интеллект при определении Сл спасбросков от накладываемых ими заклинаний.
!!''__Мудрость__''
Мудрость определяет, как хорошо вы настроены на окружающий мир и отражает восприимчивость и интуицию.
!!!''Проверки Мудрости''
"""Проверки Мудрости могут отражать попытки понять язык тела, понять чьи-то переживания, заметить что-то в окружающем мире или позаботиться о раненом. Навыки Внимательность, Выживание, Медицина, Проницательность и Уход за животными отражают особую склонность к некоторым проверкам Мудрости.
//''Внимательность.''// Проверка Мудрости (Внимательность) позволяет вам увидеть, услышать или как-то иначе заметить присутствие чего-либо. Она измеряет вашу готовность к новым событиям и остроту ваших чувств. Например, вы может подслушать разговор под дверью, подсмотреть в окно или услышать чудовищ, крадущихся по лесу. Или вы можете попытаться заметить что-то, что скрыто или легко можно пропустить, будь то орки, лежащие в засаде у дороги, головорезы, затаившиеся в тенях аллеи или свет от лампы под закрытой потайной дверью."""
<<<
!!!''Поиски скрытых предметов''
"""Если ваш персонаж ищет скрытый предмет, такой как потайная дверь или ловушка, Мастер обычно просит совершить проверку Мудрости (Внимательность). Такая проверка может использоваться для поиска скрытых деталей или другой информации и подсказок, которые вы могли бы пропустить.
В большинстве случаев вам нужно описать, где вы ищете, чтобы Мастер определил ваши шансы на успех. Например, если ключ спрятан под одеждой в верхнем ящике комода, и вы говорите, что ищете по комнате, осматривая стены, вы не найдёте ключ, каким бы ни был результат проверки Мудрости (Внимательность). Чтобы получить шанс на успех, вам нужно заявить, что вы открываете все ящики или ищете конкретно в этом комоде."""
<<<
"""//''Выживание.''// Мастер может призвать совершить проверку Мудрости (Выживание) для выслеживания врагов, охоты на дичь, нахождения дороги в промёрзшей тундре, замечания признаков того, что рядом живут совомедведи, предсказывания погоды и избегания зыбучих песков и прочих природных опасностей.
//''Медицина.''// Проверка Мудрости (Медицина) позволяет стабилизировать умирающего спутника или диагностировать болезнь.
//''Проницательность.''// Ваша проверка Мудрости (Проницательность) определяет, можете ли вы определить истинные намерения существа, например, при попытке распознать ложь или предсказать чей-то следующий шаг. При этом вы совершаете догадки по языку тела, особенностям разговора и переменах в поведении.
//''Уход за животными.''// Если возникает вопрос, можете ли вы успокоить одомашненное животное, удержать скакуна от того, чтобы он запаниковал, или почувствовать намерения животного, Мастер может призвать совершить проверку Мудрости (Уход за животными). Вы также совершаете проверку Мудрости (Уход за животными) для контролирования скакуна при совершении опасного манёвра.
//''Прочие проверки Мудрости.''// Мастер может призвать к проверке Мудрости, если вы пытаетесь сделать что-то из следующего:"""
* Вы пытаетесь понять, что делать дальше
* Вы пытаетесь распознать в живом или вроде бы мёртвом существе нежить
!!!''Базовая характеристика заклинаний''
Друиды, жрецы и следопыты используют Мудрость при определении Сл спасбросков от накладываемых ими заклинаний.
!!''__Харизма__''
Харизма измеряет вашу способность эффективно взаимодействовать с другими. Она охватывает такие факторы как уверенность в себе и красноречие, и может отражать привлекательную или внушительную внешность.
!!!''Проверки Харизмы''
"""Проверку Харизмы можно совершать при попытке повлиять на других или развлечь их, когда вы пытаетесь произвести впечатление или убедительно соврать, или если вы пытаетесь разобраться в сложной социальной ситуации. Навыки Выступление, Запугивание, Обман и Убеждение отражают особую склонность к некоторым проверкам Харизмы.
//''Выступление.''// Ваша проверка Харизмы (Выступление) определяет, насколько хорошо вы удовлетворили публику музыкой, танцем, актёрской игрой, рассказом или другим развлечением.
//''Запугивание.''// Когда вы пытаетесь воздействовать на других угрозами, враждебными действиями и физическим насилием, Мастер может попросить вас совершить проверку Харизмы (Запугивание). Примерами могут послужить добыча информации из пленника, убеждение головорезов отказаться от драки и угроза разбитой бутылкой ехидному визирю, чтобы тот изменил решение.
//''Обман.''// Ваша проверка Харизмы (Обман) определяет, можете ли вы намеренно утаить правду, хоть речами, хоть действиями. Такой обман охватывает всё, от направления других по неверному следу и двусмысленных речей до рассказывания откровенной лжи. Может применяться при отвлечении стражников, обмане торговцев, зарабатывании денег азартными играми, маскировке под других, отводе чужих подозрений ложными утверждениями и сохранении спокойного лица при рассказывании чудовищной лжи.
//''Убеждение.''// Если вы пытаетесь повлиять на существо или целую группу существ тактично, с уважением и добродушием, Мастер может попросить вас совершить проверку Харизмы (Убеждение). Обычно убеждение используется при добрых намерениях, при попытках подружиться, установить контакт или проявить этикет. Примеры убеждения других включают в себя попытки убедить дворецкого пропустить вас к королю, мирное урегулирование споров двух враждующих племён и воодушевление толпы горожан.
''//Прочие проверки Харизмы.//'' Мастер может призвать к проверке Харизмы, если вы пытаетесь сделать что-то из следующего:"""
* Вы ищете, с кем лучше всего обсудить новости, слухи и сплетни
* Вы сливаетесь с толпой, чтобы узнать основные обсуждаемые темы
!!!''Базовая характеристика заклинаний''
Барды, колдуны, паладины и чародеи используют Харизму при определении Сл спасбросков от накладываемых ими заклинаний.
//4 уровень, Очарование, Бард//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Выбранные вами существа, которых вы видите в пределах дистанции, и которые слышат вас, должны совершить спасбросок Мудрости. Цель автоматически преуспевает, если не может быть очарована. При провале спасброска цель попадает под действие этого заклинания. Пока заклинание активно, вы можете в каждом своём ходу бонусным действием указать направление, горизонтальное для вас. Все попавшие под действие цели должны в свой следующий ход максимально возможно перемещаться в том направлении. Перед перемещением они могут совершить свои действия. После перемещения из-за заклинания они могут совершить ещё один спасбросок Мудрости, чтобы окончить этот эффект.
Цель не обязана перемещаться в очевидно опасное место, такое как огонь или костёр, но она провоцирует атаки, когда идёт в указанном направлении."""
"""Вы провели свою жизнь, служа в храме, посвящённому какому-то конкретному богу или же пантеону богов. Вы — посредник между царством небесным и миром живых. Вы совершали священные ритуалы и приносили жертвоприношения для того чтобы молящиеся могли предстать пред ликом богов. Вы не обязательно жрец — совершение священных обрядов не то же самое, что направление божественной силы.
Выберите божество, пантеон богов или полубожественную сущность из тех, что перечислены в приложении Б или предложены Мастером, и продумайте вместе с Мастером природу вашего религиозного служения. Вы были младшим служкой в храме, с детства помогающим священникам? Или вы верховный жрец, получивший видение, как можно послужить своему богу? Возможно, вы — лидер небольшого культа, не имеющего своего храма, или даже представитель оккультных сил, служивший чудовищному повелителю, но отрёкшийся от него."""
;
:''Владение навыками:'' Проницательность, Религия
:''Языки:'' Два на ваш выбор
;
:''Снаряжение:'' Священный символ (подаренный вам в момент принятия священного сана), молитвенник или молитвенный барабан, 5 палочек благовоний, облачение, комплект обычной одежды, поясной кошель с 15 зм
!!!''Умение: Приют для верующих''
"""Вы и ваши спутники можете рассчитывать на бесплатное лечение и уход в храмах, святынях и других подобных местах, посвящённых вашей вере. Вам придётся предоставить материальные компоненты для заклинаний, если таковые понадобятся. Те, кто разделяют вашу веру, могут обеспечить вам (но только вам) скромное существование.
У вас также могут быть связи с каким-то конкретным храмом, посвящённым вашему божеству или пантеону, в котором у вас есть жилая комната. Пока вы находитесь с этим храмом в хороших отношениях, находясь неподалёку от него, вы можете попросить у его служителей помощи, если она не подвергнет их опасности."""
!!!''Персонализация''
Прислужники изучают историю и догматы своей веры, и на их привычки и идеалы влияет их отношение к храмам, святыням и иерархиям. Их слабостью может быть лицемерие или еретическая идея, либо идеал или привязанность, возведённая до гротеска.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я идеализирую конкретного героя своей веры и постоянно ссылаюсь на его поступки и свершения.</td>
</tr>
<tr>
<td>2</td>
<td>Я могу найти общую позицию даже у самых яростных врагов, сопереживая им, и всегда стремясь к примирению.</td>
</tr>
<tr>
<td>3</td>
<td>Я вижу знамения в каждом событии и поступке. Боги пытаются говорить с нами, нужно лишь прислушаться.</td>
</tr>
<tr>
<td>4</td>
<td>Ничто не может поколебать мой оптимизм.</td>
</tr>
<tr>
<td>5</td>
<td>При любой оказии я цитирую (или перевираю) священные тексты и притчи.</td>
</tr>
<tr>
<td>6</td>
<td>Я терпим (или нетерпим) к другим верованиям, и уважаю (или порицаю) поклонение другим богам.</td>
</tr>
<tr>
<td>7</td>
<td>Я люблю хорошую еду, выпивку и высокое общество представителей своего храма. Жизнь вдали от этого меня раздражает.</td>
</tr>
<tr>
<td>8</td>
<td>Я пробыл в храме слишком долго, и мне недостаёт опыта взаимодействия с людьми за его пределами.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Традиции. Мы должны сохранить и защитить древние традиции богослужения и совершения священных таинств. (Законный)</td>
</tr>
<tr>
<td>2</td>
<td>Милосердие. Несмотря на затраченные усилия, я всегда пытаюсь помочь тем, кто в нужде. (Добрый)</td>
</tr>
<tr>
<td>3</td>
<td>Перемены. Мы должны помогать привносить в мир перемены, которых наши божества постоянно жаждут. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Власть. Я надеюсь однажды подняться на самую вершину своей религиозной иерархии. (Законный)</td>
</tr>
<tr>
<td>5</td>
<td>Вера. Я верю, что моё божество направляет меня. И что усердная работа всегда будет вознаграждена. (Законный)</td>
</tr>
<tr>
<td>6</td>
<td>Стремление. Я ищу шанс доказать, что я достоин благословления своего божества, совершая деяния в соответствии с его учениями. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я не пощажу живота своего, лишь бы найти древнюю реликвию своей веры, что была потеряна давным-давно.</td>
</tr>
<tr>
<td>2</td>
<td>Однажды я отомщу развращённым представителям верховной иерархии своего храма, что объявили меня еретиком.</td>
</tr>
<tr>
<td>3</td>
<td>Я обязан своей жизнью священнику, который позаботился обо мне, когда умерли родители.</td>
</tr>
<tr>
<td>4</td>
<td>Всё, что я делаю — для простых людей.</td>
</tr>
<tr>
<td>5</td>
<td>Я пойду на всё что угодно, дабы защитить свой храм.</td>
</tr>
<tr>
<td>6</td>
<td>Я пытаюсь сохранить священные тексты, которые мои враги считают еретическими и пытаются уничтожить.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я не проявляю снисходительности к другим, но к себе я ещё более суров.</td>
</tr>
<tr>
<td>2</td>
<td>Я слишком доверяю тем, кто обладает властью в моей церковной иерархии.</td>
</tr>
<tr>
<td>3</td>
<td>Моя набожность зачастую приводит к тому, что я слепо верю всем, кто исповедует мою религию.</td>
</tr>
<tr>
<td>4</td>
<td>Я непреклонен в своих убеждениях.</td>
</tr>
<tr>
<td>5</td>
<td>Я настороженно отношусь к незнакомцам и всегда жду от них худшего.</td>
</tr>
<tr>
<td>6</td>
<td>Однажды выбрав цель, я становлюсь одержимым ею в ущерб всему прочему в своей жизни.</td>
</tr>
</table>
//3 уровень, Некромантия, Бард/Волшебник/Друид/Жрец (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (щепотка кладбищенской земли)
:''Длительность:'' 1 час
"""Вы касаетесь согласного существа и погружаете его в каталептическое состояние, не отличимое от смерти.
Пока заклинание активно, или пока вы не коснётесь действием цели, снимая заклинание, цель выглядит мёртвой для любого обследования и заклинаний, определяющих состояние цели. Цель ослеплена и недееспособна, а скорость равна 0. Цель получает сопротивление всем видам урона кроме психической энергии. Если цель была больна или отравлена, когда вы накладываете это заклинание, или становится больной или отравленной, находясь под его действием, болезни и яды не оказывают никакого эффекта, пока заклинание не окончится."""
//5 уровень, Иллюзия, Бард/Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' 8 часов
"""Это заклинание позволяет вам менять облик любого количества существ, видимых вами в пределах дистанции. Вы даёте каждой выбранной цели новый, иллюзорный облик. Несогласная цель может совершить спасбросок Харизмы, и в случае успеха заклинание на неё не действует.
Это заклинание маскирует внешний облик, а также одежду, доспехи, оружие и снаряжение. Вы можете сделать каждое существо на 1 фут (30 сантиметров) ниже или выше, и сделать его худого, толстого или обычного сложения. Вы не можете менять вид тела цели, так что у неё должен быть такой же набор конечностей. Во всём остальном иллюзию определяете вы. Вы можете закончить действие заклинания досрочно, потратив действие.
Изменения, внесённые этим заклинанием, не проходят проверку физическим исследованием. Например, если заклинание добавит шляпу к снаряжению персонажа, предметы будут проходить сквозь неё, и все, кто коснутся её, либо не почувствуют ничего, либо почувствуют голову и волосы. Если вы сделаете себя более худым, то рука того, кто захочет к вам прикоснуться, ударится о вас, не дойдя до видимых очертаний.
Существо может действием осмотреть цель и совершить проверку Интеллекта (Анализ) против Сл ваших заклинаний. В случае успеха оно поймёт, что облик ненатурален."""
//5 уровень, Преобразование, Бард/Друид//
:''Время накладывания:'' 8 часов
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (агат, стоящий как минимум 1 000 зм, расходуемый заклинанием)
:''Длительность:'' Мгновенная
"""Потратив время на прокладывание магических каналов в драгоценном камне, вы касаетесь им зверя или растения с размером не больше Огромного. У цели либо не должно быть значения Интеллекта, либо Интеллект должен быть не больше 3. Цель получает Интеллект 10. Цель также получает способность говорить на одном известном вам языке. Если цель — растение, оно получает возможность шевелить ветками, корнями, лианами, и так далее, и получает чувства, подобные человеческим. Мастер подбирает параметры для пробуждённого растения, будь то куст или дерево.
Пробуждённый зверь или растение очарован вами 30 дней, либо пока вы или ваши спутники не причините ему вред. Когда очарование спадает, пробуждённое существо решает, останется ли оно к вам дружелюбно, в зависимости от того, как вы с ним обращались."""
"""Проверка характеристики испытывает врождённые таланты и обучение персонажа или чудовища, пытающегося преодолеть какое-то препятствие. Мастер призывает совершить проверку характеристики когда персонаж или чудовище пытается совершить действие (но не атаку), которое может не получиться. Если исход действия неясен, его помогает определить бросок кости.
Вначале Мастер определяет, какая из шести характеристик связана с выполняемой задачей, и определяет трудность этой задачи, отражаемую Сложностью. Чем труднее задача, тем выше Сл. Приведённая таблица показывает примерную Сл задач."""
''Типичная Сложность''
<table>
<tr>
<th>Трудность задачи</th>
<th>Сл</th>
</tr>
<tr>
<td>Очень лёгкая</td>
<td>5</td>
</tr>
<tr>
<td>Лёгкая</td>
<td>10</td>
</tr>
<tr>
<td>Средняя</td>
<td>15</td>
</tr>
<tr>
<td>Сложная</td>
<td>20</td>
</tr>
<tr>
<td>Очень сложная</td>
<td>25</td>
</tr>
<tr>
<td>Практически невозможная</td>
<td>30</td>
</tr>
</table>
Для совершения проверки характеристики бросьте к20 и добавьте модификатор соответствующей характеристики. Как и при других бросках к20 добавьте бонусы и штрафы, и сравните сумму со Сл. Если сумма равна Сл или превышает её, проверка успешна — существо выполняет поставленную задачу. В случае провала персонаж или чудовище не достигает успеха и сталкивается с последствиями, определяемыми Мастером.
!!!__''Состязание''__
"""Иногда усилия одного персонажа или чудовища противостоят усилиям другого. Это может произойти если они пытаются сделать одно и то же, и преуспеть может только один, например, они пытаются схватить магическое кольцо, упавшее на пол. Такая же ситуация возникает, когда один пытается предотвратить действия другого — например, если чудовище пытается открыть дверь, которую удерживает персонаж. В таких ситуациях исход определяется особой проверкой характеристики, называемой состязанием.
Оба участника состязания совершают проверки характеристик, связанные с их попытками. Они применяют все уместные бонусы и штрафы, но суммы сравнивают не со Сл, а с результатами друг друга. Участник с наибольшим результатом выигрывает состязание. Этот персонаж или чудовище либо добивается успеха, либо не даёт преуспеть другому.
Если состязание оканчивается ничьёй, ситуация остаётся такой же, как до состязания. Таким образом, один из участников может оказаться в более выгодном положении. Если двое пытались схватить кольцо, никто его не получает. Если чудовище пыталось распахнуть дверь, а искатель приключений пытался запереть дверь на засов, ничья означает, что дверь остаётся прикрытой."""
!!!__''Навыки''__
"""Характеристики покрывают широкий диапазон возможностей, включая навыки, которыми персонаж или чудовище может владеть. Навык отражает некий аспект характеристики, а владение навыком демонстрирует сосредоточенность на этом аспекте (владения навыками персонажа определяются при его создании, а владения навыками чудовища написаны в блоке его статистики).
Например, Ловкость может отражать попытку персонажа выполнить акробатический трюк, стащить предмет, или остаться скрытым. У этих аспектов Ловкости есть три конкретных навыка: Акробатика, Ловкость рук и Скрытность, соответственно. Таким образом, персонаж, владеющий навыком Скрытность, особенно хорошо совершает проверки Ловкости, связанные с попытками вести себя тихо и оставаться незамеченным.
Навыки, связанные с характеристиками, показаны в приведённой таблице (с Телосложением не связан ни один навык). Смотрите в описании характеристик в последующих разделах примеры того, как использовать эти навыки."""
;Сила
:Атлетика
;Ловкость
:Акробатика
:Ловкость рук
:Скрытность
;Интеллект
:Анализ
:История
:Магия
:Природа
:Религия
;Мудрость
:Внимательность
:Выживание
:Медицина
:Проницательность
:Уход за животными
;Харизма
:Выступление
:Запугивание
:Обман
:Убеждение
"""Иногда Мастер может попросить совершить проверку характеристики, используя определённый навык — например, «соверши проверку Мудрости (Внимательность)». Игрок может спросить Мастера, влияет ли владение неким навыком на результат проверки. В любом случае, владение навыком означает, что существо может добавлять бонус мастерства к проверкам характеристик, касающихся этого навыка. Без владения навыком существо совершает обычные проверки характеристики.
Например, если персонаж пытается забраться на крутой утёс, Мастер может попросить совершить проверку Силы (Атлетика). Если персонаж владеет Атлетикой, его бонус мастерства добавляется к проверке Силы. Если персонаж не владеет этим навыком, он совершает обычную проверку Силы."""
!!!''Вариант: Навыки с другими характеристиками''
Обычно владение навыком применяется к проверкам только одной конкретной характеристики. Владение Атлетикой, например, обычно применяется к проверкам Силы. Однако в некоторых ситуациях ваше владение может применяться к другой проверке. В таких ситуациях Мастер может попросить совершить проверку, используя необычную комбинацию характеристики и навыка, или же вы можете попросить у Мастера разрешение применить бонус мастерства к другой проверке. Например, если вам надо переплыть с острова на континент, Мастер может попросить совершить проверку Телосложения, чтобы увидеть, хватит ли у вас выносливости для такого длительного заплыва. В этом случае Мастер может разрешить вам применить бонус от Атлетики, то есть попросит совершить проверку Телосложения (Атлетика). Таким образом, если вы владеете Атлетикой, вы применяете бонус мастерства к проверке Телосложения, как если бы совершали проверку Силы (Атлетика). Точно так же, если варвар полуорк демонстрирует грубую силу, чтобы запугать врага, Мастер может попросить совершить проверку Силы (Запугивание), несмотря на то, что Запугивание связано с Харизмой.
!!!__''Пассивные проверки''__
"""Пассивная проверка это особая проверка характеристики, в которой кости не кидаются. Такая проверка может отражать средний результат для задачи, выполняющейся с регулярной периодичностью, например, поиски потайных дверей. Мастер может использовать её для тайного определения без бросков костей того, преуспеют ли персонажи в чём-либо, например, заметят ли персонажи скрывшееся чудовище.
Результат пассивной проверки персонажа определяется так:"""
;
:10 + все модификаторы, обычно применимые к проверке
"""Если персонаж совершает проверку с преимуществом, добавьте 5. В случае помехи вычтите 5. Результат пассивной проверки в игре называется ''значением''.
Например, если у персонажа 1 уровня Мудрость 15, и он владеет Внимательностью, его пассивное значение Мудрости (Внимательность) равно 14.
Пассивные проверки используются в правилах по скрытности в разделе «Ловкость», а также в правилах исследования в главе 8."""
!!!__''Совместные попытки''__
Иногда два или несколько персонажей пытаются совместно выполнить некую задачу. В этом случае персонаж, возглавляющий усилия (или тот, у кого наибольший модификатор характеристики) может совершить проверку характеристики с преимуществом, которое и отражает помощь других персонажей. В бою для этого требуется совершить действие Помощь (смотрите в главе 9).
Персонаж может пытаться помочь, если он сам в одиночку мог бы попробовать выполнить эту задачу. Например, вскрытие замка требует владения воровскими инструментами, поэтому персонаж, не владеющий ими, не может помогать выполнять эту задачу. Более того, персонаж может помогать только если усилия другого персонажа действительно могут помочь. Некоторые задачи, такие как вдевание нитки в иголку, от чужой помощи легче не станут.
!!!''Групповые проверки''
"""Если несколько существ пытаются выполнить что-то как единая группа, Мастер может попросить совершить групповую проверку характеристики. В такой ситуации умелые персонажи смогут прикрыть слабые стороны неумелых.
Для совершения групповой проверки характеристики все в группе совершают проверку характеристики. Если как минимум половина группы достигла успеха, преуспевает вся группа. В противном случае вся группа проваливает проверку.
Групповые проверки совершаются не очень часто, и они совершаются тогда, когда преуспеть нужно сразу всем персонажам. Например, если искатели приключений идут по болоту, Мастер может призвать совершить групповую проверку Мудрости (Выживание), чтобы увидеть, смогут ли персонажи обойти топи, трясины и прочие естественные опасности. Если преуспеет как минимум половина группы, успешные персонажи помогают тем, кто не обошёл опасные места. В противном случае вся группа попадает в одну из опасностей."""
//7 уровень, Иллюзия, Бард/Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 500 миль
:''Компоненты:'' В, С, М (ваша небольшая копия, изготовленная из материала, стоящего как минимум 5 зм)
:''Длительность:'' Концентрация, вплоть до 1 дня
"""Вы создаёте иллюзорную копию себя, существующую, пока активно заклинание. Копия может появиться в любом месте в пределах дистанции, которое вы до этого видели, вне зависимости от всех возможных препятствий. Иллюзия выглядит и звучит как вы, но неосязаема. Если иллюзия получает урон, она исчезает, а заклинание оканчивается.
Вы можете действием переместить эту иллюзию на расстояние, вдвое превышающее вашу скорость, и заставить её жестикулировать, говорить и вообще, вести себя так, как решите вы. Она идеально повторяет ваши манеры.
Вы можете видеть её глазами и слышать её ушами, как если бы находились в её пространстве. Вы можете в свой ход бонусным действием переключиться с её чувств на свои или обратно. Пока вы используете её чувства, вы слепы и глухи для своего окружения.
Физическое взаимодействие с образом даёт понять, что это иллюзия, потому что сквозь него всё проходит. Существа, исследующие образ действием, могут определить, что это иллюзия, совершив успешную проверку Интеллекта (Анализ) против Сл ваших заклинаний. Если существо распознаёт иллюзию, оно может видеть сквозь неё, и издаваемые ей звуки тоже становятся незначащими."""
//9 уровень, Некромантия, Волшебник/Жрец/Колдун//
:''Время накладывания:'' 1 час
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (для каждого существа требуется по одному гиацинту, стоящему как минимум 1 000 зм, и по одному бруску серебра с орнаментом, стоящему как минимум 100 зм; все компоненты расходуются заклинанием)
:''Длительность:'' Особая
"""Вы и до восьми согласных существ в пределах дистанции проецируете свои астральные тела в Астральный План (заклинание проваливается, если вы уже находитесь на этом плане). Оставленные вами материальные тела лежат без сознания в состоянии приостановленной жизнедеятельности; им не нужна пища, воздух, и они не стареют.
Ваше астральное тело во всём похоже на смертное тело, оно обладает теми же параметрами и снаряжением. Единственным отличием является серебряная нить, исходящая у вас между лопаток и торчащая наружу, становясь невидимой через 1 фут. Эта нить связывает вас с материальным телом. Пока эта нить цела, вы можете найти путь домой. Если нить перерезать (это могут сделать только эффекты, явно указывающие, что они могут это) ваши душа и тело разделяются, и вы мгновенно умираете.
Ваше астральное тело может свободно ходить по Астральному Плану и проходить сквозь порталы, ведущие в другие планы. Если вы входите в новый план или возвращаетесь в свой, ваши тело и снаряжение переносятся по серебряной нити, позволяя вернуться в своё тело при входе на другой план.
Ваше астральное тело — отдельное воплощение. Урон и прочие эффекты, применимые к нему, не оказывают воздействие на физическое тело, и не остаются при вашем возвращении в тело.
Заклинание оканчивается для вас и ваших спутников, если вы оканчиваете его действием. При этом существа возвращаются в свои тела и просыпаются.
Заклинание может окончиться для отдельных существ преждевременно. Успешное заклинание рассеивание магии, использованное либо на астральное, либо на физическое тело, оканчивает это заклинание для этого существа. Если хиты физического или астрального тела существа опускаются до 0, заклинание оканчивается для него. Если заклинание оканчивается, и серебряная нить нетронута, она возвращает астральное тело в физическое, оканчивая состояние приостановленной жизнедеятельности.
Если вы вернулись в своё тело, а спутники остались в астральных телах, но хотят вернуться, они сами должны найти способ вернуться, что обычно происходит в результате опускания хитов до 0."""
!!!__''Происхождение чародея''__
"""Выберите источник, из которого ваш персонаж черпает свою силу. Это может быть Наследие драконьей крови или Дикая магия. Оба источника раскрыты в конце описания класса.
Ваш выбор предоставляет вам умения на 1, 6, 14 и 18 уровнях."""
!!''Происхождения чародея''
Разные чародеи называют разные источники своей врождённой магии. Несмотря на разнообразие таких источников, большинство из них можно свести к двум категориям: наследие драконьей крови и дикая магия.
<<Button "Наследие драконьей крови (Чародей)" "Наследие драконьей крови">>
<<Button "Дикая магия (Чародей)""Дикая магия">>
//3 уровень, Некромантия, Бард/Волшебник/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы касаетесь существа, и оно должно преуспеть в спасброске Мудрости, иначе станет проклятым на период действия заклинания. Накладывая это заклинание, выберите характер проклятья из следующего списка:
* Выберите одну характеристику. Будучи проклятой, цель совершает проверки и спасброски этой характеристики с помехой.
* Будучи проклятой, цель совершает с помехой броски атаки по вам.
* Будучи проклятой, цель должна в начале каждого своего хода совершать спасбросок Мудрости. В случае провала она впустую тратит своё действие.
* Пока цель проклята, ваши атаки и заклинания причиняют ей дополнительный урон некротической энергией 1к8.
Заклинание снятие проклятья оканчивает этот эффект. С разрешения Мастера, вы можете создать альтернативный эффект проклятья, но он не должен быть сильнее тех, что представлены выше. Финальное решение об эффекте проклятья остаётся за Мастером.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, длительность будет «Концентрация, вплоть до 10 минут». Если вы использовали ячейку 5 уровня или выше, длительность будет «8 часов». Если вы использовали ячейку 7 уровня или выше, длительность будет «24 часа». Если вы использовали ячейку 9 уровня, заклинание действует, пока не рассеется. При использовании ячейки как минимум 5 уровня концентрация не требуется.
Искатели приключений жаждут найти сокровища, но они также ценят и другие виды наград. В этом разделе представлены многочисленные способы, которыми боги, монархи и прочие властные создания могут вознаградить персонажей за их достижения, в том числе дары, которые дают персонажам новые способности: титулы и земли, а также дары, доступные только тем, кто достиг 20 уровня.
!!__''Сверхъестественные дары''__
Сверхъестественный дар это особая награда от создания или сущности с огромной магической силой. Такие дары бывают двух видов: благословения и чары. Благословения обычно выдаются богами и божественными сущностями. Чары обычно накладывают сильные духи, места с древней магией или существа, у которых есть легендарные действия. В отличие от магических предметов, сверхъестественный дар это не предмет, и на него не нужно настраиваться. Он даёт персонажу экстраординарные способности, которые можно использовать один или несколько раз.
!!!''Благословения''
Персонаж может получить благословение, если совершит что-то действительно значимое, что привлечёт внимание и богов, и смертных. Убийство бушующих гноллов редко приносит благословение, но вот убийство верховного жреца Тиамат, пытающегося призвать Королеву Драконов — может.
Благословение может быть получено за следующие достижения:
* Восстановление самой важной святыни бога
* Срыв эпохального плана врагов бога
* Помощь избраннику бога завершить священную миссию
Искатель приключений также может получить благословение авансом перед опасным заданием. Например, паладин может получить его перед отправкой на задание по убийству ужасающего лича, ответственного за магическую чуму, охватившую землю.
Персонаж должен получать только то благословение, которое будет ему полезно. Кроме того, некоторые благословения даются с определёнными ожиданиями со стороны благодетеля. Обычно божество даёт благословение для конкретной цели, такой как спасение останков святого человека или свержение тиранической империи. Божество может отменить благословение, если персонаж провалит задание или действует противоположно ему.
На персонаже эффект благословения сохраняется навсегда или пока божество, даровавшее его, не заберёт благословение обратно. В отличие от магических предметов, такое благословение не подавляется преградой магии или другими подобными эффектами.
Большинство искателей приключений проживают свои жизни не получив благословение ни разу. Ограничений на количество получаемых персонажем благословений нет, но обычно благословений бывает не больше одного. Кроме того, персонаж не может извлечь выгоду от двух одинаковых благословений одновременно. Например, персонаж не получит бонусы от двух Благословений здоровья одновременно.
Ниже приведены примеры благословений. «Вы» в описании благословения означает их владельца. Если решите создать новые благословения, помните: обычно благословения подражают свойствам чудесных предметов.
;
://''Благословение Валгаллы.''// Это благословение дарует вам способность призывать духов воителей, как если бы вы подули в серебряный рог Валгаллы. Использовав это благословение, вы не можете его использовать повторно, пока не пройдёт 7 дней.
://''Благословение затягивающихся ран.''// Это благословение даёт вам преимущества медальона затягивающихся ран.
://''Благословение защиты.''// Вы получаете бонус +1 к КД и спасброскам.
://''Благословение здоровья.''// Ваше значение Телосложения увеличивается на 2, с максимумом 22.
://''Благословение понимания.''// Ваше значение Мудрости увеличивается на 2, с максимумом 22.
://''Благословение сопротивления магии.''// Вы совершаете с преимуществом спасброски от заклинаний и прочих магических эффектов.
://''Благословение улучшения оружия.''// Одно немагическое оружие, принадлежащее вам, становится оружием +1, пока вы его используете.
!!!''Чары''
Чары это малые сверхъестественные дары, получить которые можно множеством разнообразных способов. Например, волшебник, нашедший мистическую тайну в книге древнего архимага, может пропитаться магией чар, так же как и персонаж, решивший загадку сфинкса или попивший из магического фонтана. Легендарные существа, такие как единороги и древние золотые драконы, иногда дарят своим союзникам чары, а некоторые исследователи обнаруживают, что обрели магию чар после того, как посетили древнее место, наполненное стародавней магией.
Некоторые чары можно использовать только раз, а другие можно использовать несколько раз, после чего они исчезают. Если чары позволяют накладывать заклинание, вы делаете это, не тратя ячейки заклинаний и компоненты (вербальные, соматические и материальные). В любом случае, чары нельзя использовать в области, созданной преградой магии или подобным эффектом, и эффекты чар подвержены рассеиванию магии и подобным эффектам. Однако сами чары у существа нельзя отнять ничем кроме божественного вмешательства и заклинания исполнение желаний.
Ниже представлены примеры чар. «Вы» в описании чар означает их владельца. Обычно чары подражают эффектам зелья или заклинания, поэтому вы, при желании, можете создать множество аналогичных чар.
;
://''Чары восстановления.''// У этих чар 6 зарядов. Вы можете действием потратить часть зарядов на накладывание одного из следующих заклинаний: высшее восстановление (4 заряда) или малое восстановление (2 заряда). Когда все заряды будут потрачены, чары исчезнут.
://''Чары героизма.''// Эти чары позволяют вам действием получить преимущество зелья героизма. Когда вы его получите, чары исчезают.
://''Чары живучести.''// Эти чары позволяют вам действием получить преимущество зелья живучести. Когда вы его получите, чары исчезают.
://''Чары падения пёрышком.''// Эти чары дают вам преимущества кольца падения пёрышком. Это преимущество длится 10 дней, после чего исчезает.
://''Чары призыва животных.''// Эти чары позволяют вам действием накладывать призыв животных (версию 3 уровня). После трёх использований вы теряете эти чары.
://''Чары тёмного зрения.''// Эти чары позволяют вам действием накладывать тёмное зрение, без компонентов. После трёх использований вы теряете эти чары.
://''Чары убийцы.''// Один меч, принадлежащий вам, на следующие 9 дней становится убийцей великанов или убийцей драконов (на выбор Мастера). После этого чары исчезают, а оружие становится обычным.
!!__''Знаки внимания''__
Иногда самой запоминающейся наградой для искателей приключений становится престиж, который они зарабатывают своими деяниями. Их приключения часто приносят им славу и влияние, союзников и врагов, а также титулы, которые они могут передать своим потомкам. Некоторые лорды и леди начали обывателями, но позже отправились в опасные места и сделали себе имя.
В этом разделе описаны самые распространённые знаки внимания, которые искатели приключений могут получить во время кампании. Обычно эти знаки идут в сопровождении с сокровищем, но иногда дарятся сами по себе.
!!!''Рекомендательные письма''
Если у благодетеля нет денег, искатели приключений могут получить вместо денежного вознаграждения рекомендательные письма. Обычно это свиток в красивой папке или футляре с подписью и печатью того, кто его написал.
Рекомендательное письмо от личности с безукоризненной репутацией может дать искателям приключений доступ к ПМ, с которыми иначе очень трудно встретиться, например, с герцогом, наместником или королевой. Более того, наличие такого письма может устранить разногласия с местными властями, которые не готовы поверить на слово.
Ценность рекомендательного письма определяется тем, кто его написал, и не предоставит особых преимуществ там, где написавший его не обладает властью.
!!!''Медали''
Несмотря на то, что медали изготавливают из золота и других драгоценных материалов, они ценны ещё и как символ для тех, кто ими награждает и кого награждают.
Обычно медалями награждают влиятельные политические фигуры за акты героизма и одного ношения медали достаточно для получения уважения от тех, кто знает её значение.
За разные героические поступки могут выдавать разные медали. Король Бреландии (в мире Эберрон) может наградить искателей приключений Королевским Орденом Доблести (изготавливается из электрумового сплава в виде щита и украшен рубинами) за защиту бреландцев, а Золотой Медведь Бреландии (золотая медаль в форме головы медведя с глазами из самоцветов) предназначается для искателей приключений, которые доказали свою преданность короне тем, что обнаружили и сорвали заговор, ставящий целью отмену Тронхолдского Договора и возобновление Последней Войны.
Медаль не предоставляет особых игровых преимуществ тем, кто её носит, но помогает взаимодействовать с ПМ. Например, персонаж, гордо носящий Золотого Медведя Бреландии, будет считаться героем среди населения Бреландии. За пределами Бреландии эта же медаль будет менее значимой, если только собеседник не является союзником Бреландии.
!!!''Земельный надел''
Земельный надел это участок земли, с которым обычно идёт королевская грамота, подтверждающая право пользования данным участком. Обычно такие участки дают в награду за службу и они остаются в собственности у местного правителя, но ими позволяется пользоваться и их можно отнять, особенно если преданность правителю оказывается под вопросом.
На земельном наделе, если он достаточно большой, может находиться одно или несколько крестьянских хозяйств или деревень, в случае чего получатель становится господином этих земель и может собирать налоги. Однако на него также накладывается ряд обязательств.
Персонаж, получивший земельный надел, может возводить на нём постройки и должен защищать его. Он может передавать землю по наследству, но не может продавать её без разрешения местного правителя.
Земельный надел станет прекрасной наградой для искателей приключений, ищущих место, где можно поселиться, у которых есть семья, или какие-то личные интересы в регионе, где расположены эти земли.
!!!''Особые услуги''
Награда может быть и в виде одолжения, которым персонаж сможет воспользоваться в будущем. Особые услуги работают лучше, когда обещающий их человек заслуживает доверия. Законно-добрые или законно-нейтральные ПМ сделают что угодно, что выполнить своё обязательство, когда придёт время, не нарушая законов. Законно-злые ПМ сделают то же, но лишь потому, что сделка есть сделка. Нейтрально-добрые или нейтральные ПМ могут сдержать слово, чтоб сохранить свою репутацию. Хаотично-добрых ПМ больше заботит правильное отношение к искателям приключений, выполнение обещания, а не личный риск или соблюдение закона.
!!!''Особые права''
Могущественные политические личности могут награждать персонажей, даруя им особые права, обычно прописанные в каком-либо официальном документе. Например, персонажам может быть дано разрешение носить оружие в публичных местах, убивать врагов короны или вести переговоры от лица графа. Они могут заслужить право требовать бесплатное проживание и питание от любого заведения в пределах конкретного сообщества или призвать местные войска для помощи при необходимости.
Особые права длятся столько, сколько указано в документе, и могут быть отменены, если персонажи злоупотребляют ими.
!!!''Крепости''
Крепость это награда, которую обычно дают опытным искателям приключений, продемонстрировавшим преданность местному правителю или влиятельной организации, такой как рыцари или совет волшебников. Крепость может быть чем угодно, от укреплённой башни в центре города до цитадели в пограничье. Подразумевается, что крепостью персонажи могут распоряжаться как им угодно, но земля под ней остаётся в собственности короны или правителя. Если персонажи предадут или окажутся недостойными подарка, их могут попросить или даже принудить покинуть крепость.
В качестве дополнительной награды, тот, кто дарит крепость, может оплатить стоимость её содержания на один или несколько месяцев, после чего эта обязанность возлагается на персонажей. Информацию о содержании крепости смотрите в 6 главе.
!!!''Титулы''
Политически важная фигура может выдавать титулы. Титул часто сопровождается земельным наделом (смотрите выше). Например, персонажа могут объявить графом Штормовой реки или графиней Дун фьорда, а к титулу будет прилагаться земля с соответствующим поселением или регионом.
У персонажа может быть больше одного титула, и, согласно феодальной системе, эти титулы могут быть переданы (или распределены) детям. Когда персонаж владеет титулом от него или неё ожидаются соответствующие манеры. По указу местного правителя или руководящего органа, титул может быть снят, если существует причина сомневаться в верности или компетенции персонажа.
!!!''Обучение''
Персонажу может быть предложено особое обучение вместо материальной награды. Такой вид обучения мало кому доступен, и потому желаем. Оно предполагает существование умелого учителя — это может быть искатель приключений в отставке или герой, решивший стать наставником. Учитель может быть магом-затворником или надменным волшебником, который задолжал королеве услугу, ры-царем-коммандором Королевской стражи, лидером
могущественного друидского круга, чудаковатым монахом, живущим на отдалённой вершине горы, предводителем варваров, колдуном, живущим среди кочевников в качестве предсказателя судьбы или рассеянным бардом, чьи песни и поэмы известны по все стране.
Персонаж, согласившийся на обучение в качестве награды, должен провести свободное время с наставником (смотрите в 6 главе подробную информацию о деятельности во время простоя). Взамен персонаж получает особенное преимущество. Существуют следующие виды преимуществ от обучения:
* Персонаж ежедневно в течение 1к4 + 6 дней получает на рассвете вдохновение.
* Персонаж получает владение навыком.
* Персонаж получает черту.
!!__''Эпические дары''__
Эпический дар это особая способность, доступная только для персонажей 20 уровня. Персонажи этого уровня получают такие дары только если вы хотите этого, и только тогда, когда вы посчитаете нужным. Эпическими дарами лучше всего награждать за выполнение основных заданий или завершение выдающихся дел. Персонаж может получить эпический дар после уничтожения злого артефакта, победы над древним драконом или остановки вторжения с Внешних Планов.
Эпические дары можно расценивать как альтернативу прогресса в уровнях, чтобы награждать персонажей. При таком подходе можете выдавать каждому персонажу по одному эпическому дару за каждые 30000 опыта, набранные сверх 355000 опыта.
Вы сами определяете, какой эпический дар получает персонаж. В идеале, выбираемый дар должен пригодиться в будущих приключениях. Вы можете позволить игроку самому выбрать дар, но окончательный вердикт всё равно будет за вами.
Какой бы дар не получил персонаж, придумайте для него место в мире и сюжете. Многие дары выглядят невероятно, и они отражают постепенное превращение персонажа в подобие полубога. Получение дара может визуально изменить персонажа. Например, глаза персонажа с Даром истинного зрения могут светиться, когда он испытывает сильные эмоции, а у персонажа < Даром высшей магии вокруг головы могут кружиться небольшие светящиеся огоньки. Кроме того, решите, как дар впервые себя проявит.
Он появится спонтанно, из ниоткуда? Или его передаст воплотившееся создание с невероятной силой? Передача дара может стать захватывающей сценой в приключении.
<<<
!!!''Альтернатива эпическим дарам''
Вы можете выдавать персонажам 20 уровня вместо эпических даров одну из следующих наград. Обе альтернативы можно выдавать более одного раза.
Улучшение характеристик. Персонаж может увеличить значение одной из характеристик на 2 или двух характеристик на 1. Теперь значения характеристик могут превышать 20, но не могут превышать 30.
Новая черта. Персонаж получает новую черту, которую выбирает игрок, но одобряете её всё равно вы.
<<<
«Вы» в описании дара означает их владельца. Если в описании дара не сказано иное, персонаж не может получить его более одного раза.
!!!''Дар бессмертия''
Вы прекращаете стареть. Вы получаете иммунитет к эффектам, старящим вас, и вы не можете умереть от старости.
!!!''Дар боевой удали''
Если вы промахнулись рукопашной атакой оружием, можете решить, что вы попали. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар бури''
Вы получаете иммунитет к урону звуком и электричеством. Вы также можете неограниченно накладывать волну грома (Сл спасброска 15), не тратя ни ячейку заклинаний, ни компоненты.
!!!''Дар быстрого заклинания''
Выберите одно своё заклинание с уровнем от до 3 и временем накладывания «1 действие». Для вас время накладывания этого заклинания теперь «1 бонусное действие».
!!!''Дар владения навыками''
Вы получаете владение всеми навыками.
!!!''Дар восстановления''
Вы можете бонусным действием восстановить количество хитов, равное половине максимума хитов. Вы не можете повторно использовать этот дар, пока не окончите длительный отдых.
!!!''Дар восстановления заклинаний''
Вы можете наложить любое известное или подготовленное заклинание, не тратя ячейку заклинаний. Вы не можете повторно использовать этот дар, пока не окончите длительный отдых.
!!!''Дар высшей магии''
Вы получаете одну ячейку заклинаний 9 уровня, при условии, что у вас уже есть хоть одна такая ячейка.
!!!''Дар идеального здоровья''
Вы получаете иммунитет ко всем болезням и ядам, и совершаете с преимуществом спасброски Телосложения.
!!!''Дар истинного зрения''
Вы получаете истинное зрение в пределах 60 футов.
!!!''Дар межпространственного перемещения''
Вы можете действием наложить заклинание туманный шаг, не используя ни ячейку заклинаний, ни компоненты. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар необнаружения''
Вы получаете бонус +10 к проверкам Ловкости (Скрытность), вас нельзя сделать целью магии школы Прорицания и эта магия, а также сенсоры не могут вас обнаружить.
!!!''Дар неотразимого нападения''
Вы можете игнорировать сопротивление к урону любых существ.
!!!''Дар несравненного прицела''
Вы можете дать себе бонус +20 к совершаемому броску дальнобойной атаки. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар неуязвимости''
Если вы получаете урон из какого угодно источника, вы можете уменьшить его до 0. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар ночного духа''
Находясь полностью в области тусклого света или темноты, вы можете действием стать невидимым. Вы остаётесь невидимым, пока не совершите действие или реакцию.
!!!''Дар огненной души''
Вы получаете иммунитет к урону огнём. Вы также можете неограниченно накладывать огненные ладони (Сл спасброска 15), не тратя ни ячейку заклинаний, ни компоненты.
!!!''Дар путешествия по планам''
Получив этот дар, выберите любой план бытия кроме Материального Плана. Теперь вы можете действием накладывать заклинание уход в иной мир (не используя ни ячейку заклинаний, ни компоненты), нацеливаясь только на себя, и перемещаясь на выбранный план, или же наоборот, с этого плана на Материальный План. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар свободы''
Вы совершаете с преимуществом проверки характеристик, совершённые для сопротивления захвату. Кроме того, вы можете действием автоматически перестать быть опутанным или схваченным, чем бы ни были вызваны эти состояния.
!!!''Дар скорости''
"""Ваша скорость ходьбы увеличивается на 30 футов.
Кроме того, вы можете бонусным действием совершить действие Отход или Рывок. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых."""
!!!''Дар сопротивления''
Вы получаете сопротивление к дробящему, колющему и рубящему урону от немагического оружия.
!!!''Дар сопротивления магии''
Вы совершаете с преимуществом спасброски от заклинаний и других магических эффектов.
!!!''Дар стойкости''
Максимум ваших хитов увеличивается на 40.
!!!''Дар судьбы''
Когда другое существо, которое вы видите в пределах 60 футов, совершает проверку характеристики, бросок атаки или спасбросок, вы можете бросить к10 и добавить его в качестве бонуса или штрафа к результату броска. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар удачи''
Вы можете добавить к10 к результату любой совершаемой вами проверки характеристики, броску атаки или спасброску. Вы не можете повторно использовать этот дар, пока не окончите короткий отдых.
!!!''Дар усвоенного заклинания''
Выберите одно заклинание волшебника, колдуна или чародея, которое можете накладывать. Теперь вы можете накладывать это заклинание с наименьшим для него уровнем, не тратя ячейку заклинаний.
Между планами и за их пределами существуют и другие миры.
!!__''Внешние Земли и Сигил''__
Внешние Земли это план между Внешними Планами. Это план нейтральности, включающий понемногу от всего, и хранящий всё это в парадоксальном равновесии — одновременно гармоничном и противодействующем. На нём разный ландшафт, с прериями, горами и мелкими реками.
Внешние Земли круглые, словно огромный диск. Те, кто представляют Внешние Планы в виде колеса, считают Внешние Земли доказательством такого устройства, называя их миниатюрной копией планов. Однако с этим аргументом можно поспорить, так как именно устройство Внешних Земель подсказало идею Великого Колеса.
По внешней границе круга, через равные расстояния, стоят портальные города: шестнадцать поселений, где каждое построено вокруг портала, ведущего на один из Внешних Планов. Каждый город имеет много общего с тем планом, куда ведёт его портал. В этих городах часто есть портальные послы, потому там можно увидеть весьма странные вещи вроде небожителя и исчадия, сидящих в таверне за бутылкой вина.
Учитывая тот факт, что на Внешних Землях даже на лошади можно попасть из ада в рай, кампанию с планарными перемещениями можно проводить без самих перемещений. Внешние Земли на Внешних Планах — ближайший аналог обычного мира на Материальном Плане.
{{$:/Портальные города Внешних Земель}}
!!!''Сигил, Город Дверей''
В центре Внешних Земель, словно ось громадного колеса, находится Пик — острая как игла гора, возвышающаяся в небеса. Над узким пиком этой горы парит город Сигил, чьи многочисленные здания построены на внутренней поверхности огромного кольца. Существа, стоящие на улице Сигила, могут видеть, как город загибается кверху, а дальний конец города и вовсе находится у них над головой. Называемый Городом Дверей, этот многолюдный планарный мегаполис содержит бесчисленные порталы на другие планы и в другие миры.
Сигил — рай для торговцев. Товары, припасы и информация стекаются сюда со всех планов. В городе ведут бойкую торговлю информацией о планах, в частности, о командных словах и предметах, необходимых для активации того или иного портала. Здесь покупают и продают портальные ключи всех видов.
Город является доменом загадочной Госпожи Боли, сущности, старой как боги, но с целями, неизвестными ни одному мудрецу. Может, Сигил это её тюрьма? Может, она — сверженный создатель мультивселенной? Никто не знает. А если знает, то не говорит.
!!__''Демипланы''__
Демипланы это межпространственные участки, создаваемые самыми разными способами и подчиняющиеся своим собственным законам физики. Некоторые из них создаются заклинаниями. Другие существуют сами по себе, как складки реальности, отщипнутые от остальной мультивселенной. Теоретически, заклинание уход в иной мир может привести путников в демиплан, но подобрать для настройки на него нужную частоту невероятно трудно. Заклинание врата в этом плане надёжнее, при условии, что заклинатель знает нужный ему демиплан.
Демиплан может быть маленьким, как одна комната, или большим, как целый мир. Например, заклинание великолепный особняк Морденкайне-на создаёт демиплан, состоящий из прихожей и смежных с ней комнат, а долина Баровия (в игровом мире Равенлофт) существует тоже в деми-плане, находясь под властью вампира, Страда фон Заровича Если демиплан соединён с Материальным Планом или любым другим планом, войти в него можно так же легко, как в обычный портал или туманную завесу.
!!__''Дальний Предел''__
Дальний Предел находится за пределами известной мультивселенной. В сущности, это может быть абсолютно иная мультивселенная со своими собственными физическими и магическими законами. Там, где энергия Дальнего Предела просачивается на другой план, жизнь и материя искажаются, становясь чужеродными формами, не подчиняющимися обычной геометрии и биологии. Аберрации, такие как проницатели и злобоглазы, либо родом с этого плана, либо сформированы под его жутким влиянием.
Сущности, обитающие в Дальнем Пределе, слишком чужеродны, чтобы обычное сознание могло принять их без вреда для себя. Громадные существа парят там в нигде, охваченные безумием. Невыразимые твари шепчут жуткую истину тем, кто осмелится слушать. Для смертных знания Дальнего Предела это триумф сознания над границами материи, пространства и даже разума. Некоторые колдуны включаются в эту борьбу, заключая договоры с такими сущностями. Те, кто видели Дальний Предел, безумно бормочут о глазах, щупальцах и ужасе.
Известных порталов в Дальний Предел нет, по крайней мере, работающих. Древние эльфы когда-то пронзили границу тысячелетий большим порталом в Дальний Предел на горе Пик Огненной Бури, но их цивилизация сгинула в кровавом ужасе, и местоположение этого портала (и даже его мира) теперь забыто. Теоретически, могут существовать и другие порталы, через которые чужеродные силы отравляют окрестные земли Материального Плана.
//1 уровень, Преобразование, Волшебник/Друид/Следопыт/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (задняя лапка кузнечика)
:''Длительность:'' 1 минута
Вы касаетесь существа. Пока заклинание активно, расстояние прыжка этого существа увеличивается в три раза.
//1 уровень, Некромантия, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (небольшое количество алкоголя или дистиллированного спирта)
:''Длительность:'' 1 час
Укрепив себя некромантским подобием жизни, вы получаете 1к4 + 4 временных хита на время длительности заклинания.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы получаете 5 дополнительных временных хитов за каждый уровень ячейки выше первого.
!!!''__Пустое тело__''
"""Начиная с 18 уровня вы можете действием потратить 4 очка ци, чтобы стать невидимым на 1 минуту. В течение этого времени вы получаете сопротивление всем видам урона кроме урона силовым полем.
Кроме того, вы можете потратить 8 очков ци, чтобы использовать заклинание проекция в астрал без применения материальных компонентов. Вы не можете перемещать кого-либо вместе с собой."""
//6 уровень, Вызов, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С
:''Длительность:'' 1 раунд
Это заклинание создаёт магическую связь между неоживлённым растением с размером не меньше Большого, находящимся в пределах дистанции, и другим растением, находящимся на любом расстоянии на том же плане существования. Вы должны до этого хотя бы раз видеть или касаться растения, служащего местом назначения. Пока заклинание активно, все существа могут входить в целевое растение и выходить из растения, служащего местом назначения, использовав всего 5 футов перемещения.
Когда искатели приключений отправляются на другие планы существования, они совершают легендарные путешествия, благодаря которым могут столкнуться с невероятными стражниками и суровыми испытаниями. Характер таких путешествий и сопутствующие испытания зависят от способа перемещения, а также того, что было использовано: магический портал или переносящее заклинание.
!!__''Планарные порталы''__
"""//Глаза мага внимательно осматривали Врата, не пропуская ни малейшей подробности, хотя в этом, наверное, уже не было необходимости. Тысячи раз он видел Врата во сне и в мечтах, видел как наяву. Заклинания, открывающие проход, были просты — ничего особо хитрого в них не было. Маг должен был обратиться с соответствующей фразой к каждой из пяти драконьих голов, охранявших Врата. К головам тоже следовало обращаться в определённом порядке, а каждую фразу необходимо было произнести с особой интонацией, но для великого мага, каким стал Рейстлин, это было пустяковой задачей. Как только он закончит с этим, Крисания обратится к своему богу с молитвой, чтобы он удержал Врата открытыми. Когда они войдут, Врата закроются.//
//И тогда Рейстлин попробует решить ту великую задачу, которую он перед собой поставил.//"""
<<AlignRight "— Маргарет Уэйс и Трейси Хикмэн, Битва близнецов">>
«Портал» это общий термин для стационарной межпланарной связи конкретного места одного плана с конкретным местом на другом плане. Некоторые порталы функционируют как дверные проёмы — выглядят как чистое окно или заполненный туманом проём, и для перемещения достаточно пересечь их границу. Другие порталы это целые строения — круги из камней, парящие башни, плывущие корабли или даже целые города, существующие сразу на нескольких планах либо же перемещающиеся с одного плана на другой. Есть воронки, соединяющие Стихийные Планы с похожими местами Материального Плана, такие как жерло вулкана (ведёт на План Огня) или глубины океана (на План Воды).
Использование планарного портала — простейший способ путешествия с Материального Плана в искомое место на другом плане. Однако чаще всего именно использование порталов приводит к разного рода приключениям.
Во-первых, искатели приключений должны найти портал, ведущий в нужное им место. Большая часть порталов находится в удалённых местах, и эти места тематически связаны с планом, на который они ведут. Например, портал на Гору Целестию может находиться среди горных пиков.
Во-вторых, у порталов часто находятся стражи, не дающие им пользоваться нежелательным личностям. В зависимости от места выхода портала, «нежелательными личностями» могут быть злые персонажи, добрые персонажи, трусы, воры, те, кто носят мантии, или просто все смертные существа. Стражем обычно является мощное магическое существо, такое как гений, сфинкс, титан или уроженец того плана, куда ведёт портал.
И напоследок, большая часть порталов не стоит открытой постоянно, и открывается только в определённых ситуациях или при выполнении неких условий. Такие условия могут быть абсолютно любыми, но чаще всего используются следующие:
;
:''Время.'' Портал функционирует только в определённое время: во время полнолуния на Материальном Плане, или раз в десять дней, или когда звёзды находятся в определённом положении. Открывшись, такой портал стоит ограниченное время, например, в течение трёх дней полнолуния, одного часа или 1к4 + 1 раунда.
:''Ситуация.'' Портал функционирует только при выполнении особых условий. Привязанный к ситуации портал может открываться только в яснуюночь, или когда идёт дождь, или когда рядом с ним произнесут определённое заклинание.
:''Случайный период.'' Такой портал функционирует в течение некоторого периода, а потом закрывается на другой период, определённый случайным образом. Обычно такой портал позволяет пройти 1к6 + 6 путешественникам, а потом отключается на 1к6 дней.
:''Командное слово.'' Портал функционирует только если произнести определённое командное слово. Иногда слово нужно произносить, проходя сквозь портал (который без этого является обычным дверным или оконным проёмом). Другие порталы открываются при произношении командного слова, и какое-то время стоят открытыми.
:''Ключ.'' Портал функционирует если путник держит определённый предмет, выполняющий роль ключа. Такой ключ может быть обычным предметом или специальным ключом, созданным для данного портала. Город Сигил над Внешними Землями известен также как Город Дверей из-за того, что там присутствует невероятное множество таких порталов, зависящих от ключей.
Процесс узнавания требований и их выполнение могут вовлечь персонажей в новые приключения, где они будут добывать ключевые предметы, искать в старых библиотеках командные слова и советоваться с мудрецами, силясь узнать точное время открытия портала.
!!__''Заклинания''__
//"""Сария воздела руки и начала декламировать слова очень мощного заклинания, одного из самых опасных, известных ей. Заклинания, предназначенного для пробивания барьеров между планами и создания магического моста в другое царство бытия. Мифал зазвенел в ответ, пульсация старого устройства перешла на новую, совершенно иную ноту. Сария проигнорировала изменения в мифале и стала завершать накладывание заклинания, открывающего врата.
«Врата открыты! — закричала она. — Малкизид, приди!»
В воздухе перед Сарией возник большой магический круг. Сквозь него она мельком увидела мир Малкизида, инфернальные пустоши выжженной пустыни, продуваемые ветрами разломы и чёрные злобные небеса, разрываемые алыми молниями. Потом через врата переступил архидьявол Малкизид. Совершив один шаг, он перенёсся со своего адского плана в комнату с мифалом."""//
<<AlignRight "— Ричард Бейкер, Дальний Предел">>
Многие заклинания создают прямой или опосредованный доступ на другие планы существования. Заклинания уход в иной мир и врата могут перенести искателей приключений на любой другой план, хотя и с разной степенью точности. Заклинание эфирность позволяет переходить на Эфирный План. А заклинание проекция в астрал позволяет искателям приключений проецировать себя в Астральный План и оттуда переходить на Внешние Планы.
;
:"""//''Уход в иной мир.''// У заклинания уход в иной мир есть два важных ограничения. Первое — это материальный компонент: маленький раздвоенный металлический прут (как камертон), настроенный на желаемый план. Заклинанию требуется резонанс с частотой места прибытия, а для этого прут должен быть изготовлен из правильного материала (чаще всего это сложный сплав). Создание такого прута обойдётся недёшево (как минимум 250 зм), но даже сами поиски правильных его характеристик могут привести к приключениям. В самом деле, не так уж много на свете есть людей, побывавших в глубинах Карцери, поэтому мало кто может достоверно сказать, какой именно прут для этого нужен.
Во-вторых, это заклинание не переносит заклинателя в конкретное место, если только тот не обладает очень точной информацией. Последовательность символов круга телепортации на другом плане позволяет перенестись именно в него, но такую информацию получить ещё сложнее, чем знания о свойствах прута В противном случае заклинание переносит в место, близкое к желаемому. Куда бы ни прибыли искатели приключений, им, скорее всего, придётся совершить ещё одно небольшое путешествие, чтобы достичь искомого места."""
:"""//''Врата.''// Заклинание врата открывает портал, связанный с конкретным местом на другом плане существования. Это заклинание создаёт кратчайший путь в другие миры, обходя большую часть стражников и испытаний, обычно обрушивающихся на тех, кто совершает подобные путешествия. Однако это заклинание 9 уровня, и оно доступно только самым мощным персонажам, и оно никак не может смягчить опасности, которые поджидают в точке выхода.
Заклинание врата мощное, но не всесильное. Божества, демонические повелители и прочие влиятельные сущности могут запретить открытие таких порталов в своих владениях."""
!!''Путь дикости''
В сердце каждого варвара пылает ярость, и в этом горниле выплавляется путь к величию варвара. Разные варвары связывают свою ярость с разными источниками. Для некоторых это внутреннее вместилище, где боль, горе и гнев сплавляются в кипящую ярость. Для других же это благословение, даруемое тотемным животным.
<<Button "Путь берсерка (Варвар)" "Путь берсерка">>
<<Button "Путь тотемного воина (Варвар)" "Путь тотемного воина">>
!!!''__Путь берсерка__''
Для некоторых варваров ярость это способ достижения цели, и этой целью является насилие. Путь берсерка это путь, залитый кровью, путь несдерживаемой ярости. Впадая в ярость берсерка, вы бросаете себя в хаос боя, не заботясь более о собственном здоровье.
!!!''Бешенство''
Если вы выбрали этот путь, то начиная с 3 уровня, находясь в состоянии ярости, вы можете впасть в бешенство. В этом случае, пока ваша ярость не прекратилась, вы можете в каждый свой ход после текущего совершать бонусным действием одну рукопашную атаку оружием. После окончания ярости вы получаете один уровень усталости (как описано в приложении А).
!!!''Бездумная ярость''
Начиная с 6 уровня вы не можете быть испуганы или очарованы, пока находитесь в состоянии ярости. Если вы были испуганы или очарованы до того, как впали в состояние ярости, эти эффекты приостанавливаются до окончания вашей ярости.
!!!''Пугающее присутствие''
"""Начиная с 10 уровня, вы можете действием пугать других своим ужасающим видом. Чтобы сделать это, выберите существо в пределах 30 футов от себя, которое вы можете видеть. Если оно может видеть или слышать вас, оно должно совершить успешный спасбросок Мудрости (Сл равна 8 + ваш бонус мастерства + ваш модификатор Харизмы), иначе станет испуганным вами до конца вашего следующего хода. В последующие ходы вы можете действием поддерживать этот эффект до конца своего следующего хода. Эффект оканчивается, если цель оказалась вне линии обзора, или далее чем в 60 футах от вас.
Если существо преуспело в спасброске, вы не можете использовать на нём это умение следующие 24 часа."""
!!!''Ответный удар''
Начиная с 14 уровня, при получении урона от существа, находящегося в пределах 5 футов от вас, вы можете реакцией совершить по нему рукопашную атаку оружием.
!!!''__Путь дикости__''
На 3 уровне вы выбираете путь, определяющий природу вашей ярости. Выберите путь берсерка или путь тотемного воина. Они перечислены в конце описания класса. Ваш выбор обеспечит вам умения на 3, 6, 10 и 14 уровнях.
!!!__''Путь открытой ладони''__
Монахи, избравшие этот путь, являются непревзойдёнными мастерами боевых искусств, вне зависимости от того, вооружены ли они. Они изучают техники, позволяющие толкать и опрокидывать противника, а также лечить себя, манипулируя энергией ци. Используемые ими медитации позволяют защититься от получаемого вреда.
!!!''Техники открытой ладони''
При выборе этой традиции на 3 уровне вы получаете возможность манипулировать вражеской энергией ци, направляя свою собственную. Если вы попадаете по существу одной из атак, дарованных Шквалом ударов, вы можете наложить на цель один из следующих эффектов:
* Цель должна преуспеть в спасброске Ловкости, иначе она сбивается с ног.
* Цель должна совершить спасбросок Силы. В случае провала вы можете толкнуть её от себя на расстояние до 15 футов.
* Цель не может совершать реакции до конца вашего следующего хода.
!!!''Исцеление тела''
На 6 уровне вы получаете способность лечить себя. Вы можете действием восстановить количество хитов, равное вашему утроенному уровню монаха. Вы должны завершить продолжительный отдых, прежде чем сможете использовать это умение снова.
!!!''Умиротворение''
Начиная с 11 уровня вы можете совершить специальную медитацию, окружающую вас аурой мира. В конце продолжительного отдыха вы получаете эффект заклинания убежище, длящийся до начала вашего следующего продолжительного отдыха (эффект может окончиться ранее, согласно описанию заклинания). Сл спасброска от заклинания равна 8 + модификатор Мудрости + бонус мастерства.
!!!''Дрожащая ладонь''
"""На 17 уровне вы получаете возможность создавать смертельные колебания в чужом теле. Если вы попадёте по существу безоружным ударом, вы можете потратить 3 очка ци, чтобы создать неуловимые колебания в его теле, которые длятся в течение количества суток, равного вашему уровню монаха. Колебания безвредны, пока вы не остановите их действием. Для того чтобы остановить их, цель должна находится на одном плане существования с вами. При этом существо должно совершить спасбросок Телосложения. В случае успеха цель получает урон некротической энергией 10к10, а в случае провала её хиты опускаются до 0.
Вы можете держать одновременно только одно существо под действием Дрожащей ладони. Вы можете решить закончить колебания без вреда, не тратя действие."""
!!!''__Путь тени__''
Монахи, следующие по Пути тени, ценят хитрость и уловки. Эти монахи, которых называют ниндзями или теневыми танцорами, служат шпионами и наёмными убийцами. Иногда члены такого монастыря, являясь одной семьёй, образуют кланы и хранят в тайне своё искусство и цели. Другие монастыри больше похожи на гильдии воров, предоставляя свои услуги знати, богатым купцам, и всем, кто может заплатить. Вне зависимости от методов, руководители этих монастырей ожидают беспрекословного подчинения от своих учеников.
!!!''Техника тени''
При выборе этой традиции на 3 уровне вы можете использовать свою ци, чтобы дублировать эффекты некоторых заклинаний. Вы можете действием использовать 2 очка ци, чтобы сотворить бесследное передвижение, тёмное зрение, тишину или тьму, не тратя материальные компоненты. Кроме того, вы получаете заговор малая иллюзия, если вы ещё не знаете его.
!!!''Шаг тени''
На 6 уровне вы получаете возможность шагнуть из одной тени в другую. Если вы находитесь в темноте или пространстве с тусклым освещением, вы можете бонусным действием телепортироваться на 60 футов в другое тусклое или тёмное пространство, которое видите. Свою первую рукопашную атаку до конца текущего хода вы совершите с преимуществом.
!!!''Плащ теней''
На 11 уровне вы узнаёте, как становиться единым с тенью. Когда вы находитесь в области с тусклом освещением или в темноте, вы можете действием стать невидимым. Вы остаётесь невидимыми до тех пор, пока не нападёте, не сотворите заклинание, или не окажетесь в области яркого света.
!!!''Оппортунист''
На 17 уровне вы узнаёте, как использовать мгновенное отвлечение цели, по которой попала атака. Если по существу в радиусе 5 футов от вас попала атака, совершенная другим существом, но не вами, вы можете реакцией совершить по нему рукопашную атаку.
!!!__''Путь тотемного воина''__
"""Путь тотемного воина — духовный путь, в котором дух зверя становится для варвара наставником, защитником и вдохновителем. В бою дух тотема дарует вам сверхъестественную мощь, наполняя вашу ярость магической силой.
Большинство варварских племён связывают свои кланы с конкретными духами-покровителями, и иметь несколько тотемных духов считается необычным, хотя такие исключения и случаются."""
!!!''Искатель духов''
Ваш путь, тесно связанный с дикой природой, даёт вам близость с животными. На 3 уровне, если вы выбрали этот путь, вы получаете возможность использовать заклинания животные чувства и разговор с животными, но только в виде ритуалов, как описано в главе 10.
!!!''Тотемный дух''
"""На 3 уровне, встав на этот путь, вы выбираете своего тотемного духа, и получаете его умения. Вы должны сделать или приобрести тотем: физический предмет (амулет или похожее украшение), содержащий мех или кожу, перья, когти, зубы или кости тотемного животного. Если хотите, можете приобрести незначительные физические изменения, напоминающие ваше тотемное животное. Например, если вашим тотемным животным является медведь, вы можете получить необычную волосатость и толстокожесть, а если это орёл, то ваши глаза могут приобрести ярко-жёлтый цвет.
Ваше тотемное животное должно относиться к одному из перечисленных ниже, но быть естественным для вашей родной местности. Например, вместо орла может быть ястреб или гриф."""
* //''Волк.''//Пока вы находитесь в состоянии ярости, ваши друзья совершают броски рукопашных атак по всем враждебным вам существам, находящимся в пределах 5 футов от вас, с преимуществом. Дух волка делает вас вожаком стаи.
* //''Медведь.''// В состоянии ярости вы получаете сопротивление всем видам урона кроме урона психической энергией. Дух медведя делает вас достаточно крепким, чтобы выдержать любое испытание.
* //''Орёл.''// Когда вы находитесь в состоянии ярости и не носите тяжёлых доспехов, другие существа совершают провоцированные атаки по вам с помехой. В свой ход вы можете совершать Рывок бонусным действием. Дух орла превращает вас в хищника, с лёгкостью носящегося по полю боя.
!!!''Аспект зверя''
На 6 уровне вы получаете волшебное свойство, зависящее от выбранного вами тотемного животного. Вы можете выбрать то же животное, что и на 3 уровне, либо другое.
* //''Волк.''// Вы получаете чутьё охотящегося волка. Вы можете идти по следу существа, путешествуя в быстром темпе, или передвигаться скрытно, путешествуя в нормальном темпе (смотрите правила по темпам путешествия в главе 8).
* //''Медведь.''// Вы получаете мощь медведя. Ваша способность переносить тяжести (включая максимальный вес нагрузки и подъёма) удваивается, и вы совершаете с преимуществом проверки Силы, совершённые, чтобы толкать, тянуть, поднимать или ломать предметы.
* ''//Орёл.//'' Вы получаете зоркость орла. Вы без затруднений можете видеть на расстоянии до одной мили, и способны различить мельчайшие детали, рассматривая что-то на расстоянии до 100 футов (30 метров). Кроме того, тусклое освещение более не накладывает помеху на проверки Мудрости (Внимательность).
!!! ''Гуляющий с духами''
На 10 уровне вы получаете способность использовать заклинание общение с природой в качестве ритуала. Когда вы делаете это, призрачная версия одного из ваших тотемных животных является вам и сообщает необходимую информацию.
!!!''Гармония тотема''
На 14 уровне вы получаете волшебное свойство, зависящее от выбранного вами тотемного животного. Вы можете выбрать то же животное, что и ранее, либо другое.
* //''Волк.''// Пока вы в состоянии ярости, вы можете в свой ход бонусным действием сбить с ног существо Большого или менее размера, когда попадаете по нему атакой рукопашным оружием.
* ''//Медведь.//'' Пока вы в состоянии ярости, все враждебные существа в пределах 5 футов от вас совершают с помехой броски атак, нацеленных не на вас и не на другое существо с таким же свойством. Противники получают иммунитет к этому эффекту, если не могут видеть или слышать вас, либо если они не могут быть напуганы.
* ''//Орёл.//'' Находясь в состоянии ярости, вы приобретаете скорость полёта, равную вашей скорости передвижения. Это преимущество работает только в коротком промежутке времени. Если вы завершите свой ход в воздухе, где ничто не будет вас поддерживать, вы упадёте.
!!!''Путь четырёх стихий''
"""Вы следуете монастырской традиции, учащей управлять четырьмя стихиями. Сфокусировав свою ци, вы можете настроиться на силы мироздания и подчинить четыре стихии своей воле, используя их как продолжение собственного тела. Некоторые члены этой традиции связывают себя с одним элементом, другие же соединяют их.
Многие монахи этой традиции покрывают свои тела татуировками, отражающими их энергию ци. Обычно это извивающиеся драконы, но встречаются также фениксы, рыбы, растения, горы и пенящиеся волны."""
!!!''Адепт стихий''
"""Когда вы выбираете эту традицию на 3 уровне, вы изучаете практики, позволяющие управлять четырьмя стихиями. Эти практики требуют использования очков ци.
Вы знаете практику Родство со стихией и ещё одну на свой выбор. Все практики описаны ниже. Вы изучите дополнительные практики на 6, 11 и 17 уровнях.
Каждый раз, когда вы изучаете новую практику, вы можете также заменить одну из ранее изученных практик другой, на свой выбор.
''Накладывание стихийных заклинаний.'' Некоторые стихийные практики позволяют вам накладывать заклинания. Общие правила по использованию заклинаний смотрите в главе 10. При использовании этих заклинаний вы используете их обычное время накладывания и прочие правила, но вам не нужны материальные компоненты.
При достижении 5 уровня в этом классе вы можете тратить очки ци для усиления заклинаний, полученных благодаря стихийным практикам, если эти заклинания увеличивают свою эффективность с уровнем, как, например, огненные ладони. Уровень заклинания увеличивается на 1 за каждое потраченное очко ци. Например, если вы — монах 5 уровня, и используете Испепеляющий удар для накладывания заклинания огненные ладони, вы можете потратить 3 очка ци, чтобы создать его как заклинание 2 уровня (базовая стоимость использования этой практики 2 очка ци, плюс ещё 1).
Максимальное количество очков ци, которое может быть потрачено на одно заклинание, определяется вашим уровнем монаха и указано в таблице. Оно включает как базовую стоимость, так и дополнительно потраченные очки ци."""
Заклинания и очки ци
<table>
<tr>
<th>Уровень монаха</th>
<th>Максимальное количество ци на заклинание</th>
</tr>
<tr>
<td>5–8</td>
<td>3</td>
</tr>
<tr>
<td>9–12</td>
<td>4</td>
</tr>
<tr>
<td>13–16</td>
<td>5</td>
</tr>
<tr>
<td>17–20</td>
<td>6</td>
</tr>
</table>
!!!''Стихийные практики''
Все практики представлены в алфавитном порядке. Если практика требует определённого уровня, вы должны достигнуть этого уровня монаха, чтоб изучить её.
''Водяной кнут.'' Вы можете действием потратить 2 очка ци и создать водяной кнут, сбивающий существ с ног. Существо, которое вы видите, и которое находится в пределах 30 футов от вас, должно совершить спасбросок Ловкости. В случае провала существо получает дробящий урон 3к10, плюс дополнительный дробящий урон 1к10 за каждое дополнительное потраченное очко ци, и вы можете либо сбить его с ног, либо подтянуть его на 25 футов ближе к себе. В случае успешного спасброска существо получает половину урона, не подтягивается и не сбивается с ног.
''Гонг на вершине горы (требуется 6 уровень).'' Вы можете потратить 3 очка ци, чтобы использовать заклинание дребезги.
''Дыхание зимы (требуется 17 уровень).'' Вы можете потратить 6 очков ци, чтобы использовать заклинание конус холода.
''Земляной вал (требуется 17 уровень).'' Вы можете потратить 6 очков ци, чтобы использовать заклинание каменная стена.
''Зубы огненной змеи.'' Когда вы в свой ход используете действие Атака, вы можете потратить 1 очко ци, и во время атаки из ваших рук и ног будут вырываться языки пламени. Досягаемость безоружных атак для этой и последующих атак текущего хода увеличивается на 10 футов. Попадание таких атак причиняет урон огнём вместо дробящего урона, и вы можете при попадании потратить ещё 1 очко ци, чтобы увеличить урон конкретной атаки на урон огнём 1к10.
''Испепеляющий удар.'' Вы можете потратить 2 очка ци, чтобы использовать заклинание огненные ладони.
''Кулак четырёх громов.'' Вы можете потратить 2 очка ци, чтобы использовать заклинание волна грома.
''Натиск штормовых духов.'' Вы можете потратить 2 очка ци, чтобы использовать заклинание порыв ветра.
''Несокрушимый воздушный кулак.'' Вы создаёте область сжатого воздуха, бьющую как могучий кулак. Вы действием тратите 2 очка ци и выбираете существо в пределах 30 футов от себя. Это существо должно совершить спасбросок Силы. В случае провала существо получает дробящий урон 3к10, плюс дополнительно 1к10 дробящего урона за каждое дополнительно потраченное очко ци, и вы можете отбросить существо на 20 футов от себя и сбить его с ног. В случае успешного спасброска существо получает половину урона, не отбрасывается, не сбивается с ног.
''Объятья северного ветра (требуется 6 уровень).'' Вы можете потратить 3 очка ци, чтобы использовать заклинание удержание личности.
''Осёдланный ветер (требуется 11 уровень).'' Вы можете потратить 4 очка ци, чтобы использовать заклинание полёт, нацеленное на себя.
''Пламя феникса (требуется 11 уровень).'' Вы можете потратить 4 очка ци, чтобы использовать заклинание огненный шар.
''Прочность вечных гор (требуется 17 уровень).'' Вы можете потратить 5 очков ци, чтобы использовать заклинание каменная кожа, нацеленное на себя.
''Река голодного пламени (требуется 17 уровень).'' Вы можете потратить 5 очков ци, чтобы использовать заклинание огненная стена.
''Родство со стихией.'' Вы можете действием на некоторое время взять под контроль расположенные поблизости стихийные силы. Это позволит выбрать один из следующих эффектов:
* Создаётся безвредный мгновенный эффект, связанный с водой, воздухом, землёй или огнём, такой как сноп искр, дуновение ветра, поток лёгкого тумана или тихое гудение камня.
* Мгновенно загорается или тушится свеча, факел или небольшой костёр.
* Остужается или нагревается до 1 фунта неживой материи на время до 1 часа.
* Вода, воздух, земля или огонь, способные втиснуться в куб с длиной ребра 1 фут, принимают на 1 минуту грубую форму, выбранную вами.
''Туманная стойка (требуется 11 уровень).'' Вы можете потратить 4 очка ци, чтобы использовать заклинание газообразная форма, нацеленное на себя.
''Формирование текущей реки.'' Вы можете действием потратить 1 очко ци, чтобы выбрать область льда или воды в пространстве с длиной стороны не больше 30 футов, в пределах 120 футов от себя. Вы можете превратить в этой области воду в лёд и наоборот, и вы можете придавать льду в этой области любую форму. Вы можете повысить или понизить уровень льда, создать или заполнить углубление, возвести или сравнять стену, или создать ледяной столб. Размер любого изменения не может превышать половину наибольшей стороны области. Например, если вы изменяете пространство с длиной стороны в 30 футов, можно создать столб до 15 футов в высоту, поднять или опустить высоту области до 15 футов, вырыть углубление до 15 футов, и так далее. Вы не можете замуровать существо в лёд или причинить этим воздействием другому существу урон.
//2 уровень, Вызов, Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок сала, щепотка серы и толчёного железа)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""В свободном пространстве на ваш выбор в пределах дистанции появляется шар из огня с диаметром 5 футов, существующий, пока активно заклинание. Все существа, оканчивающие ход в пределах 5 футов от шара, должны совершать спасбросок Ловкости. Существа получают урон огнём 2к6 при провале или половину этого урона при успехе.
Вы можете бонусным действием переместить шар на 30 футов. Если вы тараните шаром существо, это существо должно совершить спасбросок от урона шара, и шар останавливается до конца этого хода.
Когда вы перемещаете шар, вы можете поднимать его над препятствиями до 5 футов в высоту и перепрыгивать им разломы до 10 футов в длину. Шар поджигает горючие предметы, которые никто не несёт и не носит, и испускает яркий свет в пределах 20 футов и тусклый свет в пределах ещё 20 футов."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше второго.
!!!''Пьющий жизнь''
"""//Требование: 12 уровень, умение Договор клинка//
Когда вы попадаете по существу оружием договора, это существо получает дополнительный урон некротической энергией, равный вашему модификатору Харизмы (минимум 1)."""
//9 уровень, Ограждение, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность: '' 10 минут
"""Мерцающая разноцветная плоскость формирует вертикальную стену с длиной 90 футов, высотой 30 футов и толщиной 1 дюйм, с центром на точке, видимой в пределах дистанции. В качестве альтернативы, вы можете свернуть стену в сферу 30-футового диаметра с центром на точке, видимой в пределах дистанции. Стена существует, пока активно заклинание. Если вы размещаете стену так, что она пройдёт по пространству, занятому существом, заклинание проваливается, а ваше действие и ячейка заклинания тратятся.
Стена испускает яркий свет в пределах 100 футов и тусклый свет в пределах ещё 100 футов. Вы и существа, указанные вами при накладывании заклинания, можете без вреда проходить сквозь стену и оставаться возле неё. Если другое существо, способное видеть, перемещением оказывается в пределах 20 футов от стены или начинает там ход, оно должно преуспеть в спасброске Телосложения, иначе оно станет ослеплённым на 1 минуту.
Стена состоит из семи слоёв разного цвета. Когда существо пытается коснуться стены или пройти сквозь неё, оно проходит по одному слою за раз, пока не пройдёт сквозь все. Коснувшись очередного слоя, существо должно совершить спасбросок Ловкости, чтобы защититься от его эффектов, описанных ниже.
Стену можно уничтожить, по одному слою за раз, в порядке от красного к фиолетовому, средствами, специфичными для каждого слоя. Уничтоженный слой остаётся уничтоженным на период всего действия заклинания. Жезл отмены уничтожает радужную стену, но преграда магии не оказывает на неё эффекта.
//''1. Красный.''// Существо получает урон огнём 10к6 при провале или половину этого урона при успехе. Пока этот слой существует, немагические дальнобойные атаки не могут проходить сквозь стену. Этот слой можно уничтожить, причинив ему урон холодом 25.
//''2. Оранжевый.''// Существо получает урон кислотой 10к6 при провале или половину этого урона при успехе. Пока этот слой существует, магические дальнобойные атаки не могут проходить сквозь стену. Этот слой можно уничтожить сильным ветром.
//''3. Жёлтый.''// Существо получает урон электричеством 10к6 при провале или половину этого урона при успехе. Этот слой можно уничтожить, причинив ему урон силовым полем 60.
//''4. Зелёный.''// Существо получает урон ядом 10к6 при провале или половину этого урона при успехе. Заклинание создание прохода, а также другие заклинания, с неменьшим уровнем, открывающие проходы в твёрдой поверхности, уничтожают этот слой.
//''5. Голубой.''// Существо получает урон холодом 10к6 при провале или половину этого урона при успехе. Этот слой можно уничтожить, причинив ему урон огнём 25.
//''6. Синий.''// При провале существо становится опутанным. После этого оно в конце каждого своего хода должно совершать спасброски Телосложения. Если оно успешно спасётся три раза, заклинание оканчивается. Если оно провалит спасбросок три раза, оно превращается в камень и получает состояние «окаменевшее» на время длительности заклинания. Успехи и провалы не обязаны быть последовательными; отслеживайте их отдельно, пока не накопится три вида чего-то одного.
Пока этот слой существует, сквозь стену нельзя накладывать заклинания. Этот слой уничтожается ярким светом от заклинания дневной свет или подобного заклинания с неменьшим уровнем.
//''7. Фиолетовый.''// При провале существо становится ослеплённым. После этого оно в начале вашего следующего хода должно совершить спасбросок Мудрости. Успешное спасение оканчивает слепоту. При провале существо переносится на другой план, выбранный Мастером, и перестаёт быть ослеплённым (обычно существа на неродных планах изгоняются домой, а остальные существа обычно выбрасываются на Астральный или Эфирный планы). Этот слой уничтожается заклинанием рассеивание магии или подобными заклинаниями с неменьшим уровнем, оканчивающими заклинания и магические эффекты."""
//7 уровень, Воплощение, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (60-футовый конус)
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
"""Восемь разноцветных лучей света вылетают из вашей ладони. Каждый луч своего цвета, и у каждого свои особые свойства. Все существа в пределах 60-футового конуса должны совершить спасбросок Ловкости. Для каждой цели совершите бросок к8, чтобы определить, луч какого цвета её коснулся.
//''1. Красный.''// Цель получает урон огнём 10к6 при провале или половину этого урона при успехе.
//''2. Оранжевый.''// Цель получает урон кислотой 10к6 при провале или половину этого урона при успехе.
//''3. Жёлтый.''// Цель получает урон электричеством 10к6 при провале или половину этого урона при успехе.
//''4. Зелёный.''// Цель получает урон ядом 10к6 при провале или половину этого урона при успехе.
//''5. Голубой.''// Цель получает урон холодом 10к6 при провале или половину этого урона при успехе.
//''6. Синий.''// При провале цель становится опутанной. После этого цель в конце каждого своего хода совершает спасбросок Телосложения. Если будет совершено три успешных спасброска, заклинание оканчивается. Если накопится три провала, цель навсегда превращается в камень и становится окаменевшей. Успехи и провалы не обязаны быть последовательными; отслеживайте их отдельно друг от друга, пока не накопится три результата одного вида.
//''7. Фиолетовый.''// При провале цель становится ослепшей. В начале вашего следующего хода она совершает спасбросок Мудрости. Успех оканчивает ослепление. При провале существо перемещается на другой план существования на выбор Мастера и перестаёт быть ослепшей (обычно существа на неродных планах изгоняются домой, а остальные существа обычно выбрасываются на Астральный или Эфирный планы).
//''8. Особенность.''// По цели попадают два луча. Совершите ещё два броска кости, перебрасывая выпавшие «8»."""
//1 уровень, Прорицание, Бард/Друид/Следопыт (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность: '' 10 минут
Вы получаете на время действия заклинания возможность понимать зверей и общаться с ними устно. Знание и сознание многих зверей ограничено их интеллектом, но они как минимум могут дать информацию о ближайших местах и чудовищах, включая тех, кого они видели за последний день. На усмотрение Мастера, вы можете попытаться убедить зверя оказать вам небольшую помощь.
//3 уровень, Некромантия, Бард/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (горящие благовония)
:''Длительность: '' 10 минут
"""Вы даёте подобие жизни и сознания трупу, выбранному в пределах дистанции, позволяя ему отвечать на задаваемые вами вопросы. У трупа должен быть рот, и он не может быть нежитью. Заклинание проваливается, если этот труп был целью этого заклинания в течение последних 10 дней.
Пока заклинание активно, вы можете задать трупу пять вопросов. Труп знает только то, что знал при жизни, включая известные языки. Ответы обычно короткие, загадочные или невыразительные, и труп не обязан давать правдивый ответ, если вы враждебны к нему или он распознает в вас врага. Это заклинание не возвращает душу в тело существа, а только оживляет дух. Таким образом, труп не может узнавать новую информацию, не осознаёт того, что происходило после его смерти, и не может размышлять о будущих событиях."""
//3 уровень, Преобразование, Бард/Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В, С
:''Длительность: '' 10 минут
"""Вы наделяете растения в пределах 30 футов от себя ограниченным сознанием и подобием жизни, позволяя им общаться с вами и выполнять ваши простые инструкции. Вы можете спрашивать их о событиях, происходивших в области заклинания за последний день, получая информацию о проходивших существах, погоде и прочих обстоятельствах.
Вы можете также превратить на время действия заклинания труднопроходимую местность, вызванную растениями (кусты и заросли), в обычную местность. Вы можете превратить на время действия заклинания обычную местность в труднопроходимую, если там есть растения, например, заставляя ветки и лианы хватать преследователей.
На усмотрение Мастера, растения могут выполнять и другие задачи. Это заклинание не позволяет растениям выкапываться и перемещаться, но они могут свободно двигать ветками, ростками и стеблями.
Если в области заклинания есть растительное существо, вы можете общаться с ним, как если бы у вас был общий язык, но вы не получаете магическую способность влиять на него.
Это заклинание может заставить растения, созданные заклинанием опутывание, отпустить существо."""
//2 уровень, Иллюзия, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность: '' Концентрация, вплоть до 1 минуты
Ваше тело становится размытым и колышущимся для всех, кто видит вас. Пока заклинание активно, все существа совершают по вам броски атаки с помехой. Атакующий получает иммунитет к этому эффекту, если полагается не на зрение, а, например, на слепое зрение, или может видеть сквозь иллюзии, например, с помощью истинного зрения.
//5 уровень, Воплощение, Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый радиус)
:''Компоненты:'' В
:''Длительность: '' Мгновенная
Вы топаете по полу, создавая волну божественной энергии, исходящей от вас. Все существа, выбранные вами в пределах 30 футов, должны преуспеть в спасброске Телосложения, иначе они получат урон звуком 5к6, а также урон 5к6 излучением или некротической энергией (на ваш выбор), и будут сбиты с ног. Существо, преуспевшее в спасброске, получает половину урона и не сбивается с ног.
Некоторые магические предметы обладают разумом и чертами характера. Такой предмет может быть одержимым духом прежнего владельца, или же может обладать самосознанием благодаря сотворившей его магии. В любом случае, такой предмет ведёт себя как персонаж, со своими причудами, идеалами, привязанностями, а иногда и недостатками. Разумный предмет может быть ценным союзником, либо же постоянным раздражителем.
Большая часть разумных предметов это оружие. Разумными могут быть и другие предметы, но такие расходуемые предметы как зелья и свитки никогда не бывают разумными.
Разумные магические предметы действуют как ПМ под управлением Мастера. Все активированные свойства предмета находятся под его собственным управлением, а не под управлением владельца. Пока владелец поддерживает хорошие отношения с предметом, он имеет доступ к этим свойствам. Если отношения напряжённые, предмет может подавить активированные свойства или даже обратить их против владельца.
!!__''Создание разумных магических предметов''__
Если вы решили сделать магический предмет разумным, вы создаёте его личность так же, как если бы создавали ПМ, за некоторыми исключениями, описанными ниже.
!!!''Характеристики''
У разумного магического предмета есть значения Интеллекта, Мудрости и Харизмы. Вы можете подобрать характеристики самостоятельно, а можете определить случайным образом. В последнем случае бросьте 4к6 для каждой характеристики, отбрасывая в каждом случае меньшую кость и суммируя оставшиеся.
!!!''Общение''
Разумный предмет может каким-то образом общаться, либо делясь эмоциями, либо посредством телепатии, либо говоря вслух. Можете выбрать метод общения самостоятельно, а можете определить его случайным образом.
<table>
<tr>
<th>к100</th>
<th>Общение</th>
</tr>
<tr>
<th>01-60</th>
<td>Предмет общается, передавая эмоции существу, несущему или использующему его.</td>
</tr>
<tr>
<th>61-90</th>
<td>Предмет может говорить, читать и понимать на одном или нескольких языках.</td>
</tr>
<tr>
<th>91-00</th>
<td>Предмет может говорить, читать и понимать на одном или нескольких языках. Кроме того, он может общаться телепатически с персонажем, несущим или использующим его.</td>
</tr>
</table>
!!!''Чувства''
Вместе с чувствами появляется и сознание. Разумный предмет может воспринимать своё окружение в ограниченном радиусе. Можете выбрать чувства самостоятельно, а можете определить их случайным образом.
<table>
<tr>
<th>к4</th>
<th>Чувства</th>
</tr>
<tr>
<th>1</th>
<td>Слух и обычное зрение в пределах 30 футов.</td>
</tr>
<tr>
<th>2</th>
<td>Слух и обычное зрение в пределах 60 футов.</td>
</tr>
<tr>
<th>3</th>
<td>Слух и обычное зрение в пределах футов.</td>
</tr>
<tr>
<th>4</th>
<td>Слух и тёмное зрение в пределах 120 футов.</td>
</tr>
</table>
!!!''Мировоззрение''
У разумного магического предмета есть мировоззрение. Мировоззрение может определяться его создателем или природой, но вы можете самостоятельно выбрать мировоззрение или определить его случайным образом.
<table>
<tr>
<th>к100</th>
<th>Мировоззрение</th>
</tr>
<tr>
<td>01–15</td>
<td>Законно-доброе</td>
</tr>
<tr>
<td>16–35</td>
<td>Нейтрально-доброе</td>
</tr>
<tr>
<td>36–50</td>
<td>Хаотично-доброе</td>
</tr>
<tr>
<td>51–63</td>
<td>Законно-нейтральное</td>
</tr>
<tr>
<td>64–73</td>
<td>Нейтральное</td>
</tr>
<tr>
<td>74–85</td>
<td>Хаотично-нейтральное</td>
</tr>
<tr>
<td>86–89</td>
<td>Законно-злое</td>
</tr>
<tr>
<td>90–96</td>
<td>Нейтрально-злое</td>
</tr>
<tr>
<td>97–00</td>
<td>Хаотично-злое</td>
</tr>
</table>
!!!''Персонализация''
Используйте информацию по созданию ПМ из 4 главы, чтобы дать разумному предмету манеры, черты характера, идеалы, привязанности и слабости. Можете также использовать раздел «особые свойства», приведённый ранее в этой главе.
Если будете определять эти элементы случайным образом, игнорируйте или переделывайте результаты, не имеющие смысла для неживого предмета. Можете совершать броски, пока не получится устраивающий вас результат.
!!!''Особое предназначение''
Вы можете дать разумному предмету цель, которую он будет стараться преследовать, возможно, даже жертвуя чем-то другим. Пока владелец использует предмет сообразно его предназначению, предмет сотрудничает с ним. Отклонение от этого курса может вызвать конфликт между владельцем и предметом, и предмет может даже предотвратить использование уже активированных свойств. Можете выбрать особое предназначение самостоятельно, а можете определить его случайным образом.
<table>
<tr>
<th>к10</th>
<th>Предназначение</th>
</tr>
<tr>
<td>1</td>
<td>Мировоззрение: Предмет стремится покорять или уничтожать тех, чьё мировоззрение диаметрально противоположно его собственному (такой предмет не может быть нейтральным).</td>
</tr>
<tr>
<td>2</td>
<td>Погибель: Предмет стремится покорять или уничтожать существ определённого вида, таких как исчадья, перевёртыши, тролли или волшебники.</td>
</tr>
<tr>
<td>3</td>
<td>Защитник: Предмет стремится защищать определённую расу или разновидность существ, таких как эльфы или друиды.</td>
</tr>
<tr>
<td>4</td>
<td>Крестоносец: Предмет стремится побеждать, ослаблять или уничтожать слуг определённого божества.</td>
</tr>
<tr>
<td>5</td>
<td>Тамплиер: Предмет стремится защищать слуг и интересы определённого божества.</td>
</tr>
<tr>
<td>6</td>
<td>Уничтожитель: Предмет обожает разрушения и подстрекает владельца постоянно сражаться.</td>
</tr>
<tr>
<td>7</td>
<td>Искатель славы: Предмет стремится прослыть самым великим магическим предметом в мире, сделав владельца знаменитостью или скандальной личностью.</td>
</tr>
<tr>
<td>8</td>
<td>Искатель знаний: Предмет стремится искать знания, разгадывать тайны или расшифровывать таинственные пророчества.</td>
</tr>
<tr>
<td>9</td>
<td>Искатель судьбы: Предмет убеждён, что он и его владелец играют ключевые роли в будущих событиях.</td>
</tr>
<tr>
<td>10</td>
<td>Искатель создателя: Предмет ищет своего создателя и хочет понять, зачем он был создан.</td>
</tr>
</table>
!!__''Конфликт''__
У разумного предмета есть своя воля, характер и мировоззрение. Если владелец действует в разрез с мировоззрением или предназначением предмета, может возникнуть конфликт. Если такой конфликт произойдёт, предмет совершает проверку Харизмы, противопоставленную проверке Харизмы владельца. Если состязание выиграет предмет, он выдвигает одно или несколько требований:
* Предмет настаивает на том, чтобы его всегда носили или надевали.
* Предмет требует, чтобы владелец избавился от всего, что предмет посчитает отталкивающим.
* Предмет требует, чтобы владелец в первую очередь стремился выполнить цели предмета.
* Предмет требует, чтобы его передали кому-то другому.
Если владелец отказывается выполнить требования предмета, последний может выполнить все или часть пунктов из этого списка:
* Сделать невозможным настройку владельца на него.
*Подавить одно или несколько активированных свойств.
*Попытаться захватить контроль над владельцем.
Если разумный предмет пытается захватить контроль над владельцем, владелец должен совершить спасбросок Харизмы со Сл 12 + модификатор Харизмы предмета. При провале владелец становится очарованным предметом на 1к12 часов. Будучи очарованным, владелец обязан пытаться следовать командам предмета. Если владелец получает урон, он может повторить спасбросок, оканчивая эффект при успехе. Вне зависимости от исхода попытки захватить контроль над владельцем, предмет не может повторять эти попытки до следующего рассвета.
!!__''Примеры разумных предметов''__
У разумного оружия, описанного ниже, богатая история.
{{Волна (Магический предмет)}}
{{Лунный клинок}}
{{Сокрушитель}}
{{Чёрный клинок}}
//6 уровень, Некромантия, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Пока заклинание активно, ваши глаза становятся абсолютно чёрными, наполнившись жуткой энергией. Одно существо на ваш выбор в пределах 60 футов от вас, которое вы видите, должно преуспеть в спасброске Мудрости, иначе на время длительности заклинания оно попадает под действие одного из выбранных вами эффектов. В каждый свой ход, пока заклинание активно, вы можете действием нацелиться на другое существо, если только оно не совершило успешный спасбросок от этого разящего ока.
//''Паника.''// Цель испугана вами. В каждый свой ход испуганное существо должно совершать действие Рывок и перемещаться прочь от вас по самому безопасному и короткому из возможных маршруту, если ей есть куда перемещаться. Если цель окажется на расстоянии как минимум 60 футов от вас, в месте, в котором ей вас не видно, этот эффект заканчивается.
//''Слабость.''// Цель совершает с помехой броски атаки и проверки характеристик. В конце каждого своего хода она сможет совершить ещё один спасбросок Мудрости. В случае успеха эффект заканчивается.
//''Сон.''// Цель теряет сознание. Она просыпается, если получает урон или другое существо действием потрясёт его, чтобы разбудить."""
//2 уровень, Преобразование, Бард/Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок железа и пламя)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Выберите рукотворный металлический предмет, такой как металлическое оружие или комплект тяжёлого или среднего доспеха, видимый в пределах дистанции. Вы делаете его раскалённым докрасна. Все существа, находящиеся в физическом контакте с этим предметом, получают урон огнём 2к8, когда вы накладываете это заклинание. Пока заклинание активно, вы можете бонусным действием в каждом последующем ходу вновь причинять этот урон.
Если существо держит или носит предмет, и получает от него урон, оно должно преуспеть в спасброске Телосложения, иначе оно роняет этот предмет, если может. Если оно не может уронить предмет, то до начала вашего следующего хода совершает с помехой броски атаки и проверки характеристик."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше второго.
//6 уровень, Преобразование, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (магнетит и щепотка пыли)
:''Длительность: '' Мгновенная
"""Тонкий зелёный луч вылетает из вашего указательного пальца в цель, которую вы видите в пределах дистанции. Цель может быть существом, предметом или творением из магической силы, например, стеной, созданной заклинанием силовая стена.
Существо, ставшее целью этого заклинания, должно совершить спасбросок Ловкости. При провале оно получает урон силовым полем 10к6 + 40. Если этот урон опускает хиты цели до 0, она распадается.
Распавшееся существо, а также всё, что оно несло и носило, кроме магических предметов, превращается в кучку мелкого серого порошка. Такое существо можно вернуть к жизни только посредством заклинания истинное воскрешение или исполнение желаний.
Это заклинание вызывает автоматический распад немагических предметов и творений из магической силы с размером не больше Большого. Если цель — предмет или творение из магической силы с размером Огромное или больше, заклинание вызывает распад его части в кубе с длиной ребра 10 футов. На магические предметы это заклинание не действует."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, урон увеличивается на 3к6 за каждый уровень ячейки выше шестого.
//5 уровень, Ограждение, Жрец/Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С, М (святая вода или порошок серебра и железа)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Вас окружает мерцающая энергия, защищающая от фей, нежити и существ, происходящих не с Материального Плана. Пока заклинание активно, исчадия, небожители, нежить, феи и элементали совершают по вам броски атаки с помехой.
Вы можете закончить заклинание преждевременно, выбрав один из представленных ниже вариантов:
//''Изгнание.''// Вы совершаете действием рукопашную атаку заклинанием по исчадию, небожителю, нежити, фее или элементалю в пределах досягаемости. При попадании вы пытаетесь изгнать существо на его родной план. Существо должно преуспеть в спасброске Харизмы, иначе оно будет отправлено на свой родной план (если только оно уже не находится там). Нежить отправляется в Царство Теней, а феи в Страну Фей.
//''Поломка чар.''// Вы касаетесь действием существа, до которого можете дотянуться, и которое очаровано, испугано или одержимо исчадием, небожителем, нежитью, феей или элементалем. Это существо перестаёт быть очарованным, испуганным или одержимым такими существами."""
//3 уровень, Ограждение, Бард/Волшебник/Друид/Жрец/Колдун/Паладин/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
Выберите одно существо, предмет или магический эффект в пределах дистанции. Все заклинания 3 уровня и ниже на цели оканчиваются. Для каждого заклинания с уровнем 4 или выше совершите проверку базовой характеристики. Сл равна 10 + уровень заклинания. В случае успеха это заклинание оканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 4 уровня или выше, вы автоматически заканчиваете эффекты заклинаний на цели, чей уровень не превышает уровень использованной ячейки заклинаний.
Когда искатели приключений не спускаются под землю, не исследуют старые руины и не отражают наступление тьмы, они сталкиваются с обычной жизнью. Даже в фантастическом мире у существ есть основные нужды, такие как потребность в крыше над головой, пропитании и одежде. Всё это стоит денег, хотя можно жить впроголодь, а можно и шикуя.
!!!__''Затраты на существование''__
"""Затраты на существование предоставляют простой способ учитывать расходы на проживание в фэнтезийном мире. Они покрывают стоимость ночлега, еды и питья, а также все остальные нужды. Кроме того, эти затраты позволяют поддерживать ваше снаряжение в состоянии, готовом к новым приключениям.
В начале каждой недели или месяца (на ваш выбор) выберите стиль жизни из приведённой ниже таблицы и заплатите его стоимость. Цены указаны за день, так что при оплате за месяц умножьте указанную стоимость на 30. Существование может быть разным, в зависимости от текущих финансов, но вы можете поддерживать один и тот же стиль в течение всей карьеры своего персонажа.
У выбранного существования могут быть последствия. Живя на широкую ногу, вы сможете заключить контракты с богатыми и влиятельными личностями, но вы рискуете привлечь внимание воров. И наоборот, экономная жизнь позволит избежать внимания преступников, но вы вряд ли получите крупные связи."""
<<<
!!!''Самодостаточность''
"""Затраты на существование, описанные в этой главе, подразумевают, что вы проводите время между приключениями в городе, и пользуетесь услугами, которые можете себе позволить — платите за еду и ночлег, а также платите горожанам, чтобы они затачивали ваше оружие и чинили доспех. Однако некоторые персонажи предпочитают проводить время вдали от цивилизации, и живут в глухой местности за счёт охоты и сбора еды, и своё снаряжение они чинят сами.
Такое существование не требует тратить деньги, но оно занимает почти всё свободное время. Если вы между приключениями тратите время на работу по профессии, как описано в главе 8, вы можете вести аналог бедного существования. Владение навыком Выживание позволяет вести комфортное существование."""
<<<
''Затраты на существование''
<table>
<tr>
<th>Существование</th>
<th>Стоимость/день</th>
</tr>
<tr>
<td>Никудышное</td>
<td>—</td>
</tr>
<tr>
<td>Нищенское</td>
<td>1 см</td>
</tr>
<tr>
<td>Бедное</td>
<td>2 см</td>
</tr>
<tr>
<td>Скромное</td>
<td>1 зм</td>
</tr>
<tr>
<td>Комфортное</td>
<td>2 зм</td>
</tr>
<tr>
<td>Богатое</td>
<td>4 зм</td>
</tr>
<tr>
<td>Аристократическое</td>
<td>10 зм минимум</td>
</tr>
</table>
"""//''Никудышное.''// Вы живёте в нечеловеческих условиях. У вас нет дома, вы спите где придётся, шныряя по сараям, прячась под ящиками и надеясь на подачки от тех, у кого дела обстоят лучше вашего. Никудышный стиль жизни опасен. Вас всегда преследуют насилие, болезни и голод. Те, кто вместе с вами ведёт никудышное существование, хотят заполучить ваши доспехи, оружие и снаряжение, так как для них это целое состояние. За вами все пристально следят.
//''Нищенское.''// Вы живёте в протекающем стойле, землянке за городом или кишащей клопами ночлежке в трущобах. Вы укрыты от стихий, но окружение всё равно опасно, так как грозит болезнями, голодом и неудачами. Многие за вами следят, и закон вас почти не защищает. Многие из тех, что ведут такое существование, испытывают трудности. Им не дают покоя, их клеймят изгоями и они страдают от болезней.
//''Бедное.''// Бедное существование означает отсутствие благ, доступных в стабильном обществе. Однообразная пища и плохой ночлег, рваная одежда и непредсказуемое будущее приводят к неприятным последствиям. Вы можете жить в комнате в ночлежке или в общем зале над таверной. Закон вас частично защищает, но вам всё равно придётся бороться с насилием, преступлениями и болезнями. Те, кто ведут такое существование, обычно трудятся чернорабочими, лоточниками, коробейниками, ворами и занимают другие не престижные должности.
//''Скромное.''// Скромное существование выводит вас из трущоб и означает, что вы можете поддерживать своё снаряжение. Вы живёте в старой части города, снимая комнату в пансионе, на постоялом дворе или в храме. Вас не мучают голод и жажда, и вы живёте в чистоте, хотя и по-простецки. Скромное существование ведут солдаты и их семьи, разнорабочие, студенты, священники, начинающие волшебники и другие.
//''Комфортное.''// Комфортное существование означает, что вы можете позволить себе хорошую одежду и поддерживаете своё снаряжение в хорошем состоянии. Вы живёте в небольшом домике с соседями среднего класса или в личной комнате на хорошем постоялом дворе. Вы ведёте дела с купцами, опытными торговцами и военными офицерами.
//''Богатое.''// Богатое существование означает жизнь в роскоши, хотя у вас может и не быть унаследованных состояний как у дворян или членов королевской семьи. Такую же как вы жизнь ведут успешные торговцы, любимые слуги при дворе, или владельцы нескольких успешных предприятий. У вас комфортное жилище, обычно это просторный дом в хорошем районе города или комфортный номер в отличной гостинице. Возможно, у вас есть несколько слуг.
//''Аристократическое.''// Вы живёте в достатке и комфорте. Вы вращаетесь среди самых влиятельных членов общества. У вас превосходное жилище, возможно, особняк в лучшей части города или несколько комнат в отличной гостинице. Вы трапезничаете в лучших ресторанах, одеваетесь у модных портных, и у вас есть слуги на все случаи жизни. Вы получаете приглашения на сборы богатых и влиятельных, и вечерами собираетесь в компании политиков, глав гильдий, верховных жрецов и дворян. Вам угрожает ложь и предательство. Чем вы богаче, тем больше шанс, что вас затянут в политические интриги."""
!!!__''Еда, напитки и постой''__
В приведённой таблице указаны цены за готовую еду и одну ночь постоя. Эти цены уже включены в затраты на существование.
''Еда, напитки и постой''
<table>
<tr>
<th>Пункт</th>
<th>Стоимость</th>
</tr>
<tr>
<td>Вино обычное (кружка)</td>
<td>2 см</td>
</tr>
<tr>
<td>Вино отличное (бутылка)</td>
<td>10 зм</td>
</tr>
<tr>
<td>Мясо, кусок</td>
<td>3 зм</td>
</tr>
<tr>
<td>Галлон пива (4 литра)</td>
<td>2 см</td>
</tr>
<tr>
<td>Кружка пива</td>
<td>4 мм</td>
</tr>
<tr>
<td>Сыр, кусок</td>
<td>1 см</td>
</tr>
<tr>
<td>Торжественный обед (на 1 едока)</td>
<td>10 зм</td>
</tr>
<tr>
<td>Хлеб, ломоть</td>
<td>2 мм</td>
</tr>
<tr>
<th colspan="2">Постоялый двор (за день)</th>
</tr>
<tr>
<td>Нищенское</td>
<td>7 мм</td>
</tr>
<tr>
<td>Бедное</td>
<td>1 см</td>
</tr>
<tr>
<td>Скромное</td>
<td>5 см</td>
</tr>
<tr>
<td>Комфортное</td>
<td>8 см</td>
</tr>
<tr>
<td>Богатое</td>
<td>2 зм</td>
</tr>
<tr>
<td>Аристократическое</td>
<td>4 зм</td>
</tr>
<tr>
<th colspan="2">Пропитание (за день)</th>
</tr>
<tr>
<td>Нищенское</td>
<td>3 мм</td>
</tr>
<tr>
<td>Бедное</td>
<td>6 мм</td>
</tr>
<tr>
<td>Скромное</td>
<td>3 см</td>
</tr>
<tr>
<td>Комфортное</td>
<td>5 см</td>
</tr>
<tr>
<td>Богатое</td>
<td>8 см</td>
</tr>
<tr>
<td>Аристократическое</td>
<td>2 зм</td>
</tr>
</table>
!!!__''Услуги''__
"""Искатели приключений могут платить неигровым персонажам, чтобы те им помогали или что-то для них делали. У большинства таких наёмников весьма посредственные навыки, но есть мастера своего дела, и даже настоящие эксперты.
Основные виды наёмных рабочих перечислены в таблице. Нанять можно любого работника, имеющегося в городе. Например, волшебник может заплатить столяру, чтобы тот создал изысканный сундук (и его миниатюрную копию) для заклинания Леомундов потайной сундук. Воин может заказать у кузнеца особый меч. Бард может заказать у портного особый наряд для выступления перед герцогом.
Другие наёмники предоставляют высокопрофессиональные услуги, или услуги, сопряжённые с риском для жизни. Наёмные солдаты помогут искателям приключений уничтожить племя хобгоблинов, а мудрецов можно нанять для поисков древней или эзотерической информации. Если высокоуровневый искатель приключений основывает крепость, он может нанять целый штат слуг, наводящих повсюду порядок, от кастеляна и дворецкого до простых конюхов. С такими наёмниками обычно заключают долгосрочные контракты и живут они прямо в крепости.
Опытных наёмников берут для выполнения услуг, требующих мастерства (в навыке или обращения с оружием или инструментом): наёмный воитель, ремесленник, писец, и так далее. Указанная плата — минимум; некоторые экспертные наёмники просят гораздо больше. Неопытных наёмников берут для выполнения работы, не требующей навыков — на должности чернорабочих, грузчиков, горничных и так далее."""
''Услуги''
<table>
<tr>
<th>Услуга</th>
<th>Стоимость</th>
</tr>
<tr>
<td>Посыльный</td>
<td>2 мм/миля</td>
</tr>
<tr>
<td>Пошлина за дорогу или ворота</td>
<td>1 мм</td>
</tr>
<tr>
<td>Проезд на корабле</td>
<td>1 см/миля</td>
</tr>
<tr>
<th colspan="2">Наёмник</th>
</tr>
<tr>
<td>Неопытный</td>
<td>2 см/день</td>
</tr>
<tr>
<td>Опытный</td>
<td>2 зм/день</td>
</tr>
<tr>
<th colspan="2">Перевозка в коляске</th>
</tr>
<tr>
<td>В пределах города</td>
<td>1 мм</td>
</tr>
<tr>
<td>Между городами</td>
<td>3 мм/миля</td>
</tr>
</table>
!!!__''Услуги заклинателей''__
"""Те, кто могут накладывать заклинания, попадают в категорию особых наёмников. Можно найти кого-то, кто согласится наложить заклинание в обмен на деньги или услугу, но вряд ли это будет так легко сделать, и к тому же нет конкретных цен за услуги такого рода. Как правило, чем выше уровень желаемого заклинания, тем труднее найти знающего его, и тем дороже такая услуга стоит.
В городе можно найти того, кто согласится сотворить относительно простое заклинание 1 или 2 уровня, такое как лечение ран или опознание, и стоить оно будет 10–50 золотых монет (плюс стоимость расходуемых материальных компонентов). Для того чтобы найти согласного сотворить высокоуровневое заклинание, возможно, придётся отправиться в большой город, где есть университет или большой храм. Найденный заклинатель может попросить в качестве оплаты выполнить для него услугу — что-то такое, чем занимаются искатели приключений, например, попросит принести из опасного места редкий предмет или пройти по населённым чудовищами пустошам, чтобы передать в далёкое поселение что-то важное."""
//7 уровень, Преобразование, Бард/Друид/Жрец//
:''Время накладывания:'' 1 минута
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (молитвенный барабан и святая вода)
:''Длительность: '' 1 час
"""Вы касаетесь существа и активируете его врождённые способности к исцелению. Цель восстанавливает 4к8 + 15 хитов. Пока заклинание активно, цель восстанавливает 1 хит в начале каждого своего хода (10 хитов в минуту).
Отрубленные части тела цели (пальцы, ноги, хвосты, и так далее), если они были, восстанавливаются через 2 минуты. Если отрубленная часть тела есть в наличии, и её можно приставить к обрубку, заклинание мгновенно сращивает их."""
//5 уровень, Преобразование, Друид//
:''Время накладывания:'' 1 час
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (редкие масла и мази, стоящие как минимум 1 000 зм, расходуемые заклинанием)
:''Длительность: '' Мгновенная
"""Вы касаетесь мёртвого гуманоида или части мёртвого гуманоида. Если это существо мертво не более 10 дней, заклинание формирует для него новое взрослое тело и зовёт душу занять его. Если душа цели не свободна или не хочет новое тело, заклинание проваливается.
Новое тело для существа создаёт магия, и раса существа может измениться. Мастер бросает к100 и сверяется с таблицей, чтобы определить, в каком теле будет жить существо, либо же выбирает тело самостоятельно."""
<table>
<tr>
<th>к100</th>
<th>Раса</th>
</tr>
<tr>
<td>01–04</td>
<td>Гном, лесной</td>
</tr>
<tr>
<td>05–10</td>
<td>Гном, скальный</td>
</tr>
<tr>
<td>11–18</td>
<td>Дварф, горный</td>
</tr>
<tr>
<td>19–27</td>
<td>Дварф, холмовой</td>
</tr>
<tr>
<td>28–31</td>
<td>Драконорождённый</td>
</tr>
<tr>
<td>32–35</td>
<td>Полуорк</td>
</tr>
<tr>
<td>36–43</td>
<td>Полурослик, коренастый</td>
</tr>
<tr>
<td>44–51</td>
<td>Полурослик, легконогий</td>
</tr>
<tr>
<td>52–55</td>
<td>Полуэльф</td>
</tr>
<tr>
<td>56–59</td>
<td>Тифлинг</td>
</tr>
<tr>
<td>60–79</td>
<td>Человек</td>
</tr>
<tr>
<td>80–88</td>
<td>Эльф, высший</td>
</tr>
<tr>
<td>89–96</td>
<td>Эльф, лесной</td>
</tr>
<tr>
<td>97–00</td>
<td>Эльф, тёмный</td>
</tr>
</table>
Реинкарнировавшее существо помнит свою прошлую жизнь и переживания. Оно сохраняет все способности, бывшие в прежнем теле, но раса меняется на новую, изменяя расовые особенности.
//2 уровень, Очарование, Бард/Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность: '' 1 минута
Вы произносите отвлекающую речь, заставляя выбранных вами существ, которых вы видите в пределах дистанции, и которые при этом могут слышать вас, совершить спасбросок Мудрости. Существа, которые не могут быть очарованными, автоматически преуспевают в спасброске, и если вы или ваши спутники сражаетесь с существом, оно совершает спасбросок с преимуществом. При провале цель получает помеху к проверкам Мудрости (Внимательность), совершённым для обнаружения других существ кроме вас, пока заклинание активно или пока цель не перестанет вас слышать. Заклинание оканчивается, если вы становитесь недееспособны или теряете возможность говорить.
//Чудесный предмет, редкий (серебряный или латунный), очень редкий (бронзовый) или легендарный (железный)//
Вы можете действием подуть в этот рог. После этого в пределах 60 футов от вас появляются духи воителей с плана Асгард. Эти духи используют статистику берсерков из Бестиария. Они возвращаются в Асгард через 1 час, или когда их хиты опускаются до 0. Рог нельзя использовать повторно, пока не пройдёт 7 дней.
Существует четыре вида рогов Валгаллы, изготовленных из разных материалов. Вид рога определяет, сколько берсерков будет призвано, а также требования для их использования. Мастер определяет вид рога самостоятельно или случайным образом.
<table>
<tr>
<th>к100</th>
<th>Вид рога</th>
<th>Берсерки</th>
<th>Требование</th>
</tr>
<tr>
<td>01-40</td>
<td>Серебряный</td>
<td>2к4 + 2</td>
<td>Нет</td>
</tr>
<tr>
<td>41-75</td>
<td>Латунный</td>
<td>3к4 + 3</td>
<td>Владение всеми видами простого оружия</td>
</tr>
<tr>
<td>76-90</td>
<td>Бронзовый</td>
<td>4к4 + 4</td>
<td>Владение всеми видами средних доспехов</td>
</tr>
<tr>
<td>91-00</td>
<td>Железный</td>
<td>5к4 + 5</td>
<td>Владение всеми видами воинского оружия</td>
</tr>
</table>
Если вы подуете в рог, не выполняя требований, призванные берсерки нападут на вас. Если вы выполняете требования, они будут дружественны к вам и вашим спутникам, и будут выполнять ваши команды.
//Чудесный предмет, редкий//
Вы можете действием произнести командное слово рога и подуть в него, испуская взрыв 30 футовым конусом, слышимый на расстоянии 600 футов. Все существа в конусе должны совершить спасбросок Телосложения со Сл 15. При провале существо получает урон звуком 5к6 и становится оглохшим на 1 минуту. При успехе существо получает половину урона и не становится оглохшим. Существа и предметы, изготовленные из стекла или кристаллов, спасбросок совершают с помехой и получают урон звуком 10к6, а не 5к6.
При каждом использовании магии рога существует 20-процентный шанс, что он взорвётся. Взрыв причиняет урон огнём 10к6 тому, кто в него дул, и уничтожает рог.
Кости — нейтральный арбитр. Они определяют исход действий, невзирая на предпочтения Мастера, и не выбирая любимчиков. До какой степени вы будете полагаться на них — зависит только от вас.
!!__''Принимать результаты бросков''__
Некоторые Мастера во всём полагаются на броски костей. Если персонаж пытается что-то сделать, Мастер просит совершить проверку и устанавливает Сл Таким Мастерам не следует допускать, чтобы продвижение сюжета зависело от одной-единственной проверки. Вы должны быть готовы импровизировать и реагировать в изменяющейся ситуации.
Большое влияние костей также даёт игрокам ощущение, что возможно всё. И действительно, кажется невероятным, что полурослик сможет запрыгнуть на спину огру, натянуть ему на голову мешок, а потом убраться восвояси, но если на кости выпадет большое число, этот план может получиться.
Недостаток такого подхода в том, что может пострадать отыгрыш, если игроки решат, что успех зависит только от костей, а не от их решений и личностей их персонажей.
!!__''Игнорировать кости''__
При таком подходе кости используются как можно реже. Некоторые Мастера используют их только в сражении, а успехи и провалы определяют в зависимости от ситуации.
При таком подходе Мастер решает, успешным ли было действие или план, в зависимости от того, как игроки излагают свои доводы, насколько они тщательны или изобретательны, или в зависимости от других факторов. Например, игроки могут описать, как они ищут потайную дверь, описывая, что простукивают стены и дёргают крепления для факелов, надеясь найти потайной механизм. Этого может быть достаточно, чтобы убедить Мастера в том, что они находят потайную дверь, не совершая никаких проверок характеристик.
Такой подход вознаграждает изобретательность, и поощряет игроков искать выходы в описанных вами ситуациях, а не высматривать особые умения на листах своих персонажей. Недостатком является инертность и возможная предвзятость Мастера. Мастеру может нравиться подход некоторых игроков или же наоборот, он может на корню зарубить хорошие идеи, если они ведут игру в направлении, которое ему не нравится. Этот подход может также замедлить игру, если Мастер загадает один-единственный «правильный» вариант и будет ждать, пока игроки не сформулируют его слово в слово.
!!__''Средний путь''__
Многие Мастера считают, что лучше всего использовать комбинацию двух описанных выше методов. Найдя баланс между надеждой на кости и самостоятельным определением успеха, вы поощрите игроков и полагаться на бонусы и характеристики, и при этом внимательно следить за игрой, погружаясь в мир.
Помните, что игру ведут не кости, а вы.
Кости — как правила, это инструмент, помогающий совершать действия. Вы можете в любое время заявить, что действия персонажа были успешны. Вы можете позволить игроку совершить проверку с преимуществом, чтобы уменьшить шанс того, что плохой бросок сорвёт планы персонажа И наоборот, плохой план или плохие обстоятельства могут превратить простейшую задачу в невозможную, или как минимум заставят совершать проверку с помехой.
//3 уровень, Преобразование, Бард/Друид/Следопыт//
:''Время накладывания:'' 1 действие или 8 часов
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
"""Это заклинание вливает жизненные силы в растения, находящиеся в определённой области. Есть два варианта использования этого заклинания; одно даёт краткосрочный, другое — долговременный эффект.
Если вы активируете это заклинание 1 действием, выберите точку в пределах дистанции. Все обычные растения в пределах 100-футового радиуса с центром на этой точке становятся густыми и рослыми. Существо, перемещающееся по этой местности, должно потратить 4 фута перемещения за каждый 1 пройдённый фут.
Вы можете исключить одну или несколько областей любого размера в пределах зоны действия заклинания.
Если вы активируете это заклинание 8 часов, вы делаете почву удобренной. Все растения в радиусе полумили с центром на точке в пределах дистанции становятся удобренными на 1 год. Эти растения приносят удвоенный урожай."""
//Чудесный предмет, необычный (требуется настройка)//
Ваша Сила равна 19, когда вы носите эти латные рукавицы. Они не оказывают на вас эффект, если ваша Сила без них уже 19 или выше.
//1 уровень, Вызов, Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (10-футовый радиус)
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
Вы взываете к мощи Хадара, Тёмного Алкателя. Из вас вырываются щупальца из тёмной энергии, бьющие всех существ в пределах 10 футов. Все существа в этой области должны совершить спасбросок Силы. В случае провала цель получает урон некротической энергией 2к6 и в следующем ходу не может совершать реакции. В случае успеха существо получает половину урона, и других эффектов нет.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к6 за каждый уровень ячейки выше первого.
//Чудесный предмет, редкий (требуется настройка)//
Если вы носите эти сапоги, вы можете неограниченно действием накладывать на себя заклинание левитация.
//Чудесный предмет, редкий (требуется настройка)//
Пока вы носите эти сапоги, вы можете бонусным действием щёлкнуть каблуками. Если вы делаете это, то сапоги удваивают вашу скорость ходьбы, а все существа, совершающие по вам провоцированные атаки, совершают броски атаки с помехой. Если вы щёлкнете каблуками повторно, вы прекращаете действие эффекта.
Если свойства этих сапог использовались в общей сложности 10 минут, магия перестаёт работать, пока вы не закончите продолжительный отдых.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эти сапоги, ваша скорость ходьбы становится равной 30 футов, если она была ниже, и ваша скорость не уменьшается, когда вы перегружены или носите тяжёлый доспех. Кроме того, вы можете совершать прыжки в три раза дальше, чем обычно, но вы всё равно не можете прыгнуть дальше, чем осталось у вас перемещения.
!!!__''Сбитый с ног/ Лежащий ничком''__
* Сбитое с ног существо способно перемещаться только ползком, пока не встанет, прервав тем самым это состояние.
* Существо совершает с помехой броски атаки.
* Броски атаки по существу совершаются с преимуществом, если нападающий находится в пределах 5 футов от него. В противном случае броски атаки совершаются с помехой.
//1 уровень, Иллюзия, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (15-футовый конус)
:''Компоненты:'' В, С, М (щепотка порошка или песка, окрашенного в красный, жёлтый и синий цвет)
:''Длительность: '' 1 раунд
"""Из вашей руки вылетают яркие разноцветные лучи. Бросьте 6к10; результат покажет, сколько хитов существ попадает под эффект. Существа в 15-футовом конусе, исходящем от вас, попадают под эффект в порядке увеличения текущих хитов (игнорируя тех, кто без сознания и не может видеть).
Начиная с существа с наименьшим числом текущих хитов, все существа, попавшие под действие заклинания, становятся ослеплёнными до конца действия заклинания. Вычитайте из остатка хиты уже ослеплённых существ и переходите к следующим. Хиты существа не должны превышать остаток, чтобы это существо попало под действие заклинания."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, бросайте дополнительно 2к10 за каждый уровень ячейки выше первого.
//Заговор, Воплощение, Бард/Волшебник/Жрец/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, М (светлячок или фосфоресцирующий мох)
:''Длительность: '' 1 час
"""Вы касаетесь одного предмета, длина которого ни по одному из измерений не превышает 10 футов. Пока заклинание активно, предмет испускает яркий свет в радиусе 20 футов и тусклый свет в пределах ещё 20 футов. Свет может быть любого выбранного вами цвета. Полное покрытие предмета чем-то непрозрачным блокирует свет. Заклинание оканчивается, если вы наложите его ещё раз или окончите действием.
Если вы нацелились на предмет, несомый или носимый враждебным существом, это существо должно преуспеть в спасброске Ловкости, чтобы увернуться от заклинания."""
//Чудесный предмет, очень редкий (требуется настройка)//
Эта тонкая восковая свеча посвящена определённому божеству и настроена на мировоззрение этого божества. Мировоззрение свечи можно определить заклинанием обнаружение добра и зла. Мастер сам выбирает божество и мировоззрение, либо определяет их случайным образом.
<table>
<tr>
<th>к20</th>
<th>Мировоззрение</th>
</tr>
<tr>
<td>1-2</td>
<td>Хаотично-злое</td>
</tr>
<tr>
<td>3-4</td>
<td>Хаотично-нейтральное</td>
</tr>
<tr>
<td>5-7</td>
<td>Хаотично-доброе</td>
</tr>
<tr>
<td>8-9</td>
<td>Нейтрально-злое</td>
</tr>
<tr>
<td>10-11</td>
<td>Нейтральное</td>
</tr>
<tr>
<td>12-13</td>
<td>Нейтральнодоброе</td>
</tr>
<tr>
<td>14-15</td>
<td>Законно-злое</td>
</tr>
<tr>
<td>16-17</td>
<td>Законнонейтральное</td>
</tr>
<tr>
<td>18-20</td>
<td>Законно-доброе</td>
</tr>
</table>
Магия свечи активируется, когда свечу зажигают, что совершается действием. Погорев 4 часа, свеча уничтожается. Вы можете затушить свечу раньше, чтобы воспользоваться ей же позже. Минимальная единица учёта времени горения — 1 минута.
Будучи зажжённой, свеча испускает тусклый свет в радиусе 30 футов. Все существа в области этого света, чьё мировоззрение совпадает с мировоззрением свечи, совершают броски атаки, спасброски и проверки характеристик с преимуществом. Кроме того, жрецы и друиды в области света, чьё мировоззрение совпадает с мировоззрением свечи, могут накладывать подготовленные заклинания 1 уровня, не тратя ячейки заклинаний, и эффект таких заклинаний будет как у заклинаний, наложенных с использованием ячейки 1 уровня.
В качестве альтернативы, когда вы впервые зажигаете совершенно новую свечу, вы можете наложить ей заклинание врата. Это мгновенно уничтожает свечу.
//Чудесный предмет, необычный (требуется настройка)//
Вы должны владеть духовыми музыкальными инструментами, чтобы использовать эту свирель. Пока вы настроены на неё, обычные и гигантские крысы безразличны к вам и не будут вас атаковать, если вы им не угрожаете и не вредите им.
У свирели есть 3 заряда. Если вы играете на ней действием, вы можете бонусным действием потратить от 1 до 3 зарядов, призывая по одному рою крыс (смотрите статистику в БестиариИ) за каждый потраченный заряд, при условии, что в пределах полумили от вас есть достаточное количество крыс, которых можно призвать свирелью (на усмотрение Мастера). Если достаточного количества крыс нет, заряд тратится впустую. Призванные рои движутся к источнику музыки кратчайшим возможным маршрутом, но во всём остальном не находятся под вашим контролем. Свирель ежедневно восстанавливает 1к3 заряда на рассвете.
Каждый раз, когда рой крыс, не находящийся под контролем другого существа, оказывается в пределах 30 футов от вас, пока вы играете на этой свирели, вы можете совершить проверку Харизмы, противопоставленную проверке Мудрости крыс. Если вы проигрываете состязание, рой действует как обычно, и не может становиться одержимым музыки этой свирели в течение 24 часов. Если вы выиграете состязание, рой становится одержимым музыкой свирели и становится дружественным к вам и вашим спутникам, пока вы каждый раунд продолжаете играть на свирели действием. Дружественный рой подчиняется вашим командам. Если вы не отдаёте команды дружественному рою, он защищается, но других действий не совершает.
Если дружественный рой начинает ход, и при этом не слышит музыки свирели, ваш контроль над этим роем заканчивается, рой действует как обычно, и не может быть одержим музыкой свирели в течение следующих 24 часов.
//Чудесный предмет, необычный//
Вы должны владеть духовыми музыкальными инструментами, чтобы использовать эту свирель. У неё есть 3 заряда. Вы можете действием поиграть на ней и потратить 1 заряд, чтобы издать жуткую мелодию. Все существа в пределах 30 футов от вас, слышащие вашу мелодию, должны преуспеть в спасброске Мудрости со Сл 15, иначе они станут испуганными вами на 1 минуту. Если хотите, все существа в этой области, не враждебные по отношению к вам, автоматически преуспеют в этом спасброске. Существа, провалившие спасбросок, могут повторять его в конце каждого своего хода, оканчивая эффект на себе при успехе. Существо, преуспевшее в спасброске, получает иммунитет к этой свирели на 24 часа. Свирель ежедневно восстанавливает 1к3 заряда на рассвете.
//Свиток, редкость варьируется//
Свиток заклинания несёт на себе слова одного заклинания, написанные таинственным шифром. Если это заклинание есть в списке заклинаний вашего класса, вы можете прочитать свиток и наложить его заклинание, не предоставляя материальные компоненты. В противном случае свиток непонятен для вас. Накладывание заклинания свитком занимает столько же времени, сколько обычное накладывание заклинания. После того, как заклинание наложено, слова на свитке исчезают, а сам свиток рассыпается в прах. Если накладывание прервано, свиток остаётся целым.
Если заклинание есть в списке заклинаний вашего класса, но имеет более высокий уровень, чем те, что вы способны накладывать, вы должны совершить проверку базовой характеристики, чтобы определить, удалось ли вам справиться с задачей. Сл такой проверки равна 10 + уровень заклинания. При провале заклинание просто исчезает со свитка, не произведя никаких эффектов.
Уровень заклинания на свитке определяет Сл спасброска от него, его бонус атаки, а также редкость этого свитка, как это показано в таблице «свитки заклинаний».
<table>
<tr>
<th>Уровень заклинания</th>
<th>Редкость</th>
<th>Сл спасброска</th>
<th>Бонус атаки</th>
</tr>
<tr>
<td>Заговор</td>
<td>Обычная</td>
<td>13</td>
<td>+5</td>
</tr>
<tr>
<td>1</td>
<td>Обычная</td>
<td>13</td>
<td>+5</td>
</tr>
<tr>
<td>2</td>
<td>Необычная</td>
<td>13</td>
<td>+5</td>
</tr>
<tr>
<td>3</td>
<td>Необычная</td>
<td>15</td>
<td>+7</td>
</tr>
<tr>
<td>4</td>
<td>Редкая</td>
<td>15</td>
<td>+7</td>
</tr>
<tr>
<td>5</td>
<td>Редкая</td>
<td>17</td>
<td>+9</td>
</tr>
<tr>
<td>6</td>
<td>Очень редкая</td>
<td>17</td>
<td>+9</td>
</tr>
<tr>
<td>7</td>
<td>Очень редкая</td>
<td>18</td>
<td>+10</td>
</tr>
<tr>
<td>8</td>
<td>Очень редкая</td>
<td>18</td>
<td>+10</td>
</tr>
<tr>
<td>9</td>
<td>Легендарная</td>
<td>19</td>
<td>+11</td>
</tr>
</table>
Если свиток содержит заклинание из списка заклинаний волшебника, то оно может быть скопировано в книгу заклинаний. Для этого надо преуспеть в проверке Интеллекта (Магия), Сл которой равна 10 + уровень заклинания. Если проверка успешна, заклинание удаётся скопировать. Вне зависимости от исхода проверки свиток после этого уничтожается.
//Свиток, редкий//
Каждый свиток защиты работает против какого-то одного определённого вида существ, выбранного Мастером самостоятельно или же случайным образом с помощью приведённой ниже таблицы.
<table>
<tr>
<th>к100 </th>
<th>Вид существ</th>
<th>к100 </th>
<th>Вид существ</th>
</tr>
<tr>
<td>01–10</td>
<td>Аберрации</td>
<td>56–75</td>
<td>Нежить</td>
</tr>
<tr>
<td>11–20</td>
<td>Звери</td>
<td>76–80</td>
<td>Растения</td>
</tr>
<tr>
<td>21–45</td>
<td>Исчадия</td>
<td>81–90</td>
<td>Феи</td>
</tr>
<tr>
<td>46–55</td>
<td>Небожители</td>
<td>91–00</td>
<td>Элементали</td>
</tr>
</table>
Прочитав действием свиток, вы окружаете себя невидимым барьером, формирующим цилиндр с радиусом 5 футов и высотой 10 футов. В течение 5 минут этот барьер препятствует созданиям определённого вида входить в цилиндр и каким-либо образом воздействовать на то, что заключено в него.
Этот цилиндр перемещается вместе с вами, оставаясь с центром на вас. Однако, если вы перемещаетесь так, что существо указанного вида окажется внутри цилиндра, защитный эффект заканчивается.
Существо может попытаться преодолеть барьер, совершив действием проверку Харизмы со Сл 15. При успехе барьер на это конкретное существо не действует.
//4 уровень, Ограждение, Бард/Друид/Жрец/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (кожаный ремешок, обмотанный вокруг предплечья или аналогичной конечности)
:''Длительность: '' 1 час
"""Вы касаетесь согласного существа. Пока заклинание активно, на перемещения цели не влияет труднопроходимая местность, а заклинания и прочие магические эффекты не могут ни уменьшить её скорость, ни сделать её парализованной или опутанной.
Цель может также потратить 5 футов перемещения, чтобы автоматически высвободиться из немагических оков, таких как кандалы или захват другого существа. Более того, нахождение под водой не накладывает штрафы на перемещение и атаки цели."""
!!!__''Свободное заклинательство''__
"""Вы можете использовать единицы чародейства, чтобы получить дополнительные ячейки заклинаний, и наоборот, пожертвовать ячейками, чтоб получить единицы. Другие способы использования единиц чародейства вы освоите на более высоких уровнях.
Создание ячеек заклинаний. В свой ход вы можете бонусным действием превратить оставшиеся единицы чародейства в дополнительные ячейки заклинаний. Приведённая таблица отображает стоимость создания ячеек разных уровней. Вы не можете создавать ячейки с уровнем выше 5. Созданные ячейки заклинаний исчезают в конце длительного отдыха."""
''Создание ячеек заклинаний''
<table>
<tr>
<th rowspan="2">Уровень ячейки заклинаний</th>
<th rowspan="2">Единицы чародейства</th>
</tr>
<tr>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>4</td>
<td>6</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
</tr>
</table>
Преобразование ячейки заклинания в единицы чародейства. Вы можете в свой ход бонусным действием преобразовать одну ячейку заклинаний в единицы чародейства, количество которых равно уровню ячейки.
//5 уровень, Прорицание, Волшебник/Колдун (ритуал)//
:''Время накладывания:'' 1 минута
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность: '' 1 минута
"""Вы мысленно связываетесь с полубогом, духом давно умершего мудреца или другой таинственной сущностью с другого плана существования. Контакт с иномировой сущностью может ослабить или даже повредить ваш рассудок. Накладывая это заклинание, вы совершаете спасбросок Интеллекта со Сл 15. При провале вы получаете урон психической энергией 6к6 и становитесь безумным до окончания продолжительного отдыха. Будучи безумным, вы не можете совершать действия, не можете понимать речь других существ, не можете читать и можете только неразборчиво бормотать. Заклинание высшее восстановление, наложенное на вас, оканчивает этот эффект.
При успешном спасении вы можете задать сущности до пяти вопросов. Вы должны задать вопросы до того как окончится заклинание. На все вопросы Мастер отвечает односложно, например, «да», «нет», «может быть», «никогда» или «неясно» (если сущность не знает ответ). Если односложный ответ может ввести в заблуждение, Мастер может произнести короткую фразу."""
//5 уровень, Воплощение, Жрец//
:''Время накладывания:'' 24 часа
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (травы, масла и благовония, стоящие как минимум 1 000 зм, расходуемые заклинанием)
:''Длительность: '' Пока не рассеется
"""Вы касаетесь точки и наполняете область вокруг неё святой (или нечестивой) силой. Радиус области может быть с радиусом до 60 футов, и заклинание проваливается, если в этот радиус попадает область, уже находящаяся под действием заклинания святилище. Наполненная область подвергается следующим эффектам:
Во-первых, исчадия, небожители, нежить, феи и элементали не могут войти в эту область, и не могут делать существ, находящихся внутри, очарованными, испуганными и одержимыми. Все существа, очарованные, испуганные или одержимые такими существами, перестают быть очарованными, испуганными и одержимыми, входя в эту область. Вы можете исключить из эффекта один или несколько видов существ.
Во-вторых, вы можете привязать к области дополнительный эффект. Выберите один эффект из прилагающегося списка, или выберите эффект, предложенный Мастером. Некоторые из этих эффектов применяются к существам, находящимся в области; вы можете указать, будет ли он применяться ко всем существам, существам, служащим определённому божеству или лидеру, или существам определённого вида, например, оркам и троллям. Когда существо, попадающее под действие эффекта, входит в область заклинания впервые за ход или начинает там ход, оно может совершить спасбросок Харизмы. В случае успеха существо игнорирует дополнительный эффект, пока не покинет эту область.
//''Вечный покой. ''//Мёртвые тела, похороненные в области, не могут стать нежитью.
//''Вмешательство в путешествия между измерениями.''// Затронутые существа не могут перемещаться и путешествовать, используя телепортацию или перемещение между измерениями и планами.
//''Дневной свет.''// Область освещается ярким светом. Магическая тьма, созданная заклинаниями с уровнем меньше уровня ячейки, использованной вами для накладывания этого заклинания, не может затмить свет.
//''Защита от энергии.''// Затронутые существа в области получают сопротивление к одному виду урона на ваш выбор кроме дробящего, колющего и рубящего.
//''Страх.''// Затронутые существа испуганы, пока находятся в области.
//''Темнота.''// Область заполняется темнотой. Обычный свет, а также магический свет, созданный заклинаниями, с уровнем меньше уровня ячейки, использованной вами для накладывания этого заклинания, не могут осветить область.
//''Тишина. ''//Звуки не покидают границы области, и не проникают снаружи внутрь.
//''Уязвимость энергии.''// Затронутые существа в области получают уязвимость к одному виду урона на ваш выбор кроме дробящего, колющего и рубящего.
//''Храбрость.''// Затронутые существа не могут быть испуганы, пока находятся в области.
//''Языки.''// Затронутые существа могут общаться с любыми другими существами, находящимися в области, даже если у них нет общего языка."""
//Оружие (любой меч), легендарное (требуется настройка паладином)//
Вы получаете бонус +3 к броскам атаки и урона, совершённым этим магическим оружием. Если вы попадаете им по исчадию или нежити, это существо получает дополнительный урон излучением 2к10.
Пока вы держите в руке этот вынутый из ножен меч, он создаёт ауру с радиусом 10 футов вокруг вас. Вы и все дружественные вам существа в этой ауре совершаете с преимуществом спасброски от заклинаний и других магических эффектов. Если у вас есть 17 уровней в классе паладина, радиус ауры увеличивается до 30 футов.
!!!__''Священная клятва''__
"""Когда вы получаете 3 уровень, вы даёте клятву, навсегда связывающую вас, как паладина. До этого момента вы были в подготовительной стадии, следуя по пути, но ещё не дав присягу. Теперь же вы выбираете Клятву Преданности, Клятву Древних или Клятву Мести, которые подробно рассмотрены в конце описания класса.
Ваш выбор предоставляет вам умения на 3, 7, 15 и 20 уровнях. Эти умения включают в себя заклинания клятвы и умения Божественного канала."""
<<<
!!!''Нарушение клятвы''
"""Паладин старается придерживаться высочайших стандартов поведения, но даже самым добродетельным паладинам свойственно ошибаться. Иногда правильный путь оказывается слишком требовательным, иногда ситуация сводится к выбору меньшего из двух зол, а иногда эмоции вынуждают паладина преступить через свою клятву.
Паладин, который нарушил клятву, обычно стремится к отпущению грехов у жреца, разделяющего его веру, или у другого паладина того же ордена. Паладин может провести всенощное бдение в молитве в знак покаяния, или поститься, или совершить другой аналогичный акт самоотречения. После обряда исповеди и прощения паладин очищается.
Если паладин умышленно нарушил свою клятву и не проявляет никаких признаков раскаяния, последствия могут быть куда более серьёзными. По усмотрению Мастера, не раскаявшийся паладин может вынуждено отказаться от этого класса и взять другой, или, возможно, стать паладином клятвопреступником, который описан в Руководстве Мастера."""
<<<
!!!''Заклинания клятвы''
Каждая клятва имеет список связанных с ней заклинаний. Вы получаете доступ к этим заклинаниям на уровнях, указанных в описании клятвы. После того как вы получаете доступ к заклинанию клятвы, оно всегда у вас подготовлено. Заклинания клятвы не учитывается в количестве заклинаний, которые можно подготовить каждый день.
Если вы получаете заклинание клятвы, которое не входит в список заклинаний паладина, это заклинание всё равно считается заклинанием паладина для вас.
!!!''Божественный канал''
"""Ваша клятва позволяет направлять божественную энергию, чтобы подпитывать магические эффекты. Каждый вариант Божественного канала, предоставленный клятвой, объясняет, как его использовать.
Когда вы используете ваш Божественный канал, вы выбираете, какой эффект создать. Затем вы должны окончить короткий или продолжительный отдых, чтобы использовать Божественный канал снова.
Некоторые эффекты Божественного канала требуют совершить спасбросок. Когда вы используете эффекты такого рода, Сл равна Сл спасброска от ваших заклинаний паладина."""
//Заговор, Воплощение, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
Похожее на огонь сияние нисходит на существо, которое вы видите в пределах дистанции. Цель должна преуспеть в спасброске Ловкости, иначе она получает урон излучением 1к8. Для этого спасброска цель не получает преимуществ от укрытия.
Урон этого заклинания увеличивается на 1к8, когда вы достигаете 5 уровня (2к8), 11 уровня (3к8) и 17 уровня (4к8).
!!''Священные клятвы''
Становление паладином подразумевает под собой принятие обетов, которые обращают паладина к праведным делам и пути активного сопротивления злу. Финальная клятва, взятая им на 3 уровне, является кульминацией всего обучения паладина. Некоторые персонажи этого класса не считают себя настоящими паладинами до того как они получат 3 уровень и не дадут эту клятву. Для других эта клятва является формальностью, официальной отметкой того, что и так было всегда в сердце паладина.
<<Button "Клятва Древних (Паладин)" "Клятва Древних">>
<<Button "Клятва мести (Паладин)" "Клятва мести">>
<<Button "Клятва преданности (Паладин)" "Клятва преданности">>
<<<
!!!''Священные растения''
"""Некоторые растения считаются священными у друидов. В частности, это берёза, бузина, дуб, ива, можжевельник, ольха, омела, орех, падуб (он же остролист), рябина, тис и ясень. Эти растения часто используются в изготовлении друидической фокусировки, которая может включать, например, ветви дуба или тиса, побеги омелы.
Древесина подходит и для других изделий, включая оружие и щиты. Тис связан со смертью и перерождением, так что из него делают рукояти скимитаров и серпов. Ясень символизирует жизнь, а дуб — силу: из них получаются замечательные древки, дубины, боевые посохи и щиты. Ольху считают растением воздуха и делают из неё метательное оружие, например, дротики и метательные копья.
Друиды из мест, которым эти растения чужды, обращаются к местным видам. Например, пустынный друид может почитать юкку и кактус."""
<<<
//1 уровень, Очарование, Колдун//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (окаменевший глаз тритона)
:''Длительность: '' Концентрация, вплоть до 1 часа
"""Вы проклинаете существо, которое видите в пределах дистанции. Пока заклинание активно, вы причиняете цели урон некротической энергией 1к6 каждый раз, когда попадаете по ней атакой. Кроме того, выберите одну характеристику, когда накладываете заклинание. Цель совершает с помехой проверки выбранной характеристики.
Если хиты цели опускаются до 0, пока заклинание активно, вы можете в свой следующий ход бонусным действием проклясть новое существо.
Снятие проклятья, наложенное на цель, оканчивает это заклинание преждевременно."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 или 4 уровня, вы можете поддерживать концентрацию на нём до 8 часов. Если вы используете ячейку заклинания 5 уровня или выше, вы можете поддерживать концентрацию на нём до 24 часов.
//Чудесный предмет, необычный//
Если вы находитесь в этом седле на ездовом животном, и вы в сознании, вы не можете быть спешены против вашей воли, и броски атаки по вашему ездовому животному совершаются с помехой.
//1 уровень, Ограждение, Волшебник/Следопыт (ритуал)//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (колокольчик и серебряная проволочка)
:''Длительность: '' 8 часов
"""Вы устанавливаете сигнализацию на случай вторжения. Выберите дверь, окно или область в пределах дистанции не больше куба с длиной ребра 20 футов. До окончания действия заклинания тревога уведомляет вас каждый раз, когда охраняемой области касается или входит в неё существо с размером не меньше Крошечного. При накладывании заклинания вы можете указать существ, которые не будут вызывать срабатывание тревоги. Вы также выбираете, мысленной будет тревога или слышимой.
Мысленная тревога предупреждает вас звоном в сознании, если вы находитесь в пределах 1 мили от охраняемой области. Этот звон пробуждает вас, если вы спите.
Слышимая тревога издаёт звон колокольчика в течение 10 секунд в пределах 60 футов."""
//5 уровень, Воплощение, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (щепотка порошка толчёного прозрачного драгоценного камня)
:''Длительность: '' Концентрация, вплоть до 10 минут
"""Невидимая стена из силового поля появляется в точке, выбранной вами в пределах дистанции. Стена появляется, будучи ориентированной в любом направлении: горизонтальном, вертикальном или наклонённом. Она может свободно парить, а может опираться на твёрдую поверхность. Вы можете создать её полусферой-куполом или сферой с радиусом до 10 футов, или можете сформировать плоскую поверхность, состоящую из плит 10 × 10 футов, количество которых может доходить до десяти. Каждая плита должна соседствовать как минимум с одной другой плитой. Какая бы форма ни была у стены, её толщина всегда 1/4 дюйма (6 миллиметров). Она существует, пока активно заклинание. Если стена при появлении проходит по пространству существа, это существо выталкивается по одну из сторон стены (на ваш выбор).
Ничто не может физически пройти сквозь эту стену. Она обладает иммунитетом ко всем видам урона, и не может быть рассеяна рассеиванием магии. Заклинание распад полностью уничтожает стену. Стена простирается и на Эфирный План, блокируя эфирные перемещения сквозь себя."""
!!!''__Сильный критический удар__''
"""Начиная с 9 уровня вы можете бросать одну дополнительную кость урона оружия, когда определяете дополнительный урон от критического попадания рукопашной атакой.
Количество костей увеличивается до двух на 13 уровне и трёх на 17 уровне."""
"""Хороший скакун поможет вам быстро пересечь пустоши, но основное его предназначение — везти груз, который замедлял бы вас. Приведённая таблица показывает скорость разных животных и их базовую грузоподъёмность.
Животное, тянущее тележку, повозку, карету, сани или фургон, может перевозить в пять раз больше базовой грузоподъёмности, включая вес транспортного средства. Если в одно транспортное средство впряжены сразу несколько животных, они могут суммировать свою грузоподъёмность.
В мирах D&D есть и другие скакуны, но они редкие, и их сложно купить. В эту категорию входят летающие скакуны (пегасы, грифоны, гиппогрифы и подобные животные), а также водные (гигантские морские коньки, например). Обычно таких скакунов получают, выращивая питомца с рождения, посредством сделки с влиятельной сущностью, или с разрешения самого скакуна.
//''Доспехи.''// Есть специальные доспехи, защищающие голову, шею, грудь и тело животного. Для животных можно приобрести любые доспехи, описанные ранее в этой главе. Стоимость в четыре раза больше аналогичного доспеха для гуманоида, а вес — в два раза больше.
//''Сёдла.''// Боевое седло охватывает всадника, помогая удержаться на нём в бою. Благодаря ему вы совершаете с преимуществом проверки, совершённые чтобы остаться в седле. Экзотические сёдла требуются для водных и летающих скакунов.
//''Владение транспортным средством.''// Если вы владеете определённым транспортным средством (наземным или водным), вы можете добавлять бонус мастерства к проверкам, совершённым для управления этим транспортом в трудных обстоятельствах.
//''Суда с вёслами.''// Килевые лодки и шлюпки используют для перемещения по рекам и озёрам. При плавании по течению добавьте к скорости судна скорость потока (обычно 5 километров в час). На вёслах против быстрого течения на этих судах не поднимешься, но их могут тянуть животные, идущие по берегу. Шлюпка весит 100 фунтов, если искатели приключений понесут её на руках."""
!!!''Скакуны и другие животные''
<table>
<tr>
<th>Животное</th>
<th>Стоимость</th>
<th>Скорость</th>
<th>Грузоподъёмность</th>
</tr>
<tr>
<td>Боевой конь</td>
<td>400 зм</td>
<td>60 фт.</td>
<td>540 фнт.</td>
</tr>
<tr>
<td>Верблюд</td>
<td>50 зм</td>
<td>50 фт.</td>
<td>480 фнт.</td>
</tr>
<tr>
<td>Лошадь, ездовая</td>
<td>75 зм</td>
<td>60 фт.</td>
<td>480 фнт.</td>
</tr>
<tr>
<td>Лошадь, тягловая</td>
<td>50 зм</td>
<td>40 фт.</td>
<td>540 фнт.</td>
</tr>
<tr>
<td>Мастифф</td>
<td>25 зм</td>
<td>40 фт.</td>
<td>195 фнт.</td>
</tr>
<tr>
<td>Осёл или мул</td>
<td>8 зм</td>
<td>40 фт.</td>
<td>420 фнт.</td>
</tr>
<tr>
<td>Пони</td>
<td>30 зм</td>
<td>40 фт.</td>
<td>225 фнт.</td>
</tr>
<tr>
<td>Слон</td>
<td>200 зм</td>
<td>40 фт.</td>
<td>1 320 фнт.</td>
</tr>
</table>
!!!''Сёдла, упряжь и транспорт''
<table>
<tr>
<th>Предмет</th>
<th>Стоимость</th>
<th>Вес</th>
</tr>
<tr>
<td>Доспех</td>
<td>×4</td>
<td>×2</td>
</tr>
<tr>
<td>Карета</td>
<td>250 зм</td>
<td>100 фнт.</td>
</tr>
<tr>
<td>Коляска</td>
<td>100 зм</td>
<td>600 фнт.</td>
</tr>
<tr>
<td>Конюшня (в день)</td>
<td>5 см</td>
<td>—</td>
</tr>
<tr>
<td>Корм (в день)</td>
<td>5 мм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Сани</td>
<td>20 зм</td>
<td>300 фнт.</td>
</tr>
<tr>
<td>Седельные сумки</td>
<td>4 зм</td>
<td>8 фнт.</td>
</tr>
<tr>
<td>Телега</td>
<td>15 зм</td>
<td>200 фнт.</td>
</tr>
<tr>
<td>Упряжь и уздечка</td>
<td>2 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Фургон</td>
<td>35 зм</td>
<td>400 фнт.</td>
</tr>
<tr>
<th colspan="3">Сёдла</th>
</tr>
<tr>
<td>Военное</td>
<td>20 зм</td>
<td>30 фнт.</td>
</tr>
<tr>
<td>Грузовое</td>
<td>5 зм</td>
<td>15 фнт.</td>
</tr>
<tr>
<td>Ездовое</td>
<td>10 зм</td>
<td>25 фнт.</td>
</tr>
<tr>
<td>Экзотическое</td>
<td>60 зм</td>
<td>40 фнт.</td>
</tr>
</table>
!!!''Водный транспорт''
<table>
<tr>
<th>Предмет</th>
<th>Стоимость</th>
<th>Скорость</th>
</tr>
<tr>
<td>Военный корабль</td>
<td>25 000 зм</td>
<td>2,5 мили/ч (4 км/ч)</td>
</tr>
<tr>
<td>Галера</td>
<td>30 000 зм</td>
<td>4 мили/ч (6,5 км/ч)</td>
</tr>
<tr>
<td>Килевая лодка</td>
<td>3 000 зм</td>
<td>1 миля/ч (1,5 км/ч)</td>
</tr>
<tr>
<td>Ладья</td>
<td>10 000 зм</td>
<td>3 мили/ч (5 км/ч)</td>
</tr>
<tr>
<td>Парусный корабль</td>
<td>10 000 зм</td>
<td>2 мили/ч (3 км/ч)</td>
</tr>
<tr>
<td>Шлюпка</td>
<td>50 зм</td>
<td>1,5 мили/ч (2,5 км/ч)</td>
</tr>
</table>
//Чудесный предмет, легендарный (требуется настройка)//
Если вы держите в своей руке этот медальон в форме жука в течение 1 раунда, на его поверхности появятся письмена, открывающие его магическую сущность. Он предоставляет два преимущества, пока находится у вас:
* Вы совершаете с преимуществом спасброски от заклинаний.
* У скарабея есть 12 зарядов. Если вы проваливаете спасбросок от заклинания школы Некромантии или вредоносного эффекта, исходящего от нежити, вы можете реакцией потратить 1 заряд, чтобы превратить проваленный спасбросок в успешный. Скарабей рассыпается в порошок и уничтожается, когда тратится его последний заряд.
//Оружие (скимитар), очень редкое (требуется настройка)//
Вы получаете бонус +2 к броскам атаки и урона, совершённым этим магическим оружием. Кроме того, в каждом своём ходу вы можете совершить бонусным действием одну атаку им.
//Чудесный предмет, редкий//
Этот предмет выглядит как деревянная коробка 12 дюймов в длину, 6 дюймов шириной и 6 дюймов высотой. Коробка весит 4 фунта и держится на плаву. Её можно открывать и хранить внутри вещи. У этого предмета есть три командных слова, и каждое из них произносится действием.
Первое командное слово разворачивает коробку в лодку 10 футов длиной, 4 фута шириной и 2 фута высотой. У лодки есть пара вёсел, якорь, мачта и треугольный парус. В этой лодке с комфортом разместятся четыре существа Среднего размера.
Второе командное слово разворачивает коробку в корабль 24 фута в длину, 8 футов шириной и 6 футов высотой. У корабля есть палуба, скамьи для гребли, пять пар вёсел, кормовое весло, якорь, палубная каюта и мачта с прямым парусом. На корабле с комфортом разместятся пятнадцать существ Среднего размера.
Если коробка стала судном, оно весит как обычное судно его размера, а всё, что хранилось в коробке, остаётся на судне.
Третье командное слово превращает судно в коробку, при условии, что на борту нет существ.
Все предметы на судне, не помещающиеся в коробке, остаются вне коробки, когда та складывается. Все предметы на судне, которые могут поместиться в коробке, оказываются в коробке.
//1 уровень, Вызов, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (кусок масла или свиного сала)
:''Длительность: '' 1 минута
"""Скользкий жир покрывает пол в квадрате с длиной стороны 10 футов с центром на точке в пределах дистанции, делая эту местность труднопроходимой, пока заклинание активно.
Когда жир появляется, все существа, стоящие в этой области, должны преуспеть в спасброске Ловкости, иначе они падают ничком. Существа, входящие в эту область или оканчивающие там ход, тоже должны преуспеть в спасброске Ловкости, чтобы не упасть."""
!!!''__Скользкий ум__''
На 15 уровне вы увеличиваете силу мышления. Вы получаете владение спасбросками Мудрости.
//1 уровень, Преобразование, Бард/Волшебник/Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (щепотка земли)
:''Длительность: '' 1 час
Вы касаетесь существа. Пока заклинание активно, скорость существа увеличивается на 10 футов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше первого.
!!!''__Скрытая атака__''
"""Начиная с 1 уровня вы знаете, как точно наносить удар и использовать отвлечение врага. Один раз в ход вы можете причинить дополнительный урон 1к6 одному из существ, по которому вы попали атакой, совершённой с преимуществом к броску атаки. Атака должна использовать дальнобойное оружие или оружие со свойством «фехтовальное».
Вам не нужно иметь преимущество при броске атаки, если другой враг цели находится в пределах 5 футов от неё. Этот враг не должен быть недееспособным, и у вас не должно быть помехи для броска атаки.
Дополнительный урон увеличивается, когда вы получаете уровни в этом классе, как показано в колонке «скрытая атака»."""
!!!''Скульптор плоти''
"""//Требование: 7 уровень//
Вы можете один раз сотворить заклинание превращение, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых. """
//8 уровень, Очарование, Бард/Волшебник/Друид/Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (пригоршня глиняных, кристаллических, стеклянных или минеральных шариков)
:''Длительность: '' Мгновенная
"""Вы врываетесь в сознание существа, которое видите в пределах дистанции, пытаясь подавить его интеллект и сознание. Цель получает урон психической энергией 4к6 и должна совершить спасбросок Интеллекта.
В случае провала Интеллект и Харизма существа становятся равны 1. Оно не может накладывать заклинания, активировать магические предметы, понимать языки и вразумительно общаться. Однако существо признаёт друзей, следует за ними, и даже защищает их.
В конце каждых 30 дней существо может повторять спасбросок от этого заклинания. Если оно преуспевает, заклинание оканчивается.
Это заклинание также оканчивается заклинаниями высшее восстановление, исполнение желаний и полное исцеление."""
Грубо и дико выглядящий человек в одиночку следует в тенях деревьев за орками, которые, как он знает, планируют напасть на расположенную рядом ферму. Зажав по короткому мечу в каждой руке, он становится стальным вихрем, вырезающим одного врага за другим.
Увернувшись от конуса морозного воздуха, эльфийка встаёт на ноги и натягивает тетиву лука, чтобы пустить стрелу в белого дракона. Невзирая на волну страха, которая исходит от дракона подобно холоду его дыхания, она посылает одну стрелу за другой, чтоб найти уязвимые места между толстыми чешуйками.
Подняв высоко руку, полуэльф свистит ястребу, кружащему высоко над ним, призывая птицу к себе. Нашёптывая указания на эльфийском, он показывает на выслеженного совомедведя и посылает ястреба, чтобы отвлечь существо, пока он готовит свой лук.
Вдали от суеты городов и посёлков, за изгородями, которые защищают самые далёкие фермы от ужасов дикой природы, среди плотно стоящих деревьев, беспутья лесов и на просторах необъятных равнин следопыты несут свой бесконечный дозор.
!!!''__Смертоносные охотники__''
Бойцы диких земель, следопыты, специализируются на охоте на монстров, таких как неистовствующие звери, чудовищные создания, ужасающие великаны и смертоносные драконы, угрожающих нападением на цивилизованные земли гуманоидов. Они умеют выслеживать добычу подобно хищнику, скрытно передвигаясь через дебри, прячась среди кустов и камней. Тренируясь сражаться, следопыты делают упор боевой подготовки на сражениях с избранными врагами.
Благодаря близости с дикой природой, следопыты приобретают способность творить заклинания, взывая к силам природы подобно друидам. Их заклинания, как и боевые навыки, делают акцент на скорость, скрытность и охоту. Таланты и способности следопыта оттачиваются с концентрацией на защите пограничных земель.
!!!__''Независимые искатели приключений''__
Хотя следопыт может заработать на жизнь как охотник или проводник, его истинным призванием является защита приграничных земель от разрушительных действий чудовищ и гуманоидных орд, приходящих из диких земель. В некоторых местах следопыты собираются в тайные ордены или объединяют усилия с кругами друидов. Однако, многие следопыты независимы, так как знают, что если нападёт дракон или отряд орков, оно будут первой (и чаще всего последней) линией обороны.
Эта яростная независимость делает следопытов пригодными для приключений, так как они привыкли жить вдали от комфорта сухой постели и горячей ванны. Сталкиваясь с воспитанными в городе искателями приключений, которые ноют о тяготах жизни в дикой природе, следопыты реагируют на это с помесью веселья, разочарования и сочувствия. Но они понимают, что другие искатели приключений, привносящие свою лепту в дело борьбы с врагами цивилизации, стоят дополнительных усилий. Изнеженные горожане могут не знать, как прокормить себя или найти пресную воду в дикой природе, но они компенсируют это незнание своими навыками.
{{Таблица развития Следопыта}}
{{Создание Следопыта}}
!!!''__Слепое зрение__''
Начиная с 14 уровня, если вы можете слышать, то знаете о местонахождении всех скрытых и невидимых существ в пределах 10 футов от себя.
//3 уровень, Преобразование, Друид/Жрец (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность: '' 8 часов
"""Вы входите в каменный предмет или поверхность, достаточно большую, чтобы там поместилось ваше тело, и сливаетесь на время действия заклинания вместе со всем снаряжением с камнем. Используя перемещение, вы выходите из камня в точке, которой можете коснуться. Ваше присутствие абсолютно незаметно, и без помощи магии обнаружить вас невозможно.
Слившись с камнем, вы не можете видеть, что происходит вокруг, и все проверки Мудрости (Внимательность), совершённые, чтобы слушать, совершаются с помехой. Вы осознаёте ход времени и можете в камне накладывать заклинания на себя. Вы можете перемещением выйти из камня в том месте, где вы входили, что оканчивает это заклинание. Иначе вы перемещаться не можете.
Небольшие физические повреждения камня не причиняют вам вреда, но частичное разрушение или изменение его формы (так, что вы больше внутри не поместитесь) изгоняют вас и причиняют дробящий урон 6к6. Полное разрушение камня (или превращение его в другую субстанцию) изгоняет вас и причиняет дробящий урон 50. Если вас изгоняют, вы падаете ничком в свободном пространстве, ближайшем к месту, в котором вы входили в камень."""
//6 уровень, Вызов, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 5 футов
:''Компоненты:'' В
:''Длительность: '' Мгновенная
"""Вы и до пяти согласных существ в пределах 5 футов от вас мгновенно телепортируетесь в заранее подготовленное святилище. Вы и телепортирующиеся с вами существа появляетесь в свободном пространстве, ближайшем к месту, указанному вами при подготовке святилища (смотрите ниже). Если вы активируете это заклинание, не подготовив святилище, заклинание не оказывает никакого эффекта.
Вы должны подготовить святилище, активировав это же заклинание в таком месте как храм, посвящённом или сильно связанном с вашим божеством. Если вы попытаетесь активировать это заклинание в месте, не связанном с вашим божеством, заклинание не окажет никакого эффекта."""
//9 уровень, Воплощение, Бард//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
Волна целительной энергии окутывает существо, которого вы касаетесь. Цель восстанавливает все свои хиты. Если существо испугано, очаровано, ошеломлено или парализовано, это состояние оканчивается. Если существо лежит ничком, оно может реакцией встать. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
//8 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность: '' Мгновенная
"""Вы произносите слово силы, способное захлестнуть сознание одного существа, видимого в пределах дистанции, делая его потрясённым. Если у существа не больше 150 хитов, оно становится ошеломлённым. В противном случае это заклинание не оказывает никакого эффекта.
Ошеломлённая цель должна в конце каждого своего хода совершать спасбросок Телосложения. При успехе ошеломление проходит."""
//9 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Вы произносите слово силы, заставляющее существо, которое вы видите в пределах дистанции, мгновенно умереть. Если у выбранного вами существа не больше 100 хитов, он умирает. В противном случае это заклинание не оказывает никакого эффекта.
!!!''Слуги хаоса''
"""//Требование: 9 уровень//
Вы можете один раз сотворить заклинание призыв элементаля, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
Если персонажи исследуют дикую местность или подземелье, то они обязательно столкнутся с чем-то неожиданным. Случайные встречи являются одним из способов создания неожиданностей. Примеры таких сцен, обычно, представляются в виде таблиц. Чтобы определить, кого встретил отряд, бросьте кость и сверьтесь с таблицей.
Некоторые игроки и Мастера считают случайные встречи пустой тратой времени, но всё же хорошо продуманная случайная встреча может быть во многом полезна:
* Создание срочности. Искатели приключений не станут терять времени зря, зная, что угроза случайных встреч висит над их головами. Желание избежать блуждающих чудовищ стимулирует поиск безопасного места для отдыха (бросок игральной кости Мастером за ширмой стимулирует не хуже).
* Создание атмосферы. Появление тематически связанных существ в случайных встречах помогает создать последовательный тон и атмосферу в приключении. Например, таблица случайных встреч, наполненная летучими мышами, призраками, гигантскими пауками, и зомби создаёт чувство ужаса и подсказывает искателям приключений, что надо подготовиться к бою с ещё более могущественными существами ночи.
* Вытягивание ресурсов персонажей. Случайные встречи заставляют персонажей терять хиты и заклинания, делая их ослабленными и уязвимыми. Это создаёт напряжённость, так как игроки вынуждены принимать решения, основанные на том, что их персонажи не могут сражаться в полную силу.
* Обеспечение помощи. Некоторые случайные встречи могут принести персонажам выгоду вместо того, чтобы тормозить их или причинять им вред. Полезные существа или ПМ могут обеспечить искателей приключений полезной информацией или помощью, когда те нуждаются в этом больше всего.
* Добавление интереса. Случайные встречи могут раскрыть подробности о вашем мире. Они могут предвещать опасность или предоставлять подсказки, которые помогут искателям приключений подготовиться к будущим сценам.
* """Усиление темы кампании. Случайные встречи могут напомнить игрокам о главных темах кампании. Например, если в вашей кампании идёт постоянная война между двумя народами, то вы можете спроектировать таблицы случайных встреч таким образом, чтобы они усилили вездесущую природу конфликта. На дружественной территории ваши таблицы могут включать в себя грязных военнослужащих, возвращающихся с войны, беженцев, спасающихся от сил вторжения, хорошо охраняемые караваны, полные оружия, и одиноких посыльных верхом на лошадях, отправляющихся на линию фронта.
На враждебной территории таблицы могут включать в себя усеянные трупами поля битв, армии злых гуманоидов на марше и импровизированные виселицы с телами дезертиров."""
Случайные встречи никогда не должны быть утомительными для вас и ваших игроков. У игроков не должно сформироваться впечатление, что случайные встречи тормозят их на пути к цели. Кроме того, вы не должны тратить время и отвлекаться на случайные встречи, которые не добавляют ничего к повествованию, или которые тормозят общий темп игры.
Не все Мастера любят использовать случайные встречи. При неправильном использовании они отвлекают и создают больше проблем, чем пользы. Если вы решили, что случайные встречи вам не подходят, то просто не используйте их.
!!!''Запуск случайных встреч''
Если вы хотите, чтобы случайные встречи стали частью повествования, а не конкурировали с ним, то вы должны научиться аккуратно их размещать. Применяйте случайные встречи в следующих обстоятельствах:
* Игроки сходят с пути и замедляют игру.
* Персонажи остановились на короткий или продолжительный отдых.
* Персонажи совершают долгое и не насыщенное событиями путешествие.
* Персонажи обращают на себя слишком много внимания тогда, когда они должны оставаться в тени.
!!!''Проверка на случайные встречи''
Вы можете сами решить, когда произойдёт случайная встреча, или предоставить это игральной кости. Проверки на случайные встречи можно устраивать раз в час, раз в 4 или 8 часов, раз в течение дня, или во время длительного отдыха.
Бросьте двадцатигранную кость (к20). Если выпало «18» или выше, то произойдёт случайная встреча. Затем сделайте ещё один бросок и сверьтесь с таблицей случайных встреч, чтобы определить, кого встретили искатели приключений; перебросьте, если результат броска не имеет смысла в текущих обстоятельствах.
Таблица случайных встреч может предоставляться вместе с готовым приключением, или вы можете использовать информацию в этой главе, чтобы создать свою собственную таблицу. Создание собственных таблиц — это лучший способ усилить тему и атмосферу вашей личной кампании.
Не каждая стычка с другим существом считается случайной встречей. Таблицы случайных встреч обычно не включают в себя прыгающих по кустам кроликов, бегающих по подземельям безобидных крыс, и обычных граждан, гуляющих по улицам города. Таблицы случайных встреч включают в себя события, которые двигают сюжет вперёд, предвосхищают важные элементы или темы приключения, и предоставляют интересные отвлечения.
!!!''Создание таблицы случайных встреч''
Создать собственную таблицу случайных встреч просто. Определите, какие встречи могут произойти в данной части подземелья, а затем выясните вероятность их возникновения и упорядочьте результаты. Термин «встреча» в данном случае может означать одиночное чудовище или ПМ, группу чудовищ или ПМ, случайное событие (например, землетрясение), или случайное открытие (например, обугленное тело или сообщение, нацарапанное на стене).
;
:"""//''Соберите встречи.''// После того как вы определились с локациями, по которым искатели приключений, скорее всего, пойдут, будь то дикая местность или подземелье, составьте список существ, которые могут там находиться. Если вы не уверены, каких существ можно добавить, то в приложении Б имеется список чудовищ, упорядоченный по типам местности.
Для фейских лесов вы можете создать таблицу, которая включает в себя кентавров, волшебных дракончиков, пикси, спрайтов, дриад, сатиров, мерцающих псов, лосей, совомедов, трентов, гигантских сов и единорогов. Если леса населяют эльфы, то также можно включить туда эльфов друидов и эльфов разведчиков. Возможно, гноллы угрожают лесам, так что добавление гноллов и гиен в таблицу станет сюрпризом для игроков. Другим забавным сюрпризом станет бродячий хищник, например, ускользающий зверь, который любит охотиться на мерцающих псов. В таблице можно также использовать несколько случайных встреч менее чудовищного характера, таких как роща сожжённых деревьев (дело рук гноллов), увитая плющом эльфийская статуя, и кусты светящихся ягод, которые делают существ невидимыми при поедании.
При выборе чудовищ для таблицы случайных встреч попробуйте представить себе, почему чудовища встречаются за пределами своих берлог. Что каждое чудовище тут делает? Патрулирует? Охотится? Ищет что-нибудь? Также определите, скрытно передвигается существо или нет.
Подобно спланированным сценам, случайные встречи более интересны, когда происходят в запоминающихся местах. Искатели приключений могут встретить единорога на лесной поляне или натолкнуться на гнездо пауков, прорубаясь через густой лес. Пересекая пустыню, персонажи могут найти населённый привидениями оазис или отвесную скалу, на которой обосновался синий дракон.
://''Вероятности.''// Таблица случайных встреч может быть создана по-разному, начиная от простого (бросок 1к6 для одной из шести возможных встреч) к сложному (бросьте процентную кость, скорректируйте время суток и сопоставьте полученное число с этажом подземелья). В представленной ниже таблице используется диапазон от 2 до 20 (всего девятнадцать записей), сгенерированный с помощью 1к12 + 1к8. Кривая вероятности гласит, что встречи в середине таблицы выпадают чаще, чем встречи, помещённые в начало или в конец таблицы. «2» или «20» довольно редко выпадают (шанс около 1 процента), а значения в диапазоне от «9» до «13» имеют шанс на выпадение чуть более 8 процентов."""
Таблица случайных встреч в эльфийском лесах служит примером таблицы случайных встреч, которая реализует упомянутые выше идеи.
!!!''Сложность случайных встреч''
Случайные встречи не обязательно должны подходить по уровню сложности для искателей приключений, но уничтожить отряд, используя случайную встречу, считается дурным тоном, ведь игроки посчитают такую концовку неудовлетворительной.
Не все случайные встречи с чудовищами должны быть разрешены с помощью боя. Искатели приключений 1 уровня могут случайно встретить молодого дракона, кружащего над лесом в поисках еды, и если он увидит их, то персонажи должны иметь возможность спрятаться или откупиться за свою жизнь. Таким же образом, группа может столкнуться с гуляющим по холмам каменным великаном, но он может не иметь никакого желания кому-то вредить. Он вообще может попытаться скрыться от группы из-за своей затворнической натуры. Великан нападёт только на того, кто его раздражает.
Тем не менее, таблицы случайных встреч обычно включают в себя враждебных (хотя и не обязательно злых) чудовищ, которые предназначены для сражения. Следующие чудовища подходят под боевые задачи:
* Одно чудовище с показателем опасности, равным уровню отряда или ниже.
* Группа чудовищ со скорректированной суммой опыта, соответствующей сцене с лёгким, средним или сложным уровнем для отряда.
{{$:/Встречи в эльфийском лесу}}
На следующих страницах приводятся таблицы, которые вы можете использовать, чтобы случайным образом генерировать сокровища, которые чудовища носят с собой, прячут в своих логовах или укрывают иным способом. Размещение сокровищ остаётся на ваше усмотрение. Главное убедитесь, что игроки чувствуют себя вознаграждёнными за игру, и их персонажи удовлетворены наградой, что досталась им после того, как они преодолели опасные испытания в подземельях.
!!__''Таблицы сокровищ''__
Сокровища могут быть распределены случайным образом на основе показателя опасности чудовища.
В таблицах представлена информация для чудовищ с показателем опасности 0-4, 5-10, 11-16, а также 17 и выше. Используйте эти таблицы, чтобы определить, каким количеством денег располагает чудовище, или какие богатства хранятся в его сокровищнице.
!!!''Использование таблицы «Индивидуальные сокровища»''
Таблица «индивидуальные сокровища» поможет вам определить, сколько сокровищ имеет при себе одно существо. Если чудовище не заинтересовано в накоплении сокровищ, вы можете использовать эту таблицу, чтобы определить побочное сокровище, оставленное предыдущими жертвами чудовища.
Используйте таблицу «индивидуальные сокровища», соответствующую показателю опасности чудовища. Бросьте к100 и в зависимости от результата определите, сколько монет каждого вида есть у чудовища. В таблице также указано среднее значение бросков, указанное в скобках, на тот случай, если вы хотите отказаться от дополнительных бросков и сэкономить время. Чтобы определить общее количество индивидуальных сокровищ для группы одинаковых существ, вы можете сэкономить время путём умножения полученного результата на количество существ в группе.
Если чудовищу нет смысла носить при себе большую кучу монет, вы можете конвертировать монеты в драгоценные камни или предметы искусства равной ценности.
<<Button "$:/Индивидуальные сокровища""Индивидуальные сокровища">>
!!!''Использование таблицы «Сокровищница»''
Таблица «сокровищница» поможет вам определить содержание большого тайника с сокровищем, будь то накопленные богатства какой-либо большой группы существ (племя орков или армия хобгоблинов), имущество одного мощного существа, который имел страсть в накоплении сокровищ (например, дракона), или награда, дарованная отряду искателей приключений их благодетелем после успешного выполнения задания. Вы также можете разделить это сокровище на несколько частей, чтобы искатели приключений не смогли найти его и получить всё сразу.
При определении содержимого клада, принадлежащего одному чудовищу, используйте таблицу, соответствующую показателю опасности чудовища. При определении сокровища, принадлежащего большой группе чудовищ, используйте показатель опасности лидера этой группы. Если клад не принадлежит никому, используйте показатель опасности чудовища, контролирующего подземелье или логово. Если клад — это подарок от покровителя, используйте показатель опасности, равный среднему уровню отряда.
Каждый клад содержит случайное количество монет, как показано в верхней части каждой таблицы. Бросьте к100 и обратитесь к таблице, чтобы определить, содержит ли клад драгоценные камни и произведения искусства. Этот же бросок используется для определения того, присутствуют ли в кладе магические предметы.
Как и для таблицы «индивидуальные сокровища», здесь в скобках приведены средние значения. Вы можете использовать среднее значение, не бросая кость, чтобы сэкономить время.
Если размер сокровища кажется вам слишком маленьким, вы можете повторить бросок несколько раз. Используйте этот подход для чудовищ, которые особенно любят накапливать сокровища. Легендарные существа накапливают гораздо больше сокровищ, чем обычные. Для них бросайте кость как минимум дважды и складывайте результаты вместе.
Вы можете давать так много или так мало сокровищ, как вы того пожелаете. В течение типичной кампании отряд находит сокровища на сумму семи бросков для показателя опасности 0-4, восемнадцати бросков для показателя опасности 5-10, двенадцати бросков для показателя опасности 11-16, и восьми бросков для показателя опасности 17+
<<Button "$:/Сокровищница: Показатель опасности 0-4""Сокровищница: Показатель опасности 0-4">>
<<Button "$:/Сокровищница: Показатель опасности 5-10""Сокровищница: Показатель опасности 5-10">>
<<Button "$:/Сокровищница: Показатель опасности 11-16""Сокровищница: Показатель опасности 11-16">>
<<Button "$:/Сокровищница: Показатель опасности 17+""Сокровищница: Показатель опасности 17+">>
!!!''Драгоценные камни''
Если клад содержит драгоценные камни, вы можете использовать следующие таблицы, чтобы определить разновидность найденных драгоценных камней, основываясь на их стоимости. Вы можете бросить кость один раз и предположить, что все найденные камни одинаковы, или же несколько раз, чтобы создать яркую коллекцию драгоценных камней.
<<Button "$:/Драгоценные камни стоимостью 10 зм""Драгоценные камни стоимостью 10 зм">>
<<Button "$:/Драгоценные камни стоимостью 50 зм""Драгоценные камни стоимостью 50 зм">>
<<Button "$:/Драгоценные камни стоимостью 100 зм""Драгоценные камни стоимостью 100 зм">>
<<Button "$:/Драгоценные камни стоимостью 500 зм""Драгоценные камни стоимостью 500 зм">>
<<Button "$:/Драгоценные камни стоимостью 1000 зм""Драгоценные камни стоимостью 1000 зм">>
<<Button "$:/Драгоценные камни стоимостью 5000 зм""Драгоценные камни стоимостью 5000 зм">>
!!!''Произведения искусства''
Если клад содержит произведения искусства, вы можете использовать следующие таблицы, чтобы определить разновидность этих произведений, основываясь на их стоимости. Бросьте кости столько раз, сколько произведений искусства содержит клад.
<<Button "$:/Произведения искусства стоимостью 25 зм""Произведения искусства стоимостью 25 зм">>
<<Button "$:/Произведения искусства стоимостью 250 зм""Произведения искусства стоимостью 250 зм">>
<<Button "$:/Произведения искусства стоимостью 750 зм""Произведения искусства стоимостью 750 зм">>
<<Button "$:/Произведения искусства стоимостью 2500 зм""Произведения искусства стоимостью 2500 зм">>
<<Button "$:/Произведения искусства стоимостью 7500 зм""Произведения искусства стоимостью 7500 зм">>
//2 уровень, Преобразование, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы принимаете другой облик. При накладывании выберите один из представленных ниже вариантов, эффект от которого будет длиться всю длительность заклинания. Пока заклинание активно, вы можете действием окончить один эффект, чтобы получить преимущества другого.
//''Адаптация к воде.''// Вы приспосабливаете своё тело к существованию в воде, отращивая жабры и перепонки между пальцами. Вы можете дышать под водой и получаете скорость плавания, равную скорости хождения.
//''Естественное оружие.''// Вы отращиваете когти, клыки, шипы, рога или другое естественное оружие на свой выбор. Ваш безоружный удар причиняет дробящий, колющий или рубящий урон 1к6, в зависимости от выбранного вами оружия, и вы владеете безоружными ударами. Это оружие будет магическим, и вы получаете бонус +1 к броскам атаки и урона им.
//''Изменение внешности.''// Вы изменяете свою внешность. Вы сами решаете, на кого будете походить, включая рост, вес, лицо, звук голоса, длину волос, цвета и отличительные характеристики. Вы можете стать похожим на представителя другой расы, но ваши показатели не изменяются. Вы также не можете выглядеть как существо другой категории размера, и ваше тело остаётся примерно тем же самым; например, это заклинание не сделает вас четырёхногим. Пока заклинание активно, вы можете действием изменять свою внешность."""
//9 уровень, Иллюзия, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Воззвав к сильнейшим страхам группы существ, вы создаёте иллюзорных существ в их сознаниях, видимых только для них. Все существа в сфере с радиусом 30 футов с центром на выбранной точке в пределах дистанции, должны совершить спасбросок Мудрости. При провале существо становится испуганным на время длительности заклинания. Иллюзия взывает к самым потаённым страхам, проявляясь в виде худших кошмаров и неумолимой угрозы. В конце каждого своего хода испуганное существо должно преуспевать в спасброске Мудрости, иначе оно получает урон психической энергией 4к10. При успехе для этого существа заклинание оканчивается.
//4 уровень, Очарование, Бард/Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (три ореховые скорлупки)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Это заклинание атакует и скручивает сознание существ, порождая галлюцинации и провоцируя на необдуманные действия. Все существа в сфере с радиусом 10 футов с центром на точке, выбранной в пределах дистанции, должны преуспеть в спасброске Мудрости, иначе попадут под действие эффекта.
Попавшая под эффект цель не может совершать реакции и должна бросать к10 в начале каждого своего хода, чтобы определить своё поведение в этом ходу."""
<table>
<tr>
<th>к10</th>
<th>Поведение</th>
</tr>
<tr>
<td>1</td>
<td>Существо использует всё своё перемещение на движение в случайном направлении. Для определения направления бросьте к8, назначив каждой грани своё направление. Действие в этом ходу существо не совершает.</td>
</tr>
<tr>
<td>2–6</td>
<td>Существо в этом ходу не перемещается и не совершает действий.</td>
</tr>
<tr>
<td>7–8</td>
<td>Существо действием совершает рукопашную атаку по случайным образом выбранному существу в пределах досягаемости. Если в пределах досягаемости нет других существ, существо в этот ход ничего не делает.</td>
</tr>
<tr>
<td>9–10</td>
<td>Существо может действовать и перемещаться как обычно.</td>
</tr>
</table>
В конце каждого своего хода цель может совершать спасбросок Мудрости. В случае успеха на этой цели эффект заканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, радиус сферы увеличивается на 5 футов за каждый уровень ячейки выше четвёртого.
В этом разделе описываются предметы, используемые по особым правилам, или требующие разъяснений.
''Вместимость контейнеров''
<table>
<tr>
<th>Контейнер</th>
<th>Вместимость</th>
</tr>
<tr>
<td>Бочка</td>
<td>40 галлонов (150 литров), 4 кубических фута</td>
</tr>
<tr>
<td>Бурдюк</td>
<td>4 пинты (2 литра)</td>
</tr>
<tr>
<td>Бутылка</td>
<td>1,5 пинты (0,75 литра)</td>
</tr>
<tr>
<td>Ведро</td>
<td>3 галлона (11 литров), 0,5 кубических футов</td>
</tr>
<tr>
<td>Горшок, железный</td>
<td>1 галлон (3,75 литра)</td>
</tr>
<tr>
<td>Корзина</td>
<td>2 кубических фута/40 фунтов (20 килограмм)</td>
</tr>
<tr>
<td>Кошель</td>
<td>0,2 кубических фута/6 фунтов (3 килограмма)</td>
</tr>
<tr>
<td>Кувшин или графин</td>
<td>1 галлон (3,75 литра)</td>
</tr>
<tr>
<td>Мешок</td>
<td>1 кубический фут/30 фунтов (15 килограмм)</td>
</tr>
<tr>
<td>Рюкзак*</td>
<td>1 кубический фут/30 фунтов (15 килограмм)</td>
</tr>
<tr>
<td>Сундук</td>
<td>12 кубических футов/300 фунтов (150 килограмм)</td>
</tr>
<tr>
<td>Флакон</td>
<td>4 унции (100 грамм)</td>
</tr>
<tr>
<td>Фляга или кружка</td>
<td>1 пинта (0,5 литра)</td>
</tr>
<tr>
<td colspan="3"> * Вы также можете привязывать такие предметы как спальники и верёвки снаружи рюкзака.</td>
</tr>
</table>
!!''Снаряжение''
<table>
<tr>
<th>Предмет</th>
<th>Стоимость</th>
<th>Вес</th>
</tr>
<tr>
<td>Абак</td>
<td>2 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Алхимический огонь (фляга)</td>
<td>50 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Блок и лебёдка</td>
<td>1 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Бочка</td>
<td>2 зм</td>
<td>70 фнт.</td>
</tr>
<tr>
<td>Бумага (один лист)</td>
<td>2 см</td>
<td>—</td>
</tr>
<tr>
<td>Бурдюк</td>
<td>2 см</td>
<td>5 фнт. (полный)</td>
</tr>
<tr>
<td>Бутылка, стеклянная</td>
<td>2 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Ведро</td>
<td>5 мм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Верёвка пеньковая (50 футов)</td>
<td>1 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Верёвка, шёлковая (50 футов)</td>
<td>10 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Весы, торговые</td>
<td>5 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Воск</td>
<td>5 см</td>
<td>—</td>
</tr>
<tr>
<td>Горшок, железный</td>
<td>2 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Духи (флакон)</td>
<td>5 зм</td>
<td>—</td>
</tr>
<tr>
<td>Замок</td>
<td>10 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Зелье лечения</td>
<td>50 зм</td>
<td>1/2 фнт.</td>
</tr>
<tr>
<td>Зеркало, стальное</td>
<td>5 зм</td>
<td>1/2 фнт.</td>
</tr>
<tr>
<td>Калтропы (20 штук в сумке)</td>
<td>1 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Кандалы</td>
<td>2 зм</td>
<td>6 фнт.</td>
</tr>
<tr>
<td>Кирка, горняцкая</td>
<td>2 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Кислота (флакон)</td>
<td>25 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Книга</td>
<td>25 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Книга заклинаний</td>
<td>50 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Колокольчик</td>
<td>1 зм</td>
<td>—</td>
</tr>
<tr>
<td>Колчан</td>
<td>1 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Кольцо-печатка</td>
<td>5 зм</td>
<td>—</td>
</tr>
<tr>
<td>Комплект для лазания</td>
<td>25 зм</td>
<td>12 фнт.</td>
</tr>
<tr>
<td>Комплект для рыбалки</td>
<td>1 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Комплект целителя</td>
<td>5 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Контейнер для арбалетных болтов</td>
<td>1 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Контейнер для карт и свитков</td>
<td>1 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Корзина</td>
<td>4 см</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Кошель</td>
<td>5 см</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Крюк-кошка</td>
<td>2 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Кувшин или графин</td>
<td>2 мм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Лампа</td>
<td>5 см</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Лестница (10 футов)</td>
<td>1 см</td>
<td>25 фнт.</td>
</tr>
<tr>
<td>Ломик</td>
<td>2 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Лопата</td>
<td>2 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Масло (фляга)</td>
<td>1 см</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Мел (1 кусочек)</td>
<td>1 мм</td>
<td>—</td>
</tr>
<tr>
<td>Металлические шарики (1 000 штук в сумке)</td>
<td>1 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Мешок</td>
<td>1 мм</td>
<td>1/2 фнт.</td>
</tr>
<tr>
<td>Мешочек с компонентами</td>
<td>25 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Молот, кузнечный</td>
<td>2 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Молоток</td>
<td>1 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Мыло</td>
<td>2 мм</td>
<td>—</td>
</tr>
<tr>
<td>Одежда, дорожная</td>
<td>2 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Одежда, костюм</td>
<td>5 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Одежда, обычная</td>
<td>5 см</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Одежда, отличная</td>
<td>15 зм</td>
<td>6 фнт.</td>
</tr>
<tr>
<td>Одеяло</td>
<td>5 см</td>
<td>3 фнт.</td>
</tr>
<tr>
<td>Охотничий капкан</td>
<td>5 зм</td>
<td>25 фнт.</td>
</tr>
<tr>
<td>Палатка, двухместная</td>
<td>2 зм</td>
<td>20 фнт.</td>
</tr>
<tr>
<td>Пергамент (один лист)</td>
<td>1 см</td>
<td>—</td>
</tr>
<tr>
<td>Песочные часы</td>
<td>25 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Писчее перо</td>
<td>2 мм</td>
<td>—</td>
</tr>
<tr>
<td>Подзорная труба</td>
<td>1,000 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Противоядие (флакон)</td>
<td>50 зм</td>
<td>—</td>
</tr>
<tr>
<td>Рационы (1 день)</td>
<td>5 см</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Рюкзак</td>
<td>2 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Ряса</td>
<td>1 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Свеча</td>
<td>1 мм</td>
<td>—</td>
</tr>
<tr>
<td>Святая вода (фляга)</td>
<td>25 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Сигнальный свисток</td>
<td>5 мм</td>
<td>—</td>
</tr>
<tr>
<td>Спальник</td>
<td>1 зм</td>
<td>7 фнт.</td>
</tr>
<tr>
<td>Столовый набор</td>
<td>2 см</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Сундук</td>
<td>5 зм</td>
<td>25 фнт.</td>
</tr>
<tr>
<td>Таран, портативный</td>
<td>4 зм</td>
<td>35 фнт.</td>
</tr>
<tr>
<td>Точильный камень</td>
<td>1 мм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Трутница</td>
<td>5 см</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Увеличительное стекло</td>
<td>100 зм</td>
<td>—</td>
</tr>
<tr>
<td>Факел</td>
<td>1 мм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Флакон</td>
<td>1 зм</td>
<td>—</td>
</tr>
<tr>
<td>Фляга или большая кружка</td>
<td>2 мм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Фонарь, закрытый</td>
<td>5 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Фонарь, направленный</td>
<td>10 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Цепь (10 футов)</td>
<td>5 зм</td>
<td>10 фнт.</td>
</tr>
<tr>
<td>Чернила (бутылочка 30 грамм)</td>
<td>10 зм</td>
<td>—</td>
</tr>
<tr>
<td>Шест (10 футов)</td>
<td>5 мм</td>
<td>7 фнт.</td>
</tr>
<tr>
<td>Шипы, железные (10)</td>
<td>1 зм</td>
<td>5 фнт.</td>
</tr>
<tr>
<td>Шлямбур</td>
<td>5 мм</td>
<td>1/4 фнт.</td>
</tr>
<tr>
<td>Яд, простой (флакон)</td>
<td>100 зм</td>
<td>—</td>
</tr>
<tr>
<th colspan="3">Боеприпасы</th>
</tr>
<tr>
<td>Арбалетные болты (20)</td>
<td>1 зм</td>
<td>1,5 фнт.</td>
</tr>
<tr>
<td>Иглы для трубки (50)</td>
<td>1 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Снаряды для пращи (20)</td>
<td>4 мм</td>
<td>1,5 фнт.</td>
</tr>
<tr>
<td>Стрелы (20)</td>
<td>1 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<th colspan="3">Магическая фокусировка</th>
</tr>
<tr>
<td>Волшебная палочка</td>
<td>10 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Жезл</td>
<td>10 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Кристалл</td>
<td>10 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Посох</td>
<td>5 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Сфера</td>
<td>20 зм</td>
<td>3 фнт.</td>
</tr>
<tr>
<th colspan="3">Священный символ</th>
</tr>
<tr>
<td>Амулет</td>
<td>5 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Реликварий</td>
<td>5 зм</td>
<td>2 фнт.</td>
</tr>
<tr>
<td>Эмблема</td>
<td>5 зм</td>
<td>—</td>
</tr>
<tr>
<th colspan="3">Фокусировка друидов</th>
</tr>
<tr>
<td>Веточка омелы</td>
<td>1 зм</td>
<td>—</td>
</tr>
<tr>
<td>Деревянный посох</td>
<td>5 зм</td>
<td>4 фнт.</td>
</tr>
<tr>
<td>Тисовая палочка</td>
<td>10 зм</td>
<td>1 фнт.</td>
</tr>
<tr>
<td>Тотем</td>
<td>1 зм</td>
<td>—</td>
</tr>
</table>
"""//''Алхимический огонь.''// Эта вязкая и клейкая жидкость воспламеняется при контакте с воздухом. Вы можете действием метнуть фляжку на расстояние до 20 футов, разбив её от удара. Совершите дальнобойную атаку по существу или предмету, считая алхимический огонь импровизированным оружием. При попадании цель получает урон огнём 1к4 в начале каждого своего хода. Существо может окончить этот урон, потратив действие на тушение пламени, и совершив проверку Ловкости со Сл 10.
//''Блок и лебёдка.''// Набор блоков и тросов с крюками для подвешивания предметов. Блок и лебёдка позволяют вам поднять в четыре раза больше, чем обычно.
//''Верёвка.''// У верёвки, сделанной из пеньки или шёлка, 2 хита, и её можно порвать проверкой Силы со Сл 17.
//''Весы, торговые.''// В набор входят рычажные весы, чашки и набор грузиков на 2 фунта. С их помощью можно точно измерять вес небольших предметов, таких как драгоценные металлы или товары.
//''Замок.''// Вместе с замком идёт и ключ. Без ключа существо, владеющее воровскими инструментами, может вскрыть замок успешной проверкой Ловкости со Сл 15. Мастер может решить, что есть более качественные замки, стоящие больше.
//''Зелье лечения.''// Существо, выпившее магическую красную жидкость из этого флакона, восстанавливает 2к4 + 2 хита. Зелье выпивается или заливается в рот другому действием.
//''Калтропы.''// Вы можете действием рассыпать сумку калтропов по площади в 5 × 5 футов. Все существа, входящие в эту область, должны преуспеть в спасброске Ловкости со Сл 15, иначе они останавливаются и получают колющий урон 1. Пока это существо не восстановит как минимум 1 хит, его скорость ходьбы уменьшена на 10 футов. Существо, перемещающееся по этой области с уменьшенной вдвое скоростью, не обязано совершать спасбросок.
//''Кандалы.''// Эти металлические оковы удерживают существ Маленького и Среднего размера. Для того чтобы сбежать из кандалов, требуется успешная проверка Ловкости со Сл 20. Для того чтобы их сломать, требуется проверка Силы со Сл 20. Каждый набор кандалов идёт с одним ключом. Без ключа существо, владеющее воровскими инструментами, может вскрыть замок кандалов успешной проверкой Ловкости со Сл 15. У кандалов 15 хитов.
//''Кислота.''// Вы можете действием выплеснуть содержимое этого сосуда на существо, находящееся в пределах 5 футов от вас, или метнуть сосуд на расстояние до 20 футов, чтобы он разбился от удара. В любом случае совершите дальнобойную атаку против существа или предмета, считая кислоту импровизированным оружием. При попадании цель получает урон кислотой 2к6.
//''Книга.''// В книге могут быть стихи, документальные сведения, информация о чём-либо, диаграммы и заметки о гномьих приспособлениях, или что угодно другое, представленное текстом и картинками. Книга с заклинаниями — другое дело (описана ниже).
//''Книга заклинаний.''// Книги заклинаний очень важны для волшебников. Это переплетённые кожей тома, содержащие 100 пустых пергаментных страниц, на которых можно записывать заклинания.
//''Колчан.''// В колчан помещается 20 стрел.
//''Комплект для лазания.''// В набор для лазания входят шлямбуры, накладные подошвы, перчатки и страховочная привязь. Вы можете действием использовать набор для лазания, чтобы закрепиться на высоте; если вы делаете это, вы не можете упасть более чем на 25 футов от того места, где закрепились, но и не можете подняться выше 25 футов от этого места, не открепившись.
//''Комплект для рыбалки.''// В этот набор входит удилище, шёлковая леска, пробковый поплавок, стальные крючки, свинцовые грузила, приманки из ниток и мелкоячеистая сеть.
//''Комплект целителя.''// Это кожаный кошель с бинтами, мазями и шинами. Набор годится для десяти использований. Вы можете действием потратить одно использование набора для стабилизации существа, у которого 0 хитов, не совершая проверку Мудрости (Медицина).
//''Контейнер для арбалетных болтов.''// В этот деревянный контейнер помещаются 20 арбалетных болтов.
//''Контейнер для карт и свитков.''// В этом цилиндрическом кожаном тубусе может храниться до десяти скрученных листов бумаги или пять скрученных листов пергамента.
//''Кошель.''// В кожаном или тканевом кошеле поместится 20 снарядов для пращи или 50 иголок для духовой трубки, а также другие вещи. Кошель с отделениями для хранения компонентов заклинаний называется мешочком с компонентами (описывается ниже).
//''Лампа.''// Лампа испускает яркий свет в пределах 15 футов и тусклый свет в пределах ещё 30 футов. Зажжённая лампа горит 6 часов от одной фляги (1 пинта [0,5 литра]) масла.
//''Ломик.''// Использование ломика позволяет совершать проверки Силы с преимуществом, если рычаг должен помочь.
//''Магическая фокусировка.''// Магическая фокусировка это особый предмет — сфера, кристалл, жезл, особый посох, короткая деревянная палочка или похожий предмет — созданный для проведения тайных заклинаний. Волшебники, колдуны и чародеи могут использовать эти предметы в качестве фокусировки для заклинаний, как описано в главе 10.
//''Масло.''// Обычно масло продаётся в глиняных флягах по 1 пинте (0,5 литра). Вы можете действием облить маслом из фляги существо, находящееся в пределах 5 футов, или кинуть её на 20 футов, ломая при ударе. Совершите дальнобойную атаку по целевому существу или предмету, считая масло импровизированным оружием. При попадании цель покрывается маслом. Если цель получает урон огнём, пока масло не высохло (1 минута), она получает дополнительный урон огнём 5 от горящего масла. Вы можете также вылить фляжку масла на землю, покрыв площадь 5 × 5 футов, при условии, что пол ровный. Если теперь масло поджечь, оно горит 2 раунда и причиняет урон огнём 5 всем существам, входящим в эту область или оканчивающим в ней ход. Существо может получить этот урон только один раз за ход.
//''Металлические шарики.''// Вы можете действием рассыпать из этого мешка крохотные металлические шарики, покрыв площадь 10 × 10 футов. Существа, перемещающиеся по этой области, должны преуспеть в спасброске Ловкости со Сл 10, иначе они падают ничком. Существо, перемещающееся по этой области с уменьшенной вдвое скоростью, не обязано совершать спасбросок.
//''Мешочек с компонентами.''// Мешочек с компонентами это маленький водонепроницаемый кожаный поясной кошель с отделениями для хранения материальных компонентов и других особых предметов, нужных для накладывания заклинаний, если только у этих компонентов не указана стоимость (смотрите описание заклинания).
//''Охотничий капкан.''// Если вы действием установите эту ловушку, она образует стальное кольцо с зазубренными краями, которая захлопывается, когда в её центр наступает существо. Капкан привязывается толстой цепью к неподвижному предмету, такому как дерево или колышек, вбитый в землю. Существо, наступившее в центр, должно преуспеть в спасброске Ловкости со Сл 13, иначе оно получает колющий урон 1к4 и прекращает перемещение. Впоследствии, пока существо не высвободится из ловушки, его перемещения ограничены длиной цепи (обычно 1 метр). Любое существо может действием совершить проверку Силы со Сл 13, чтобы высвободить себя или другое существо, находящееся в пределах досягаемости. Каждая проваленная проверка причиняет пойманному существу колющий урон 1.
//''Палатка.''// В палатке, простом парусиновом жилище, могут спать двое.
Подзорная труба. Предметы, на которые смотрят в подзорную трубу, увеличиваются в два раза
//''Противоядие.''// Существо, выпившее жидкость из этого флакона, в течение часа совершает спасброски от яда с преимуществом. Оно не предоставляет преимущества нежити и конструктам.
//''Рационы.''// Рационы состоят из обезвоженной пищи, подходящей для путешествий, включая вяленое мясо, сухофрукты, галеты и орехи.
//''Свеча.''// В течение 1 часа свеча испускает яркий свет в пределах радиуса 5 футов и тусклый свет в пределах ещё 5 футов.
//''Святая вода.''// Вы можете действием облить содержимым этой фляги существо, находящееся в пределах 5 футов, или кинуть флягу на 20 футов, ломая при ударе. Совершите дальнобойную атаку по целевому существу, считая святую воду импровизированным оружием. Если цель — изверг или нежить, она получает урон излучением 2к6.
Жрец или паладин может создать святую воду, исполнив особый ритуал. Этот ритуал исполняется 1 час, использует толчёное серебро на 25 зм и требует, чтобы заклинатель потратил ячейку заклинаний 1 уровня.
//''Священный символ.''// Священный символ изображает божество или целый пантеон. Это может быть амулет, изображающий символ божества, символ, выгравированный или выложенный камнями в качестве эмблемы на щите, или крохотная коробочка, в которой хранится священная реликвия. В приложении Б приводится список символов, используемый для самых распространённых богов мультивселенной. Жрец или паладин может использовать священный символ в качестве фокусировки для заклинаний, как описано в главе 10. Для такого использования символа заклинатель должен держать его в руке, носить у всех на виду или нести на щите.
//''Столовый набор.''// В этой небольшой коробке находится чашка и простые столовые приборы. Коробка раскрывается, и одна сторона может использоваться как сковорода, а другая — как тарелка или неглубокая миска.
//''Таран, портативный.''// Вы можете вышибать портативным тараном двери. Вы получаете бонус +4 к проверкам Силы. Если другой персонаж помогает вам использовать таран, вы совершаете проверку с преимуществом.
//''Трутница.''// В этом небольшом контейнере находится кремень, кресало и трут (обычно это сухая тряпка, вымоченная в масле), используемые для разжигания огня. Использование его для разжигания факела — или чего-нибудь другого, легковоспламеняющегося — требует одного действия. Разжигание другого огня требует 1 минуты.
//''Увеличительное стекло.''// Эта линза позволяет разглядывать маленькие предметы. Линзу также можно использовать для замены кремня и кресала. Разжигание огня увеличительным стеклом требует света, яркого как свет солнца, трута для розжига и примерно 5 минут. Увеличительное стекло позволяет совершать с преимуществом проверки характеристик, сделанных для оценки или исследования мелких и высокодетализированных предметов.
//''Факел.''// Факел горит 1 час, испуская яркий свет в пределах 20 футов и тусклый свет в пределах ещё 20 футов. Если вы совершаете рукопашную атаку горящим факелом и попадаете, он причиняет урон огнём 1.
//''Фокусировка друидов.''// Фокусировкой друида может быть веточка омелы или падуба, палочка или скипетр из тиса или другого дерева, посох, созданный из живого дерева, или тотем с перьями, мехом, костями и зубами священных животных. Друид может использовать эти предметы в качестве фокусировки для заклинаний, как описано в главе 10.
//''Фонарь, закрытый.''// Закрытый фонарь испускает яркий свет в пределах 30 футов и тусклый свет в пределах ещё 30 футов. Зажжённый фонарь горит 6 часов от одной фляги (1 пинта [0,5 литра]) масла. Вы можете действием опустить козырёк, уменьшив освещение до тусклого света в пределах 5 футов.
//''Фонарь, направленный.''// Направленный фонарь испускает яркий свет 60-футовым конусом и тусклый свет в пределах ещё 60 футов. Зажжённый фонарь горит 6 часов от одной фляги (1 пинта [0,5 литра]) масла.
//''Цепь.''// У цепи 10 хитов. Её можно порвать успешной проверкой Силы со Сл 20.
//''Яд, простой.''// Вы можете покрыть ядом из этого флакона одно рубящее или колющее оружие или три боеприпаса. Наносится яд одним действием. Существо, по которому попадёт отравленное оружие или боеприпас, должно совершить спасбросок Телосложения со Сл 10, получая в случае провала урон ядом 1к4. Нанесённый яд эффективен 1 минуту, после чего высыхает."""
<<<
!!!''Наборы снаряжения''
"""В начальное снаряжение, получаемое от класса, входит готовый набор полезного снаряжения. Здесь указано содержимое этих наборов. Если вы стартовое снаряжение покупаете, можете приобрести его по указанной цене, что может быть дешевле, чем покупать его порознь.
//''Набор артиста (40 зм).''// Включает рюкзак, спальник, 2 костюма, 5 свечек, рационы на 5 дней, бурдюк и набор для грима.
//''Набор взломщика (16 зм).''// Включает рюкзак, сумку с 1 000 металлических шариков, 10 футов лески, колокольчик, 5 свечек, ломик, молоток, 10 шлямбуров, закрытый фонарь, 2 фляги масла, рационы на 5 дней, трутницу и бурдюк. В набор также входит 50-футовая пеньковая верёвка, закреплённая сбоку.
//''Набор дипломата (39 зм).''// Включает сундук, 2 контейнера для карт и свитков, комплект отличной одежды, бутылочку чернил, писчее перо, лампу, 2 фляги масла, 5 листов бумаги, флакон духов, воск и мыло.
//''Набор исследователя подземелий (12 зм).''// Включает рюкзак, ломик, молоток, 10 шлямбуров, 10 факелов, трутницу, рационы на 10 дней и бурдюк. В набор также входит 50-футовая пеньковая верёвка, закреплённая сбоку.
//''Набор путешественника (10 зм).''// Включает рюкзак, спальник, столовый набор, трутницу, 10 факелов, рационы на 10 дней и бурдюк. В набор также входит 50-футовая пеньковая верёвка, закреплённая сбоку.
//''Набор священника (19 зм).''// Включает рюкзак, одеяло, 10 свечек, трутницу, коробку для пожертвований, 2 упаковки благовоний, кадило, облачение, рационы на 2 дня и бурдюк.
//''Набор учёного (40 зм).''// Включает рюкзак, научную книгу, бутылочку чернил, писчее перо, 10 листов пергамента, небольшую сумочку с песком и небольшой нож."""
<<<
//3 уровень, Ограждение, Волшебник/Жрец/Колдун/Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
После вашего касания все проклятья, действующие на одно существо или предмет, оканчиваются. Если предмет был проклятым магическим предметом, проклятье остаётся, но заклинание разрывает настройку владельца на него, поэтому его можно снять или выбросить.
Значимые события в истории фэнтезийного мире, как правило, ведут в сторону огромных потрясений: к войнам, которые бросают силы добра против зла в эпическом противостоянии, к стихийным бедствиям, которые губят целые цивилизации, к вторжениям обширных армий или орд демонов с планов, к убийству мировых лидеров. Такие сотрясающие весь мир события всегда входят в историю.
Такие события необходимы в играх D&D, они могут вдохнуть жизнь в кампанию и поддерживать её. Самая распространённая ошибка одиночных рассказов, у которых нет общего начала, середины, и конца — это инертность. Подобно многим телевизионным шоу и сериям комиксов, кампания D&D рискует встать на те же грабли скучности, когда заканчивается веселье. Актёры и писатели уходят из таких проектов, так же могут поступить и игроки — актёры и писатели в игре D&D. Игра переходит в стагнацию, когда ход истории затягивается и перестаёт развиваться, когда одни и те же злодеи и похожие приключения становятся утомительными и предсказуемым, когда мир вокруг персонажей остаётся неизменным и никак не отвечает на их действия.
События, сотрясающие весь мир, вызывают конфликт. Они провоцируют новые события и приводят различные силы в движение. Их результаты изменяют мир, очень сильно преобразуя его атмосферу. Они наносят на летопись вашего мира большую, жирную печать. Изменения, особенно изменения, которые происходят в результате действий персонажей, заставляют историю развиваться. Если изменения незаметны, то действиям персонажей не хватает значимости. Когда мир становится слишком спокойным, наступает пора встряхнуть его как следует.
!!__''Запуск событий''__
События мирового масштаба могут произойти в любое время, но самые большие происшествия обычно случаются в начале, в середине, и в конце истории.
Такое размещение отражает структуру драматических историй. В начале истории что- то случается, встряхивая жизнь главных героев и подталкивая их к действию. Персонажи принимают меры, чтобы решить свои проблемы, но им противостоят другие силы. Как только они близко подбираются к своей цели, большое столкновение срывает все их планы, ситуация накаляется, а провал кажется неизбежным. В конце истории мир снова сотрясается и изменяется в ту сторону, в которую персонажи изменили его своими действиями.
В начале кампании потрясшие весь мир события мгновенно создают идеи для приключений и напрямую влияют на жизнь персонажей. В середине они создают великолепные сюжетные повороты, в которых жизнь героев встаёт с ног на голову — они поднимаются после поражения или терпят крах после победы. Ближе к концу кампании подобные события служат превосходной кульминацией с далеко идущими последствиями. Они могут происходить даже после окончания истории, как результат действий героев.
!!__''Когда не стоит сотрясать мир''__
При повествовании остерегайтесь «ложных действий», или действий только ради действий. Ложные действия не двигают историю вперёд, не вовлекают персонажей, и не заставляют их меняться. Многие боевики страдают от ложных сцен действия, которые наполнены погонями, перестрелками, взрывами, но не создают ничего кроме неудобства персонажам. Они в конечном счёте утомляют зрителей своим повторением и недостаточностью значимости. Некоторые кампании D&D попадают в ту же ловушку, создавая одно за другим глобальные бедствия с минимальным воздействием на персонажей или на мир. Таким образом, изменять мировой порядок каждый раз, когда действие в игре затихает, тем самым делая глобальные потрясения банальными, не в интересах Мастера.
Существует основное правило: кампания может выдержать до трёх крупномасштабных, повлиявших на весь мир события: одно ближе к началу, одно около середины, и одно в конце. Но вы можете добавлять в игру сколько угодно небольших событий, которые нарушают привычную жизнь городов, деревень, племён, феодальных владений, герцогств и провинций. Пусть неожиданные и страшные события регулярно происходят на небольших участках, а крупномасштабные, охватывающие всю карту события приберегите для больших и для самых важных моментов вашей кампании.
!!!__''Потрясающие весь мир события''__
Вы можете использовать этот раздел для идей и вдохновения, или чтобы расширить свой список мировых событий. Вы также можете совершить бросок кубика и свериться с таблицами ниже, чтобы случайно сгенерировать событие. Попытка оправдать случайный результат — хороший способ стимуляции воображения и может выявить непредвиденные возможности.
Для начала выберите категорию событий или бросьте к10.
{{$:/Потрясающие весь мир события}}
!!!''1-2. Восхождение/падение лидера или начало/конец эпохи''
Эпохи часто определяется выдающимися лидерами, новаторами, и тиранами тех дней. Эти люди изменили мир и оставили неизгладимый след на страницах истории. Когда они приходят к власти, они увековечивают всё вокруг себя. Когда их свергают или они уходят, остаётся лишь призрак их присутствия.
Определите тип лидера, который повлиял на новую или текущую эпоху. Вы можете выбрать тип лидера или определить его случайно с помощью приведённой таблицы:
{{$:/Типы лидеров}}
Политические лидеры это монархи, дворяне, и начальники. Религиозные лидеры включают в себя аватары божеств, первосвященников и мессий, а также тех, кто в ответе за монастыри и руководителей влиятельных религиозных сект. Основные военные лидеры управляют вооружёнными силами стран. Они включают в себя военных диктаторов, полевых командиров и глав военного совета. Меньшие военные лидеры включают в себя руководителей местных ополчений, банд и других боевых организаций. В широком масштабе, криминальные и преступные лидеры властвуют через сеть шпионов, взяток, и через торговлю на чёрном рынке. В узком масштабе, это местные главари банд, пиратские капитаны и разбойники. Лидер в искусстве или культуре это виртуоз, чья работа отражает дух эпохи и меняет взгляды людей: известный драматург, бард, или придворный шут, из чьих слов, произведений или спектаклей люди получают универсальную истину. В меньшем масштабе, это может быть влиятельный местный поэт, певец, писатель-сатирик или скульптор. Лидер в философии, эрудиции, или магии это философ-гений, советник императора, просвещённый мыслитель, глава высшего образовательного учреждения в мире, или архимаг. Меньшим лидером может быть местный мудрец, провидец, загадочный колдун, мудрый старец, или учитель.
//''Восхождение лидера, начало эпохи.''// В драматических историях восхождение нового лидера часто происходит в конце периода борьбы или беспорядка. Иногда это война или восстание; иногда — избрание, смерть тирана, исполнение пророчества, или назначение героя. Наоборот, новый лидер может быть тираном, демоном или чёрствым злодеем, а эпоха, которая только что закончилась, может быть эпохой мира, спокойствия и справедливости.
Новый лидер сотрясает устои мира вашей кампании и в выбранном регионе начинается новая эпоха. Как этот человек или эта эпоха влияют на мир? Вот несколько вещей для рассмотрения при определении влияния лидера на мир:
* Назовите одну вещь, которая была неизменной правдой о мире, и которая в настоящее время уже не является таковой ввиду восхождения нового лидера или его влияния. Это самое большое изменение, которое происходит, когда новый лидер приходит к власти и становится основным лицом, определяющим эпоху.
* Назовите личность (или группу таковых), чья смерть, поражение или пропажа открыла новому лидеру двери во власть. Это может быть военное поражение, свержение старых идеалов, культурное возрождение или что-то ещё. Кто умер, пропал, или проиграл? С чем они не были готовы пойти на компромисс? Был ли новый лидер замешан в смерти, поражении, пропаже, или он просто оказался в нужном месте в нужное время?
* Несмотря на все достоинства лидера, он имеет один недостаток, который возмущает определённую часть населения. Что это за недостаток? Какой человек или группа лиц сделают всё возможное, чтобы свергнуть его из-за этого? Наоборот, какое выдающееся достоинство этого лидера, и кто встанет на его защиту из-за этого?
* Кто сейчас верит в лидера, но все ещё немного сомневается в нём? Это кто-то приближенный к лидеру, кто заслужил его доверие и знает его тайные страхи, сомнения, или пороки.
//''Падение лидера, конец эпохи.''// Всё, что имеет начало, имеет и конец. С уходом королей и королев, карты мира перерисовываются. Законы меняются, новые обычаи входят в моду, а старые забываются. Отношение граждан к их прошлому лидеру поначалу не сильно меняется, но со временем, когда они оглядываются назад или вспоминают о старых временах, оно начинает меняться сильнее.
Падший лидер, возможно, был доброжелательным правителем, влиятельным гражданином, или даже противником персонажей. Как смерть этого человека повлияла на тех, кто ранее был под его влиянием? Вот несколько вещей, которые надо рассмотреть при определении последствий ухода лидера:
* Назовите одно положительное изменение, которое лидер оказал в своей сфере влияния. Осталось ли это изменение после смерти лидера?
* Сформулируйте общее настроение или отношение людей к власти этого человека. Чего важного они не знают об этом человеке, что позже станет известным?
* Назовите человека или группу людей, которая пытается занять место правителя в результате образовавшего вакуума власти.
* Назовите человека или группу людей, участвовавших в заговоре против лидера.
* Назовите три вещи, за которые этого лидера будут помнить.
!!!''3. Катастрофа''
Землетрясение, голод, огонь, чума, наводнение — крупномасштабные катастрофы могут уничтожить целые цивилизации без предупреждения. Природные (или магические) катастрофы перерисовывают карты, уничтожают экономики, и изменяют миры. Иногда они наоборот, дают возможность выжившим построить новый мир из руин. Великий чикагский пожар, например, позволил перестроить город в соответствии с современным планом. Но чаще всего катастрофы оставляют лишь руины — подобно Помпеи, погребённой под пеплом, или затопленной Атлантиде.
Вы можете выбрать катаклизм или определить его случайно, используя следующую таблицу:
{{$:/Катастрофы и бедствия}}
Некоторые из бедствий, возможно, не будут иметь смысла в контексте вашей кампании. Наводнение в пустыне? Извержение вулкана на травянистых равнинах? Если случайно выбранная катастрофа конфликтует с вашим миром, вы можете перебросить, но сначала всё-таки попробуйте оправдать катастрофу в рамках вашего мира, это может привести к неожиданным результатам.
С двумя исключениями, предложенные бедствия напоминают те, что влияют на наш собственный мир. Думайте о планарных искривлениях и вышедшей из-под контроля магии как об ядерных инцидентах; это большие события, которые неестественно изменяют землю и её обитателей. Например, в мире Эберрон, магическая катастрофа оставила руины по всей территории страны, превратив её в опасную пустошь, и покончила с Последней Войной.
Божественный суд — это нечто совсем другое. Эта катастрофа может быть какой угодно, но это всегда большой, жирный, недвусмысленный намёк на то, что бог чем-то недоволен.
Вы можете решить стереть город, область или страну с карты вашего мира. Катастрофа опустошает землю и эффективно уничтожает места, которые персонажи когда-то знали. Оставьте одного или двух выживших, чтобы рассказать персонажам, что случилось и удостовериться в том, что персонажи чувствуют глубину катастрофы. Каковы последствия этого катаклизма? Следующие пункты помогут вам определить характер и последствия катастрофы:
* Решите, что вызвало катаклизм, и где он возник.
* Какие предзнаменования, приметы или признаки предвещали это событие? Подробно их опишите.
* Опишите или назовите существо, которое предупреждало население о надвигающейся катастрофе. Кто-нибудь его послушал?
* Кто те счастливчики (или несчастные), что выжили?
* Опишите, как местность выглядит после катастрофы, и насколько она отличается от того, что было раньше.
!!!''4. Нападение или вторжение''
Это одно из наиболее распространённых глобальных мировых событий. Вторжение происходит, когда одна группа насильно берёт контроль над другой, как правило, это происходит с помощью военной силы, но иногда и путём внедрения или оккупации.
Нападение отличается от вторжения тем, что атакующая сторона не обязательно заинтересована в оккупации или захвате власти. С другой стороны, нападение может стать первым шагом к вторжению.
Вне зависимости от масштаба, влияющее на весь мир нападение или вторжение отличается от остальных событий, потому что оно меняет мир, а его последствия сказываются на персонажах ещё долго после первой атаки или захвата.
Представьте себе, что часть мира вашей кампании подверглась нападению или вторжению. В зависимости от текущего масштаба кампании, площадь может быть малой, как район города, или большой, как континент, мир, или целый план.
Определите агрессора и решите, представляет ли он уже известного врага или же это неизвестный противник. Придумайте угрозу, которая представит опасность для области или используйте следующую таблицу:
{{$:/Вторгающиеся силы}}
Теперь определите эти и другие аспекты конфликта:
* Назовите один элемент вторжения или нападения, который защитники не ожидали или были не в состоянии отразить.
* Что-то случилось с первыми защитниками, которые выступали против вторжения — что-то, о чем никто не хочет говорить. Что это было?
* Нападавшие имели мотив действий, который был неочевидным или непонятным поначалу. Что это был за мотив?
* Кто стал предателем, и в какой момент? Зачем они это сделали? Нападающие пытались остановить вторжение, или же известный защитник встал на сторону захватчиков?
!!!''5. Восстание, революция, свержение''
Человек или группа людей, недовольные нынешним порядком, свергают доминирующий режим и берут власть в свои руки — или терпят неудачу. Независимо от результата, революция (даже её попытка) может формировать судьбу наций.
Революция не обязательно стягивает простой народ против дворянства. Революция может быть малой, когда гильдия купцов выступает против храма, свергая его святейшество в пользу новой веры. Духи леса могут попытаться свергнуть силы цивилизации в соседнем городе, который вырубает деревья. С другой стороны, масштаб революции может быть очень впечатляющим, например, когда человечество поднимается, чтобы свергнуть богов.
Представьте себе, что в части вашего мира вспыхивает революция. Выберите правящую группу в мире вашей кампании и назовите (или придумайте) группу, которая выступает против них, разжигая революцию. Далее, с помощью следующих пунктов, создайте конфликт:
* Назовите три цели, которые повстанцы хотят или надеются достичь.
* Повстанцы добьются победы над теми, кого они хотели бы свергнуть, даже если это будет пиррова (равносильная поражению) победа Каких из трёх целей они добьются? Как долго это достижение может продлиться?
* Назовите цену, взысканную со старого порядка после его отстранения от власти. Кто-нибудь из старого аппарата власти останется при своей должности в новом правительстве? Если старая команда всё-таки останется у власти, опишите, как её лидеры накажут революционеров.
* Один из известных лидеров бунтовщиков, можно сказать, лицо революции, участвовал в мероприятиях по личным причинам. Опишите его и укажите истинную причину, по которой он вёл восстание.
* Какие проблемы, существовавшие до революции, остаются нерешёнными до сих пор?
!!!''6. Вымирание или истощение''
Что-то, что существовало ранее в мире, теперь закончилось. Исчерпанным ресурсом может быть драгоценный металл, вид растения или животного, которое занимало важное место в местной экосистеме, целая раса или культура людей. Его отсутствие приводит к цепной реакции, влияющей на всех существ, которые полагались на него.
Вы можете устранить народ, место, или вещь, которые ранее существовали в определённом месте или области. В небольшом масштабе это может быть смерть кого-то последнего из династии или когда-то процветающий шахтёрский городок может истощиться и стать городом-призраком. В большом масштабе, может исчезнуть магия, последний дракон может быть убит, а может, последняя благородная фея отходит в мир иной.
Что из существовавшего ранее в мире или регионе теперь исчезло? Если не получается дать быстрый ответ, обратитесь к следующей таблице:
{{$:/Вымирание или истощение}}
Далее, ответьте на эти дополнительные вопросы:
* Назовите территорию, расы или вид существ, которые полагались на то, что было потеряно. Как они это компенсируют? Как они пытаются заменить то, что было потеряно?
* Кто или что виновато в потере?
* Опишите прямые следствия потери. Спрогнозируйте, как последствия повлияли на мир в долгосрочной перспективе. Кто или что страдает больше всего в результате потери? Кому или чему эта потеря приносит больше всего пользы?
!!!''7. Новая организация''
Основатели нового ордена, королевства, религии, общества, клики, или культа могут потрясти мир своими действиями, доктриной, догмами и политикой. На местном уровне новая организация может соперничать с существующими властными группами, влияя, подрывая, доминируя или объединяясь с ними, чтобы создать более сильную структуру власти. Большие и мощные организации могут оказывать достаточное влияние, чтобы править миром. Некоторые новые организации приносят пользу другим, а другие со временем угрожают цивилизации, которую они когда-то защищали.
Возможно, где-то в вашем мире возникает новая организация. Поначалу она может быть скромной и безобидной, но одно можно сказать наверняка: если она продолжит развиваться тем же курсом, то ей суждено изменить мир. Иногда мировоззрение организации очевидно с самого начала, но нельзя судить о его морали однозначно, пока её доктрина, политика и традиции не станут ясными. Придумайте тип организации, или используйте следующую таблицу:
{{$:/Новые организации}}
Далее, рассмотрите некоторые или все из следующих вариантов:
* Новый орден вытесняет текущую властную группировку, захватывая территорию, обращая в свою веру или поощряя чужих перебежчиков и уменьшая численность предыдущей правящей группы. Кого или что новый орден вытесняет своим появлением?
* Новый орден обращается к конкретной аудитории. Решите, привлекает ли он определённую расу, социальный класс, или класс персонажей.
* Лидер нового ордена известен за определённые качества, которые ценят его последователи. Придумайте, почему они уважают его за эти качества, и что этот лидер сделал, чтобы получить поддержку последователей.
* Конкурирующая группа выступает против появления новой организации. Выберите существующую властную организацию, которая будет противостоять новой организации. Решите, почему они выступают против новой группы, кто их лидер, и что они намереваются сделать, чтобы остановить конкурентов.
!!!''8. Открытие, экспансия, изобретение''
Открытие новых земель расширяет карту и меняет границы империй. Открытие новой магии или технологии расширяет границы возможного. Новые ресурсы или археологические находки открывают новые возможности, а также заставляют старателей и властные объединения шевелиться, чтобы захватить над ними контроль.
Новое открытие (или повторное открытие) может значимым образом повлиять на мир вашей кампании, формируя ход истории и события эпохи. Лучше рассматривать такие открытия как основу для создания приключений. Они открывают хорошие возможности для создания уникального чудовища, предмета, бога, плана или расы в вашем мире. Открытия не обязательно должны быть полностью оригинальными, просто подстраивайте их под свою кампанию.
Открытие особенно впечатляет, когда его совершают сами искатели приключений в вашей кампании. Если они обнаруживают новый минерал с магическими свойствами, карту новых земель, которые отлично подходят для колонизации, или древнее оружие, способное принести разрушения в ваш мир, они, скорее всего, запустят важные процессы в игре. Это даёт игрокам понять, насколько их действия оказывают влияние на ваш мир.
Придумайте тип совершённого открытия или используйте следующую таблицу:
{{$:/Открытия}}
После того как вы выбрали тип открытия, доработайте его — определите, что это такое, кто первооткрыватель, и какое значение открытие имеет для мира. В идеале предыдущие приключения в вашей кампании должны помочь вам заполнить пробелы, но на всякий случай имейте в виду следующее:
* Это открытие полезно конкретному человеку, группе или фракции больше чем остальным. Кому оно полезно больше остальных? Назовите три преимущества, которые они получают от этого открытия.
* Это открытие напрямую вредит другому человеку, группе или фракции. Кому оно вредит больше всего?
* Это открытие имеет последствия. Назовите три последствия или побочных эффекта. Кто игнорирует последствия?
* Назовите две-три личности или группы, сражающиеся за обладание или контроль над открытием. Кто из них, вероятней всего, победит? Что они получат, и что они готовы сделать, чтобы контролировать открытие?
!!!''9. Предсказание, предзнаменование, пророчество''
Иногда предсказание глобального мирового катаклизма становится глобальным мировым катаклизмом — например, предзнаменование, предсказывающее падение империй, гибель рас, и конец мира. Иногда приметы указывают на благие изменения, такие как приход легендарного героя или спасителя. Но самые драматические пророчества предупреждают о будущих трагедиях и предсказывают тёмные века. В таких событиях, в отличие от других потрясающих мир событий, развязка не происходит мгновенно. Обычно, отдельные лица или группировки стремятся создать все условия для выполнения или предотвращения пророчества. Такие сторонники и противники пророчества своими действиями создают идеи для приключений. Пророчество должно предсказывать событие с большим размахом — такому событию необходимо время, чтобы случиться (или чтобы его предотвратили).
Представьте, что сотрясающее мир пророчество наступает. Если события продолжат развиваться в подобном русле, пророчество сбудется, и в результате мир резко изменится. Не стесняйтесь сделать это пророчество значительным и тревожным, и имейте в виду следующие моменты:
* Создавайте пророчество, которое предвещает серьёзные изменения в мире кампании. Вы можете придумать его с нуля, используя идеи из текущей кампании, или случайно выбрать событие и конкретизировать детали.
* Напишите список из трёх или более предзнаменований, которые произойдут прежде чем пророчество сбудется. Вы можете использовать в качестве предзнаменований те события, которые уже произошли в кампании; таким образом, пророчество станет ближе исполнению.
* Опишите человека или существо, которое обнаружило пророчество, и как оно было найдено. Что это существо получило от того, что открыло пророчество? Что оно потеряло или чем пожертвовало ради этого?
* Опишите персону или фракцию, которая поддерживает пророчество и обеспечивает его исполнение, и тех, кто сделает всё возможное, чтобы предотвратить его. Какие первые шаги они предпринимают? Кто страдает от их действий?
* Одна часть пророчества оказывается ложной. Вы всегда можете сделать какое-то предзнаменование или предсказанное событие выдумкой. Хороший, но не всегда возможный, трюк — сделать предзнаменование неправдой, а его противоположность правдой. Таким образом, отзерка-ленные события будут служить предтечей для исполнения пророчества.
!!!''10. Мифы и легенды''
Если войны, чума, открытия и т. п. можно назвать обычными потрясающими мир событиями, то мифические события таковыми назвать нельзя. Мифическое событие может произойти как исполнение древнего или давно забытого пророчества, или оно может быть актом божественного вмешатель-
Ваша нынешняя кампания, скорее всего, предоставляет вам несколько возможностей чтобы создать подобное событие. Но если вам всё-таки нужно вдохновение, бросьте к8 (вместо к10) и сверьтесь с таблицей «потрясающие весь мир события». Прочтите указания для этого пункта списка, но усильте результат до величайшего масштаба, который вы сможете себе представить.
Восхождение или падение лидера/эпохи станут смертью или рождением бога, концом эпохи или концом света. Катастрофа станет мировым потопом, ледниковым периодом, или зомби-апокалипсисом. Нападение или вторжение станет мировой войной, охватывающим весь мир вторжением демонов, пробуждением угрожающего всему миру чудовища, или финальной битвой между добром и злом. Восстание свергнет бога или богов, или приведёт новую силу (например, демонического повелителя) к божественности. Новая организация станет мировой империей или пантеоном новых богов. Открытие явит миру апокалиптическое устройство или портал в сверхъестественные измерения, где обитают космические ужасы, сокрушающие миры.
!!__''Отслеживание времени''__
Календарь позволяет записывать ход времени в кампании. Он позволяет заранее планировать критические, потрясающие мир события. Для простого отслеживания времени используйте обычный календарь на текущий год. Выберите дату, чтобы отметить начало кампании, и следите за тем, сколько дней искатели приключений потратили на путешествия и прочие мероприятия. Календарь расскажет вам, когда сменяется время года или лунный цикл. Более того, вы можете использовать свой календарь, чтобы отслеживать важные фестивали и праздники, а также ключевые события.
Этот метод является хорошей отправной точкой, но календарь вашего мира не обязательно должен походить на современный календарь. Если вы хотите наполнить свой календарь деталями, присущими только вашему миру, взгляните на эти следующие виды особенностей.
!!!''Основы''
Календарь фэнтезийного мира не обязательно должен быть копией современного календаря (смотрите врезку «календарь Харптоса» для примера). Имеют ли недели свои особые названия? А как насчёт названий для конкретных дней каждого месяца, таких как иды, ноны, и календы из римского календаря?
!!!''Физические циклы''
Определите, когда оканчиваются времена года. Соответствуют ли месяцы фазам луны (или лун)? Происходят ли в это время странные и магические эффекты?
!!!''Религиозные обряды''
Распределите святые дни по всему календарю. Каждый значимый бог в мире должен иметь по крайней мере один собственный священный день в году; священные дни некоторых богов соответствуют небесным явлениям, таким как новолуние или равноденствие. Священные дни отражают специализацию божества (богу сельского хозяйства поклоняются в сезон сбора урожая) или важные события в истории поклонения божеству, такие как рождение или смерть святого человека, дата проявления бога, вступление в должность нынешнего первосвященника, и так далее.
Некоторые священные дни — это муниципальные праздниками, с которыми знаком любой гражданин города, где есть храм. Фестивали урожая часто празднуются на широкую ногу. Другие священные дни важны для людей, которые поклоняются только одному божеству. Третьи соблюдаются священниками, которые выполняют частные обряды и жертвоприношения в храмах в определённые дни или в определённое время суток. А некоторые дни священны только в определённых местах, и отмечаются верующими конкретного храма.
Подумайте о том, как священники и простые люди отмечают праздники. Поход в храм, сидение на скамейке и выслушивание проповеди чуждо большинству фэнтези религий. Здесь празднующие приносят жертвы своим богам. Верующие приносят животных в храм на убой или урны с ладаном как подношение. Самые богатые граждане приносят больших животных, чтобы выставить напоказ своё богатство и продемонстрировать свою набожность. Далее, люди выливают вино на могилы своих предков. Они проводят всю ночь, дежуря у алтарей, или наслаждаются великолепным застольем, празднуя щедрость божества.
!!!''Гражданские праздники''
Священные дни занимают большую часть праздничных дней календаря, на оставшиеся дни приходятся местные или национальные фестивали. День рождения монарха, годовщина великой победы в войне, фестивали ремёсел, базарные дни, и другие подобные мероприятия все ещё служат предлогом для местных празднований.
!!!''Фантастические события''
Так как ваш мир является фантастическим, а не обыденным средневековым обществом, добавьте в него несколько событий явно магического характера. Например, призрачный замок появляется на определённом холме каждый год в день зимнего солнцестояния, или каждое третье полнолуние наполняет оборотней особенно сильной жаждой крови. Кроме того, тринадцатая ночь каждого месяца может вызывать призраки давно забытого племени кочевников.
Экстраординарные события, такие как появление кометы или лунное затмение, представляют собой отличное дополнение для приключения, к тому же, вы можете расставить их в своём календаре где захотите. Ваш календарь подскажет вам подходящий день для лунного затмения, но вы всегда можете подстроить дату для конкретного эффекта.
!!__''Завершение кампании''__
Завершение кампании должно расставить все точки над «i», но вам не обязательно вести кампанию до 20 уровня персонажей, чтобы она стала удовлетворительной. Заканчивайте кампанию, когда ваша история достигнет логического финала.
Убедитесь, что вы оставили место и время для персонажей, чтобы они выполнили свои личные цели до окончания кампании. Их собственные истории должны закончиться удовлетворительным образом, так же, как и сюжетная линия. В идеале некоторые из личных целей персонажей должны быть выполнены вместе с финальной целью кампании. Дайте персонажам с невыполненными целями шанс закончить их до финала игры.
После того как кампания закончилась, может начаться новая. Если вы собираетесь запускать новую кампанию для той же группы игроков, то используйте предыдущие действия персонажей как основу для легенд, которые послужат отличной базой для нового мира. Позвольте новым персонажам испытать, как изменился мир из-за действий их старых персонажей. Однако, новая кампания — это всё-таки новая история с новыми героями. Оставьте старые подвиги героям минувших дней, ведь у новых впереди новые приключения и свершения.
<<<
Календарь Харптоса
Мир Забытых Королевств использует Календарь Харптоса. названный в честь давно умершего волшебника, который изобрёл его. Каждый год состоит из 365 дней и разделён на двенадцать месяцев по тридцать дней в каждом, что примерно соответствует месяцам в григорианском календаре из реального мира. Каждый месяц делится на три декады. На каждое межсезонье приходится специальный праздник. Ещё один специальный праздник, Щитовой Сход, добавляется каждые четыре года после Солнцеворота, что похоже на дополнительный день в високосном году в современном григорианском календаре.
{{$:/Календарь Харптоса}}
<<<
Совершаете ли вы удар оружием, стреляете ли из лука или совершаете бросок атаки частью заклинания, атака совершается довольно просто.
# ''Выберите цель.'' Выберите цель в пределах досягаемости атаки: существо, предмет или место.
# ''Определите модификаторы.'' Мастер определяет, есть ли у цели укрытие, и есть ли у вас преимущество или помеха к броскам атаки по ней. Кроме того, заклинания, особые умения и прочие эффекты могут накладывать бонусы и штрафы к вашему броску атаки.
# ''Определите последствия атаки.'' Вы совершаете бросок атаки. При попадании вы совершаете бросок урона, если только атака не подчиняется другим правилам. Некоторые атаки создают особые эффекты в добавление к урону или вместо него.
Если возникнет вопрос, является ли то, что вы делаете, атакой, ответ будет простым: если вы совершаете бросок атаки, вы совершаете атаку.
!!!__''Броски атаки''__
Если вы совершаете атаку, бросок атаки определяет, попала атака или промахнулась. Для совершения броска атаки бросьте к20 и добавьте уместные модификаторы. Если сумма результата броска и модификаторов не меньше Класса Доспеха (КД) цели, атака попадает. КД персонажа определяется при создании персонажа, а КД чудовищ указан в их блоке статистики.
!!!''Модификаторы броска''
"""Когда персонаж совершает бросок атаки, из модификаторов чаще всего используются модификатор характеристики и бонус мастерства. Если бросок атаки совершает чудовище, оно использует модификатор, указанный в блоке статистики.
Модификатор характеристики. Для атак рукопашным оружием используется модификатор Силы, а для атак дальнобойным оружием используется модификатор Ловкости. Оружие со свойствами «метательное» или «фехтовальное» не подчиняются этому правилу.
Некоторые заклинания тоже требуют совершения броска атаки. Характеристика, модификатор которой используется при этом, называется базовой характеристикой заклинателя. Подробности смотрите в [[главе 10|Глава 10: Использование заклинаний]].
Бонус мастерства. Вы добавляете бонус мастерства к броскам атаки, когда совершаете атаку оружием, которым владеете, а также когда атакуете заклинанием."""
!!!''Выпадение «1» или «20»''
"""Судьба может улыбнуться вам, а может отвернуться от вас; иногда новобранцы совершают удачные атаки, а ветераны могут промахиваться.
Если при броске к20 для броска атаки выпало «20», атака попадает вне зависимости от всех модификаторов и КД цели. Кроме того, атака считается критическим попаданием, что будет объяснено ниже.
Если при броске к20 для броска атаки выпало «1», атака промахивается вне зависимости от всех модификаторов и КД цели."""
!!!__''Невидимые атакующие и цели''__
"""Участники сражения часто пытаются избежать внимания врагов, прячась, накладывая заклинания и скрываясь в темноте.
Если вы атакуете цель, которую не видите, бросок атаки совершается с помехой. Это справедливо и в случае, если вы не знаете местонахождение цели, и в случае, если вы слышите цель, но не видите её. Если цели не было в том месте, которое вы атаковали, вы автоматически промахиваетесь, но Мастер обычно просто говорит, что атака промахнулась, не сообщая, что цель была вообще в другом месте.
Если существо вас не видит, вы совершаете по нему броски атаки с преимуществом.
Если вы скрылись (вас не видно и не слышно), то при совершении атаки вы выдаёте своё местоположение, когда атака попадает или промахивается."""
!!!__''Дальнобойные атаки''__
Если вы совершаете дальнобойную атаку, вы стреляете из лука или арбалета, кидаете ручной топор или другой снаряд во врага с расстояния. Чудовища могут метать шипы из хвоста. Многие заклинания тоже включают в себя совершение дальнобойной атаки.
!!!''Дистанция''
"""Дальнобойные атаки можно совершать только по целям, находящимся в пределах определённой дистанции.
Если у дальнобойной атаки, например, заклинанием, указана только одна дистанция, вы не можете атаковать цели, находящиеся за пределами этой дистанции.
У некоторых дальнобойных атак, например, у совершаемых из лука, указаны две дистанции. Меньшее число это нормальная дистанция, а большее — максимальная дистанция. Бросок атаки совершается с помехой, если цель за пределами нормальной дистанции, и вы не можете атаковать цель, находящуюся за пределами максимальной дистанции."""
!!!''Дальнобойные атаки в ближнем бою''
Дальнобойной атакой трудно прицелиться, если непосредственно перед вами стоит враг. Если вы совершаете дальнобойную атаку оружием, заклинанием или каким-то другим средством, бросок атаки совершается с помехой, если вы находитесь в пределах 5 футов от враждебного не недееспособного существа.
!!!''__Рукопашные атаки__''
"""Используемые в близком бою рукопашные атаки позволяют атаковать врага, находящегося в пределах вашей досягаемости. Обычно рукопашная атака совершается зажатым в руке оружием, таким как меч, боевой молот или топор. Чудовища совершают рукопашные атаки когтями, рогами, клыками, щупальцами и другими частями тела. Некоторые заклинания тоже включают в себя совершение рукопашной атаки.
У большинства существ 5-футовая ''досягаемость'', и потому при совершении рукопашной атаки они могут атаковать цели, находящиеся в пределах 5 футов от них. Некоторые существа (обычно с размером больше Среднего) обладают рукопашными атаками с досягаемостью больше 5 футов, что указано в их описании.
При совершении рукопашной атаки оружием вы можете использовать ''безоружный удар'': пнуть, ударить кулаком, головой или другой аналогичный удар (ничто из этого не считается оружием). При попадании безоружный удар причиняет дробящий урон 1 + ваш модификатор Силы. Вы считаетесь владеющим безоружными атаками."""
!!!''Провоцированные атаки''
"""В бою все постоянно ждут, когда враг ослабит бдительность. Не получится спокойно ходить рядом с врагами, так как это провоцирует их на совершение атак.
Вы можете совершить провоцированную атаку, если враждебное существо, которое вы видите, покидает вашу досягаемость. Для этого вы реакцией совершаете одну рукопашную атаку по спровоцировавшему существу. Эта атака прерывает перемещение спровоцировавшего существа, происходя как раз перед тем, как оно покинет пределы вашей досягаемости.
Вы можете избежать провоцированной атаки, совершив действие Отход. Вы также не провоцируете атаки, если телепортируетесь, или кто-то (что-то) перемещает вас, не тратя ваше перемещение, действие и реакцию. Например, вы не провоцируете атаку, если взрыв выбросил вас из пределов досягаемости врага или сила тяжести заставила упасть мимо врага, стоящего на возвышении."""
!!!''Сражение с двумя оружиями''
Если вы совершаете действие Атака и атакуете рукопашным оружием со свойством «лёгкое», удерживаемым в одной руке, вы можете бонусным действием атаковать другим рукопашным оружием со свойством «лёгкое», удерживаемым в другой руке. Вы не добавляете модификатор характеристики к урону от бонусной атаки, если он положительный.
Если у любого из оружий есть свойство «метательное», вы можете не совершать им рукопашную атаку, а метнуть его.
<<<
!!!''Состязания в бою''
В сражениях часто приходится противопоставлять свою доблесть отваге врага. Это отыгрывается в виде состязаний. В этом разделе описаны самые распространённые состязания, требующие в бою совершения действий: захват и толкание существ. Мастер может использовать механику этих действий для моделирования импровизированных действий.
<<<
!!!''Захват''
"""Если вы хотите схватить существо или побороться с ним, вы можете использовать действие Атака для совершения особой рукопашной атаки, захвата. Если вы можете совершать многочисленные атаки действием Атака, эта атака заменяет одну из них.
Цель вашего захвата должна быть не более чем на одну категорию больше вас, и она должна находиться в пределах вашей досягаемости. Используя как минимум одну свободную руку, вы пытаетесь схватить цель, совершая проверку захвата: проверку Силы (Атлетика), противопоставленную проверке Силы (Атлетика) или Ловкости (Акробатика) цели (цель сама выбирает, какую характеристику использовать). Если вы преуспеете, цель становится захваченной (смотрите приложение А). В описании состояния сказано, что его оканчивает, и вы в любой момент можете отпустить цель (действие не требуется).
Высвобождение из захвата. Захваченное существо может пытаться высвободиться. Для этого оно действием совершает проверку Силы (Атлетика) или Ловкость (Акробатика), противопоставленную вашей проверке Силы (Атлетика).
Перемещение захваченного существа. Если вы перемещаетесь, вы можете тащить или нести захваченное существо вместе с собой, но ваша скорость уменьшается вдвое, если только существо не меньше вас как минимум на две категории."""
!!!''Толкание существа''
"""Вы можете при помощи действия Атака совершить особую рукопашную атаку, чтобы или сбить его с ног, или оттолкнуть от себя. Если вы можете совершать многочисленные атаки действием Атака, эта атака заменяет одну из них.
Цель вашего толкания должна быть не более чем на одну категорию больше вас, и она должна находиться в пределах вашей досягаемости. Вы совершаете проверку Силы (Атлетика), противопоставленную проверке Силы (Атлетика) или Ловкости (Акробатика) цели (цель сама выбирает, какую характеристику использовать). Если вы преуспеете, вы либо сбиваете цель с ног, либо толкаете её на 5 футов от себя."""
!!!''__Совершенство__''
На 20 уровне, если при броске инициативы у вас нет очков ци, вы получаете 4 таких очка.
!!''__Создание Барда__''
Барды процветают за счет историй, не важно, правдивы они или нет. Ваша предыстория и мотивы не так важны, как истории, что ваш персонаж рассказывает о себе. Возможно, у вас было безопасное и ничем не примечательное детство. В нём нет хороших историй, чтобы поведать о них, но вы можете изобразить себя сиротой, воспитанным ведьмой на зловещем болоте. Или ваше детство действительно может быть достойным истории. Некоторые барды приобретают свою волшебную музыку необычайными способами, в том числе под влиянием фей или других сверхъестественных существ.
Были ли вы учеником у мастера, следуя за более опытным бардом, пока не начали следовать своему собственному пути? Или посещали коллегию, где вы обучались знаниям бардов и практиковали свою музыкальную магию? Может быть, вы в молодости сбежали из дома, или став сиротой подружились с бродячим бардом, который стал вашим наставником. Или вы могли быть избалованным знатным ребенком, обученным мастером. Может быть, вы попали в лапы ведьмы, совершив сделку, посулившую вам музыкальный дар вдобавок к вашей жизни и свободе, но какой ценой?
{{Быстрое создание (Бард)}}
{{Классовые умения (Бард)}}
{{Начальное снаряжение (Бард)}}
{{Использование заклинаний (Бард)}}
{{Вдохновение барда (Бард)}}
{{Мастер на все руки (Бард)}}
{{Песнь отдыха (Бард)}}
{{Коллегия бардов (Умение) (Бард)}}
{{Компетентность (Бард)}}
{{Увеличение характеристик}}
{{Источник вдохновения (Бард)}}
{{Контрочарование (Бард)}}
{{Тайны магии (Бард)}}
{{Превосходное вдохновение (Бард)}}
{{Коллегии бардов (Бард)}}
!!__''Создание варвара''__
Когда вы создаёте персонажа варвара, подумайте о том, откуда ваш персонаж прибыл, и о том, какое место в мире он занимает. Поговорите с вашим Мастером о подходящем происхождении вашего варвара. Пришли ли вы из далёких земель, став чужаком на новой территории? Или кампания происходит в жестоких землях, где варвары являются обычным делом?
Что заставило вас вести жизнь искателя приключений? Вы соблазнились переселением на новые земли обещаниями богатства? Вы присоединились к солдатам этих земель перед лицом общей угрозы? Может, чудовища или вторжение орды изгнали вас из вашей родины, сделав безродным беженцем? Может быть, вы были пленником на войне, приведённым в цепях в «цивилизованные» земли и только там завоевавшим свою свободу? Или, возможно, вы были изгнаны своим народом из-за совершённого вами преступления, нарушения табу, или в результате переворота, после которого вы были свергнуты со своего места у власти.
{{Быстрое создание (Варвар)}}
{{Классовые умения (Варвар)}}
{{Начальное снаряжение (Варвар)}}
{{Защита без доспехов (Варвар)}}
{{Ярость (Варвар)}}
{{Безрассудная атака (Варвар)}}
{{Чувство опасности (Варвар)}}
{{Путь дикости (Умение) (Варвар)}}
{{Увеличение характеристик}}
{{Быстрое передвижение (Варвар)}}
{{Дополнительная атака}}
{{Дикий инстинкт (Варвар)}}
{{Сильный критический удар (Варвар)}}
{{Непреклонная ярость (Варвар)}}
{{Непрерывная ярость (Варвар)}}
{{Неукротимая мощь (Варвар)}}
{{Дикий чемпион (Варвар)}}
{{Пути дикости (Варвар)}}
!!__''Создание воина''__
Когда вы создаёте своего воина, продумайте два связанных элемента предыстории своего персонажа: где вы получили боевую подготовку, и что отличало вас от обычных воителей, окружавших вас? Были ли вы особенно безжалостным? Получали ли вы особую помощь от наставника, возможно, из-за вашей исключительной преданности? Что в первую очередь побудило вас к этой подготовке, угроза, нависшая над вашей родиной, жажда мести, необходимость доказать себе, или все эти факторы вместе?
Вы могли пройти официальную подготовку в армии дворянина или в местном ополчении. Возможно, вы тренировались в военной академии, изучая стратегию, тактику и военную историю. Или же вы можете быть самоучкой, несовершенным, но проверенным бойцом. Взялись ли вы за меч, чтобы сбежать от жизни на ферме, или следуете гордой фамильной традиции? Где вы приобрели своё оружие и доспехи? Они могут быть военным наследием или семейными реликвиями, или, возможно, вы экономили годами, чтобы купить их. Ваше вооружение теперь самое важное ваше имущество, это единственное, что стоит межу вами и смертью.
{{Быстрое создание (Воин)}}
{{Классовые умения (Воин)}}
{{Начальное снаряжение (Воин)}}
{{Боевой стиль (Воин)}}
{{Второе дыхание (Воин)}}
{{Всплеск действий (Воин)}}
{{Воинский архетип (Умение) (Воин)}}
{{Увеличение характеристик (Воин)}}
{{Дополнительная атака (Воин)}}
{{Упорный (Воин)}}
{{Воинские архетипы (Воин)}}
!!''__Создание волшебника__''
При создании персонажа волшебника в его истории обязательно должно быть некое выдающееся событие. Как ваш персонаж впервые встретился с магией? Как он открыл свою предрасположенность к ней? Владелец ли он природного таланта или же достиг всего усердной учёбой и постоянной практикой? Или же произошла неожиданная встреча с магическим существом или древней книгой, что могли обучить его основам магического искусства?
Что привлекло вас к жизни в обучении? Сподвиг ли вас на большее вкус первого обретённого магического знания? Постигли ли вы слова тайного хранилища знаний, ещё не разграбленного другими волшебниками? Возможно, вы просто желаете противопоставить обретённые магические навыки опасностям для проверки своих сил.
{{Быстрое создание (Волшебник)}}
{{Классовые умения (Волшебник)}}
{{Начальное снаряжение (Волшебник)}}
{{Использование заклинаний (Волшебник)}}
{{Магическое восстановление (Волшебник)}}
{{Магические традиции (Умение) (Волшебник)}}
{{Увеличение характеристик}}
{{Мастерство заклинателя (Волшебник)}}
{{Фирменное заклинание (Волшебник)}}
{{Магические традиции (Волшебник)}}
!!''__Создание друида__''
Создавая персонажа друида, подумайте о том, что сформировало его тесную связь с природой. Возможно, он родом из мест, где жива Старая Вера. Или же его, брошенного ребёнком в чаще леса, нашёл и вырастил друид. Возможно, персонаж испытал волнующий опыт встречи с духом природы — скажем, пережил нападение гигантского орла или лютого волка. Может, персонаж родился в разгар бури или во время извержения вулкана, что стало знаком уготованного ему пути друида.
Всегда ли он был странствующим друидом или же когда-то охранял рощу или ручей? Возможно, зло отравило его родину, и он отправился в большой мир в поисках нового смысла и надежды.
<<Button "Друиды и боги (Друид)" "Друиды и боги">>
<<Button "Священные растения (Друид)" "Священные растения друидов">>
{{Быстрое создание (Друид)}}
{{Классовые умения (Друид)}}
{{Начальное снаряжение (Друид)}}
{{Друидический язык (Друид)}}
{{Использование заклинаний (Друид)}}
{{Дикий облик (Друид)}}
{{Круг Друидов (Умение) (Друид)}}
{{Увеличение характеристик}}
{{Безвременное тело (Друид)}}
{{Заклинания зверя (Друид)}}
{{Архидруид (Друид)}}
{{Круги друидов (Друид)}}
!!''__Создание жреца__''
Если вы создаёте жреца, важно определить, какому божеству вы служите, и какие принципы воплощает ваш персонаж. Приложение Б включает список множества богов мультивселенной. Посоветуйтесь с Мастером, чтобы узнать, какие божества есть в вашей кампании.
Как только вы выбрали божество, определитесь с отношением вашего жреца с этим богом. Стали ли вы его служителем добровольно? Или бог сам выбрал вас, принуждая к служению и не считаясь с вашими пожеланиями? Как священники в храмах вашей веры воспринимают вас: как героя или нарушителя порядка? Каковы ваши конечные цели? Есть ли у вашего божества специальное поручение для вас? Или вы стремитесь доказать себе, что вы достойны великих достижений?
{{Быстрое создание (Жрец)}}
{{Классовые умения (Жрец)}}
{{Начальное снаряжение (Жрец)}}
{{Использование заклинаний (Жрец)}}
{{Божественный домен (Умение) (Жрец)}}
{{Божественный канал (Жрец)}}
{{Увеличение характеристик}}
{{Уничтожение нежити (Жрец)}}
{{Божественное вмешательство (Жрец)}}
{{Божественные домены (Жрец)}}
При создании нового заклинания ориентируйтесь на уже существующие. Вот на что следует обратить особое внимание:
* Если заклинание настолько хорошее, что заклинатель его постоянно использует, возможно, оно слишком мощное для своего уровня.
* Большая длительность или большая зона воздействия могут скомпенсировать слабый эффект, в зависимости от заклинания.
* Избегайте создавать заклинания с очень ограниченным диапазоном применения, например, работающие только против добрых драконов. Такие заклинания имеют право на существование, но мало кто будет их учить и подготавливать, если только заранее не известно, что они точно пригодятся.
* Убедитесь, что заклинание не выбивается из стилистики класса. Например, обычно у вол шебников и чародеев нет лечащих заклинаний, поэтому лечащее заклинание в списке заклинаний волшебника будет посягательством на область деятельности жреца.
!!__''Урон заклинания''__
Для заклинаний, причиняющих урон, используйте приведённую ниже таблицу, чтобы определить примерный урон, соответствующий их уровню. Таблица предполагает, что заклинания причиняют половину урона при успешном спасброске или промахе. Если заклинание не причиняет урон при успешном спасброске, увеличьте урон на 25 процентов.
Вы можете использовать другие кости урона, при условии, что средний результат будет примерно таким же. Так заклинания получатся разными. Например, вы можете изменить урон заговора с 1к10 (в среднем 5,5) на 2к4 (в среднем 5), уменьшив максимальный урон и сделав более вероятным получение среднего результата.
!!!!''Урон заклинания''
<table>
<tr>
<th>Уровень заклинания</th>
<th>Одна цель</th>
<th>Многочисленные цели</th>
</tr>
<tr>
<td>Заговор</td>
<td>1к10</td>
<td>1к6</td>
</tr>
<tr>
<td>1</td>
<td>2К10</td>
<td>2к6</td>
</tr>
<tr>
<td>2</td>
<td>3к10</td>
<td>4к6</td>
</tr>
<tr>
<td>3</td>
<td>5к10</td>
<td>6к6</td>
</tr>
<tr>
<td>4</td>
<td>6к10</td>
<td>7к6</td>
</tr>
<tr>
<td>5</td>
<td>8к10</td>
<td>8к6</td>
</tr>
<tr>
<td>6</td>
<td>10к10</td>
<td>11к6</td>
</tr>
<tr>
<td>7</td>
<td>11к10</td>
<td>12к6</td>
</tr>
<tr>
<td>8</td>
<td>12к10</td>
<td>13к6</td>
</tr>
<tr>
<td>9<br></td>
<td>15к10</td>
<td>14к6</td>
</tr>
</table>
!!__''Лечащие заклинания''__
Вы можете использовать таблицу «урон заклинаний» для определения хитов, восстанавливаемых заклинаниями. Заговоры не должны восстанавливать хиты.
Мир, который вы создаёте, это сцена, на которой персонажи игроков — главные актёры Вот и вся истина! Вы можете проводить независимые эпизодические приключения, в которых неизменными будут только персонажи, или вплести общую сюжетную линию в эти приключения, чтобы выстроить большую сагу о достижениях персонажей в мире.
Планирование целой кампании может показаться сложной задачей, но вам не обязательно продумывать каждую деталь с самого начала. Вы можете начать с основ, провести несколько приключений, а уже далее, по ходу игры, обдумывать расширение сюжетных линий. Вы можете добавить столько деталей в игру, сколько пожелаете.
Начало кампании означает начало приключений. Вам нужно быстро перейти к действиям, которых ждут игроки, чтобы сразу захватить их внимание. Дайте игрокам столько информации, чтобы они ждали игры через неделю, желая узнать, что будет дальше.
!!''__Начните с малого__''
Когда вы в первый раз создаёте кампанию, начните с малого. Персонажи должны знать только о городе или деревне, в которых они начинают игру, и, возможно, что-то близлежащем подземелье. Если вы решите, что государство находится в состоянии войны с соседним герцогством, или что дальний лес кишит мизгирями и гигантскими пауками, то следует записать эти вещи. Но в начале игры окрестности — это то, что вам нужно, чтобы дать развитие кампании. Чтобы создать эти окрестности, выполните следующие действия:
!!!''1. Создайте базу для игроков''
Смотрите выше раздел «поселения» для получения руководства по созданию поселения. Неболь шой город или деревня на краю дикой местно сти станут хорошей базой в большинстве кампаний. Используйте большой город если вы проводите кампанию с городскими приключениями.
!!!''2. Создайте окрестности''
Смотрите выше раздел «создание карты для вашей кампании» для получения руководства по созданию карты. Нарисуйте карту в масштабе области (I гекс = 1 миля) с базой недалеко от центра Наполните район в радиусе дня путешествия (25-30 миль) от базы по своему усмотрению. Приправьте двумя-четырьмя подземельями или аналогичными местами для приключения.
В области такого размера кроме базы могут находиться от одного до трёх дополнительных населённых пунктов, так что подумайте и о них тоже.
!!!''3. Составьте начальное приключение''
Одиночное подземелье — это лучшее первое приключение для большинства кампаний. Смотрите главу 3, «создание приключений» для получения справки.
База обеспечивает отправную точку для персонажей. Такой отправной точкой может стать деревня, где они выросли, или город, который привлекает их больше остальных. Или, возможно, они начнут кампанию в подземельях замка злого барона, где они были заперты по различным причинам (законным или не очень).
Для каждого из этих этапов детализируйте локации настолько подробно, насколько они в этом нуждаются. Вам не нужно продумывать каждое здание в деревне или называть каждую улицу в большом городе. Если персонажи начинают в подземелье барона, вам придётся придумывать подробности такого приключения, но это не значит, что вы должны придумывать имена всем рыцарям барона. Набросайте простую карту, подумайте об окружающих местах, и решите, с кем персонажи, скорее всего, станут взаимодействовать в начале кампании. Самое главное, представьте себе, как это место вписывается в историю, которая происходит в вашей кампании. Теперь вы готовы начать работу над своим первым приключением!
!!__''Преподнесите место действия''__
Как только вы начнёте развивать свою кампанию, вам придётся рассказать игрокам о своём мире. Для удобства соберите необходимую информацию в раздаточный материал. Такой раздаточный материал обычно включает в себя следующее:
* Любые ограничения или новые возможности для создания персонажа, такие как новые или запрещённые расы.
* Предыстория кампании, которую персонажи могут знать. Если вы заготовили сценарий или направление для кампании, то эта информация может включать в себя подсказки, намекающие, на что обращать особое внимание.
* Базовая информация о районе, в котором персонажи, начинают, например, название города, важные места в нём и вокруг него, видные персонажи Мастера, о которых они знают, и, возможно, слухи, которые указывают на возможные проблемы.
Старайтесь излагать материал коротко и, по существу. Две страницы текста — это максимум. Даже если у вас сейчас всплеск творческой энергии, позволяющий писать по двадцать страниц отличного справочного материала, попридержите его для будущих приключений. Пусть игроки раскрывают детали постепенно.
!!__''Вовлекайте персонажей''__
После того как вы рассказали, о чём ваша кампания, пусть игроки помогут рассказать историю, решив, какую роль в ней играют их персонажи. Это их шанс связать истории своих персонажей с предысторией мира, и ваша возможность определить, как различные элементы жизни персонажей вписаны в историю кампании. Например, какую тайну узнал персонаж- отшельник? Каков статус семьи знатного персонажа? И какая судьба ждёт народного героя?
У некоторых игроков могут возникнуть проблемы с идеями, ведь не все люди одинаково изобретательны. Вы можете стимулировать их творческий потенциал, задав несколько вопросов об их персонажах:
* Ты местный, родился или вырос в этих местах? Если да, то кто твои родители? Чем ты сейчас занимаешься?
* Ты недавно прибыл в эти места? Откуда ты? Почему ты приехал именно сюда?
* Ты связан с какой-либо организацией или с людьми, которые замешаны в событиях, с которых начинается кампания? Они друзья или враги?
Слушайте идеи игроков, и говорите «да» если можете. Даже если вы хотите, чтобы все персонажи выросли в стартовом городке, рассмотрите возможность добавления недавно приехавшего персонажа, если история игрока достаточно убедительна. Предложите изменения в истории персонажа, чтобы она лучше подходила под ваш мир, или добавьте первые события вашей кампании в эту историю.
!!__''Создавайте предыстории''__
Предыстории нужны, чтобы вплести персонажей в мир, а создание новых предысторий — это отличный способ показать игрокам особенности вашего мира. Предыстории, которые связаны с конкретными культурами, организациями и историческими событиями в вашей кампании особенно ценны. Возможно, священники той или иной религии живут как нищие, и поддерживаются благочестивым населением, распевая сказки о подвигах их божества, чтобы развлечь и просветить верующих. Вы можете создать предысторию нищенствующего священника (или изменить предысторию послушника), чтобы отразить эти качества. Так, он, скорее всего, будет специалистом по игре на музыкальном инструменте, и, вероятно, будет пользоваться гостеприимством верующих.
Руководящие принципы для создания новой предыстории предоставлены в главе 9, «Мастерская ведущего».
Когда вы приступите к созданию мира для своей кампании, вам понадобится карта. Для этого вы можете воспользоваться одним из двух методов создания карты: метод «сверху-вниз» или метод «снизу-вверх». Некоторые Мастера любят начинать сверху, показывая всю картину мира и открывая карту всего континента прямо на старте кампании, чтобы позже увеличить масштаб и показать маленькие участки. Другие Мастера предпочитают идти обратным путём, начиная с маленького клочка земли, который ограничивается провинцией или королевством, а потом уменьшая масштаб по мере того как искатели приключений приводят персонажей на новую территорию.
Какой бы масштаб вы ни выбрали, гексы (шестигранники) отлично подходят для картографирования местности, когда приключение может пойти в любом направлении и подсчёт дистанции может быть важным. Один лист разгексованной бумаги с 2 гексами в одном сантиметре идеален для большинства карт. Используйте масштаб для вашей карты, который лучше подходит для требуемого уровня детализации. Глава 7 предлагает дополнительную информацию о создании карты для дикой местности.
!!__''Масштаб области''__
Для большинства детальных мест в вашем мире используйте областной масштаб, в котором каждый гекс представляет 1 милю. Одна страница в таком масштабе представляет собой местность, которую можно пройти за один день в любом направлении от центра карты, если это не труднопроходимая местность. Масштаб области полезен при создании стартовой точки кампании, (смотрите ниже «создание кампании») или любой локации, где вы планируете отследить передвижение искателей приключений в часах, а не днях.
Земля на локации такого размера будет состоять из широких зон одного преобладающего типа местности, разбавленных небольшими участками местности другого типа.
Населённый регион, созданный в этом масштабе, может иметь один городок и от восьми до двенадцати деревень или хуторов. Более дикие регионы могут иметь только одну сторожевую башню или вообще не иметь поселений. Вы можете также отмечать, сколько земли расчищено под фермерские угодья, которые окружают каждый посёлок или город. На карте областного масштаба это будет выглядеть как пояс в несколько гексов, окружающий каждый городок. Даже маленькие деревни занимают вокруг себя под фермы пахотные земли в пределах мили или двух.
!!__''Масштаб королевства''__
На карте с королевским масштабом каждый гекс представляет 6 миль. Карта с таким масштабом покрывает большой регион, размером с Великобританию или в половину Калифорнии. Это огромная площадь для приключений.
Первый шаг в создании региона с таким масштабом заключается в зарисовке береговых линий и водоёмов в районе. Имеет ли регион выход к берегу моря? Регионы с выходом к морю могут включать в себя острова, а закрытые регионы могут быть с внутренним морем или с крупными озёрами. Или же регион может состоять из одного большого острова, перешейка или полуострова с множественными берегами.
Далее нанесите основные горные хребты. Предгорья создают переходы между горами и низменностями, а широкие участки пологих холмов могут усеивать регион в любом месте.
Такой подход оставляет место на вашей карте для относительно плоской местности: лугов, лесов, болот и т. д. Разместите эти элементы по своему усмотрению.
Разместите русла всех рек, которые текут через территорию. Реки зарождаются в горах или в удалённых от моря местах, в которых выпадает много осадков, после чего впадают в ближайший большой водоём, до которого смогут добраться.
На своём пути к озеру или морю, а также по мере увеличения, реки обрастают притоками.
Наконец, разместите основные города на местности. В этом масштабе вам не нужно думать о маленьких городках и деревнях, или о создании фермерских угодий. Населённый регион этого масштаба может легко иметь от восьми до двенадцати городов.
!!__''Масштаб континента''__
Для создания карты всего континента используйте масштаб, в котором 1 гекс представляет 60 миль. В этом масштабе вы сможете увидеть только границы берегов, самые большие горные хребты, основные реки, огромные озёра и политические границы. Карта в этом масштабе лучше всего показывает, как множественные карты масштаба королевства совмещаются друг с другом.
Тот же метод, который вы используете для создания карты местности в королевском масштабе, работает и для создания карты всего континента. Континент может иметь от восьми до двенадцати больших городов, которые заслуживают места на карте. Скорее всего это основные центры торговли и столицы королевств.
!!__''Комбинирование масштабов''__
С какого бы масштабы вы не начали, всегда можно легко увеличить или уменьшить его. В континентальном масштабе 1 гекс представляет собой такую же площадь как 10 гексов в масштабе королевства. Два города, находящиеся на расстоянии 3 гекса (180 миль) друг от друга на вашей карте континента будут на расстоянии 30 гексов на карте королевства. Эти города могут служить противоположными границами региона, который вы детализируете. Один гекс в масштабе королевства равняется 6 гексам масштаба области, таким образом, вы всегда можете перенести регион в областном масштабе в центр карты королевского масштаба и создать интересные места вокруг него.
!!__''Создание колдуна''__
Когда вы создаёте персонажа колдуна, потратьте немного времени и подумайте о том, каков будет ваш покровитель, и какие обязательства на вас накладывает договор с ним. Что привело вас к заключению договора, и как вы встретились с покровителем? Соблазнил ли вас дьявол, когда вы его вызывали, или же вы искали ритуал, который бы позволил вызвать древнего бога? Искали ли вы покровителя или покровитель сам нашёл и выбрал вас? Раздражают ли вас обязательства, возложенные договором, или же вы радостно служите в ожидании награды?
Посоветуйтесь со своим Мастером, чтобы определить, какую роль будет играть ваш договор во время приключений. Требования вашего покровителя могут втянуть вас в различные приключения, или же это будут небольшие услуги, которые персонаж выполняет между приключениями.
Какие отношения у вас с покровителем? Они дружественные, враждебные, сложные или же романтичные? Насколько важным вы являетесь для своего покровителя? Какую роль играете в его планах? Знаете ли вы других слуг своего покровителя?
Как покровитель общается с вами ? Если у вас есть фамильяр, он может неожиданно заговорить голосом покровителя. Некоторые колдуны находят послания от своих покровителей вырезанными на деревьях, среди листьев чайной заварки или в движении облаков — такие послания может увидеть только сам колдун. Другие колдуны разговаривают со своими покровителями во снах или видениях, или имеют дело только с посредниками.
{{Быстрое создание}}
{{Классовые умения (Колдун)}}
{{Начальное снаряжение (Колдун)}}
{{Потусторонний покровитель (Колдун) (Умение)}}
{{Магия договора (Колдун)}}
{{Таинственные воззвания (Умение) (Колдун)}}
{{Предмет договора (Колдун)}}
{{Увеличение характеристик}}
{{Таинственный арканум (Колдун)}}
{{Таинственный мастер (Колдун)}}
{{Потусторонние покровители (Колдун)}}
{{Таинственные воззвания (Колдун)}}
Магические предметы из 7 главы — лишь малая часть магических сокровищ, которые могут найти персонажи во время приключений. Если у вас очень опытные игроки, и вы хотите их удивить, можете или модифицировать существующий предмет или придумать нечто совершенно новое.
!!__''Модификация предмета''__
Вместо того чтобы изобретать новый предмет, проще изменить уже существующий. Если ваш паладин использует цеп, вы можете изменить святой мститель так, чтобы он стал цепом, а не мечом. Вы можете превратить кольцо тарана в волшебную палочку, а плащ защиты в обруч защиты, и всё это не меняя свойств предмета
Возможны и другие замены. Предмет, причиняющий урон одного вида, может причинять другой вид урона Меч язык пламени может причинять урон электричеством, а не огнём, например. Одни способности могут заменять другие, так что зелье лазания может с лёгкостью стать зельем скрытности
Вы также можете модифицировать предмет, наделяя его свойствами другого предмета Например, вы можете объединить эффекты шлема понимания языков с эффектами шлема телепатии. Это сделает предмет более мощным (и возможно увеличит его редкость), но не сломает вам игру.
Ну и, наконец вспомните инструменты модификации предметов из 7 главы. Дав предмету интересное малое свойство, причудливую особенность или разум, вы значительно измените ощущения от обладания им.
!!__''Создание нового предмета''__
Если модификации предмета вам недостаточно, можете создать нечто абсолютно новое. Магический предмет должен или позволять персонажу делать что-то, что ранее он не мог, или улучшать его возможность делать то, что он и так умел. Например, кольцо прыжков позволяет владельцу прыгать на большие расстояния, то есть улучшает уже имеющееся умение. Кольцо тарана же даёт персонажу возможность причинять урон силовым полем.
Чем проще подход, тем легче персонажу будет использовать предмет в игре. Можно дать предмету заряды, особенно если у него есть несколько разных эффектов, но если решить, что предмет всегда активен или может использоваться определённое число раз в день, использовать его будет проще.
!!!''Уровень силы''
Если вы сделаете предмет, позволяющий персонажу убивать любого, по кому попадёт одна-единственная атака, это наверняка разрушит вашу игру. С другой стороны, предмет, чьё преимущество редко проявляется, не будет достойной наградой.
Используйте приведённую ниже таблицу в качестве руководства, помогающего оценить силу предмета, основываясь на его редкости.
!!!!''Сила магического предмета в зависимости от редкости''
<table>
<tr>
<th>Редкость</th>
<th>Макс. уровень заклинания</th>
<th>Макс. бонус</th>
</tr>
<tr>
<td>Обычный</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>Необычный</td>
<td>3</td>
<td>+1</td>
</tr>
<tr>
<td>Редкий</td>
<td>6</td>
<td>+2</td>
</tr>
<tr>
<td>Очень редкий</td>
<td>8</td>
<td>+3</td>
</tr>
<tr>
<td>Легендарный</td>
<td>9</td>
<td>+4</td>
</tr>
</table>
://''Максимальный уровень заклинания.''// В этой колонке указан максимальный уровень заклинания, эффект которого может предоставлять предмет в форме свойства, доступного один раз в день. Например, предмет с обычной редкостью может предоставлять преимущества заклинания 1 уровня один раз в день (или всего один раз, если он поглощаемый). Редкие, очень редкие и легендарные предметы могут позволять владельцу накладывать заклинания более низкого уровня чаще, чем раз в день.
://''Максимальный бонус.''// Если предмет даёт статичный бонус к КД, броскам атаки, спасброскам или проверкам характеристик, в этой колонке указан максимальный бонус, соответствующий редкости предмета.
!!!''Настройка''
Решите, нужно ли, чтобы персонаж настраивался на предмет, чтобы получить доступ к его свойствам. Используйте следующие рекомендации:
* Если вы не хотите, чтобы члены отряда передавали друг другу предмет и получали от него постоянные преимущества, предмет должен требовать настройку.
* Если предмет даёт бонус, который могут давать и другие предметы, хорошо, если он будет требовать настройку, чтобы персонажи не пытались собрать слишком много таких предметов.
!!''__Создание монаха__''
Когда вы создаёте персонажа монаха, подумайте о своей связи с монастырём, в котором вы получили свои навыки и провели годы становления. Были ли вы сиротой или ребёнком, оставленным на пороге монастыря? Ваши родители отдали вас в монастырь в благодарность за услуги, оказанные монахами? Вы начали этот замкнутый образ жизни, чтобы скрыться от преступлений, что вы совершили? Или вы выбрали монашескую жизнь для себя сами?
Подумайте, почему вы оставили монастырь. Быть может, глава вашего монастыря выбрал вас для особо важной миссии за пределами обители? Возможно, вы были изгнаны, потом что нарушили правила сообщества. Вы уходите с опаской, или были рады уйти? Есть то, что вы надеетесь достичь вне монастыря? Хотите ли вы вернуться домой?
В результате строгой организации жизни монашеской общины и дисциплины, необходимой для использования ци, мировоззрение монахов почти всегда законное.
{{Быстрое создание (Монах)}}
{{Классовые умения (Монах)}}
{{Начальное снаряжение (Монах)}}
{{Защита без доспехов (Монах)}}
{{Боевые искусства (Монах)}}
{{Ци (Монах)}}
{{Движение без доспехов (Монах)}}
{{Монастырская традиция (Монах) (Умение)}}
{{Отражение снарядов (Монах)}}
{{Увеличение характеристик}}
{{Медленное падение (Монах)}}
{{Дополнительная атака}}
{{Ошеломляющий удар (Монах)}}
{{Энергетические удары (Монах)}}
{{Увёртливость (Монах)}}
{{Спокойствие разума (Монах)}}
{{Чистота тела (Монах)}}
{{Язык солнца и луны (Монах)}}
{{Алмазная душа (Монах)}}
{{Безвременное тело (Монах)}}
{{Пустое тело (Монах)}}
{{Совершенство (Монах)}}
{{Монастырские традиции (Монах)}}
Если вас не устраивают опции, представленные в Книге игрока, посмотрите в этом разделе советы по созданию новых расовых и классовых опций, а также предысторий.
!!__''Создание расы или подвида''__
В этом разделе показано, как модифицировать существующие расы, а также создавать новые. Самый важный шаг при этом — создать историю, стоящую за расой или одним из её подвидов. Чёткое представление о месте этой расы в сюжете вашей кампании поможет совершить выбор в процессе создания. Задайте себе несколько вопросов:
*Зачем моей кампании нужно, чтобы этой расой можно было играть?
* Как выглядит эта раса?
* Как описать культуру этой расы?
* Где живут представители этой расы?
* Есть ли интересные конфликты в истории и культуре этой расы?
* Какие отношения у этой расы с другими расами, доступными для игры?
* Какие классы и предыстории подходят представителям этой расы?
* Какие у этой расы значительные особенности?
* Если создаётся подвид, что отличает его от других видов этой расы?
Сравните придуманную вами расу с другими вариантами рас, доступных игрокам, чтобы убедиться, что она не меркнет в сравнении с существующими вариантами (что сделает её непопулярной), но и не затмевает их (что сделает непопулярными другие расы).
Когда начнёте создавать игровые элементы расы, такие как расовые особенности, посмотрите для вдохновения на уже существующие расы.
!!!''Косметические изменения''
Проще всего можно модифицировать существующую расу, изменив её внешность. Смена внешнего вида не обязана менять игровые элементы. Например, можно переделать полуросликов в антропоморфных мышей, вообще не меняя их расовых особенностей.
!!!''Культурные изменения''
В вашем мире эльфы могут быть пустынными кочевниками, а не лесными жителями, полуросли-ки могут жить в городах среди облаков, а дварфы могут быть моряками, а не шахтёрами. Если вы меняете культуру расы, можете также совершить небольшие изменения в особенностях и владениях расы.
Например, представим, что дварфы в вашем мире — моряки и изобретатели пороха. Вы можете добавить пистоли и мушкеты в список оружия, навыками владения которыми обладают дварфы, а также дать им владение навыками управления водным транспортом вместо владения ремесленными инструментами. Эти два небольших изменения сделают дварфов разительно непохожими на своих собратьев из Книги игрока, а сила расы останется практически той же самой.
!!!!''Создание нового подвида''
Создание нового подвида требует большего вовлечения, чем внесение небольших изменений в существующие расы, но так вы создаёте дополнительное разнообразие в выборе расы, а не просто заменяете одни опции другими.
В приведённом примере мы рассмотрим создание подвида эльфов: эладринов. Эта раса встречается во многих мирах D&D, так что вы можете черпать идеи из многочисленных источников
!!!''Пример подрасы: Эладрин''
Эладрины — магические существа с сильными связями с природой, живущие в сумеречном царстве Страны Фей. Их города иногда пересекаются с Материальным Планом, появляясь ненадолго в горных долинах и глухих лесных рощах, но всегда возвращаются в Страну Фей.
У подвидов эльфов из Книги игрока есть увеличение характеристик, обучение оружию и по две-три дополнительных особенности. Учитывая историю эладринов и их магическую сущность, будет логично увеличить их Интеллект. Изменять владение оружием, общим для лесных и высших эльфов, нет смысла.
От других эльфов эладринов отличает умение двигаться между границами планов, исчезая в одном месте и тут же появляясь в другом. В игре это отражено ограниченным использованием заклинания туманный шаг. Поскольку туманный шаг это заклинание 2 уровня, это умение достаточно сильное, и новых особенностей добавлять больше не нужно. Так мы получаем готовый подвид эладринов:
://''Увеличение характеристик.''// Значение вашего Интеллекта увеличивается на 1.
://''Владение эльфийским оружием.''// Вы владеете длинным мечом, коротким мечом, коротким и длинным луками.
://''Фейский шаг.''// С помощью этой особенности вы можете один раз наложить заклинание туманный шаг. Вы восстанавливаете эту особенность когда заканчиваете короткий или продолжительный отдых.
!!!''Создание новой расы''
При создании новой расы начните с её истории и отталкивайтесь от неё. Сравните своё творение с Другими расами своего мира и можете позаимствовать особенности у них. Посмотрите, например, на аасимаров, расу, похожую на тифлингов, но с наследием небожителей.
!!!''Пример расы: Аасимар''
В то время как у тифлингов по венам течёт кровь исчадий, аасимары являются потомками небожителей. Обычно они выглядят как прекрасные люди со сверкающими волосами, безупречной кожей и пронзительными глазами. Аасимары часто пытаются выдавать себя за людей, чтобы искоренять зло и защищать добро на Материальном Плане, не привлекая внимания к своему наследию. Они стремятся слиться с обществом, но чаще всего всё равно выбиваются из общего ряда и становятся почитаемыми лидерами и славными героями.
Вы можете использовать аасимаров в противовес расе тифлингов. Эти расы могут враждовать, демонстрируя более масштабный конфликт между силами добра и зла в вашей кампании.
Вот задачи для Аасимаров:
* Аасимары должны быть эффективными жрецами и паладинами.
* Аасимары должны быть для небожителей и людей теми же, кем являются тифлинги для исчадий и людей.
Учитывая, что аасимары и тифлинги являются двумя сторонами одной монеты, разрабатывать особенности новой расы можно на основе уже существующих тифлингов. Так как мы хотим, чтобы аасимары были хорошими паладинами и жрецами, стоит улучшить им Мудрости и Харизму вместо Интеллекта и Харизмы.
Так же как у тифлингов, у аасимаров будет тёмное зрение. Вместо сопротивления к урону огнём дадим им сопротивление к урону излучением, чтобы показать их сущность. Однако урон излучением встречается гораздо реже урона огнём, поэтому мы также дадим им сопротивление к урону некротической энергией, чтобы они хорошо сражались с нежитью.
Особенность тифлингов Дьявольское наследие является хорошей моделью для аналогичной особенности аасимаров, отражающей их магическую природу, нужно лишь заменить заклинания тифлингов на заклинания такого же уровня, но отражающие при этом родство с небожителями. Однако аасимары получили целых два сопротивления, поэтому мы ограничим заклинания только простыми и бытовыми.
Заполнив все остальные детали, мы получим следующие расовые особенности аасимаров:
://''Увеличение характеристик''//. Значение вашей Мудрости увеличивается на 1, а значение Харизмы увеличивается на 2.
://''Возраст.''// Аасимары взрослеют тогда же, когда и люди, но живут немного дольше.
://''Мировоззрение.''// Из-за родства с небожителями аасимары чаще всего бывают добрыми. Однако некоторые аасимары отвергают своё родство и посвящают себя злу.
://''Размер.''// Аасимары по росту и телосложению схожи с людьми. Ваш размер — Средний.
://''Скорость.''// Ваша базовая скорость передвижения составляет 30 футов.
://''Тёмное зрение.''// Благодаря вашему наследию небожителей, вы отлично видите при тусклом свете и в темноте. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
://''Сопротивление небожителей.''// Вы получаете сопротивление к урону излучением и некротической энергией.
://''Наследие небожителей.''// Вы знаете заговор свет. При достижении 3 уровня вы можете один раз в день накладывать малое восстановление. При достижении 5 уровня вы можете один раз в день наложить заклинание дневной свет как заклинание 3 уровня. «Раз в день» означает, что вы должны окончить продолжительный отдых, прежде чем сможете наложить это заклинание ещё раз посредством данного умения. Базовой характеристикой для этих заклинаний является Харизма.
://''Языки.''// Вы можете говорить, читать и писать на Небесном и Общем.
!!__''Модификация класса''__
Классы в Книге игрока описывают широкий диапазон архетипов персонажей, но для вашей кампании может понадобиться что-то совершенно новое. В этом разделе описаны способы модификации существующих классов под ваши нужды.
!!!''Изменение владений''
Смена владений — простой и безопасный способ модифицировать класс, чтобы он лучше подходил вашему миру. Замена владения одним навыком или инструментом на владение другим не делает персонажа ни слабее, ни сильнее, но может изменить нюансы класса.
Например, в крупной гильдии воров вашего мира могут поклоняться божеству-покровителю, и выполнять ради него тайные задания. Чтобы отразить эту культурную деталь, вы можете добавить Религию в список навыков, из которых плут выбирает те, которыми будет владеть. Вы можете даже заставлять брать этот навык, если плут принадлежит этой гильдии.
Вы можете также изменить владение доспехами и оружием, чтобы отразить некоторые аспекты своего мира. Например, можете решить, что жрецы определённого божества принадлежат к ордену, запрещающему накопление материальных богатств кроме магических предметов, полезных для выполнения поручений. Такие жрецы ходят с посохами, и им запрещено носить доспехи и использовать другое оружие кроме посохов. Чтобы это отразить, вы можете убрать у жрецов этой веры владение оружием и доспехами, оставив только владение боевыми посохами. Вы можете дать им преимущество, чтобы скомпенсировать потерю владения — что-то вроде классового умения монаха Защита без доспехов, но в виде божественного благословения.
Обычно изменение списка заклинаний мало влияет на силу персонажа, но сильно меняет ощущение от класса целиком. В вашем мире паладины могут присягать не своим идеалам, а мощным чародеям. Для того чтобы отразить это, вы можете создать новый список заклинаний паладинов, добавив в исходный список заклинания их господ, волшебников и чародеев. И вот паладины выглядят уже совсем иначе.
Будьте осторожны, меняя список заклинаний колдунов. Из-за того, что они восстанавливают ячейки заклинаний после короткого отдыха, они смогут использовать некоторые заклинания чаще, чем другие классы.
!!!''Ограничения классов''
Вы можете не менять принцип класса, но всё равно подстроить его под свой мир, ограничив класс для некоторых рас или культур.
Например, вы можете решить, что барды, волшебники, колдуны и чародеи отражают магические традиции четырёх разных рас или культур. Коллегии бардов могут быть доступны только эльфам. Драконорождённые могут быть единственной расой, в которой появляются чародеи, а все колдуны вашего мира могут быть людьми. Эту мысль можно развивать дальше. Коллегия знаний может предназначаться для высших эльфов, а барды Коллегии доблести могут быть лесными эльфами. Школу Иллюзий могли открыть гномы, поэтому все волшебники, специализирующиеся на этой школе — гномы. Разные человеческие культуры могут производить колдунов с разными договорами, и так далее. Точно так же, разные домены жрецов могут быть закреплены за разными регионами, в которых живут свои расы и культуры.
Вы сами решаете, когда позволять персонажам игроков игнорировать эти ограничения. Может ли полуэльф затесаться среди эльфов и выучить традиции их бардов? Сможет ли дварф заключить договор колдуна, несмотря на отсутствие связей с культурой, в среде которой возникают настоящие колдуны? Как всегда, лучше согласиться и использовать желание игрока как возможность развить историю персонажа и мира, чем отказаться и отрезать перспективы.
!!!''Замена классовых умений''
Если одно или несколько умений некоего класса не совсем подходит тематике вашей кампании, вы можете заменить их другими. При этом вы должны убедиться, что новые опции так же привлекательны как те, что вы убираете, и что новые классовые умения так же эффективны при социальном взаимодействии, исследовании или в сражении, как старые. Классы существуют чтобы помогать игроку выражать концепцию персонажа, и, отнимая классовые умения, вы отнимаете у персонажа эти возможности.
Менять классовые умения нужно лишь тогда, когда вы хотите подстроить его под нужды своей кампании или если хотите помочь игроку сделать особого персонажа (возможно, похожего на персонажа из романа, телесериала, комикса или фильма).
Для начала выберите классовое умение или их группу для замены. Затем вам надо оценить, что эти умения давали классу, чтобы новые умения не оказались слишком сильными или слабыми. Задайте себе следующие вопросы об удаляемых умениях:
* Какое влияние окажет замена этого умения на исследование, социальное взаимодействие или сражение?
* Влияет ли замена умения на то, сколько времени отряд может искать приключения в течение дня?
* Потребляет ли это умение ресурсы, создаваемые другими элементами этого класса?
* Это умение действует постоянно или восстанавливается после короткого отдыха, продолжительного отдыха или иного отрезка времени?
Вооружившись ответами на эти вопросы, вы можете начать создавать новые умения на замену старым. Нет ничего страшного, если новые классовые умения завязаны на исследование, социальное взаимодействие или сражение больше, чем старые, но и слишком сильно этим не увлекайтесь. Например, если вы замените умение, ориентированное на исследование, чем-то, что полезно только в сражении, вы сделаете класс более сильным в бою, и он может затмить собой другие классы.
Нет готовой формулы, по которой можно создавать классовые умения. Для начала лучше всего просмотреть все другие классовые умения, а также заклинания, черты и прочие правила. Будьте готовы к неудачам, когда с виду хорошие умения на игре оказываются не такими уж замечательными. Ничего страшного в этом нет. Всё, что вы создаёте, нужно предварительно тестировать. Представляя новые классовые умения, убедитесь, что игроки осознают факт, что вы позже можете их запрещать или вносить в них изменения.
!!!''Создание новых классовых опций''
У каждого класса есть как минимум одна основная точка ветвления. Жрецы выбирают божественный домен, воины выбирают воинский архетип, волшебники выбирают магические традиции, и так далее. Создание новых опций не требует удаления старых, но новые должны быть сопоставимы с существующими, чтобы не быть сильнее или слабее их, и при этом не должны выбиваться из стилистики. Как всегда, будьте готовы тестировать свои идеи и вносить изменения, если некоторые элементы не будут вас устраивать.
Создав в голове концепцию новой классовой опции, можете начинать конкретизировать. Если не знаете с чего начать, посмотрите на существующие опции и то, что дают их классовые умения. Ничего страшного, если у двух классовых опций будут одинаковые умения, а примеры механики для вдохновения можно искать и в других классах. Создав классовое умение, задайте себе следующие вопросы:
* Как это умение усиливает историю или тематику классовой опции?
* Если ли аналогичное умение, которое можно использовать как образец?
* Сопоставимо ли новое классовое умение с другими умениями этого же уровня?
!!!''Вариант: Очки заклинаний''
Можно изменить класс, поменяв его методику использования заклинаний. При помощи этой системы персонаж с умением Использование заклинаний использует не ячейки заклинаний, а очки заклинаний. Очки заклинаний дают заклинателю большую гибкость ценой больших расчётов.
В этом варианте у каждого заклинания есть стоимость в очках, зависящая от его уровня. В приведённой ниже таблице указана стоимость в очках заклинаний ячеек с 1 по 9 уровень. Заговоры не требуют ячеек, и потому не стоят очков заклинаний.
Вместо того чтобы получать от умения Использование заклинаний ячейки заклинаний, вы получаете очки заклинаний. Вы тратите очки заклинаний для создания ячейки заклинаний желаемого уровня, а потом используете эту ячейку для накладывания самого заклинания. Очков заклинаний не может быть меньше 0, и вы восстанавливаете все очки заклинаний, когда оканчиваете продолжительный отдых.
Заклинания с уровнем выше 5 накладывать сложно. Вы можете с помощью очков заклинаний создать по одной ячейке заклинаний уровня 6 и выше. Вы не можете создать ещё одну ячейку с таким же уровнем, что уже была создана, пока не окончите продолжительный отдых.
Количество очков заклинаний, которые вы можете потратить, зависит от вашего уровня заклинателя, как показано в таблице «очки заклинаний в зависимости от уровня». Ваш уровень также определяет максимальный уровень заклинаний, который вы можете накладывать. Даже если у вас достаточно очков, ячейку с уровнем выше максимального вы не создадите.
Эта таблица распространяется на бардов, волшебников, друидов, жрецов и чародеев. Для паладинов и следопытов уровень персонажа считается уменьшенным вдвое. Для воина (мистический рыцарь) и плута (мистический ловкач) уровень персонажа делится на три.
Эту же систему можно применять к чудовищам, накладывающим заклинания за счёт ячеек заклинаний, но делать это не рекомендуется, так как отслеживать очки заклинаний чудовищ может быть сложно.
!!!!''Стоимость в очках заклинаний''
<table>
<tr>
<th>Уровень заклинания</th>
<th>Стоимость в очках</th>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>4</td>
<td>6</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>6</td>
<td>9</td>
</tr>
<tr>
<td>7</td>
<td>10</td>
</tr>
<tr>
<td>8</td>
<td>11</td>
</tr>
<tr>
<td>9</td>
<td>13</td>
</tr>
</table>
!!!!''Очки заклинаний в зависимости от уровня''
<table>
<tr>
<th>Уровень класса</th>
<th>Очки заклинаний</th>
<th>Макс. уровень заклинаний</th>
</tr>
<tr>
<td>1</td>
<td>4</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>6</td>
<td>1</td>
</tr>
<tr>
<td>3</td>
<td>14</td>
<td>2</td>
</tr>
<tr>
<td>4</td>
<td>17</td>
<td>2</td>
</tr>
<tr>
<td>5</td>
<td>27</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>32</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>38</td>
<td>4</td>
</tr>
<tr>
<td>8</td>
<td>44</td>
<td>4</td>
</tr>
<tr>
<td>9</td>
<td>57</td>
<td>5</td>
</tr>
<tr>
<td>10</td>
<td>64</td>
<td>5</td>
</tr>
<tr>
<td>11</td>
<td>73</td>
<td>6</td>
</tr>
<tr>
<td>12</td>
<td>73</td>
<td>6</td>
</tr>
<tr>
<td>13</td>
<td>83</td>
<td>7</td>
</tr>
<tr>
<td>14</td>
<td>83</td>
<td>7</td>
</tr>
<tr>
<td>15</td>
<td>94</td>
<td>8</td>
</tr>
<tr>
<td>16</td>
<td>94</td>
<td>8</td>
</tr>
<tr>
<td>17</td>
<td>107</td>
<td>9</td>
</tr>
<tr>
<td>18</td>
<td>114</td>
<td>9</td>
</tr>
<tr>
<td>19</td>
<td>123</td>
<td>9</td>
</tr>
<tr>
<td>20</td>
<td>133</td>
<td>9</td>
</tr>
</table>
!!__''Создание предыстории''__
Хорошая предыстория может помочь игроку создать персонажа, уместного в вашей кампании. Предыстория помогает найти ему место, а не объяснить, что персонаж умеет делать в терминах игровой механики.
Вместо того чтобы фокусироваться на предыстории конкретного персонажа, например, торговца или странника, подумайте о фракциях, организациях и культурах своей кампании и том, как с их помощью можно создать интересные предыстории для персонажей игроков. Например, вы можете создать предысторию послушника Крепости Свечи, которая по функциона лу будет похожа на предысторию мудреца, но будет привязывать персонажей к месту и организации вашего мира.
У персонажа с такой предысторией, возможно, будут друзья среди монахов, следящих за великий библиотекой Крепости Свечи. Такой персонаж может свободно входить в библиотеку и обращаться к её знаниям, в то время как другие должны для этого жертвовать ценные книги со знаниями. Враги Крепости Свечи будут врагами этого персонажа, но и союзники у них будут общие. Послушники Крепости Свечи считаются образованными мудрецами и защитниками знаний. Можно будет провести много интересных диалогов с ПМ, которые узнали предысторию персонажа и теперь обращаются к нему за помощью.
Для создания предыстории выполните следующие шаги:
!!!''Шаг 1 Привяжите предысторию к своему миру''
Для того чтобы привязать предысторию к своему миру, определите элемент кампании, с которым она будет связана Это может быть организация, ремесло, личность, событие или место.
!!!''Шаг 2. Предположите характеристики личности''
Создайте таблицу с чертами характера, идеалами, привязанностями и слабостями, подходящими к этой предыстории, или позаимствуйте готовые записи из таблиц Книги игрока. Даже если ваши игроки не используют эти таблицы, этот шаг поможет вам обрисовать, на что похожа это предыстория. Эти таблицы не обязаны быть большими — достаточно будет по два-три элемента для каждой таблицы.
!!!''Шаг 3. Выдайте владения или языки''
Выберите для предыстории по два навыка и два инструмента, которыми будет владеть персонаж с этой предысторией. Вы можете поменять владение инструментом на один язык или владение двумя инструментами на два языка.
!!!''Шаг 4. Определите начальное снаряжение''
Убедитесь, что ваша предыстория включает набор начального снаряжения. Кроме небольшой денежной суммы начальное снаряжение должно включать предметы, которые персонаж заполучил до того как стал искателем приключений, а также один-два уникальных для этой предыстории предмета.
Например, начальное снаряжение послушника Крепости Свечи может включать комплект дорожной одежды, мантию учёного, пять свечей, трутницу, пустой футляр для свитков с выгравированным на нём символом Крепости Свечи и поясной кошель с 10 зм. Футляр для свитков может быть подарком послушнику, принявшему жизнь, полную приключений. Если хотите, там также может быть полезная карта.
!!!''Шаг 5. Выберите умение предыстории''
Выберите уже существующее умение или создайте новое. Если вы берёте существующее умение, добавьте или измените несколько деталей, чтобы сделать его уникальным.
Например, у послушника Крепости Свечи может быть умение мудреца Исследователь (представлено в Книге игрока), но с дополнительным преимуществом, позволяющим входить в Крепость Свечи без обычной платы.
Умение предыстории не должно давать чётких игровых преимуществ, таких как бонусы к проверкам характеристик и броскам атаки. Эти умения должны открывать новые возможности для отыгрыша, исследования и другого взаимодействия с миром.
Например, умение мудреца Исследователь толкает персонажа на поиски приключений. Оно не предоставляет самой информации и не даёт автоматических успехов. Однако если персонаж с этим умением не может вспомнить информацию, он знает, где может её найти. Это может быть другой мудрец или библиотека, находящаяся в древнем захоронении.
Хорошие умения дают персонажам повод отправляться на поиски приключений, общаться с другими персонажами, и они укрепляют связи с создаваемым вами окружением.
!!''__Создание паладина__''
Наиболее важным аспектом персонажа-паладина является природа его святого задания. Хотя классовые умения, связанные с вашей клятвой, не проявляются до достижения 3 уровня, приготовьтесь заранее, прочитав описание клятв в конце описания класса. Вы преданный слуга добра, лояльный к богам справедливости и чести, святой рыцарь в сияющих доспехах, отважившийся идти вперёд, чтобы поразить зло? Вы доблестный чемпион света, лелеющий всё прекрасное, что выступает против тьмы, рыцарь, чья клятва старше, чем многие из богов? Или вы озлобленный одиночка, поклявшийся отомстить тем, кто совершил великое зло, посланный подобно ангелу смерти богами или обуреваемый личной необходимостью мести? Приложение Б перечисляет множество божеств, которым поклоняются паладины всей мультивселенной, например, Торм, Тир, Хейрониус, Паладайн, Кири-Джолит, Дол Арра, Серебряное Пламя, Багамут, Афина, Ра-Хорахти и Хеймдалль.
Как вы получили призыв к тому, чтобы стать паладином? Вы услышали шёпот невидимого бога или ангела во время молитвы? Другой паладин почувствовал ваш потенциал и решил тренировать вас в качестве оруженосца? Или случилось какое-то ужасное событие — уничтожение вашего дома, которое, возможно, послужило отправной точкой ваших исканий? Может быть, вы наткнулись в священной роще на тайный эльфийский анклав, и нашли себя в защите всех подобных убежищ добра и красоты? Или вы знали с самых ранних воспоминаний, что жизнь паладина была вашим призванием, подобно тому, как если бы вы были посланы в мир с целью, отпечатанной в вашей душе.
Противостоящие силам зла паладины редко имеют любое злое мировоззрение. Большинство из них следует пути милосердия и справедливости. Подумайте, как ваше мировоззрение ведёт вас по пути святого задания, и каким образом оно определяет поведение перед богами и смертными. Ваша клятва и мировоззрение могут находиться в гармонии, или ваша клятва может представлять стандарты поведения, которых вы ещё не достигли.
{{Быстрое создание (Паладин)}}
{{Классовые умения (Паладин)}}
{{Начальное снаряжение (Паладин)}}
{{Божественное чувство (Паладин)}}
{{Наложение рук (Паладин)}}
{{Боевой стиль (Паладин)}}
{{Использование заклинаний (Паладин)}}
{{Божественная кара (Паладин)}}
{{Божественное здоровье (Паладин)}}
{{Священная клятва (Паладин) (Умение)}}
{{Увеличение характеристик}}
{{Дополнительная атака}}
{{Аура защиты (Паладин)}}
{{Аура отваги (Паладин)}}
{{Улучшенная Божественная кара (Паладин)}}
{{Очищающее касание (Паладин)}}
{{Священные клятвы (Паладин)}}
Ничто так не оживляет приключения и кампанию как подборка хорошо проработанных персонажей Мастера. Однако, таким персонажам редко нужна глубина персонажей фильма или романа. Большая часть ПМ это статисты, а искатели приключений — настоящие звёзды.
!!__''Быстрое создание ПМ''__
Персонажу не нужны боевые характеристики, если он не представляет угрозы. Более того, большинству ПМ нужно всего лишь одно-два качества, чтобы быть запоминающимся. Например, игроки с лёгкостью запомнят рассудительного кузнеца с татуировкой чёрной розы на правом плече или ужасно одетого барда с разбитым носом.
!!__''Детализированные ПМ''__
Потратьте время на создание истории и характера персонажей, играющих важную роль в приключении. Основные элементы запоминающегося ПМ можно описать десятью предложениями:
* Занятие и история
* Внешность
* Характеристики
* Дарование
* Манеры
* Взаимодействие с другими
* Полезные знания
* Идеал
* Привязанность
* Слабость или тайна
Представленный ниже материал предназначен для гуманоидных ПМ, но вы можете самостоятельно добавить варианты и для чудовищ.
!!!''Занятие и история''
Опишите одним предложением занятие ПМ и дайте краткое историческое замечание, намекающее на его прошлое. Например, ПМ мог служить в армии, сидеть в тюрьме за преступление, или искать приключения в прошлом.
!!!''Внешность''
Опишите одним предложением самые заметные особенности внешности ПМ. Можете совершить бросок по таблице или самостоятельно выбрать подходящую особенность.
<<Button "$:/Внешность ПМ""Внешность ПМ">>
!!!''Характеристики''
Вы не должны определять для ПМ все характеристики — достаточно двух, тех, что выше и ниже среднего. Например, персонаж может быть невероятно сильным и тупым как пробка. Используйте эту информацию при описании ПМ.
<<Button "$:/Характеристики ПМ""Характеристики ПМ">>
!!!''Дарование''
Опишите одним предложением, что особенного ваш ПМ может делать, хотя это и не обязательно. Совершите бросок по таблице или придумайте с её помощью что-нибудь своё.
<<Button "$:/Дарование ПМ""Дарование ПМ">>
!!!''Манеры''
Опишите одним предложением одну манеру, которая поможет игрокам запомнить ПМ. Совершите бросок по таблице или придумайте с её помощью что-нибудь своё.
<<Button "$:/Манеры ПМ""Манеры ПМ">>
!!!''Взаимодействие с другими''
Опишите одним предложением, как ПМ взаимодействует с другими, используя при необходимости таблицу. Поведение ПМ может меняться, в зависимости от того, с кем он взаимодействует. Например, тавернщик может быть дружелюбен с гостями и груб с персоналом.
<<Button "$:/Взаимодействие с другими""Взаимодействие с другими">>
!!!''Полезные знания''
Опишите одним предложением, какие знания есть у ПМ, способные пригодиться персонажам игроков. ПМ может знать что-то банальное вроде лучшей гостиницы в городе или что-то важное, вроде улики, которая поможет раскрыть убийство.
!!!''Идеал''
Опишите одним предложением идеал ПМ, способный подвигнуть его на значительный поступок. Персонажи игроков, узнавшие идеал ПМ, могут использовать его для влияния при социальном взаимодействии (описано в главе 8).
Идеал может быть связан с мировоззрением, как показано в приведённой таблице. Эти связи даны лишь для примера; например, у злого персонажа может быть идеал «красота».
<<Button "$:/Идеалы ПМ""Идеалы ПМ">>
!!!''Привязанность''
Опишите одним предложением, какие существа, места или вещи особенно важны для ПМ. В таблица приводятся примеры обширными категориями.
Особенности привязанностей раскрыты в Книге игрока, и персонажи игроков, уз- j навшие привязанности ПМ, могут использовать их для влияния при социальном взаимодействии (описано в главе 8).
<<Button "$:/Привязанности ПМ""Привязанности ПМ">>
!!!''Слабость или тайна''
Опишите одним предложением слабость ПМ какой-то элемент его личности или истории, который потенциально можно использовать против персонажа — или тайну, которую ПМ пытается скрыть.
В таблице приводятся примеры таких недостатков. Примеры слабостей также есть в Книге игрока. Персонажи игроков, узнавшие слабости или тайны ПМ, могут использовать их для влияния при социальном взаимодействии (описано в главе 8).
<<Button "$:/Слабости и тайны ПМ""Слабости и тайны ПМ">>
!!__''Чудовища в качестве ПМ''__
Уникальные чудовища, играющие важную роль в приключении, заслуживают такого же внимания, что и гуманоидные ПМ, с манерами, идеалами, привязанностями, сла- ЙН бостями и тайнами. Если за преступной деятельностью в городе стоит злобоглаз, не стоит полагаться на один лишь Бести-арий для описания его внешнего вида и характера. Потратьте время, придумайте ему предысторию, отличительные черты и внешность, а самое главное, идеал, привязанность и слабость.
В качестве примера, рассмотрим Занатара, злобоглаза, ведущего преступную деятельность в городе Глубоководье. Шарообразное тело Занатара покрыто кожистой плотью, похожей на поверхность булыжника. Стебельки его глаз похожи на лапки насекомых, а на некоторые надеты магические кольца. Речь Занатара медленная и осторожная, и он предпочитает отворачивать центральный глаз от существа, с которым разговаривает. Как все злобоглазы, он считает других существ ниже себя, хотя и осознаёт полезность гуманоидных прислужников. Через канализацию под Глубоководьем Занатар может попасть практически в любое место города или под городом.
Идеал Занатара — жадность. Он жаждет заполучить мощные магические предметы и окружить себя золотом, платиной и драгоценными камнями. Он привязан к своему логову — проработанному комплексу пещер, вырытых между канализационных ходов Глубоководья — унаследованному от своих предшественников, и которое он ценит превыше всего. Его слабость — любовь к экзотическим удовольствиям: изысканной пище, ароматным маслам, редким специям и травам.
Вся эта информация позволит вам отыграть Занатара не как обычного злобоглаза. Точное описание характера этого существа сделает отыгрыш более запоминающимся и даст возможность сплести интересный сюжет.
!!__''Статистика ПМ''__
При определении игровой статистики ПМ у вас есть три варианта: дать ему только необходимые параметры, дать блок статистики чудовища или дать класс и уровни. Последние два варианта требуют дополнительных пояснений.
!!!''Использование блока статистики чудовища''
Приложение Б Бестиария содержит многочисленные примеры ПМ, которые вы можете переделать под свои нужды, а в 9 главе этой книги предложено руководство по изменению характеристик и созданию новых блоков статистики.
!!!''Использование классов и уровней''
Вы можете создать ПМ, как если бы он был персонажем игрока, используя правила из Книги игрока. Вы можете даже использовать лист персонажа для отслеживания важной информации о ПМ.
;
://''Классовые опции.''// В дополнение к классовым опциям из Книги игрока, для злых персонажей игроков и ПМ есть две дополнительных классовых опции: домен смерти для жрецов и клятвопреступник для паладинов. Обе опции описаны в конце этой главы.
://''Снаряжение.''// Большинству ПМ не нужен исчерпывающий список снаряжения. Враг, с которым предстоит сразиться, должен обладать оружием и доспехами, плюс имеющиеся у него сокровища, (включая магические предметы, которые могут пригодиться искателям приключений).
://''Показатель опасности.''// ПМ, созданному для сражения, нужен показатель опасности. Используйте правила из главы 9 по определению показателя опасности ПМ, как если бы это было обычное чудовище.
!!''__Создание плута__''
Создавая персонажа плута, учитывайте отношение персонажа к закону. Есть ли у вас криминальное прошлое или настоящее? Вы в бегах от закона или от разъярённой гильдии воров? Или вы ушли из своей гильдии в поисках бо́льших опасностей и бо́льших вознаграждений? Движет ли вами во время приключений жадность, или какие-либо другие желания и идеалы?
Что послужило причиной, которая увела вас прочь от прошлой жизни? Грандиозное мошенничество или ограбление пошло настолько неправильно, что заставило вас изменить взгляд на ваше ремесло? Может, удача улыбнулась вам, и успешное ограбление дало деньги, которые были вам нужны для побега от убогой жизни. Страсть к путешествиям наконец позвала вас прочь от вашего дома? Возможно, вы обнаружили себя отрезанным от семьи или наставника, и вы должны найти новые средства поддержки. Или, может быть, вы обрели нового друга — другого члена группы искателей приключений — который показал вам новые возможности для заработка, используя ваши особые таланты.
{{Быстрое создание (Плут)}}
{{Классовые умения (Плут)}}
{{Начальное снаряжение (Плут)}}
{{Компетентность (Плут)}}
{{Скрытая атака (Плут)}}
{{Воровской жаргон (Плут)}}
{{Хитрое действие (Плут)}}
{{Архетип плута (Плут) (Умение)}}
{{Увеличение характеристик}}
{{Невероятное уклонение (Плут)}}
{{Увёртливость (Плут)}}
{{Надёжный талант (Плут)}}
{{Слепое зрение (Плут)}}
{{Скользкий ум (Плут)}}
{{Неуловимость (Плут)}}
{{Удача (Плут)}}
{{Архетипы плута (Плут)}}
//5 уровень, Преобразование, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (щепотка кунжутного семени)
:''Длительность: '' 1 час
"""В точке, которую вы видите в пределах дистанции на деревянной, оштукатуренной или каменной поверхности (такой как стена, потолок или пол) появляется проход, существующий, пока активно заклинание. Вы сами определяете габариты прохода: до 5 футов в ширину, до 8 футов в высоту и до 20 футов в глубину. Этот проход не дестабилизирует само строение.
Когда проход исчезает, все существа и предметы, всё ещё находящиеся в нём, безопасно выталкиваются в свободное пространство, ближайшее к поверхности, на которой вы активировали это заклинание."""
!!''__Создание следопыта__''
Создавая следопыта, подумайте, какое обучение дало вам ваши выдающиеся возможности. Возможно, вы обучались персональным наставником, блуждая по дебрям вместе с ним? Или ваше обучение закончилось после смерти наставника, убитого чудовищем, все собратья которого стали для вас заклятыми врагами? Возможно, вас учили необходимым навыкам в группе следопытов, связанной с кругом друидов, постигшим мистические пути и тайны дикой природы. Вы можете быть самоучкой, отшельником, который познал боевые навыки, навыки выслеживания, и даже волшебную связь с природой через необходимость выживания в дикой местности.
Что является источником вашей ненависти к определённого рода врагам? Может, чудовище убило того, кого вы любите, или уничтожило вашу деревню? Или вы видели слишком много разрушений, причинённых этими чудовищами, после которых вы и посвятили себя обузданию их бесчинств? Является ли ваша карьера продолжением вашей работы по охране пограничных земель или это что-то совершенно другое? Что заставило вас объединиться с группой искателей приключений? Считаете ли вы, что научить новых союзников пути дикой природы сложно, или вы радуетесь освобождению от одиночества, которое они вам предлагают?
{{Быстрое создание (Следопыт)}}
{{Классовые умения (Следопыт)}}
{{Начальное снаряжение (Следопыт)}}
{{Избранный враг (Следопыт)}}
{{Исследователь природы (Следопыт)}}
{{Боевой стиль (Следопыт)}}
{{Использование заклинаний (Следопыт)}}
{{Архетип следопыта (Следопыт) (Умение)}}
{{Первозданная осведомлённость (Следопыт)}}
{{Увеличение характеристик}}
{{Дополнительная атака}}
{{Тропами земли (Следопыт)}}
{{Маскировка на виду (Следопыт)}}
{{Исчезновение (Следопыт)}}
{{Дикие чувства (Следопыт)}}
{{Убийца врагов (Следопыт)}}
{{Архетипы следопыта (Следопыт)}}
Сцены — это отдельные фрагменты в большой истории вашего приключения.
Во-первых, сцена должна быть интересной для игроков. Во-вторых, её проведение не должно вас обременять. Кроме того, хорошо продуманная сцена, как правило, имеет простую цель, а также некоторую связь с общей историей вашей кампании.
Сцена имеет один из трёх возможных исходов: персонажи достигли цели, персонажи частично достигли цели, или персонажи не достигли цели. В сцене должны учитываться все три возможности, а результат должен иметь такие последствия, чтобы игроки почувствовали, что их успехи и неудачи имеют значение.
!!__''Цели персонажей''__
Когда игроки не знают, что конкретно они должны делать в данной сцене, ожидание и волнение могут быстро перерасти в скуку и разочарование. Ясная цель уменьшает риск потерять интерес игроков.
Например, если общая история вашего приключения это поиски бесценной реликвии в отдалённом монастыре, то каждая сцена должна вводить меньшую цель, которая движет историю вперёд. Сцены во время путешествия могут содержать врагов, пытающихся украсть реликвию, или чудовищ, постоянно угрожающих монастырю.
Некоторые игроки создают свои собственные цели, и такое поведение следует поощрять. В конце концов, это ваша с игроками общая кампания. Например, персонаж может попытаться подкупить врагов, а не драться с ними, или погнаться за убегающим врагом, чтобы увидеть, куда он побежит. Игрокам, игнорирующим цели, придётся иметь дело с последствиями, которые являются ещё одним важным аспектом создания сцены.
!!!''Примеры целей''
Следующие цели могут быть использованы в качестве основы для сцены. И хотя эти цели предназначены для одной сцены, вы всегда можете использовать одну и ту же цель в нескольких, объединяя их в большое препятствие, которое искатели приключений должны преодолеть.
;
://''Защитить ПМ или предмет.''// Персонажи должны выступить в качестве телохранителей или защитить некий предмет. Как усложнение, ПМ, которого охраняет отряд, может быть проклят, болен, склонен к приступам паники, слишком молод или слишком стар, чтобы сражаться, или может рисковать жизнью искателей приключений, принимая сомнительные решения. Предмет, который искатели приключений поклялись защищать, может быть разумным, проклятым, или трудно транспортируемым.
://''Остановить ритуал.''// Замыслы злобных культистов, злонамеренных колдунов и могущественных демонов часто связаны с ритуалами, которые нужно сорвать. Обычно персонажи, пытающиеся остановить ритуал, должны прорубать свой путь через орды злых приспешников. Как усложнение, в тот момент, когда персонажи прибывают на место, ритуал может быть уже близок к завершению, что накладывает ограничение по времени. В зависимости от ритуала, его завершение может иметь немедленные последствия.
://''Получить предмет.''// Искатели приключений должны заполучить определённый предмет в области сцены, желательно до окончания сражения. Как усложнение, враги хотят завладеть предметом так же сильно как искатели приключений, что заставляет обе стороны сражаться за него.
://''Пройти испытание.''// Искатели приключений должны пройти через опасную зону. Эта цель похожа на получение предмета, поскольку добраться до выхода более важно, чем убить противников в области. Временные ограничения добавят сложности, как и развилки, в которых персонажи могут заблудиться. Для большей сложности можно добавить ловушки, опасности, и чудовищ.
://''Скрытно пробраться.''// Искатели приключений должны пройти через область сцены так, чтобы их не обнаружили. Сложности могут возникнуть, если их заметят.
://''Убрать одну цель.''// Злодей окружён приспешниками, достаточно мощными, чтобы убить искателей приключений. Персонажи могут убежать и надеяться, что встретятся со злодеем в другой раз, или они могут попытаться пробить себе путь через приспешников. Как усложнение, приспешниками могут оказаться невинные существа под контролем злодея. Убийство злодея разрушит этот контроль, но до того времени искатели приключений должны выдержать атаки приспешников.
://''Установить мир.''// Персонажи должны убедить две противоборствующие группы (или их лидеров) завершить конфликт. Как усложнение, персонажи могут иметь врагов на одной или обеих противоборствующих сторонах, или кто-то может специально подстрекать конфликт для достижения своих собственных целей.
!!__''Создание боевой сцены''__
При создании боевой сцены отпустите своё воображение в свободное плавание и создайте что-то, что понравится вашим игрокам. Как только вы выясните детали, используйте этот раздел, чтобы настроить сложность сцены.
!!!''Сложность боевой сцены''
Существует четыре категории сложности сцены.
;
://''Легко.''// Лёгкая сцена не потребует от персонажей больших затрат и не подвергнет их серьёзной опасности. Они могут потерять несколько хитов, но победа в любом случае гарантирована.
://''Средне.''// Средняя по сложности сцена, как правило, имеет один или два страшных момента для игроков, но персонажи должны одержать победу без потерь. Одному или нескольким из них, скорее всего, понадобится лечение.
://''Сложно.''// Сложная сцена может быть болезненна для искателей приключений. Слабые персонажи могут быть выведены из боя и есть шанс, что один или несколько героев умрёт.
://''Смертельно.''// Смертельная сцена может стать летальной для одного или нескольких персонажей. Группе потребуется хорошая тактика, иначе она рискует потерпеть поражение.
{{$:/Пороговые значения опыта для определения уровня сложности}}
<<<
!!!''Показатель опасности''
При создании сцены или приключения, особенно на низких уровнях, будьте аккуратны при использовании чудовищ, чей показатель опасности выше, чем средний уровень группы. Такое существо одним действием может причинить достаточно урона, чтобы убить искателей приключений низкого уровня. Например, у огра показатель опасности 2, но он может убить волшебника 1 уровня с одного удара.
Кроме того, некоторые чудовища имеют умения, с которыми персонажам низкого уровня может быть трудно или невозможно соперничать. Например, у ракшаса показатель опасности 13, и он обладает иммунитетом к заклинаниям 6 уровня и ниже. У заклинателей 12 уровня нет заклинаний выше 6 уровня, что означает, что они не смогут повилять на ракшаса с помощью магии, и это ставит искателей приключений в невыгодное положение. Такая сцена будет значительно сложнее для группы, чем ожидается, если вы полагаетесь только на показатель опасности чудовища.
<<<
!!!''Определение сложности сцены''
Используйте следующий метод, чтобы оценить сложность любой боевой сцены.
;
://''1. Определите пороговые значения опыта.''// Во-первых, определите пороговые значения опыта для каждого персонажа в отряде. Приведённая выше таблица содержит по четыре пороговых значения для каждой категории сложности. Используйте уровень персонажа, чтобы определить его пороговые значения. Повторите этот процесс для каждого члена отряда.
:"""//''2. Определите пороговые значения опыта для всего отряда.''// Сложите пороговые значения опыта персонажей для каждой категории сложности сцены. Так вы определите пороговые значения опыта для всего отряда. В конечном итоге у вас получится четыре значения, по одному для каждой категории сложности сцены.
Например, если ваша группа состоит из трёх персонажей 3 уровня и одного 2 уровня, то итоговые пороговые значения опыта для всего отряда составят:"""
;;
::''Легко: 275 (75 + 75 + 75 + 50)''
::''Средне: 550 (150 + 150 + 150 + 100)''
::''Сложно: 825 (225 + 225 + 225 + 150)''
::''Смертельно: 1400 (400 + 400 + 400 + 200)''
:Запишите значения, ведь вы сможете использовать их для всех сцен в вашем приключении.
://''3. Сложите опыт за чудовищ.''// Сложите значения опыта для всех чудовищ в сцене. У каждого чудовища опыт указан в его блоке статистики.
:"""//''4. Модифицируйте итоговый опыт для нескольких чудовищ.''// Если в сцене принимает участие больше одного чудовища, то примените множитель к итоговому опыту за них. Чем больше чудовищ в сцене, тем больше атак они совершат по персонажам в раунд, и тем опасней становится схватка. Чтобы правильно оценить сложность сцены, умножьте сумму опыта за всех участвующих чудовищ на значение, указанное в таблице множителей.
Например, если в сцене принимают участие четыре чудовища на общую сумму 500 опыта, вам нужно умножить опыт на 2 (взято из таблицы), и получится 1 000 опыта. Получившееся значение — это не то, сколько опыта герои получат за победу над чудовищами; получившееся значение служит для того, чтобы помочь вам точно оценить сложность сцены.
При осуществлении этого расчёта не учитывайте чудовищ, чей показатель опасности значительно ниже среднего показателя опасности других чудовищ в группе. Их стоит учитывать только если они вносят действительно весомый вклад в сложность сцены."""
{{$:/Множители}}
:"""//''5. Сравните опыт.''// Сравните полученное значение опыта за чудовищ с пороговым значением опыта для всего отряда. Пороговое значение опыта, соответствующее модифицированной сумме опыта, определяет сложность сцены. Если совпадения нет, используйте ближайшее значение, не превышающее модифицированную сумму опыта.
Например, у сцены с одним медвежатником и тремя хобгоблинами модифицированная сумма опыта равна 1000, что делает её сложной сценой для отряда из трёх персонажей 3 уровня и одного персонажа 2 уровня (для такого отряда значение сложной сцены равняется 825 опыта, а значение смертельной сцены равняется 1400 опыта)."""
!!!''Размер отряда''
Предыдущие рекомендации основаны на том, что ваш отряд состоит из трёх-пяти искателей приключений.
Если группа состоит менее чем из трёх персонажей, используйте следующий по величине множитель из таблицы «множители». Например, применяйте множитель «1,5», когда персонажи сражаются с одним чудовищем, и множитель «5» для групп из пятнадцати и более чудовищ.
Если же группа состоит из шести или более персонажей, то используйте предыдущий по величине множитель из таблицы. Для одного чудовища используйте множитель «0,5».
!!!''Составные сцены''
Иногда в сцене принимают участие несколько врагов, но отряд искателей приключений не сталкивается с ними всеми сразу. Например, чудовища могут нападать на героев волнами. Чтобы определить сложность таких сцен относитесь к каждой её части или волне как к отдельной сцене.
Группа не сможет отдохнуть между частями составной сцены, поэтому они не смогут восстановить хиты и умения, требующие отдыха для перезарядки. Как правило, если модифицированная сумма опыта за чудовищ в составной сцене больше трети ожидаемого отрядом опыта за день приключений (см. ниже «день приключений»), то сцена будет сложнее, чем сумма её частей.
!!!''Создание сцен с учётом бюджета опыта''
Вы можете создать сцену, если знаете её желаемую сложность. Пороговое значение опыта группы даёт вам бюджет опыта, который вы можете потратить на чудовищ, чтобы создавать лёгкие, средние, сложные, и смертельные сцены. Просто помните, что группы чудовищ требуют гораздо больше опыта, чем показано в их базовых значениях (смотрите шаг 4).
Например, используя отряд из шага 2, вы сможете создать сцену средней сложности, убедившись, что модифицированная сумма опыта за чудовищ составляет как минимум 550 (пороговое значение опыта для сцены средней сложности) и не более чем 825 (пороговое значение опыта для сложной сцены). Одно чудовище с показателем опасности 3 (мантикора или совомед) стоит 700 опыта, поэтому в сцену можно добавить только одно такое чудовище. Если вы хотите пару чудовищ, каждое из них будет стоить уже в 1,5 раза больше его стоимости в опыте. Пара лютых волков (стоимостью 200 опыта каждый) в сумме дают 600 опыта, что делает их сценой средней сложности для отряда.
Чтобы облегчить задачу, приложение Б предоставляет список всех чудовищ из Бестиария, выстроенных в порядке увеличения показателя опасности.
!!!''День приключений''
В обычных условиях и при средней удаче, большинство отрядов может пройти от шести до восьми средних или сложных сцен в день. Если в приключении задействованы более лёгкие сцены, то и пройдено будет больше. Обратная история со смертельными сценами, большое их количество никто не выдержит.
Подобно тому, как вы рассчитываете уровень сложности сцены, вы можете использовать значения опыта чудовищ и других противников в качестве ориентира при определении того, как далеко продвинется отряд.
Для каждого персонажа в отряде при помощи таблицы «опыт за день приключений» определите, сколько опыта персонаж планирует заработать за день. Сложите значения всех искателей приключений, чтобы получить общий опыт отряда за один день приключений. Так вы получите грубую оценку общего значения опыта для сцен, которые отряд сможет выдержать, прежде чем героям понадобится продолжительный отдых.
{{$:/Опыт за день приключений}}
!!!''Короткий отдых''
В целом, в течение полного приключений дня, отряду, скорее всего, понадобится взять два коротких отдыха, по одному на каждую треть пути.
!!__''Изменение сложности сцены''__
Сцена может быть легче или сложнее, в зависимости от места действия и ситуации.
Если персонажам что-то мешает, а их врагам — нет, увеличьте сложность сцены на один шаг (например, лёгкая станет средней) И наоборот, уменьшите сложность на один шаг, если у персонажей есть преимущество, которого нет у их врагов. Любые дополнительные преимущества или помехи меняют сложность сцены на один шаг в нужном направлении. Если персонажи имеют как преимущества так и помехи, то они компенсируют друг друга.
Ситуационные помехи включают следующее:
* Весь отряд застигнут врасплох, а враги — нет.
* У противника есть укрытие, а у отряда — нет.
* Персонажи не могут видеть врага.
* Персонажи каждый раунд получают урон от какого-то природного эффекта или магического источника, а их враги — нет.
* Персонажи висят на верёвке посреди большой отвесной скалы, прикованы к полу, или находятся в другой ситуации, которая серьёзно ограничивает их мобильность и делает их лёгкой добычей.
Ситуационные преимущества похожи на помехи, за исключением того, что они приносят пользу персонажам, а не врагу.
!!__''Интересные боевые сцены''__
Следующие особенности могут сделать сцену интереснее и напряжённей:
* Особенности местности, которые создают риск как для персонажей, так и для их противников, такие как ветхий верёвочный мост и лужи зелёной слизи
* Особенности местности, связанные с изменением высоты, такие как ямы, нагромождения пустых ящиков, карнизы и балконы
* Что-то, что подтолкнёт или заставит персонажей и их врагов передвигаться, например, бочонки с порохом или ловушка с кружащими пилами
* Враги в труднодоступных местах или в оборонительных позициях, так что персонажи-стрелки будут вынуждены передвигаться по полю боя
* Различные типы чудовищ, работающие сообща
!!__''Создание чародея''__
Самым важным аспектом при создании вашего чародея, является источник его силы. Вы в самом начале выбираете происхождение, которое может быть связано с драконьей родословной или влиянием дикой магии, но конкретный источник вашей силы определяется только вами. Возможно, это семейное проклятье, доставшееся вам от далёких предков? Или какое-нибудь экстраординарное событие оставило своё благословление, даровав врождённые способности к магии, или, может, располосовав вас шрамами?
Как вы ощущаете магические силы, струящиеся сквозь вас? Вы приняли их, попытались освоить или упиваетесь их непредсказуемой природой? Благословление это или проклятье? Искали ли вы их, или они сами нашли вас? Есть ли возможность отказаться от них, и поступили бы вы так, если бы могли? Что вы намерены делать с ними? Возможно, вы чувствуете, что были одарены этой силой для свершения какого то высшего предназначения. Или же, вы могли решить, что такая власть даёт вам право делать всё, что вздумается, и отбирать всё необходимое у тех, кто такой силы не имеет. Возможно, ваши силы связаны с могущественной фигурой, известной в этом мире — фейским существом, благословившим вас при рождении, драконом, который смешал вашу кровь с каплей своей, личем, который создал вас в качестве эксперимента, или божеством, которое избрало вас носителем этой силы.
{{Быстрое создание (Чародей)}}
{{Классовые умения (Чародей)}}
{{Начальное снаряжение (Чародей)}}
{{Использование заклинаний (Чародей)}}
{{Происхождение чародея (Чародей) (Умение)}}
{{Источник магии (Чародей)}}
{{Единицы чародейства (Чародей)}}
{{Свободное заклинательство (Чародей)}}
{{Метамагия (Чародей)}}
{{Увеличение характеристик}}
{{Чародейское восстановление (Чародей)}}
{{Происхождения чародея (Чародей)}}
В Бестиарии находятся сотни готовых для игры чудовищ, но там нет всех чудовищ, которых вы можете себе представить. Часть удовольствия от игры как раз состоит в том, что можно создавать новых чудовищ и адаптировать старых, хотя бы ради того, чтобы игроки обрадовались встрече с врагом, которого раньше не видели.
Первый шаг — создание концепции чудовища. Что делает его уникальным? Где оно живёт? Какую роль вы хотите ему выделить в приключении, кампании или мире? На кого оно похоже? Есть ли у него необычные способности? Ответив на эти вопросы, вы сможете начать воплощать чудовище в игре.
!!__''Модификация чудовища''__
Теперь, создав концепцию чудовища, вам понадобятся его характеристики. Первый вопрос, который вы должны себе задать, это «Могу ли я использовать готовые характеристики?».
В блоках статистики Бестиария могут быть хорошие варианты для вашего чудовища. Допустим, вы хотите создать разумного лесного хищника, охотящегося на эльфов. Такого в Бестиарии нет, но есть кваггот — дикий гуманоидный хищник со скоростью лазания. Вы можете взять блок статистики кваггота для своего чудовища, изменив только его название. Можете также внести незначительные изменения, например, заменив его язык, Подземный, на более подходящий, например, Эльфийский или Сильван.
Вам нужен огненный феникс? Возьмите гигантского орла или рух, дайте ему иммунитет к огню и позвольте причинять урон огнём. Нужна летающая обезьяна? Возьмите бабуина с крыльями и скоростью полёта. Практически любое чудовище, которое вы можете представить, можно создать на основе уже существующего.
Адаптация блока статистики гораздо менее трудозатратна, чем создание нового с нуля, и некоторые изменения никак не сказываются на его показателе опасности, например, замена языка, смена мировоззрения и добавление новых чувств. Однако если вы меняете атакующие или защитные характеристики существа, такие как хиты или урон, его показатель опасности может измениться, как будет показано ниже.
!!!''Замена оружия''
Если чудовище использует рукотворное оружие, вы можете заменить его другим. Например, вы можете заменить длинный меч хобгоблина алебардой. Не забудьте изменить урон и досягаемость атак. Помните также о последствиях замены одноручного оружия на двуручное и наоборот. Например, хобгоблин с алебардой (двуручное оружие) теряет преимущества от щита, так что его КД уменьшается на 2.
!!!''Добавление особенностей''
Можно легко модифицировать чудовище, добавив ему новую особенность. Можете создать свою собственную особенность, а можете позаимствовать готовую особенность у чудовищ из Бестиария. Например, вы можете создать гибрид гоблина и паука, дав обычному гоблину особенность Паучье лазание, можете превратить обычного тролля в двухголового, дав особенность Две головы, или можете превратить совомеда в летающего сово-меда, дав ему крылья и скорость полёта гигантской совы.
!!__''Быстрое создание характеристик чудовища''__
Если всё, что вам нужно, это корректные характеристики для чудовища с определённым показателем опасности, совершите описанные ниже шаги. Если вы хотите создать блок статистики как у чудовищ из Бестиария, перейдите к разделу «создание блока статистики чудовища».
!!!''Шаг 1 Ожидаемый показатель опасности''
Выберите показатель опасности (ПО) для своего чудовища. Зная ожидаемый показатель опасности чудовища, вы сможете получить его бонус мастерства и другие важные боевые характеристики. Не беспокойтесь, что не получается точно определить показатель опасности, вы сможете внести корректировки позже.
<<Button "$:/Характеристика чудовищ на основе показателя опасности""Характеристика чудовищ на основе показателя опасности">>
Одно чудовище с показателем опасности, равным уровню искателей приключений, будет представлять умеренную особенность для группы из четырёх персонажей. Если чудовище будет в компании с другими существами, их показатели опасности должны быть меньше уровня отряда.
Не думайте, что показатель опасности чудовища должен равняться уровню отряда, чтобы представлять достойную угрозу персонажам. Помните, что в больших количествах чудовища с низким показателем опасности могут быть опасными даже для высокоуровневых персонажей.
!!!''Шаг 2. Базовые характеристики''
Используйте приведённую выше таблицу, чтобы определить Класс Доспеха, хиты, бонус атаки и урон в раунд чудовища, основываясь на показателе опасности, полученном в шаге 1
!!!''Шаг 3. Скорректируйте характеристики''
Увеличьте или уменьшите Класс Доспеха, хиты, бонус атаки, урон в раунд и Сл спасбросков чудовища, как посчитаете нужным, основываясь на придуманной концепции чудовища. Например, если вам нужно хорошо защищённое чудовище, увеличьте его Класс Доспеха.
Сделав нужные корректировки, запишите характеристики существа. Если вам нужны дополнительные характеристики, пройдите шаги из раздела «создание блока статистики чудовища».
!!!''Шаг 4. Финальный показатель опасности''
Вычислите финальный показатель опасности существа, учитывая корректировки из шага 3.
:"""//''Защитный показатель опасности.''// Просмотрите колонку хитов в таблице, пока не найдёте хиты своего чудовища. Запишите показатель опасности, соответствующий чудовищу с таким количеством хитов.
Теперь найдите Класс Доспеха, рекомендуемый для чудовища с таким показателем опасности. Если КД вашего чудовища как минимум на две единицы больше или меньше этого числа, скорректируйте показатель опасности, определённый с помощью хитов, в нужную сторону на 1 за каждые 2 единицы разницы."""
:"""//''Атакующий показатель опасности.''// Просмотрите колонку «урон в раунд» в таблице, пока не найдёте урон в раунд своего чудовища. Запишите показатель опасности, соответствующий чудовищу, причиняющему такой урон.
Теперь найдите бонус атаки, рекомендуемый для чудовища с таким показателем опасности. Если бонус атаки вашего чудовища как минимум на две единицы больше или меньше этого числа, скорректируйте показатель опасности, определённый с помощью урона в раунд, в нужную сторону на 1 за каждые 2 единицы разницы.
Если чудовище больше полагается на спасброски от его атак, чем на сами атаки, то вместо бонуса атаки ориентируйтесь на его Сл спасброска.
Если ваше чудовище использует разные бонусы атаки или разные Сл спасбросков, ориентируйтесь на те, что оно использует чаще всего."""
://''Средний показатель опасности.''// Итоговый показатель опасности чудовища равен среднему между защитным и атакующим показателем опасности. Округлите показатель опасности по математическим правилам округления. Например, если защитный показатель опасности существа равен 2, а атакующий показатель опасности равен 3, итоговый показатель будет равен 3.
Теперь, имея итоговый показатель опасности, определите по таблице бонус мастерства чудовища. Используйте приведённую ниже таблицу для определения опыта, который принесёт победа над чудовищем. Чудовище с показателем опасности 0 не приносит опыта, если не представляет никакой угрозы. В противном случае оно приносит 10 опыта.
!!!!''Опыт на основе показателя опасности''
<table>
<tr>
<th>ПО</th>
<th>Опыт</th>
<th>ПО</th>
<th>Опыт</th>
</tr>
<tr>
<td>0</td>
<td>0 или 10</td>
<td>14</td>
<td>11500</td>
</tr>
<tr>
<td>1/8</td>
<td>25</td>
<td>15</td>
<td>13000</td>
</tr>
<tr>
<td>1/4</td>
<td>50</td>
<td>16</td>
<td>15000</td>
</tr>
<tr>
<td>1/2</td>
<td>100</td>
<td>17</td>
<td>18000</td>
</tr>
<tr>
<td>1</td>
<td>200</td>
<td>18</td>
<td>20000</td>
</tr>
<tr>
<td>2</td>
<td>450</td>
<td>19</td>
<td>22000</td>
</tr>
<tr>
<td>3</td>
<td>700</td>
<td>20</td>
<td>25000</td>
</tr>
<tr>
<td>4</td>
<td>1100</td>
<td>21</td>
<td>33000</td>
</tr>
<tr>
<td>5</td>
<td>1800</td>
<td>22</td>
<td>41000</td>
</tr>
<tr>
<td>6</td>
<td>2300</td>
<td>23</td>
<td>50000</td>
</tr>
<tr>
<td>7</td>
<td>2900</td>
<td>24</td>
<td>62000</td>
</tr>
<tr>
<td>8</td>
<td>3900</td>
<td>25</td>
<td>75000</td>
</tr>
<tr>
<td>9</td>
<td>5000</td>
<td>26</td>
<td>90000</td>
</tr>
<tr>
<td>10</td>
<td>5900</td>
<td>27</td>
<td>105000</td>
</tr>
<tr>
<td>11</td>
<td>7200</td>
<td>28</td>
<td>120000</td>
</tr>
<tr>
<td>12</td>
<td>8400</td>
<td>29</td>
<td>135000</td>
</tr>
<tr>
<td>13</td>
<td>10000</td>
<td>30</td>
<td>155000</td>
</tr>
</table>
Создание чудовища это не просто возня с цифрами. Рекомендации из этой главы помогут создать чудовище, но узнать, интересно ли будет с ним играть, можно только попробовав его в игре. Увидев его в действии, вы можете позже скорректировать его показатель опасности.
!!__''Создание блока статистики чудовища''__
Если вы хотите полный блок статистики чудовища, создайте новое чудовище, используя описанный ниже метод.
Введение в Бестиарии объясняет все компоненты блока статистики. Для начала ознакомьтесь с тем материалом. В ходе создания чудовища, если вдруг не сможете принять решение, обратитесь к примерам из Бестиария.
Придумав концепцию чудовища, совершите следующие шаги:
!!!''Шаг 1. Название''
Названию чудовища нужно уделять столько же внимания, сколько и другим аспектам, если не больше.
Ваше чудовище может опираться на существо из реального мира или мифов, и в этом случае название будет очевидным. Если название всё же надо придумать, помните, что лучше всего использовать названия, отражающие внешность и характер чудовища (такие как мимик и совомед) или просто хорошо звучащие (такие как чууль или три-крин).
!!!''Шаг 2. Размер''
Определите размер чудовища: Крохотный, Маленький, Средний, Большой, Огромный или Громадный.
Размер чудовища определяет, какая кость будет определять его хиты в шаге 8. Размер также влияет на пространство, которое будет занимать чудовище, как описано в Книге игрока.
!!!''Шаг 3. Вид''
Вид чудовища наводит на мысли о его происхождении и сущности. В Бестиарии описаны все виды чудовищ. Выберите вид, лучше всего соответствующий концепции вашего чудовища.
!!!''Шаг 4. Мировоззрение''
Если ваше чудовище не заботят вопросы морального выбора, у него нет мировоззрения. В противном случае у него есть мировоззрение, соответствующее его сущности и моральному облику, как описано в Книге игрока.
!!!''Шаг 5. Значения характеристик и модификаторы''
У чудовищ, так же как и у персонажей игроков, есть шесть характеристик. Значение характеристики не может быть ниже 1 и не может превышать 30.
От значения характеристики зависит её модификатор, как показано в таблице на 13 странице Книги игрока.
Если не можете определить, какими должны быть характеристики чудовища, посмотрите на похожих чудовищ из Бестиария и используйте аналогичные значения. Например, если ваше чудовище умно примерно как человеческий обыватель, дайте ему Интеллект 10 (модификатор +0). Если оно сильно как огр, дайте ему Силу 19 (модификатор +4).
!!!''Шаг 6. Ожидаемый показатель опасности''
Выберите показатель опасности для своего чудовища. Смотрите шаг 1 в разделе «быстрое создание характеристик чудовища». Бонус мастерства будет использоваться в дальнейших шагах, поэтому запомните или запишите его.
!!!''Шаг 7. класс доспеха''
Класс Доспеха чудовища непосредственно влияет на его показатель опасности и наоборот. Вы можете определить Класс Доспеха чудовища одним из двух способов.
://''Используйте таблицу.''// Можете определить КД соответствующий ожидаемому показателю опасности, по таблице из предыдущего раздела. Вы можете корректировать КД так, как посчитаете нужным. Например, базовый КД для показателя опасности 1 равен 13, но если чудовище хорошо защищено доспехами, увеоичьте КД. Не волнуйтесь, что после этого КД не будет соответствовать ожидаемому показателю опасности. На показатель опасности влияют и другие факторы, которые будут описаны ниже.
://''Определите актуальный КД.''// В качестве альтернативы можете определить КД на основании доспеха, который носит чудовище, на основании его природного доспеха, или некоего усилителя Класса Доспеха (такого как заклинание доспехи мага). Опять же, не волнуйтесь, если этот КД не будет соответствовать ожидаемому показателю опасности.
:Если чудовище носит рукотворный доспех, его Класс Доспеха зависит от вида этого доспеха (смотрите в Книге игрока). Если чудовище носит щит, примените бонус щита к КД как обычно.
:У чудовища, которое не носит доспех, может быть природный доспех, в случае чего его КД равен 10 + модификатор Ловкости + бонус его природного доспеха Чудовище с толстой шкурой обычно имеет бонус природного доспеха от +1 до +3. Этот бонус может быть выше, если существо очень хорошо защищено. Горгона, например, покрыта стальными пластинами и обладает природным доспехом +9.
!!!''Шаг 8. Хиты''
Хиты чудовища непосредственно влияют на его показатель опасности и наоборот. Вы можете определить хиты чудовища одним из двух способов.
://''Используйте таблицу.''// Можете определить хиты, соответствующие ожидаемому показателю опасности, по таблице из предыдущего раздела.
://''Назначьте Кости Хитов.''// В качестве альтернативы можете выдать чудовищу Кости Хитов, чтобы определить среднее значение его хитов. Не волнуйтесь, если хиты не будет соответствовать ожидаемому показателю опасности. На показатель опасности влияют и другие факторы, которые будут описаны ниже, и вы всегда позже сможете скорректировать Кости Хитов и сами хиты.
:У чудовища может быть столько Костей Хитов, сколько захотите, но размер этих костей зависит от размера чудовища, как показано в таблице ниже.
:Например, чудовище Среднего размера использует к8 для определения хитов, так что у чудовища Среднего размера с 5 Костями Хитов и Телосложением 13 (модификатор +1) будет 5к8 + 5 хитов. Обычно у чудовища среднее число хитов. Например, у существа, у которого 5к8 + 5 хитов, будет 27 хитов (5 х 4,5 + 5).
!!!!''Кость хитов в зависимости от размера''
<table>
<tr>
<th>Размер чудовища</th>
<th>Кость Хитов</th>
<th>Среднее число хитов за кость</th>
</tr>
<tr>
<td>Крохотный</td>
<td>к4</td>
<td>2,5</td>
</tr>
<tr>
<td>Маленький</td>
<td>к6</td>
<td>3,5</td>
</tr>
<tr>
<td>Средний</td>
<td>к8</td>
<td>4,5</td>
</tr>
<tr>
<td>Большой</td>
<td>к10</td>
<td>5,5</td>
</tr>
<tr>
<td>Огромный</td>
<td>к12</td>
<td>6,5</td>
</tr>
<tr>
<td>Громадный</td>
<td>к20</td>
<td>10,5</td>
</tr>
</table>
!!!''Шаг 9. Уязвимости, сопротивления и иммунитеты к урону''
Решите, есть ли у чудовища уязвимости, сопротивляемости или иммунитеты к неким видам урона (смотрите описания видов урона в Книге игрока). Давайте уязвимости, сопротивления и иммунитеты только если они очевидны. Например, есть смысл дать чудовищу, состоящему из жидкой лавы, иммунитет к урону огнём.
Выдача сопротивления и иммунитета к одному или нескольким видам урона (особенно, дробящему, колющему и рубящему урону) подобна выдаче дополнительных хитов. Однако искатели приключений на высоких уровнях могут игнорировать такую защиту, так что на высоких уровнях сопротивления и иммунитеты играют меньшую роль.
//''Эффективные хиты.''// Если чудовище обладает сопротивлением или иммунитетом к определённым видам урона — особенно, дробящему, колющему и рубящему урону от немагического оружия — и не все персонажи в отряде смогут противостоять этим особенностям, вам нужно учесть эту защиту при сравнивании хитов чудовища с теми, что соответствуют ожидаемому показателю опасности. Используя приведённую ниже таблицу, примените множитель хитов, чтобы определить эффективные хиты для вычисления итогового показателя опасности (настоящие хиты при этом не меняются).
Например, у чудовища с ожидаемым показателем опасности 6, есть 150 хитов и сопротивление к дробящему, колющему и рубящему урону от немагического оружия. У него будет 225 эффективных хитов (используется множитель 1,5) при определении итогового показателя опасности.
Обычно у чудовищ не бывает уязвимости более чем к двум видам урона. Уязвимости незначительно влияют на показатель опасности чудовища, если только у чудовища нет уязвимости к многочисленным и распространённым видам урона, в частности, дробящему, колющему и рубящему. У такого необычного чудовища эффективных хитов будет вдвое меньше чем настоящих. В таком случае лучше уберите эти уязвимости и просто дайте меньше хитов.
!!!!''Эффективные хиты в зависимости от сопротивлений и иммунитетов''
<table>
<tr>
<th>Ожидаемый показатель опасности</th>
<th>Множитель хитов за сопротивления</th>
<th>Множитель хитов за иммунитеты</th>
</tr>
<tr>
<td>1-4</td>
<td>х 2</td>
<td>х 2</td>
</tr>
<tr>
<td>5-10</td>
<td>х 1,5</td>
<td>х 2</td>
</tr>
<tr>
<td>11-16</td>
<td>х 1,25</td>
<td>х 1,5</td>
</tr>
<tr>
<td>17 или больше</td>
<td>х 1</td>
<td>х 1,25</td>
</tr>
</table>
!!!''Шаг 10. Бонусы атаки''
Бонусы атаки чудовища непосредственно влияют на его показатель опасности и наоборот. Вы можете определить бонусы атаки чудовища одним из двух способов.
://''Используйте таблицу.''// Можете определить бонус атаки для всех атак чудовища, соответствующий ожидаемому показателю опасности, по таблице из предыдущего раздела, невзирая на значения характеристик.
:Вы можете корректировать эти бонусы атаки так, как посчитаете нужным. Например, базовый бонус атаки для чудовища с показателем опасности 1 равен +3, но если вам нужно меткое чудовище, увеличьте его бонус соответствующим образом. Не волнуйтесь, если бонус атаки не будет соответствовать ожидаемому показателю опасности. На показатель опасности влияют и другие факторы, которые будут описаны ниже.
://''Вычислите бонусы атаки.''// В качестве альтернативы, вы можете вычислить бонусы атаки чудовища так же, как игроки вычисляют бонусы атаки для своих персонажей.
:Если у чудовища есть действие, требующее совершения броска атаки, его бонус атаки будет равен его бонусу мастерства + модификатор Силы или Ловкости. Обычно чудовища используют Силу для рукопашных и Ловкость для дальнобойных атак, хотя маленькие чудовища иногда используют для обоих видов атак Ловкость.
:Опять же, не волнуйтесь, если бонус атаки не будет соответствовать ожидаемому показателю опасности. Вы всегда позже сможете скорректировать бонусы атаки чудовища.
!!!''Шаг 11. Урон''
Эффективный урон чудовища — количество урона, причиняемого им каждый раунд — непосредственно влияет на его показатель опасности и наоборот. Вы можете определить эффективный урон чудовища одним из двух способов.
://''Используйте таблицу.''// Можете определить урон чудовища, причиняемый им каждый раунд, соответствующий ожидаемому показателю опасности, по таблице из предыдущего раздела. При этом не важно, как этот урон распределён среди атак; например, у чудовища может быть одна атака, причиняющая такой большой урон, а может быть несколько атак, причиняющий куда меньший урон одному или нескольким врагам.
:Выберите вид урона, зависящий от способа, которым он причиняется. Например, если чудовище атакует острейшими клыками, урон, скорее всего, будет рубящим. Если когти отравлены, часть урона может быть уроном ядом.
:Если хотите, чтобы в разных раундах урон был разным, можете превратить диапазон урона в выражение с использованием костей (для чудовища с одной атакой) или несколько таких выражений (для чудовища с многочисленными атаками). Например, чудовище с показателем опасности 2 причиняет в раунд 15-20 урона. Если у чудовища Сила 18 (модификатор +4), можете дать ему одну рукопашную атаку, причиняющую урон 3к8 + 4 (в среднем 17,5), либо разделить эффективный урон на две отдельные атаки, причиняющие урон 1к10 + 4 (в среднем 9) каждая, либо использовать любую другую комбинацию, в которой средний эффективный урон будет попадать в указанные границы.
://''Зависимость урон от оружия.''// В качестве альтернативы, вы можете использовать выражение с использованием костей, чтобы представить урон, причиняемый чудовищем каждой из своих атак, зависящий при этом от используемого оружия.
:Не волнуйтесь, если эффективный урон не будет соответствовать ожидаемому показателю опасности. На показатель опасности влияют и другие факторы, которые будут описаны ниже, и вы всегда позже сможете скорректировать эффективный урон чудовища.
:Некоторые чудовища используют естественное оружие, такое как когти и жало на хвосте. Другие используют рукотворное оружие.
:Если у чудовища есть природное оружие, вы сами решаете, какой урон оно причиняет этими атаками, а также вид урона. Примеры смотрите в Бестиарии.
:Если чудовище использует рукотворное оружие, оно причиняет урон, соответствующий этому оружию. Например, секира в руках Среднего чудовища причиняет рубящий урон 1к12 плюс модификатор Силы чудовища.
:Крупные чудовища обычно используют увеличенные версии оружия, причиняющие при попадании дополнительную кость урона. Удвойте кость оружия, если существо Большое, утройте, если существо Огромное, или возьмите четыре кости, если существо Громадное. Например, Огромный великан с секирой соответствующего размера причиняет рубящий урон 3к12 (плюс бонус Силы), а не 1к12.
:Существа совершают с помехой броски атаки оружием, предназначенным для более крупного атакующего. Вы можете постановить, что существа вообще не могут использовать оружие, созданное для бойца на две и более категории крупнее.
://''Итоговый эффективный урон.''// Чтобы определить итоговый эффективный урон, сложите вместе средний урон, причиняемый каждой из атак в раунде. Если у чудовища есть разные варианты атак, используйте самые эффективные его атаки. Например, огненный великан может совершить в раунд две атаки двуручным мечом или одну атаку камнем. Атаки двуручным мечом причиняют больше урона, поэтому эффективный урон будет определяться этими атаками.
:Если в каждом раунде эффективный урон варьируется, возьмите урон за три первых раунда сражения и вычислите среднее значение. Например, у молодого белого дракона есть мультиатака (одна атака укусом и две атаки когтями), причиняющая в среднем каждый раунд по 37 урона, а также дыхание, причиняющее урон 45, или 90, если целей будет две (а так, скорее всего, и будет). В первых трёх раундах дракон, скорее всего, один раз использует оружие дыхания, а потом два раза использует мультиатаку, так что средний эффективный урон за три раунда будет равен (90 + 37 + 37) э 3, или 54 урона (после округления в меньшую сторону).
:При вычислении эффективного урона за раунд не забывайте о других причиняющих урон умениях, таких как ауры, реакции, легендарный действия и действия в логове. Например, Огненная аура балора причиняет урон 10 всем существам, которые попадают по нему рукопашными атаками. Эта же аура причиняет урон огнём 10 всем существам в пределах 5 футов от балора в начале каждого хода балора Если предположить, что один член отряда всегда будет в пределах 5 футов от балора, и всегда будет попадать по нему рукопашным оружием, эффективный урон балора в раунд увеличивается на 20.
<<<
!!!''Дополнение к атакам''
У многих чудовищ есть атаки, которые не просто причиняют урон. Вот некоторые эффекты, которые можно добавить к атаке, чтобы получить зрелищные сражения:
* Добавьте к атаке урон другого вида
* Пусть чудовище при попадании возьмёт цель в захват
* Пусть чудовище собьёт цель с ног при попадании
* Цель получит особое состояние, если по ней попадут, и она провалит спасбросок
<<<
!!!''Шаг 12. Сл спасбросков''
У чудовища могут быть атаки и другие особенности, заставляющие цель совершить спасбросок. Сл спасброска для сопротивления таким эффектам непосредственно влияет на его показатель опасности и наоборот. Вы можете определить Сл спасбросков одним из двух способов.
://''Используйте таблицу.''// Можете определить Сл спасбросков, соответствующую ожидаемому показателю опасности, по таблице из предыдущего раздела.
://''Вычислите Сл.''// В качестве альтернативы, вы можете вычислить Сл спасбросков от эффектов чудовища так: 8 + бонус мастерства чудовища + модификатор соответствующей характеристики чудовища. Характеристику вы выбираете сами.
:Например, если эффект — яд, самой подходящей характеристикой будет Телосложение чудовища. Если эффект подобен эффекту заклинания, соответствующей характеристикой может оказаться Интеллект, Мудрость или Харизма.
:Не волнуйтесь, если Сл спасбросков не будет соответствовать ожидаемому показателю опасности. На показатель опасности влияют и другие факторы, которые будут описаны ниже, и вы всегда позже сможете скорректировать Сл спасбросков.
!!!''Шаг 13. Особые действия, реакции и особенности''
Некоторые особенности (такие как Сопротивление магии), особые действия (такие как Превосходная невидимость) и особые реакции (такие как Парирование) улучшают боевую эффективность чудовища и потенциально могут увеличить его показатель опасности.
В представленной ниже таблице приводятся разнообразные умения из Бестиария. Там же указано, какие умения увеличивают эффективный Класс Доспеха существа, хиты, бонусы атаки и эффективный урон для определения показателя опасности (настоящие характеристики эти умения не изменяют). Если умение не влияет на показатель опасности чудовища, в третьей колонке стоит прочерк.
Выдавая чудовищу особенности, действия и реакции, помните, что они нужны далеко не всем. Чем больше вы их добавите, тем более сложным для игры станет чудовище.
//''Врождённое колдовство и Использование заклинаний.''// Влияние, оказываемое этими двумя особенностями на показатель опасности чудовища, зависит от заклинаний, которые чудовище может накладывать. Заклинания, причиняющие больше урона, чем обычные атаки чудовища, а также заклинания, увеличивающие КД и хиты чудовища, нужно принимать в расчёт при определении итогового показателя опасности чудовища. Смотрите информацию по этим двум особенностям во введении Бестиария.
<<Button "$:/Умения чудовищ""Умения чудовищ">>
!!!''Шаг 14. Скорость''
У каждого чудовища есть скорость хождения (у неподвижных она равна 0). Кроме скорости хождения, у чудовища может быть одна или несколько других скоростей, включая скорости копания, лазания, плавания и полёта.
//''Летающее чудовище.''// Увеличьте эффективный Класс Доспеха чудовища на 2 (не настоящий КД), если оно может летать, умеет причинять урон на расстоянии и предполагается показатель опасности не больше 10 (высокоуровневым персонажам проще разобраться с летающими существами).
!!!''Шаг 15. Бонусы спасбросков''
Если вы хотите, чтобы чудовище было невероятно устойчиво к определённым эффектам, можете дать ему бонус к спасброскам, привязанным к конкретным характеристикам.
Бонусы спасбросков лучше всего использовать для нейтрализации низких характеристик. Например, нежити с низкой Мудростью может понадобиться бонус к спасброскам Мудрости, чтобы её было сложнее очаровывать, пугать и изгонять.
Бонус спасброска равен бонусу мастерства чудовища + модификатор его соответствующей характеристики.
Чудовище с тремя и более бонусами спасбросков обладает хорошим преимуществом в защите, поэтому его эффективный КД (не настоящий) должен быть увеличен при определении показателя опасности. Если у него три или четыре бонуса, увеличьте эффективный КД на 2. Если у него пять или больше бонусов, увеличьте эффективный КД на 4.
!!!''Шаг 16. Итоговый показатель опасности''
Теперь у вас есть информация по всем характеристикам, чтобы можно было вычислить итоговый показатель опасности чудовища. Этот шаг идентичен шагу 4 из раздела «быстрое создание характеристик чудовища». Вычислите защитный показатель опасности и атакующий показатель опасности, а среднее число станет итоговым показателем опасности.
!!!''Шаг 17. Бонусы навыков''
Если хотите, чтобы чудовище владело навыком, можете дать ему бонус, равный его бонусу мастерства, к проверкам характеристики, связанной с этим навыком. Например, чудовище с острыми чувствами может обладать бонусом к проверкам Мудрости (Внимательность), а лживое чудовище может обладать бонусом к проверкам Харизмы (Обман).
Вы можете удвоить бонус мастерства, чтобы продемонстрировать несравненные навыки. Например, доппельгангер так хорошо обманывает других, что его бонус к проверкам Харизмы (Обман) равен его удвоенному бонусу мастерства + его модификатор Харизмы.
Бонусы навыков не влияют на показатель опасности чудовища.
!!!''Шаг 18. Иммунитет к состояниям''
У чудовища может быть иммунитет к одному или нескольким негативным состояниям, но эти иммунитеты не влияют на его показатель опасности. Описание состояний смотрите в приложении А Книги игрока.
Так же как иммунитет к урону, иммунитет к состояниям должен быть интуитивным и логичным. Например, есть смысл в том, чтобы каменный голем не становится отравленным, так как у него нет ни нервной системы, ни внутренних органов.
!!!''Шаг 19. Чувства''
У чудовища могут быть следующие особые чувства, описанные в Бестиарии. истинное зрение, слепое зрение, тёмное зрение и чувство вибрации. Владение особыми чувствами не влияет на показатель опасности чудовища.
//''Пассивное значение Внимательности.''// У всех чудовищ есть пассивное значение Мудрости (Внимательность), которое используется при обнаружении приближающихся или скрывающихся врагов. Пассивное значение Мудрости (Внимательность) равно 10 + его модификатор Мудрости. Если чудовище владеет навыком Внимательность, то его пассивное значение равно 10 + бонус Мудрости (Внимательность).
!!!''Шаг 20. Языки''
Владение языками не влияет на показатель опасности чудовища.
Чудовище может говорить на таком количестве языков, сколько нужно вам, хотя мало кто говорит больше чем на двух, а многие чудовища (в частности, звери), вообще не могут говорить. Чудовище, не способное говорить, всё равно может понимать те или иные языки.
//''Телепатия.''// Владение телепатией не влияет на показатель опасности чудовища. Подробности о телепатии смотрите в Бестиарии.
!!__''Блоки статистики ПМ''__
В приложении Б Бестиария есть блоки статистики для распространённых архетипов ПМ, таких как разбойники и стражи, а также подсказки по их модификации. При этом разрешается использовать расовые особенности из Книги игрока, экипировать ПМ магическими предметами и менять им доспехи, оружие и заклинания.
Если хотите взять готовый блок ПМ и адаптировать его для определённой расы, примените модификаторы характеристик и умения из приведённой ниже таблицы. Если изменятся КД, хиты, бонус атаки или урон, пересчитайте показатель опасности.
!!!''Создание ПМ с нуля''
Если вам нужна абсолютно новая статистика для ПМ, у вас есть два варианта:
* Можете создать блок статистики для него (подобный тем, что есть в Бестиарии), как для чудовища, как было объяснено в предыдущем разделе.
* Вы можете создать ПМ как персонажа игрока, по инструкциям из Книги игрока.
Если вы решили создать ПМ как персонажа игрока, можете пропустить этап выбора предыстории и вместо этого выдать ему владение двумя навыками.
!!!!''Умения ПМ''
Таблица «умения ПМ» резюмирует модификаторы характеристик и умения представителей разнообразных рас, а также существ из Бестиария с показателем опасности меньше 1 Примените эти модификаторы и добавьте эти умения к блоку статистики ПМ, а потом определите его показатель опасности, как если бы он был чудовищем. Умения, влияющие на показатель опасности чудовища, описаны в таблице «умения чудовищ». Бонус мастерства ПМ определяется его уровнем, как у персонажа, а не показателем опасности.
Если чудовища, которое вы хотите использовать, нет в этой таблице, используйте процесс, описанные в разделе «чудовища с классами».
<<Button "$:/Умения ПМ""Умения ПМ">>
!!!__''Чудовища с классами''__
Вы можете использовать правила из 3 главы Книги игрока, чтобы дать чудовищу уровни класса. Например, вы можете превратить обычного оборотня в оборотня с 4 уровнями класса варвар (название такого чудовища будет записываться так: «оборотень, варвар 4 уровня»).
Для начала создайте блок статистики чудовища. Чудовище получает классовые умения за те уровни класса, что вы ему даёте, со следующими исключениями:
* Чудовище не получает начальное снаряжение добавляемого класса.
* За каждый добавляемый уровень класса чудовище получает одну Кость Хитов (вид которой зависит от его размера), игнорируя прогрессию Костей Хитов класса.
* Бонус мастерства чудовища зависит от его показателя опасности, а не от уровней класса.
Закончив добавлять уровни класса чудовищу, вы можете скорректировать значения его характеристик, как посчитаете нужным (например, можно увеличить Интеллект, чтобы чудовище было более эффективным волшебником), и внести любые другие исправления. Вам нужно будет пересчитать его показатель опасности, как если бы вы создавали его с нуля.
В зависимости от выбранного чудовища и выданных ему уровней класса, его показатель опасности может измениться очень сильно, а может практически не измениться. Например, оборотень с четырьмя уровнями варвара станет гораздо сильнее, чем раньше. И наоборот, хиты, заклинания и прочие классовые умения, получаемые красным драконом от пяти уровней волшебника, не увеличат его показатель опасности.
!!!''Сокрушитель''
//Оружие (боевой молот), легендарное (требуется настройка дварфом)//
Сокрушитель это мощный боевой молот, выкованный дварфами и утерянный в подземельях горы Белый Шлейф.
Вы получаете бонус +3 к броскам атаки и урона, совершённым этим магическим оружием. На рассвете следующего дня, после того как вы впервые совершите бросок атаки Сокрушителем, у вас развивается боязнь открытого пространства, которая остаётся, пока вы настроены на это оружие. Из-за неё вы совершаете с помехой броски атаки, спасброски и проверки характеристик, если видите дневное небо.
;
://''Метательное оружие.''// У Сокрушителя есть свойство «метательное», его нормальная дистанция — 20 футов, а максимальная дистанция — 60 футов. Если вы попадаете дальнобойной атакой оружием, используя его, цель получает дополнительный дробящий урон 1к8 или 2к8, если цель — великан. Каждый раз, когда вы метаете это оружие, оно после атаки возвращается в вашу руку. Если у вас нет свободной руки, оружие падает у ваших ног.
://''Ударная волна.''// Вы можете действием ударить Сокрушителем о землю, посылая ударную волну. Все существа на ваш выбор, находящиеся в пределах 60 футов от точки удара, должны преуспеть в спасброске Телосложения со Сл 15, иначе они станут ошеломлёнными на 1 минуту. Существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе. После использования, это свойство недоступно до следующего рассвета.
://''Сверхъестественная бдительность.''// Пока вы держите это оружие, оно предупреждает вас о местонахождении всех потайных и скрытых дверей в пределах 30 футов от вас. Кроме того, вы можете действием наложить оружием заклинание обнаружение добра и зла или поиск предмета. Наложив заклинание, вы до следующего рассвета больше не можете накладывать его этим оружием.
:"""//''Разум.''// Сокрушитель — разумное законнонейтральное оружие с Интеллектом 15, Мудростью 12 и Харизмой 15. Он обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие может понимать Великаний, Го-блинский и Дварфский языки, а также говорить и читать на них и телепатически общаться с владельцем. При использовании в сражении он издаёт боевые кличи на Дварфском."""
:"""//''Индивидуальность.''// Предназначение Сокрушителя в уничтожении великанов и гоблиноидов. Он также стремится защищать дварфов от всех врагов. Если владелец отказывается уничтожать гоблинов и великанов или же защищать дварфов, возникает конфликт.
Сокрушитель связан с создавшим его кланом Данкил (клан Могучего Молота). Он хочет вернуться в этот клан. Для защиты этих дварфов он готов вообще на всё.
У молота есть своя тайна. Несколько веков тому назад им владел дварф по имени Ктенмиир, ставший позже вампиром. Его воля была такой сильной, что он использовал Сокрушитель в злых целях, и даже убивал им членов своего клана."""
//8 уровень, Ограждение, Бард/Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность: '' 24 часа
Пока заклинание активно, одно согласное существо, которого вы касаетесь, получает иммунитет к урону психической энергией, и всем эффектам, которые должны чувствовать его эмоции или читать мысли, заклинаниям школы Прорицания и состоянию очарованности. Это заклинание даже помогает от заклинания исполнение желаний, а также от заклинаний и эффектов аналогичной силы, использованных для воздействия на сознание цели или получение от неё информации.
"""Сколько вы помните, в вашей жизни всегда была война. С молодости вы проходили тренировки, учились использовать оружие и доспехи, изучали технику выживания, включая то, как оставаться живым на поле боя. Вы могли быть частью армии страны или отряда наёмников, а может, были местным ополченцем во время войны.
Выбрав эту предысторию, определите вместе с Мастером, в какой военной организации вы состояли, до какого звания вы дослужились, и что вам за это время довелось пережить. Что это было, регулярная армия, городская стража или деревенское ополчение? Это могла быть частная армия наёмников дворянина или самостоятельный бродячий отряд наёмников."""
;
:''Владение навыками:'' Атлетика, Запугивание
:''Владение инструментами:'' Один игровой набор, транспорт (сухопутный)
;
:''Снаряжение:'' Знак отличия, трофей с убитого врага (кинжал, сломанный клинок или кусок знамени), набор игровых костей или колода карт, комплект обычной одежды, поясной кошель с 10 зм
!!!''Специализация''
Будучи солдатом, вы выполняли особую роль. Совершите бросок к8 или выберите один из вариантов из таблицы самостоятельно:
<table>
<tr>
<th>к8</th>
<th>Специализация</th>
<th>к8</th>
<th>Специализация</th>
</tr>
<tr>
<td>1</td>
<td>Офицер</td>
<td>5</td>
<td>Врач</td>
</tr>
<tr>
<td>2</td>
<td>Разведчик</td>
<td>6</td>
<td>Интендант</td>
</tr>
<tr>
<td>3</td>
<td>Пехотинец</td>
<td>7</td>
<td>Знаменосец</td>
</tr>
<tr>
<td>4</td>
<td>Кавалерист</td>
<td>8</td>
<td>Обслуживающий персонал (повар, кузнец, и т. п.)</td>
</tr>
</table>
!!!''Умение: Воинское звание''
Будучи солдатом, вы заслужили звание. Солдаты, верные военной организации, которой вы раньше принадлежали, всё ещё признают вашу власть и влияние, и они подчиняются вам, если их звание ниже вашего. С помощью своего звания вы можете оказывать влияние на других солдат и брать во временное пользование простое снаряжение или лошадей. Возможно, вас пропустят внутрь военного лагеря или крепости, если к вашему званию отнесутся с уважением.
!!!''Персонализация''
Ужасы войны вкупе с жёсткой дисциплиной воинской службы оставляют следы на всех солдатах, формируя их идеалы, создавая привязанности, а также оставляя на них шрамы, как физические, так и ментальные.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я всегда вежлив и почтителен.</td>
</tr>
<tr>
<td>2</td>
<td>Меня терзают воспоминания о войне. Не могу забыть то насилие, что мне довелось увидеть.</td>
</tr>
<tr>
<td>3</td>
<td>Я потерял много друзей, и теперь с трудом завожу новых.</td>
</tr>
<tr>
<td>4</td>
<td>У меня много воодушевляющих и предостерегающих рассказов из военного прошлого, подходящих практически к любой боевой ситуации.</td>
</tr>
<tr>
<td>5</td>
<td>Я могу смотреть прямо на адскую гончую, не отводя глаз.</td>
</tr>
<tr>
<td>6</td>
<td>Мне нравится быть сильным и крушить вещи.</td>
</tr>
<tr>
<td>7</td>
<td>У меня грубое чувство юмора.</td>
</tr>
<tr>
<td>8</td>
<td>Я решаю проблемы прямолинейно. Простое решение — лучший путь к успеху.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Высшее благо. Наш жребий — отдать свои жизни ради других. (Добрый)</td>
</tr>
<tr>
<td>2</td>
<td>Ответственность. Я делаю что должен, и подчиняюсь вышестоящим. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Независимость. Если слепо следовать приказам, попадаешь под пяту тирании. (Хаотичный)</td>
</tr>
<tr>
<td>4</td>
<td>Мощь. В жизни и войне побеждает сильнейший. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Живи и не мешай другим. Идеалы не стоят того, чтобы ради них убивать или воевать. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Нация. Мой город, нация и народ — вот что самое главное. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я по-прежнему готов отдать свою жизнь за тех, кому поклялся служить.</td>
</tr>
<tr>
<td>2</td>
<td>Кое-кто спас мне жизнь на поле боя. С тех пор я никогда не оставляю друзей, оставшихся в бою.</td>
</tr>
<tr>
<td>3</td>
<td>Моя честь — моя жизнь.</td>
</tr>
<tr>
<td>4</td>
<td>Никогда не забуду сокрушительное поражение, которое потерпел наш отряд, или врага, устроившего это.</td>
</tr>
<tr>
<td>5</td>
<td>Те, кто сражаются рядом со мной, достойны того, чтобы за них умереть.</td>
</tr>
<tr>
<td>6</td>
<td>Я сражаюсь за тех, кто не может это сделать сам.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Одно чудовище, с которым мы когда-то сразились, до сих пор заставляет меня дрожать от страха.</td>
</tr>
<tr>
<td>2</td>
<td>Я мало уважаю тех, кто не доказал, что является достойным воителем.</td>
</tr>
<tr>
<td>3</td>
<td>В одном сражении я совершил ужасную ошибку, стоившую жизни многим — и я сделаю что угодно, лишь бы это оставалось в тайне.</td>
</tr>
<tr>
<td>4</td>
<td>Ярость к врагам ослепляет меня и делает безрассудным.</td>
</tr>
<tr>
<td>5</td>
<td>Я подчиняюсь закону, даже если закон вызывает страдания.</td>
</tr>
<tr>
<td>6</td>
<td>Я скорее съем свой доспех, чем признаюсь, что был неправ.</td>
</tr>
</table>
//Оружие (длинный меч), редкое (требуется настройка)//
Этот предмет выглядит как рукоять длинного меча. Держа эту рукоятку, вы можете бонусным действием заставить появиться или исчезнуть клинок из чистого сияния. Пока клинок существует, этот магический длинный меч обладает свойством «фехтовальное». Если вы владеете обращением с короткими или длинными клинками, то вы владеете и обращением с солнечным клинком.
Вы получаете бонус +2 к броскам атаки и урона, совершённым этим оружием, и причиняете не рубящий урон, а урон излучением. Если вы попадаете им по нежити, цель получает дополнительный урон излучением 1к8.
Клинок этого меча испускает яркий свет в радиусе 15 футов и тусклый свет в радиусе ещё 15 футов. Это солнечный свет. Пока клинок существует, вы можете действием увеличить или уменьшить радиус и яркого и тусклого света на 5 футов каждый, с максимумом 30 футов и минимумом 10 футов для каждого.
//6 уровень, Воплощение, Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (60-футовая линия)
:''Компоненты:'' В, С, М (увеличительное стекло)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Луч ярчайшего света исходит из вашей ладони линией шириной 5 футов и длиной 60 футов. Все существа в этой линии должны совершить спасбросок Телосложения. При провале существо получает урон излучением 6к8 и становится ослеплённым до вашего следующего хода. При успехе оно получает половину урона и не ослепляется. Нежить и слизи совершают этот спасбросок с помехой.
Пока заклинание активно, вы можете действием создавать новые линии света.
Пока заклинание активно, в вашей руке светится яркая искра. Она испускает яркий свет в пределах 30 футов и тусклый свет в пределах ещё 30 футов. Это свет идентичен солнечному."""
//8 уровень, Воплощение, Волшебник/Друид/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (огонь и кусочек солнечного камня)
:''Длительность: '' Мгновенная
"""Яркий солнечный свет освещает всё в 60-футовом радиусе с центром на точке, выбранной вами в пределах дистанции. Все существа, находящиеся в нём, должны совершить спасбросок Телосложения. При провале существо получает урон излучением 12к6 и становится ослеплённым на 1 минуту. При успехе оно получает половину урона и не становится ослеплённым. Нежить и слизи совершают этот спасбросок с помехой.
Существо, ослеплённое этим заклинанием, совершает повторные спасброски Телосложения в конце каждого своего хода. В случае успеха оно перестаёт быть ослеплённым.
Это заклинание рассеивает любую тьму в своей области, созданную заклинанием."""
//Заговор, Преобразование, Бард/Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (кусочек медной проволоки)
:''Длительность: '' 1 раунд
"""Вы указываете пальцем на существо, находящееся в пределах дистанции, и шепчете послание. Цель (и только цель) слышит его, и может ответить шёпотом, который услышите только вы.
Вы можете использовать это заклинание сквозь твёрдые препятствия, если вы знакомы с целью и знаете, что она находится за барьером. Магическая тишина, 1 фут камня, 1 дюйм обычного металла, тонкий лист свинца или 3 фута дерева блокируют заклинание. Заклинание не обязано идти по прямой линии, и может огибать углы и проходить через отверстия."""
//Заговор, Ограждение, Друид/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (крошечный плащ)
:''Длительность: '' Концентрация, вплоть до 1 минуты
Вы касаетесь одного согласного существа. Пока заклинание активно, цель может один раз бросить к4 и добавить выпавшее число к одному спасброску на свой выбор. Кость можно кидать до или после спасброска. После этого заклинание оканчивается.
В противоположность подземелью, дикая местность предлагает бессчётное множество вариантов. По бездорожной пустыне или открытому пастбищу искатели приключений могут перемещаться в любом направлении, так как же вам, Мастеру, разобраться со всеми возможными местами и событиями, которые могут произойти в глуши? Что, если вы придумаете сцену в оазисе посреди пустыни, а персонажи пройдут мимо, сбившись с пути? Как избежать скучного перехода по каменной пустоши, в которой ничего не происходит?
Один из вариантов решения данной проблемы — считать дикую местность аналогом подземелья. Даже в самой дикой глуши есть более удобные для перемещения участки. Дороги редко идут прямо — они повторяют контур местности, следуя по самым ровным или удобным местам. Долины и горные хребты направляют путников в определённом направлении. Горные гряды формируют барьеры, пройти через которые можно только по далёкому перевалу. Даже в бездорожной пустыне есть наиболее предпочтительные маршруты, так как исследователи и погонщики караванов знают места, где почва под ногами твёрже, чтобы не идти по песку.
Если отряд сходит с тропы, вы можете переместить запланированные сцены в другое место, чтобы потраченное на подготовку время не было потрачено зря.
В главе 1 описываются основы создания карт дикой местности с тремя разными масштабами, которые помогут вам создать стартовый регион кампании и всю остальную карту. Работая с масштабом области (1 гекс = 1 миля), подумайте об особенностях местности — дорогах, проходах, горных хребтах и долинах — которые могут направлять перемещение персонажей по карте.
!!__''Перемещение по карте''__
Повествуйте о перемещении по дикой местности с уровнем детализации, соответствующим используемой карте. Если вы описываете каждый час путешествия по карте с масштабом области (1 гекс = 1 миля), можете описывать все встреченные поселения. На этом масштабе можете предположить, что персонажи встречают примечательное место при входе в новый гекс, если только это место не скрыто. Персонажам при этом не обязательно оказываться у дверей разрушенного замка, но они могут находить старые дороги, окружающие руины и прочие знаки присутствия чего-то интересного.
Если вы отслеживаете многодневное путешествие по карте с масштабом королевства (1 гекс = 6 миль), не беспокойтесь о деталях, слишком мелких для такой карты. Игрокам достаточно знать, что на третий день путешествия они пересекли реку, потом дорога пошла в гору, и через два дня они достигли горного перевала.
!!__''Особенности дикой местности''__
Карта не будет полной без поселений, крепостей, руин и прочих мест, которые достойны исследования. Дюжины таких мест, распределённых по области примерно 50 миль в поперечнике, будет достаточно.
!!!''Крепости''
Крепости защищают местное население в лихие времена. Количество крепостей зависит от общества, населения, стратегической важности, уязвимости, а также богатства региона.
!!!''Логова чудовищ''
В области примерно 50 миль в поперечнике может находиться примерно шесть логовищ, но не более одного хищника верховного порядка, такого как дракон.
Если вы ожидаете, что персонажи будут исследовать логово, заранее найдите или создайте для него карту как для обычного подземелья.
!!!''Монументы''
В местах, где присутствует или присутствовала цивилизация, искатели приключений могут найти монументы, построенные в честь великих лидеров, богов и культур. Используйте таблицу для вдохновения, или совершите бросок костей, чтобы узнать, на что наткнулись искатели приключений.
{{$:/Монументы}}
!!!''Поселения''
Поселения существуют там, где много пищи, воды, сельхозугодий и строительных материалов. В цивилизованной провинции примерно 50 миль в поперечнике может быть один крупный город, несколько небольших городков, и множество деревень и торговых постов. В нецивилизованных местах может быть один торговый пост на границе с дикой местностью, и никаких более крупных поселений.
В дополнение к поселениям, в окрестностях могут находиться разрушенные деревни и посёлки, которые либо покинуты всеми, либо служат логовами для чудовищ и разбойников.
!!!''Руины''
Развалившиеся башни, древние храмы и разрушенные города — идеальные места для приключений. Кроме того, старая развалившаяся стена, идущая вдоль дороги, осевшая ветряная мельница на холме, и скопище стоящих камней добавят фактуры вашей дикой местности.
!!!''Странные места''
Странные места делают фантастические и сверхъестественные вещи частью ваших приключений.
{{$:/Странные места}}
Каждому подземелью нужна карта, изображающая его структуру. Его местоположение, создатель, предназначение, история и обитатели помогут создать отправную точку в создании карты. Если вам нужно дополнительное вдохновение, можете поискать карты, в большом количестве имеющиеся в Интернете, или даже использовать карты настоящих мест. В качестве альтернативы, можете позаимствовать карту в одном из опубликованных приключений или создать подземный комплекс случайным образом, используя таблицы из приложения А.
Размер подземелья может варьироваться от нескольких комнат разрушенного храма до огромного комплекса комнат и проходов, простирающихся на сотни метров во всех направлениях. Обычно цель искателей приключений находится максимально далеко от входа, заставляя идти дальше и дальше, в сердце комплекса.
Проще всего карту рисовать на миллиметровке, где каждая клетка представляет пространство 10 на 10 футов (если вы играете с миниатюрами, можете выбрать масштаб, где клетка представляет 5 квадратных футов, либо же рисуйте и общую карту и особую, укрупнённую карту отдельно для сражений). Когда вы рисуете карту, помните следующее:
* Асимметричные комнаты и раскладка карты делают подземелье менее предсказуемым.
* Думайте в трёх измерениях. Лестницы, пандусы, платформы, выступы, балконы, ямы и прочие изменения высоты делают подземелье более интересным, а боевые сцены — более сложными.
* Делайте подземелье старым и ветхим. Если не хотите подчеркнуть тот факт, что строители были невероятно опытными, можете разместить обвалившиеся проходы, отрезавшие ранее соединявшиеся части подземелья. Землетрясения в прошлом могут открыть разломы, разделить комнаты и коридоры, а также создать интересные препятствия.
* Внедряйте естественные элементы даже в рукотворные подземелья. Посреди крепости дварфов может течь подземный ручей, из-за которого комнаты будут разного размера и на разных уровнях, а также могут появиться мосты и водостоки.
* Делайте несколько входов и выходов. Ничто не даёт игрокам такого ощущения правильного выбора как наличие нескольких входов в подземелье.
* Добавьте потайные двери и комнаты, чтобы вознаградить игроков, потративших время на их поиски.
Если вам нужна помощь в создании карты подземелья, смотрите приложение А.
!!__''Особенности подземелья''__
Атмосфера и физические характеристики подземелий тоже очень разнообразны. В старом склепе могут быть каменные стены и покосившиеся деревянные двери, запах разложения и отсутствие источников света кроме тех, что принесут искатели приключений. У логова в вулкане могут быть гладкие каменные стены, двери из укреплённой магией латуни, запах серы и освещение от языков пламени.
!!!''Стены''
В некоторых подземельях стены сложены из камней. В других стены из сплошного камня, обтёсанного инструментами или промытого водой или лавой. В «подземельях» над уровнем земли стены могут быть из дерева или других материалов.
Иногда стены украшают росписью, фресками, барельефами и креплениями для освещения, такими как канделябры и кольца для факелов. В некоторых даже есть потайные двери.
!!!''Двери''
Двери в подземелье могут быть встроены в арку или прямоугольный косяк. Они могут быть украшены изображениями горгулий или ухмыляющихся лиц, а могут быть покрыты знаками, намекающими на то, что находится за ними.
;
://''Заклинившие двери.''// Двери в подземельях часто заклинивают от того, что ими не пользуются. Открытие заклинившей двери требует успешной проверки Силы. В главе 8 есть руководство по определению Сл таких проверок.
://''Запертые двери.''// Персонажи без ключа от запертой двери могут вскрыть замок успешной проверкой Ловкости (для этого требуются воровские инструменты и навык владения ими). Они также могут выломать дверь успешной проверкой Силы, разнести её в щепки, причинив достаточно урона, или использовать заклинание открывание или подобную магию. В главе 8 есть руководство по определению Сл проверок и характеристик дверей и подобных предметов.
://''Запертые на засов двери.''// Запертая на засов дверь подобна запертой двери, за исключением того, что нет никакого замка, который можно было бы вскрыть, и дверь нормально открывается с запертой стороны, если действием вынуть засов из скоб по краям двери.
!!!''Потайные двери''
Потайная дверь сконструирована так, чтобы сливаться с окружающей стеной. Иногда присутствие потайной двери выдают трещины в стене или царапины на полу.
;
://''Обнаружение потайной двери.''// Используйте пассивное значение Мудрости (Внимательность) для определения того, заметит ли кто-то из отряда дверь, не ища её активно. Персонажи также могут найти дверь, совершая активные поиски в месте, где замаскирована дверь, преуспев в проверке Мудрости (Внимательность). Для определения Сл проверки смотрите главу 8.
://''Открывание потайной двери.''// После того как потайная дверь обнаружена, может потребоваться успешная проверка Интеллекта (Анализ), чтобы понять, как её открыть, если механизм не очевиден. Определите Сл, пользуясь указаниями из главы 8.
Если искатели приключений не могут понять, как открыть потайную дверь, всегда есть вариант её выломать. Считайте её просто запертой дверью, изготовленной из того же материала, что и окружающая стена, а указания по определению характеристик и Сл проверок есть в главе 8.
!!!''Скрытые двери''
Скрытая дверь это обычная дверь, но скрытая из виду. Потайную дверь тщательно создают, стараясь, чтобы она сливалась с окружением, а скрытая дверь чаще всего заслонена чем-то обыденным. Она может быть закрыта гобеленом, замазана штукатуркой или (в случае скрытого люка) накрыта ковриком. Обычно для обнаружения скрытой двери проверки характеристик не требуются — нужно лишь посмотреть в правильном направлении и совершить нужные действия. Однако вы можете использовать пассивное значение Мудрости (Внимательность) персонажей, чтобы узнать, не заметит ли кто из них следы того, что гобелен или коврик недавно двигали.
!!!''Опускные решётки''
Опускная решётка изготавливается из дерева или железа, и усиливается горизонтальными балками. Она блокирует проход, пока её не поднимут под потолок с помощью ворота и цепи. Главным преимуществом опускной решётки является то, что она, блокируя проход, не мешает стражникам наблюдать за охраняемой территорией и позволяет совершать через неё дальнобойные атаки и накладывать заклинания.
Подъём или опускание решётки воротом совершаются действием. Если персонаж не может дотянуться до ворота (обычно это происходит из-за того, что он находится по другую сторону решётки), подъём решётки или разгибание её прутьев требуют успешной проверки Силы. Сл проверки зависит от размера и веса решётки, а также толщины прутьев. Для определения Сл проверки смотрите главу 8.
!!!''Тьма и свет''
По умолчанию в подземном комплексе, а также комнатах руин царит тьма, но в населённом подземелье могут быть источники света.
В подземных поселениях даже расы с тёмным зрением используют огонь для обогрева, приготовления пищи и обороны. Однако, не всем нужны тепло и свет. Искатели приключений должны принести свои источники света, если они отправляются в пыльный склеп, где на страже стоит только нежить, заброшенные руины, заселённые хищными чудовищами и слизями, или естественные пещеры, где живут безглазые существа.
Свет факела или фонаря поможет персонажам видеть на короткой дистанции, а вот другие существа источник света увидят с гораздо большего расстояния. Яркий свет в окружении полной тьмы виден с расстояния в несколько миль, хотя под землёй редко встретишь такие обширные открытые пространства. Более того, искатели приключений, использующие источники света, часто привлекают чудовищ, так же как элементы подземелья, излучающие свет (от фосфоресцирующих грибов до порталов) привлекают внимание искателей приключений.
!!!''Качество воздуха''
Подземные туннели и руины на поверхности земли чаще всего представляют собой закрытое пространство с плохой вентиляцией. Вряд ли встретишь настолько герметичное подземелье, что искатели приключений будут испытывать трудности с дыханием, но атмосфера там часто тяжёлая и удушливая. Кроме того, запахи, заполняющие подземелье, ощущаются сильнее от неподвижной атмосферы.
!!!''Звуки''
Закрытые подземелья хорошо отражают звук. Скрип открывающейся двери может эхом прокатиться на сотни футов по коридору. Более громкие звуки, такие как стук молотов в кузнице или шум сражения, могут быть слышны во всём подземелье. Многие существа, живущие под землёй, полагаются на звуки при поиске добычи, либо же становятся настороженными, когда слышат звуки вторгшихся искателей приключений.
!!__''Опасности подземелья''__
Описанные ниже опасности это всего лишь примеры того, что можно встретить под землёй и в других тёмных местах. Опасности подземелий функционируют подобно ловушкам, которые описаны в конце этой главы.
;
://''Обнаружение опасности.''// Для обнаружения опасности не требуется проверка, если она не скрыта. Опасность, похожую на что-то безобидное, например, слизь или плесень, можно правильно опознать успешной проверкой Интеллекта (Природа). Используйте советы из главы 8 для определения Сл проверок обнаружения и определения опасности.
://''Степень опасности.''// Для того чтобы определить смертоносность опасности по отношению к персонажам, представьте её в качестве ловушки и сравните причиняемый ей урон с уровнем отряда, используя таблицу «урон в зависимости от уровня» ниже в этой главе (эта таблица также присутствует в главе 8).
!!!''Жёлтая плесень''
Жёлтая плесень растёт в тёмных местах, и один участок покрывает квадратную площадь с длиной стороны 5 футов. Если к плесени прикоснуться, она испускает облако спор, заполняющее куб с длиной ребра 10 футов, исходящий от плесени. Все существа в области спор должны преуспеть в спасброске Телосложения со Сл 15, иначе они получат урон ядом 11 (2к10) и станут отравленными на 1 минуту. Будучи отравленными этими спорами, существо получает урон ядом 5 (1к10) в начале каждого своего хода. Существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе в случае успеха.
Солнечный свет или любой урон огнём мгновенно уничтожает один участок жёлтой плесени.
!!!''Зелёная слизь''
Эта кислотная слизь пожирает при контакте плоть, органические материалы и металл. Она ярко-зелёного цвета, мокрая и склизкая, может покрывать пол, стены и потолок.
Участок зелёной слизи покрывает квадратную площадь с длиной стороны 5 футов, обладает слепым зрением в пределах 30 футов и падает со стен и потолка, если замечает под собой движение. Другими способами перемещения она не обладает. Существо, знающее о присутствии слизи, может избежать прикосновения к ней, совершив успешный спасбросок Ловкости со Сл 10. Никак иначе от падающей слизи не защититься.
Существо, вступившее в контакт с зелёной слизью, получает урон кислотой 5 (1к10). Существо получает этот же урон каждый раз в начале каждого своего хода, пока слизь не будет соскоблена или уничтожена. Дереву и металлу слизь каждый раунд причиняет урон кислотой 11 (2к10), и немагическое деревянное или металлическое оружие или инструмент, использованные для соскабливания слизи, фактически, уничтожаются.
Солнечный свет, все эффекты, лечащие болезни, а также эффекты, причиняющие урон излучением, огнём или холодом, уничтожают участки зелёной слизи.
!!!''Коричневая плесень''
Коричневая плесень питается теплом, вытягивая его из всего, что её окружает. Обычно коричневая плесень покрывает квадратную площадь с длиной стороны 10 футов, и в пределах 30 футов от неё всегда стоит прохлада.
Когда существо впервые за ход оказывается в пределах 5 футов от плесени или начинает здесь ход, оно должно совершить спасбросок Телосложения со Сл 12, получая урон холодом 22 (4к10) при провале, или половину этого урона при успехе.
Коричневая плесень обладает иммунитетом к огню, и если в пределах 5 футов от плесени окажется источник огня, она мгновенно выпускает отростки в сторону этого источника, и покрывает дополнительную квадратную площадь с длиной стороны 10 футов (с источником огня в центре). Коричневая плесень, ставшая целью эффекта, причиняющего урон холодом, мгновенно уничтожается.
!!!''Паутина''
Гигантские пауки ткут толстую липкую паутину в проходах и на дне ям, чтобы ловить добычу. Эти заполненные паутиной участки являются труднопроходимой местностью. Более того, существа, впервые за ход входящие в пространство с паутиной, или начинающие там ход, должны преуспеть в спасброске Ловкости со Сл 12, иначе они станут опутанными паутиной. Опутанное существо может действием попытаться высвободиться, если преуспеет в проверке Силы (Атлетика) или Ловкости (Акробатика) со Сл 12.
У каждого куба с длиной ребра 10 футов гигантской паутины КД 10, 15 хитов, уязвимость к огню и иммунитет к дробящему, колющему урону и урону психической энергией.
Рисуя карту для поселения, не беспокойтесь о расположении каждого здания, и сконцентрируйтесь только основных строениях.
Для деревни сделайте набросок дорог, включая торговые маршруты, ведущие к крупным поселениям, и дороги, соединяющие центр деревни с окрестными фермами. Отметьте центр деревни. Если искатели приключений позже посетят особые места, отметьте их на карте.
Для посёлков и городов отметьте основные дороги и окрестные земли. Сделайте набросок стен и отметьте местоположение достопримечательностей, которые вы считаете важными: крепость мэра, основные храмы, и тому подобное. Для больших городов добавьте внутренние стены и продумайте особенности каждого административного района. Дайте этим районам название, отражающее их суть, которое также определит товары, которыми там торгуют (площадь Дубильщиков, Храмовая улица), географические характеристики (Верхушка Холма, Побережье), или основные здания (квартал Лордов).
//5 уровень, Иллюзия, Волшебник/Чародей//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (крошечный кусочек материи того же вида, из которого вы планируете создать предмет)
:''Длительность: '' Особая
"""Вы зачерпываете теневую материю в Царстве Теней и создаёте в пределах дистанции неживой предмет из растительной материи: ткань, верёвку, дерево, или что-то подобное. Вы также можете этим заклинанием создавать минеральную материю, такую как камни, кристаллы и металлы. Создаваемый предмет должен помещаться в куб с длиной ребра 5 футов, и должен иметь форму и материю, которые вы раньше видели.
Длительность зависит от создаваемого материала. Если предмет составлен из нескольких материалов, используется самая короткая длительность."""
<table>
<tr>
<th>Материал</th>
<th>Длительность</th>
</tr>
<tr>
<td>Растительная материя</td>
<td>1 день</td>
</tr>
<tr>
<td>Камень или кристалл</td>
<td>12 часов</td>
</tr>
<tr>
<td>Драгоценные металлы</td>
<td>1 час</td>
</tr>
<tr>
<td>Драгоценные камни</td>
<td>10 минут</td>
</tr>
<tr>
<td>Адамантин или мифрил</td>
<td>1 минута</td>
</tr>
</table>
Использование материи, созданной этим заклинанием, в качестве материального компонента для другого заклинания, вызывает провал того заклинания.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, длина ребра куба увеличивается на 5 футов за каждый уровень ячейки выше пятого.
//1 уровень, Преобразование, Друид/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (капля воды, если вода создаётся, или несколько песчинок, если вода уничтожается)
:''Длительность: '' Мгновенная
"""Вы либо создаёте, либо уничтожаете воду.
//''Сотворение воды.''// Вы создаёте до 10 галлонов (40 литров) чистой воды в пределах дистанции в открытом контейнере. В качестве альтернативы, вода выпадает дождём в кубе с длиной ребра 30 футов в пределах дальности, туша открытое пламя.
//''Уничтожение воды.''// Вы уничтожаете до 10 галлонов (40 литров) воды в открытом контейнере в пределах дистанции. В качестве альтернативы, вы уничтожаете туман в кубе с длиной ребра 30 футов в пределах дистанции."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, вы создаёте или уничтожаете 10 дополнительных галлонов (40 литров) воды, и длина ребра куба увеличивается на 5 футов за каждый уровень ячейки выше первого.
//6 уровень, Некромантия, Волшебник/Жрец/Колдун//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С, М (глиняный горшок с могильной землёй, глиняный горшок с солоноватой водой и по одному чёрному ониксу стоимостью 150 зм на каждый труп)
:''Длительность: '' Мгновенная
"""Вы можете накладывать это заклинание только ночью. Выберите до трёх трупов гуманоидов Среднего или Маленького размера в пределах дистанции. Все трупы становятся упырями под вашим контролем (параметры этих существ есть у Мастера).
В каждом своём ходу вы можете бонусным действием мысленно приказать любому существу, оживлённому этим заклинанием, если оно находится в пределах 120 футов от вас (если вы контролируете сразу несколько существ, можете отдать одну и ту же команду сразу нескольким из них). Вы решаете, какое действие это существо совершит, и куда оно переместится в свой следующий ход, или же вы можете отдать общий приказ, например, охранять конкретную комнату или коридор. Если вы не отдадите команду, существо будет всего лишь защищаться от врагов. Получив приказ, существо продолжает его выполнять, пока задача не будет выполнена.
Существо находится под вашим контролем 24 часа, после чего перестаёт слушаться команд. Для поддержания контроля ещё на 24 часа вы должны активировать это заклинание на него ещё раз до окончания 24-часового периода. Такое использование заклинания только поддерживает контроль над уже созданными существами, количество которых не может быть больше трёх, и не оживляет новых."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня, вы оживляете или продлеваете контроль над четырьмя упырями. Если вы накладываете это заклинание, используя ячейку 8 уровня, вы оживляете или продлеваете контроль над пятью упырями или двумя вурдалаками или умертвиями. Если вы накладываете это заклинание, используя ячейку 9 уровня, вы оживляете или продлеваете контроль над шестью упырями, тремя вурдалаками или умертвиями, или двумя мумиями.
//3 уровень, Вызов, Жрец/Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность: '' Мгновенная
Вы создаёте 45 фунтов еды и 30 галлонов (100 литров) воды на земле или в контейнере в пределах дистанции, которых достаточно для питания пятнадцати гуманоидов или пятерых скакунов на 24 часа. Еда безвкусная, но сытная, и портится, если её не съесть за 24 часа. Вода чистая, и она не портится.
//Заговор, Вызов, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность: '' 10 минут
"""В вашей ладони появляется мерцающее пламя. Оно остаётся там, пока заклинание активно, и не вредит ни вам, ни вашему снаряжению. Огонь испускает яркий свет в радиусе 10 футов и тусклый свет в пределах ещё 10 футов. Заклинание оканчивается, если вы оканчиваете его действием или накладываете ещё раз.
Вы можете атаковать этим пламенем, но это тоже оканчивает заклинание. Когда вы накладываете это заклинание, или другим действием в одном из последующих ходов вы можете метнуть пламя в существо, находящееся в пределах 30 футов от вас. Совершите дальнобойную атаку заклинанием. При попадании цель получает урон огнём 1к8."""
Урон этого заклинания увеличивается на 1к8, когда вы достигаете 5 уровня (2к8), 11 уровня (3к8) и 17 уровня (4к8).
Во время социального взаимодействия у искателей приключений обычно есть конкретная цель. Они хотят получить информацию, помощь, завоевать чьё-то доверие, избежать наказания или сражения, заключить договор или достичь другой цели. У существ, с которыми они взаимодействуют, тоже есть свои цели.
Некоторые Мастера проводят социальное взаимодействие как отыгрыш в свободной форме, когда кости практически не используются. Другие Мастера предпочитают определять исход совершением проверок Харизмы. Оба подхода прекрасно работают, и большая часть игр проходит где-то между этими двумя крайностями, учитывая как навыки игроков (отыгрыш и убедительность), так и навыки персонажей (отражаются проверками характеристиками).
!!__''Разрешение взаимодействия''__
В Книге игрока приводятся рекомендации по учёту в социальном взаимодействии отыгрыша и проверок характеристик (смотрите в главе 8). В данном же разделе приводится структурированный способ разрешения социального взаимодействия. Большая часть этой структуры не видна для игроков, и он не предназначена для полной замены отыгрыша.
!!!''1 Начальное отношение''
Выберите начальное отношение существа, с которым взаимодействуют искатели приключений: дружелюбное, безразличное или враждебное.
;
://''Дружелюбное''// существо хочет помочь искателям приключений и желает, чтобы у них всё получилось. В задачах и действиях, в которых нет риска, не нужно прикладывать большие усилия и не нужны затраты, дружелюбное существо обычно помогает без вопросов. Если есть небольшой риск, может потребоваться проверка Харизмы, чтобы убедить дружелюбное существо помочь.
://''Безразличное''// существо может помочь отряду, а может и помешать, в зависимости от того, что оно посчитает более выгодным. Безразличие существа не всегда делает его замкнутым и незаинтересованным. Безразличное существо может быть вежливым и добродушным, угрюмым и раздражительным, или каким угодно ещё. Если искатели приключений пытаются убедить безразличное существо сделать что-нибудь, требуется успешная проверка Харизмы.
://''Враждебное''// существо противостоит искателям приключений и их целям, но не обязательно будет нападать при первой же встрече. Например, высокомерный дворянин может хотеть осадить группу искателей приключений, чтобы они не перетягивали на себя внимание короля, и он будет строить козни и интриги, не прибегая к угрозам и насилию. Искателям приключений нужно преуспеть в одной или нескольких сложных проверках Харизмы, чтобы убедить враждебное существо сделать что-нибудь для них. С другой стороны, враждебное существо может так плохо относиться к отряду, что никакая проверка Харизмы не изменит его настрой, и в этом случае все попытки переговоров будут автоматически провалены.
!!!''2. Переговоры''
Отыграйте переговоры. Пусть искатели приключений выскажут свою точку зрения, подобрав слова, имеющие смысл для существа, с которым они взаимодействуют.
;
:"""//''Изменение отношения.''// Отношение существа может меняться во время беседы. Если искатели приключений сделают или скажут правильные вещи (касающиеся идеалов, привязанностей или слабостей), они могут сделать враждебное существо временно безразличным, а безразличное существо временно дружелюбным. Точно так же бестактность, оскорбление или причинение вреда могут сделать дружелюбное существо временно безразличным, а безразличное существо — враждебным.
Изменят ли искатели приключений отношение существа, определяете вы. Вы же решаете, смогли ли искатели приключений сформулировать свои мысли так, чтобы повлиять на собеседника. Обычно отношение существа меняется не более чем на 1 шаг, будь эта перемена хоть временной, хоть постоянной."""
:"""//''Определение характеристик.''// Искатели приключений не всегда начинают социальное взаимодействие, полностью осознавая идеалы, привязанности и слабости собеседника. Если они хотят изменить отношение существа, используя эти характеристики, им для начала нужно определить, что важно для этого существа. Они могут попытаться догадаться, но так они рискуют наоборот, ухудшить отношение, если догадка будет неправильной.
После достаточно долгого для определения черт характера взаимодействия искатель приключений может совершить проверку Мудрости (Проницательность), чтобы узнать одну из социальных характеристик существа. Сл устанавливаете вы. Если результату не хватит до успеха 10 или больше единиц, характеристика может быть определена ошибочно. Например, если у старого мудреца слабость заключается в том, что он предвзято относится к необразованным, искатель приключений, совершивший очень плохую проверку, может подумать, что мудрецу нравится поучать тех, кто чего-то не знает.
Со временем искатели приключений могут узнать социальные характеристики существа из других источников, включая его друзей и союзников, писем и слухов. Заполучить такую информацию можно уже совершенно в других социальных взаимодействиях."""
!!!''3. Проверка Харизмы''
Когда искатели приключений дойдут до сути своей просьбы, требования или предложения — или если вы решите, что разговор окончен — попросите совершить проверку Харизмы. Персонаж, принимавший активное участие в разговоре, может совершить проверку. В зависимости от того, как искатели приключений проводили переговоры, к проверке может применяться навык Убеждение, Обман или Запугивание. Текущее отношение существа определяет Сл получения той или иной реакции, как показано в приведённой ниже таблице.
!!!!''Реакции в переговорах''
<table>
<tr>
<th>Сл</th>
<th>Реакция дружественного существа</th>
</tr>
<tr>
<td>0</td>
<td>Существо выполняет просьбу, если не нужно идти на риск и чем-то жертвовать.</td>
</tr>
<tr>
<td>10</td>
<td>Существо идёт на небольшой риск или жертвует чем-то незначительным.</td>
</tr>
<tr>
<td>20</td>
<td>Существо идёт на большой риск или жертвует чем-то значительным.</td>
</tr>
<tr>
<th>Сл</th>
<th>Реакция безразличного существа</th>
</tr>
<tr>
<td>0</td>
<td>Существо не помогает, но и вредить не будет.</td>
</tr>
<tr>
<td>10</td>
<td>Существо выполняет просьбу, если не нужно идти на риск и чем-то жертвовать.</td>
</tr>
<tr>
<td>20</td>
<td>Существо идёт на небольшой риск или жертвует чем-то незначительным.</td>
</tr>
<tr>
<th>Сл</th>
<th>Реакция враждебного существа</th>
</tr>
<tr>
<td>0</td>
<td>Существо противостоит действиям искателей приключений, и ради этого даже может пойти на риск.</td>
</tr>
<tr>
<td>10</td>
<td>Существо не помогает, но и вредить не будет.</td>
</tr>
<tr>
<td>20</td>
<td>Существо выполняет просьбу, если не нужно идти на риск и чем-то жертвовать.</td>
</tr>
</table>
://''Помощь в проверке.''// Другие персонажи, внёсшие значительный вклад в переговоры, могут помогать персонажу, совершающему проверку. Если помогающий персонаж говорит или делает что-то, что хорошо влияет на взаимодействие, персонаж, совершающий проверку Харизмы, может сделать её с преимуществом. Если другой персонаж нечаянно сказал или сделал что-то оскорбительное, проверка Харизмы совершается с помехой.
://''Многочисленные проверки.''// В некоторых ситуациях может потребоваться несколько проверок, особенно если искатели приключений обсуждают сразу несколько целей.
!!!''4. Повторить?''
После совершения проверки Харизмы дальнейшие попытки оказания влияния на цель могут быть бесплодными, и даже могут разозлить собеседника, потенциально сдвигая отношение в сторону враждебного. Используйте здравый смысл. Например, если плут говорит что-то, что меняет отношение дворянина с безразличного на враждебное, другой персонаж может развеять враждебность хитрым отыгрышем и успешной проверкой Харизмы (Убеждение).
!!__''Отыгрыш''__
У некоторых Мастеров отыгрыш получается вполне естественно. Если вы не из их числа, не волнуйтесь. Ваша основная задача — интересно отыграть ПМ и чудовищ, чтобы удовольствие получили и вы, и ваши игроки. Вы не обязаны быть опытным актёром или комедиантом, чтобы отыграть трагедию или юмор. Важно лишь внимательно относиться к элементам сюжета и образам, вызывающим у игроков смех или сопереживание, и использовать эти элементы в отыгрыше.
!!!''Станьте персонажем''
Представьте, как персонаж или чудовище, которого вы отыгрываете, реагирует на искателей приключений. Подумайте о том, что для него важно. У него есть идеалы, привязанности или слабости? Используя эти элементы, вы не только сделаете персонажа или чудовище более правдоподобным, но и усилите впечатление, что искатели приключений находятся в живом мире.
Вводите реакции и действия, приносящие неожиданные повороты. Например, старуха, чью семью убил злой волшебник, может относиться к волшебнику отряда с огромным подозрением.
Вне зависимости от того, кого вы отыгрываете, персонажа или чудовище, классический совет будет таким: показывайте, а не говорите. Например, вместо того, чтобы описывать ПМ как недалёкого и самовлюблённого, действуйте так, будто вы недалёкий и самовлюблённый. Он может отвечать на вопросы без раздумий, постоянно рассказывать истории о своей жизни и всегда встревать в чужие разговоры, чтобы обсуждали именно его.
!!!''Используйте голос''
Вы будете много говорить на собраниях. Для драматического эффекта будьте готовы прокричать боевой крик или что-то доверительно шептать.
Кроме того, персонажи и чудовища с характерными голосами лучше запоминаются. Если у вас нет врождённого дара пародиста или актёра, берите речевые обороты из жизни, фильмов и телепередач. Пробуйте разные голоса знаменитостей, а потом используйте эти голоса для воплощения своих персонажей.
Экспериментируйте с речевыми оборотами. Например, официантка и городской судья наверняка будут разговаривать по-разному. Точно так же, крестьяне могут говорить косноязычно, а богачи высокомерно и вальяжно. Пусть пират говорит «Ар-р-р, салаги!» голосом Долговязого Джона Сильвера. Пусть разумные чудовища, не знающие Общего языка, мучаются, пытаясь подобрать нужные слова. Пусть пьяницы и чудовища неразборчиво бормочут, а людоящеры шипят.
При взаимодействии с несколькими ПМ искатели приключений должны оставаться в центре внимания. Пусть ПМ говорят с ними, а не друг с другом. При возможности, пусть говорит только один ПМ, но если говорить должны несколько, дайте им разные голоса, чтобы игроки понимали, кто есть кто.
!!!''Используйте лицо и руки''
Показывайте эмоции своих персонажей выражением лица. Хмурьтесь, улыбайтесь, скальтесь, рычите, косите глаза — делайте всё, чтобы игроки запомнили персонажа или чудовище. Если дополните выражение лица необычным голосом, персонаж гарантированно получится запоминающимся.
Вы не обязаны вставать со стула, но можете использовать руки, чтобы воплощать ПМ. Дворянин может рубить воздух ладонью, говоря при этом монотонно и невозмутимо, а архимаг может выражать недовольство закатыванием глаз и массированием висков.
!!!''Вовлекайте игроков''
Некоторым игрокам нравится отыгрывать роль и взаимодействовать больше, чем другим. Какими бы ни были вкусы ваших игроков, ваше реалистичное изображение ПМ и чудовищ вдохновит их тоже вкладываться в отыгрыш своих персонажей. Это сделает социальное взаимодействие шансом для всех глубже погрузиться в игру.
Для того чтобы во время собрания, на котором много времени уделено отыгрышу, всем было чем заняться, попробуйте воспользоваться описанными ниже подходами.
:"""//''Используйте предпочтения игроков.''// Внутри игры существует деятельность, которая одним игрокам нравится больше, чем другим; об этом рассказано во введении к этой книге. Игроки, которые любят отыгрыш, наслаждаются взаимодействием, и они могут стать центром внимания. Они часто вдохновляют других игроков своим примером, но вы всё же убедитесь, что другие игроки тоже получают свою порцию удовольствия.
Игроки, которым нравится исследование и повествование, обычно согласны участвовать в отыгрыше, если он продвигает кампанию вперёд и открывает детали мира. Игроки, которым нравится решать задачи, нравится решать, как правильно ответить, чтобы изменить отношение ПМ. Игрокам-подстрекателям нравится провоцировать ПМ на ответную реакцию, так что их легко втянуть во взаимодействие, хотя это и не будет продуктивным.
Игроки, которым нравится оптимизировать персонажей и убивать чудовищ, нравится спорить, поэтому конфликт во взаимодействии может помочь этим игрокам начать отыгрыш. Однако лучше всего можно занять этих игроков, создавая боевые сцены, служащие продолжением взаимодействия (например, подкупленный визирь может послать за искателями приключений наёмных убийц)."""
:"""//''Цели для конкретных персонажей.''// Создавайте ситуации, в которых персонажи, обычно не участвующие в социальном взаимодействии, могут поучаствовать. Возможно, им встретится член их семьи или связной, который будет говорить только с ними. ПМ определённой расы или класса может прислушиваться только к тем, с кем он чувствует некое родство. Создание атмосферы важности — отличный способ заинтересовать конкретных игроков, но не затмевайте при этом игроков, которые и так хорошо отыгрывают роль.
Если в беседе доминируют лишь несколько персонажей, берите периодически паузы и подключайте других. Вы можете это сделать от лица персонажа: «А что об этом думает твой неуклюжий друг? Говори, варвар! Что ты мне дашь в обмен на моё покровительство?». Или же просто спросите игрока, что делает его персонаж во время беседы. Первый вариант лучше для игроков, которые говорят от лица своих персонажей. Второй вариант лучше для игроков, которым нужен толчок для участия в ролевом действии."""
"""Спасброски отражают вашу попытку сопротивляться заклинанию, ловушке, яду, болезни или другой подобной угрозе. Обычно это не вы решаете совершить спасбросок, а вас заставляют его сделать, когда персонаж получает плохой эффект.
Для совершения спасброска бросьте к20 и добавьте модификатор соответствующей характеристики. Например, при совершении спасброска Ловкости используется модификатор Ловкости.
Спасбросок может быть модифицирован ситуационным бонусом или штрафом, и может совершаться с преимуществом или помехой, на усмотрение Мастера.
Классы дают владение как минимум двумя спасбросками. Волшебник, например, владеет спасбросками Интеллекта. Так же как в случае владения навыками, владение спасброском позволяет персонажу добавлять бонус мастерства к спасброскам соответствующей характеристики. У некоторых чудовищ тоже есть владение спасбросками.
Сл спасброска определяется эффектом. Например, Сл спасброска от заклинания определяется базовой характеристикой заклинателя и его бонусом мастерства.
Результат успешного или проваленного спасброска описан в эффекте, заставляющем совершить спасбросок. Обычно успех означает, что существо не получает урон или получает, но уменьшенный."""
!!!''__Спокойствие разума__''
Начиная с 7 уровня вы можете действием окончить один из действующих на вас эффектов, делающих вас очарованным или испуганным.
//Чудесный предмет, очень редкий//
Эта книга описывает упражнения по координации и сохранении равновесия, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваша Ловкость, а также её максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет.
//Чудесный предмет, очень редкий//
В этом томе находится информация и чары, необходимые для создания конкретного вида голема. Мастер сам выбирает вид голема или определяет его случайным образом. Для того чтобы расшифровать и использовать справочник, вы должны быть заклинателем с как минимум двумя ячейками заклинаний 5 уровня. Существо, которое не может использовать справочник по големам, но читает его, получает урон психической энергией 6к6.
<table>
<tr>
<th>к20</th>
<th>Голем</th>
<th>Время</th>
<th>Стоимость</th>
</tr>
<tr>
<td>1-5</td>
<td>Глиняный</td>
<td>30 дней</td>
<td>65000 зм</td>
</tr>
<tr>
<td>6</td>
<td>Железный</td>
<td>20 дней</td>
<td>1100000 зм</td>
</tr>
<tr>
<td>7-8</td>
<td>Каменный</td>
<td>90 дней</td>
<td>80000 зм</td>
</tr>
<tr>
<td>9-20</td>
<td>Мясной</td>
<td>60 дней</td>
<td>50000 зм</td>
</tr>
</table>
Для того чтобы создать голема, вы должны потратить время, указанное в таблице, работая без перерывов со справочником в руке, отдыхая не более 8 часов в день. Вы также должны оплатить указанную стоимость, приобретая расходные материалы.
После того как голем создан, книга исчезает в магическом пламени. Голем оживает, когда его натрут пеплом справочника. Он находится под вашим контролем, понимает ваши устные команды и выполняет их. Игровые характеристики смотрите в Бестиарии.
//Чудесный предмет, очень редкий//
Эта книга описывает упражнения по физкультуре, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваша Сила, а также её максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет.
//Чудесный предмет, очень редкий//
Эта книга содержит советы по здоровью и питанию, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваше Телосложение, а также его максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет.
Этот раздел основан на правилах сражения из Книги игрока и предлагает подсказки по ведению игры во время сражения.
!!__''Отслеживание инициативы''__
Вы можете использовать разные методы отслеживания того, кто за кем действует в сражении.
!!!''Скрытый список''
Многие Мастера отслеживают инициативу списком, невидимым для игроков; обычно на бумаге за ширмой или в таблице на компьютере. Этот метод позволит вам отслеживать участников сражения, которые пока не появились на поле боя, и в этом же списке вы можете отслеживать текущие хиты чудовищ, а также вести полезные заметки.
Недостатком этого метода является то, что вам придётся постоянно напоминать игрокам, чей ход будет следующим.
!!!''Видимый список''
Вы можете отслеживать инициативу на стенде, чтобы её было видно всем. После того как игроки скажут свои значения инициативы, запишите их в порядке убывания, оставляя пространство после каждого имени. Инициативу чудовищ или запишите сразу же или добавляйте в момент начала их первого хода.
Эту идею можно развить дальше, используя магниты с именами персонажей и чудовищ на них или на карточках, которые эти магниты будут держать.
Видимый список позволит всем видеть порядок ходов. Игроки будут знать, что приближается их ход, и они могут заранее планировать свои действия. Видимый список также показывает, когда именно будут ходить чудовища.
В качестве альтернативы можете назначить одного игрока ответственным за отслеживание инициативы, либо на стенде, либо на бумаге, но так, чтобы список видели все игроки. Этот метод уменьшит число элементов, которое необходимо отслеживать вам.
!!!''Карточки''
При таком подходе у каждого персонажа, а также у каждой группы идентичных чудовищ есть своя карточка. Когда игрок сообщает свою инициативу, запишите её на карточке его персонажа. Сделайте то же самое для чудовищ. Затем отсортируйте карточки в порядке уменьшения инициативы и берите карты сверху, складывая тех, что совершили ход, вниз стопки. Назвав того, чей ход наступает, назовите и следующего, чтобы он мог приготовить свой ход. После того как все персонажи и чудовища совершат свои ходы, колода вернётся в исходное состояние.
Вначале игроки не будут знать порядок ходов, а также моменты, в которых в сражение будут вступать чудовища.
!!__''Отслеживание хитов чудовищ''__
Во время боевой сцены вам нужно отслеживать, сколько урона получило каждое из чудовищ. Большинство Мастеров отслеживает полученный урон тайком, чтобы игроки не знали, сколько хитов осталось у врагов. Вы сами решаете, вести ли записи тайком. Самое главное здесь отслеживать хиты каждого чудовища отдельно от других.
Отследить урон, полученный одним-двумя чудовищами легко, но для больших групп чудовищ пригодится система. Если вы не используете миниатюры или другой реквизит, нужно дать чудовищам характерные отличия. Опишите их как «огр с жутким шрамом» и «огр в рогатом шлеме», и вы с игроками всегда сможете отличить одного от другого. Представьте, например, что вы ведёте сцену с тремя ограми, у каждого из которых по 59 хитов. После того, как инициатива определена, выпишите хиты каждого огра с указанием заметок (или их именами, если хотите), чтобы отличать одного от другого:
:Крэг (огр со шрамом): 59
:Тод (огр в шлеме): 59
:Мур (огр, воняющий дерьмом): 59
Если вы используете миниатюры, проще всего дать каждому чудовищу свою уникальную фигурку. Если миниатюры все одинаковые, можете пометить их наклейками разного цвета или наклейками с буквами или цифрами.
Например, в боевой сцене с тремя ограми у вас может быть три одинаковые миниатюры огров с наклейками А, Б и В, соответственно. Для отслеживания их хитов выпишите их, и уменьшайте хиты по мере получения урона. Через несколько раундов сражения ваши заметки могут выглядеть примерно так:
:Огр А: ~~59~~ ~~53~~ ~~45~~ ~~24~~ ~~14~~ ~~9~~ мёртв
:Огр Б: ~~59~~ ~~31~~ 30
:Огр В: 59
Игроки часто спрашивают, насколько ранены чудовища. Вы не обязаны сообщать точное количество оставшихся хитов, но у чудовища, у которого хитов меньше половины от максимума, могут быть видимые раны и все признаки усталости. Можете описать такое чудовище как окровавленное, тогда у игроков появится ощущение, что они сражаются со стойким противником, и они смогут правильно распорядиться самыми сильными заклинаниями и умениями.
!!__''Использование и отслеживание состояний''__
Разнообразные правила и умения чётко дают понять, какое состояние накладывается на существо. Вы можете также накладывать состояния импровизированно. В этом нет ничего сложного. Например, если персонаж спит, он явно лишён сознания, поэтому вы можете считать, что он сейчас бессознательный. А если персонаж упал и растянулся на земле? Он теперь сбит с ног.
Отслеживать состояния может быть труднее. Для чудовищ состояния проще всего отслеживать на боевых карточках или там, где вы отслеживаете их инициативу. Игроки сами должны помнить состояния, действующие на их персонажей. Игроки могут умышленно или непреднамеренно забывать негативные состояния, поэтому их тоже можно отмечать на боевых карточках или стенде.
Вы можете также заготовить стопку карт с описанием состояний. Выдавайте эти карты игрокам, когда состояние вступает в силу. Если у игрока на листе будет лежать ярко-розовая карточка, он уже не забудет, что его персонаж очарован или испуган.
!!__''Чудовища и критические попадания''__
Чудовища используют те же самые правила критических попаданий, что и персонажи игроков. Если вы используете средние значения урона, не определяя их каждый раз броском костей, вы можете задаться вопросом, как быть в таком случае. Если чудовище совершило критическое попадание, бросьте все кости урона, связанные с этим попаданием, и добавьте их к среднему урону. Например, если обычно гоблин причиняет при попадании рубящий урон 5 (1к6 + 2), при критическом попадании он причинит рубящий урон 5 + 1к6.
!!__''Импровизированный урон''__
Обычно у чудовищ и эффектов чётко прописано, какой урон они причиняют. Однако в некоторых ситуациях вам нужно будет определить урон на лету. В таблице ниже приводятся некоторые рекомендации.
!!!!''Импровизированный урон''
<table>
<tr>
<th>Кости</th>
<th>Примеры</th>
</tr>
<tr>
<td>1к10</td>
<td>Ожог от углей, падение книжной полки, укол отравленной иглы</td>
</tr>
<tr>
<td>2к10</td>
<td>Удар молнии, падение в костёр</td>
</tr>
<tr>
<td>4к10</td>
<td>Удар валунами в рушащемся туннеле, падение в чан с кислотой</td>
</tr>
<tr>
<td>10к10</td>
<td>Стискивание сжимающимися стенами, попадание вращающимся клинком, хождение по раскалённой лаве</td>
</tr>
<tr>
<td>18к10</td>
<td>Полное погружение в лаву, падение летающей крепости</td>
</tr>
<tr>
<td>24к10</td>
<td>Попадание в огненный вихрь на Стихийном Плане Огня, стискивание челюстей богоподобного существа или чудовища размером с луну</td>
</tr>
</table>
В приведённой ниже таблице указаны числа урона, по-разному опасные для персонажей разных уровней. Зная уровень отряда и урон, который вы собираетесь причинить, вы сможете понять, насколько он будет опасен.
!!!!''Опасность урона в зависимости от уровня''
<table>
<tr>
<th>Уровень персонажа</th>
<th>Неудобство</th>
<th>Опасность</th>
<th>Смертельная опасность</th>
</tr>
<tr>
<td>1-4</td>
<td>1к10</td>
<td>2к10</td>
<td>4к10</td>
</tr>
<tr>
<td>5-10</td>
<td>2к10</td>
<td>4к10</td>
<td>10к10</td>
</tr>
<tr>
<td>11-16</td>
<td>4к10</td>
<td>10к10</td>
<td>18к10</td>
</tr>
<tr>
<td>17-20</td>
<td>10к10</td>
<td>18к10</td>
<td>24к10</td>
</tr>
</table>
Урон, способный вызвать //''неудобство''//, редко угрожает смертью персонажам указанного уровня, но ослабленные персонажи могут всё же умереть, получив такой урон.
//''Опасный''// урон является значительной угрозой ослабленным персонажам и может убить персонажа указанного уровня, если он уже потерял часть хитов.
//''Смертельно опасный''// урон может легко опустить хиты персонажа указанного уровня до 0. Такой урон может убить даже сильного персонажа, если он уже ранен.
!!__''Оценка области воздействия''__
Многие заклинания и умения создают области воздействия, такие как конусы и сферы. Если вы не используете миниатюры и прочий реквизит, может быть сложно определить, кто попал в область воздействия, а кто — нет. В такой ситуации проще всего прислушаться к внутреннему голосу и принять решение.
Если вам нужны чёткие инструкции, попробуйте воспользоваться приведённой ниже таблицей. Для этого представьте, какие участники сражения возле кого находятся, и пусть таблица покажет, сколько существ попало в область воздействия. Увеличивайте или уменьшайте это число в зависимости от скученности толпы. Вы можете бросить 1к3, чтобы определить, на сколько уменьшить или увеличить количество целей.
!!!!''Цели в области воздействия''
<table>
<tr>
<th>Область</th>
<th>Число целей</th>
</tr>
<tr>
<td>Конус</td>
<td>Размер ÷ 10 (округляя в большую сторону)</td>
</tr>
<tr>
<td>Куб или квадрат</td>
<td>Размер ÷ 5 (округляя в большую сторону)</td>
</tr>
<tr>
<td>Линия</td>
<td>Длина ÷ 30 (округляя в большую сторону)</td>
</tr>
<tr>
<td>Сфера или круг</td>
<td>Радиус ÷ 5 (округляя в большую сторону)</td>
</tr>
<tr>
<td>Цилиндр</td>
<td>Радиус ÷ 5 (округляя в большую сторону)</td>
</tr>
</table>
Например, если волшебник направляет огненные ладони (15-футовый конус) на группу орков, вы с помощью таблицы можете сказать, что целями стали два орка (15 делится на 10 и округляется до 2). Чародей может направить молнию (100-футовую линию) на огров и гоблинов, а вы с помощью таблицы скажете, что целями стали четыре чудовища (100 делится на 30 и округляется до 4).
Этот приём направлен на упрощение, а не на достоверность. Если вам хочется больше тактической составляющей, используйте миниатюры.
!!__''Управление толпами''__
Если в сражении участвует очень много чудовищ, оно может затянуться. Если бойцов очень много, вы можете ускорить игру, отказавшись от бросков атаки в пользу примерного числа попаданий, необходимого большой группе чудовищ для воздействия на цель.
Вместо совершения бросков атаки определите, какое минимальное число должно выпасть на к20, чтобы существо попало по цели, вычтя его бонус атаки из КД цели. К этому значению вы ещё будете периодически возвращаться, поэтому лучше сразу запишите его.
Посмотрите на первую колонку приведённой ниже таблицы. В колонке напротив вы увидите, сколько существ должно быть, чтобы одно из них попало. Если такое количество существ набирается, их совместные усилия приводят к тому, что один из них попадает по цели.
Например, восемь орков окружили воина. Их бонус атаки равен +5, а КД воина равен 19. Оркам нужно 14 или выше, чтобы попасть по воину. Согласно таблице, за каждые три орка, один из них будет попадать. Орков достаточно для составления двух групп по три орка. Оставшиеся два орка не будут попадать по воину.
Если атакующие существа причиняют разное число урона, считайте, что попали существа, причиняющие больше урона. Если у попавшего существа есть несколько атак с одним и тем же бонусом атаки, считается, что оно попало по одному разу каждой такой атакой. Если у атак существа разные бонусы атаки, каждую атаку отслеживайте отдельно.
Эта система совершения атак игнорирует критические попадания, но зато уменьшает число бросков костей. Как только число участников сражения уменьшится до приемлемых размеров, вернитесь к индивидуальным броскам костей, чтобы избежать ситуации, когда одна из сторон просто не сможет попадать по другой.
!!!!''Атака толпы''
<table>
<tr>
<th>Требуемый результат к20</th>
<th>Требуемое число атакующих для попадания одного</th>
</tr>
<tr>
<td>1-5</td>
<td>1</td>
</tr>
<tr>
<td>6-12</td>
<td>2</td>
</tr>
<tr>
<td>13-14</td>
<td>3</td>
</tr>
<tr>
<td>15-16</td>
<td>4</td>
</tr>
<tr>
<td>17-18</td>
<td>5</td>
</tr>
<tr>
<td>19</td>
<td>10</td>
</tr>
<tr>
<td>20</td>
<td>20</td>
</tr>
</table>
!!__''Использование миниатюр''__
В сражении игроки часто полагаются на ваше описание, чтобы представить, как расположены их персонажи относительно окружения и врагов. Однако сложные сражения проще провести с наглядными пособиями, и чаще всего используются миниатюры и разделённое на ячейки поле боя. Если вам нравится конструировать ландшафт, постройте трёхмерное подземелье или нарисуйте карты на больших ламинированных листах, а также попробуйте использовать миниатюры.
В Книге игрока приводятся простые правила по изображению сражений с помощью миниатюр на поле боя. Данный раздел расширяет те материалы.
!!!''Тактические карты''
Вы можете нарисовать тактическую карту стираемыми разноцветными маркерами на ламинированном поле с клетками в 1 дюйм, на большом листе бумаги или другой плоской поверхности. Можете также использовать готовые карты большого размера, карты, сложенные из картонных заготовок, или местность, слепленную из пластилина.
Чаще всего для тактических карт используются 5-футовые клетки, и такие карты легко найти или создать самому. Более того, можете обойтись вообще без клеток, а мерять расстояние рулеткой, линейкой или заготовками проволоки определённой длины. Альтернативный вариант — покрыть местность 1-дюймовыми шестиугольниками (также называемыми гексами), которые объединяют простоту подсчёта расстояния квадратных клеток с более гибкими перемещениями при отсутствии клеток. Однако на карте с гексами сложно размещать прямые стены коридоров и прямые углы.
!!!''Размер существ на клетках и гексах''
От размера существа зависит то, какое пространства оно будет занимать в клетках или гексах, как показано в приведённой ниже таблице. Если миниатюра, которой вы изображаете чудовище, занимает иное пространство, в этом нет ничего страшного, но считайте, что для всех правил существо занимает то количество клеток, которое должно занимать. Например, вы можете миниатюрой с Большим основанием изобразить Огромного великана. На поле боя он будет занимать меньше места, но для всех правил, например, для попыток захвата, он всё равно будет считаться Огромным.
Размер существ и занимаемое пространство
<table>
<tr>
<th>Размер</th>
<th>Пространство: Клетки</th>
<th>Пространство: Гексы</th>
</tr>
<tr>
<td>Крохотный</td>
<td>4 в одной клетке</td>
<td>4 в гексе</td>
</tr>
<tr>
<td>Маленький</td>
<td>1 клетка</td>
<td>1 гекс</td>
</tr>
<tr>
<td>Средний</td>
<td>1 клетка</td>
<td>1 гекс</td>
</tr>
<tr>
<td>Большой</td>
<td>4 клетки (2 х 2)</td>
<td>3 гекса</td>
</tr>
<tr>
<td>Огромный</td>
<td>9 клеток (3 х 3)</td>
<td>7 гексов</td>
</tr>
<tr>
<td>Громадный</td>
<td>16 клеток (4 х 4) или больше</td>
<td>12 гексов или больше</td>
</tr>
</table>
!!!''Область воздействия''
Область воздействия заклинания или умения можно конвертировать в клетки или гексы, чтобы определить, сколько потенциальных жертв присутствует в области.
Возьмите за исходную точку пересечение клеток или гексов, затем следуйте обычным правилам. Если область воздействия круглая и занимает как минимум половину клетки, она действует на эту клетку.
!!!''Линия обзора''
Для того чтобы точно определить, есть ли линия обзора между двумя пространствами, выберите угол одного пространства и проведите воображаемую линию от этого угла до всех частей другого пространства. Если как минимум одна такая линия не блокируется предметом или эффектом, блокирующим обзор, таким как каменная стена, толстый занавес или густой туман, и даже не касается его, то линия обзора есть.
!!!''Укрытие''
Для того чтобы определить, есть ли у цели укрытие от атаки или другого эффекта на поле боя, выберите угол пространства атакующего или исходную точку области воздействия. После этого проведите воображаемые линии от этого угла до всех углов одной любой клетки, занимаемой целью. Если одна или две линии блокируются препятствием (включая других существ), у цели есть укрытие на половину. Если три или четыре таких линии заблокированы, но атака всё равно может достичь цели (например, если цель стоит сразу за бойницей), у цели есть укрытие на три четверти.
При использовании гексов процедура та же самая, и линии рисуются между углами шестиугольников. У цели есть укрытие на половину, если препятствие блокирует вплоть до трёх линий, и укрытие на три четверти, если перекрыты четыре и более линии, но атака всё равно может достичь цели.
!!!''Опциональное правило: Окружение''
Если вы регулярно используете миниатюры, окружение даёт участникам сражения простой способ совершать броски атаки с преимуществом по общему врагу.
Существо не может окружать врага, если не видит его. Существо также не участвует в окружении, если оно недееспособно. Существо Большого или ещё большего размера окружает, если как минимум одна клетка или гекс его пространства участвуют в окружении.
:"""//''Окружение на клетках.''// Если существо и как минимум один его союзник смежны с врагом и находятся на противоположных сторонах или углах пространства врага, они окружают этого врага, и каждый из них совершает броски рукопашной атаки по этому врагу с преимуществом.
Если сомневаетесь в том, окружают ли два существа врага на поле, проведите воображаемую линию между центрами пространств существ.
Если эта линия пересекает противоположные стороны или углы пространства врага, этот враг окружён."""
:"""//''Окружение на гексах.''// Если существо и как минимум один его союзник смежны с врагом и находятся на противоположных сторонах пространства врага, они окружают этого врага, и каждый из них совершает броски рукопашной атаки по этому врагу с преимуществом. При использовании гексов посчитайте расстояние вокруг врага между существом и помогающим окружать союзником. При окружении существа Среднего и меньших размеров союзники окружают, если между ними есть 2 гекса. При окружении Большого существа союзники окружают, если между ними есть 4 гекса. При окружении Огромного существа между ними должно быть 5 гексов. Против Громадного существа между ними должно быть как минимум 6 гексов."""
!!!''Опциональное правило: Диагонали''
В Книге игрока приводится простой метод учёта перемещения и измерения расстояния на поле боя: считайте все клетки за 5 футов, даже если перемещаетесь по диагонали. Так будет проще играть, но ломаются законы геометрии и появляются неточности на больших расстояниях. Это опциональное правило увеличивает реализм, но в сражении придётся вести больше подсчётов.
При подсчёте расстояния или перемещении по диагонали на поле боя первая диагональная клетка считается за 5 футов, но вторая диагональная клетка считается за 10 футов. Эта схема «5 футов, потом 10 футов» повторяется и в дальнейшем, даже если между диагональными перемещениями вы какое-то расстояние перемещаетесь ровно по горизонтали или диагонали. Например, персонаж может переместиться на одну клетку по диагонали (5 футов), потом прямо на три клетки (15 футов), а потом снова по диагонали (10 футов) получая в итоге 30 футов перемещения.
!!!''Опциональное правило: Направление взгляда''
Если вы хотите достоверно знать, в какую сторону направлено существо, попробуйте использовать это опциональное правило.
Каждый раз, когда существо заканчивает перемещение, оно может изменить своё направление. У каждого существа есть передний сектор (направление, в котором оно смотрит), левый и правый боковые секторы, и задний сектор. Существо также может изменить направление реакцией, когда перемещается другое существо.
Существо может нормально нацеливаться только на существ, находящихся в переднем или боковых секторах. Оно ничего не видит в заднем секторе. Это означает, что тот, кто атакует, находясь в заднем секторе существа, совершает бросок атаки с преимуществом.
Щит даёт бонус к КД только от атак из переднего сектора и того бокового сектора, в котором находится щит. Например, воин со щитом в левой руке использует его только против атак из переднего и левого секторов.
Вы можете решить, что не у всех существ есть все виды секторов. Например, у аморфного золотистого студня все секторы могут быть передними, а у гидры могут быть три передних сектора и один задний.
При использовании клеток выберите одну сторону существа в качестве направления, в котором оно смотрит. Нарисуйте диагональные линии наружу из обоих углов этой стороны, чтобы определить клетки переднего сектора. Противоположная сторона его пространства точно также формирует задний сектор. Оставшееся пространство будет боковыми секторами.
При использовании гексов определение переднего, заднего и боковых секторов происходит сложнее. Выберите одну сторону пространства существа и создайте исходящую оттуда клиновидную область переднего сектора, а на противоположной стороне его пространства создайте задний сектор. Оставшееся пространство будет боковыми секторами.
Клетки и гексы могут принадлежать сразу двум секторам, в зависимости от того, как вы провели линии из пространства существа. Если в секторе находится больше половины клетки или гекса, клетка или гекс принадлежит этому сектору. Если клетка или гекс поделены ровно пополам, используйте следующее правило: если половина принадлежит переднему сектору, вся клетка или гекс принадлежат ему. Если половинка принадлежит и боковому и заднему сектору, то вся клетка или гекс принадлежит боковому сектору.
!!__''Очерёдность реакции''__
Обычно участники сражения совершают реакцией провоцированные атаки и действие Подготовка. Разнообразные заклинания и умения дают существу дополнительные варианты использования реакции, и иногда трудно правильно оценить очерёдность реакций. В первую очередь смотрите на описание реакции. Например, в описании провоцированной атаки и заклинания щит чётко указано, что они прерывают действие, которое вызвало их срабатывание. Если в описании реакции ничего не сказано про очерёдность, или оно размыто, реакция произойдёт после того, как закончится вызвавшее её срабатывание условие, как в случае действия Подготовка.
!!__''Комбинирование эффектов''__
На существо могут действовать сразу несколько игровых эффектов. Однако, если у двух и более игровых эффектов одно и то же название, то применяется только самый мощный из них, хотя отслеживается длительность каждого из них. Например, если цель воспламенилась от особенности огненного элементаля Огненное тело, то получаемый ей продолжительный урон огнём не увеличивается, если эта цель станет жертвой этой особенности ещё раз. Игровыми эффектами считаются заклинания, классовые умения, черты, расовые особенности, умения чудовищ и магические предметы. Смотрите также соответствующее правило в разделе «Объединение магических эффектов» 10 главы Книги игрока.
"""Рыцарь, скачущий на боевом коне, волшебник, накладывающий заклинания со спины грифона, жрец, парящий в небесах на пегасе — все они пользуются преимуществами в скорости и мобильности, предоставляемыми скакунами.
Согласное существо, чей размер как минимум на одну категорию больше вашего, и обладающее подходящей анатомией, может служить скакуном, используя следующие правила:"""
!!!__''Посадка в седло и спешивание''__
"""Один раз во время перемещения вы можете сесть в седло существа, находящегося в пределах 5 футов от вас или наоборот, спешиться. Это стоит количество перемещения, равного половине скорости. Например, если ваша скорость 30 футов, вы должны потратить 15 футов перемещения на посадку в седло лошади. Кроме того, вы не можете сесть в седло, если у вас осталось меньше 15 футов перемещения или если ваша скорость равна 0.
Если некий эффект перемещает вашего скакуна против его воли, пока вы находитесь на нём, вы должны преуспеть в спасброске Ловкости со Сл 10, иначе вы упадёте со скакуна, падая ничком в пространстве в пределах 5 футов от него. Если вас собьют с ног, пока вы находитесь верхом, вы должны совершить этот же спасбросок.
Если ваш скакун сбивается с ног, вы можете реакцией спешиться и приземлиться на ноги. В противном случае вы спешиваетесь и падаете ничком в пространстве в пределах 5 футов от скакуна."""
!!!__''Контролирование скакуна''__
"""Пока вы находитесь верхом, у вас есть два варианта. Вы можете либо контролировать скакуна, либо позволить ему действовать независимо. Разумные существа, такие как драконы, действуют независимо.
Вы можете контролировать скакуна только если он обучен принимать всадника. Подразумевается, что домашние лошади, ослы и подобные животные уже прошли такое обучение. Инициатива контролируемого скакуна совпадает с вашей, пока вы скачете на нём. Оно перемещается так, как выберете вы, и у него есть только три варианта действий: Отход, Рывок и Уклонение. Контролируемый скакун может перемещаться и действовать даже в том ходу, на котором вы взобрались на него.
Независимый скакун сохраняет своё место в порядке инициативы. Всадник при этом не ограничивает действия скакуна и он перемещается и действует как пожелает. Он может сбежать из сражения, ринуться в атаку и сожрать раненого врага, или как-то иначе подействовать против вашей воли.
В любом случае, если ваш скакун провоцирует атаку, атакующий может нацелиться или на вас, или на скакуна."""
Статисты это персонажи и существа на заднем фоне, с которыми персонажи взаимодействуют редко, если вообще замечают их.
Статисты могут занять более важные роли, если искатели приключений их заметят. Например, игрок может ухватиться за ваше описание проходящего мимо оборванца и попытаться завязать с ним беседу. Так статист внезапно становится центральной фигурой импровизированной ролевой сцены.
Если статисты будут использоваться, будьте готовы дать им на ходу имена и манеры. В крайнем случае, можете взять расовые имена из 2 главы Книги игрока.
//Чудесный предмет, редкость зависит от статуэтки//
Статуэтка чудесной силы это небольшая статуэтка зверя, помещающаяся в карман. Если вы действием произнесёте командное слово и бросите статуэтку на расстояние до 60 футов, статуэтка станет живым существом.
Если пространство, в котором существо должно появиться, занято другим существом или предметом, или если для этого существа просто нет пространства, статуэтка не становится существом.
Существо дружественно по отношению к вам и вашим спутникам. Оно понимает ваши языки и подчиняется устным командам. Если вы не отдаёте команды, существо обороняется, но других действий не совершает. Смотрите статистику всех существ кроме гигантской мухи в Бестиарии.
Животное существует в течение времени, зависящего от вида статуэтки. В конце этого периода животное вновь становится статуэткой. Оно становится статуэткой преждевременно, если его хиты опускаются до 0, или если вы действием произнесёте командное слово, касаясь его. Когда существо становится статуэткой, её свойства нельзя использовать повторно, пока не пройдёт определённое количество времени, специфичное для каждой статуэтки.
;
://''Бронзовый грифон (редкая).''// Эта бронзовая статуэтка грифона, стоящего на задних лапах. Она становится грифоном на 6 часов. Её нельзя использовать повторно, пока не пройдёт 5 дней.
://''Золотые львы (редкая).''// Эти золотые статуэтки львов всегда создаются парами. Вы можете использовать одну статуэтку или сразу две одновременно. Каждая становится львом на 1 час. Статуэтку нельзя использовать повторно, пока не пройдёт 7 дней.
://''Костяные козлы (редкая).''// Эти статуэтки козлов из слоновой кости всегда создаются по три штуки. Каждый козёл имеет уникальную внешность, и функционирует по-своему. Вот их свойства:
:://Козёл путешествия// может стать Большим козлом со статистикой ездовой лошади. У него есть 24 заряда, и каждый час или его часть, пока козёл остаётся животным, расходуется 1 заряд. Пока у него есть заряды, вы можете его использовать так часто, как вам вздумается. Когда у него кончаются заряды, он становится статуэткой и не может использоваться, пока не пройдёт 7 дней, после чего он восстанавливает все свои заряды.
:://Козёл перевозки// становится гигантским козлом на 3 часа. Его нельзя использовать повторно, пока не пройдёт 30 дней.
:://Козёл ужаса// становится гигантским козлом на 3 часа. Он не может атаковать, но вы можете брать его рога и использовать их в качестве оружия. Один рог становится длинным копьём +1, а другой становится длинным мечом +2. Рог берётся действием, и оружие исчезает, когда козёл становится статуэткой, вновь превращаясь в рог. Кроме того, козёл излучает ауру ужаса с радиусом 30 футов, когда вы на нём едете. Все враждебные вам существа, начинающие ход в ауре, должны преуспевать в спасброске Мудрости со Сл 15, иначе они станут испуганными козлом на 1 минуту, ли пока козёл не станет статуэткой. Испуганное существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе. Успешно спасшееся существо получает иммунитет к ауре козла на следующие 24 часа. Статуэтку нельзя использовать повторно, пока не пройдёт 15 дней.
://''Мраморный слон (редкая).''// Эта мраморная статуэтка примерно 4 дюйма в высоту и длину. Она становится слоном на 24 часа. Её нельзя использовать повторно, пока не пройдёт 7 дней.
:"""//''Обсидиановый скакун (очень редкая).''// Эта лошадь из полированного обсидиана становится кошмаром на 24 часа. Кошмар сражается только чтобы защитить самого себя. Его нельзя использовать повторно, пока не пройдёт 5 дней.
Если у вас доброе мировоззрение, каждый раз, когда вы отдаёте приказ, в том числе приказ вернуться в форму статуэтки, у статуэтки есть 10процентный шанс, что она проигнорирует его. Если вы едете верхом на кошмаре, когда он игнорирует вас, вы с ним мгновенно переноситесь в случайное место на плане Гадес, где он вновь становится статуэткой."""
://''Ониксовая собака (редкая).''// Эта ониксовая статуэтка становится мастиффом на 6 часов. У мастиффа Интеллект 8, и он может говорить на Общем. Он также обладает тёмным зрением в пределах 60 футов и может видеть невидимых существ и предметы в пределах этого диапазона. Его нельзя использовать повторно, пока не пройдёт 7 дней.
://''Серебряный ворон (необычная).''// Эта серебряная статуэтка становится вороном на 12 часов. Её нельзя использовать повторно, пока не пройдёт 2 дня. Пока статуэтка находится в облике ворона, вы можете неограниченно накладывать на неё заклинание почтовое животное.
://''Серпентиновая сова (редкая).''// Эта серпентино-вая статуэтка становится гигантской совой на 8 часов. Её нельзя использовать повторно, пока не пройдёт 2 дня. Сова может телепатически общаться с вами на любом расстоянии, если вы с ней находитесь на одном плане существования.
://''Эбеновая муха (редкая).''// Эта статуэтка из чёрного дерева похожа на обычную муху. Она становится гигантской мухой на 12 часов и на ней можно летать как на верховом животном. Её нельзя использовать повторно, пока не пройдёт 2 дня.
{{Гигантская муха}}
//3 уровень, Воплощение, Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (крошечный веер и перо экзотического происхождения)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""В точке на земле, выбранной вами в пределах дистанции, начинает дуть сильный ветер. Вы можете сделать стену длиной до 50 футов, высотой до 15 футов и толщиной до 1 фута. Вы можете как угодно изгибать стену, лишь бы это был непрерывный путь по земле. Стена существует, пока активно заклинание.
Когда стена появляется, все существа в её области должны совершить спасброски Силы. Существо получает дробящий урон 3к8 при провале, или половину этого урона при успехе.
Сильный ветер сдерживает туман, дым и прочие газы. Маленькие и ещё меньшие летающие существа и предметы не могут пройти через эту стену. Лёгкие, сыпучие материалы, оказавшиеся в стене, взлетают вверх. Стрелы, болты и прочие обычные боеприпасы, выпущенные в цели, находящиеся за стеной, отклоняются вверх и автоматически промахиваются (валуны, брошенные великанами и осадными машинами, а также подобные боеприпасы, не отклоняются). Существа в газообразной форме не могут пройти через неё."""
//6 уровень, Воплощение, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С
:''Длительность: '' Концентрация, вплоть до 10 минут
"""Вы создаёте вертикальную стену из крутящихся бритвенно-острых клинков из магической энергии. Стена появляется в пределах дистанции и существует столько, сколько активно это заклинание. Вы можете создать прямую стену длиной 100 футов, высотой 20 футов и толщиной 5 футов, или закольцованную стену диаметром 60 футов, высотой 20 футов и толщиной 5 футов. Стена предоставляет существам, находящимся за ней, укрытие на три четверти, и её пространство является труднопроходимой местностью.
Когда существо впервые за ход входит в пространство стены или начинает там ход, оно должно совершить спасбросок Ловкости. При провале существо получает рубящий урон 6к10. При успешном спасброске существо получает половину урона."""
Строя новый мир (или адаптируя существующий) и создавая ключевые события, вы определяете, о чём ваша кампания. Далее вы должны решить, как вы хотите проводить свою кампанию.
Как правильно проводить кампанию? Это зависит от вашего стиля игры и мотиваций ваших игроков. Рассмотрите вкусы ваших игроков, ваши сильные стороны как Мастера, правила поведения за игровым столом (обсуждаемые в части 3) и тип игры, которую вы хотите проводить. Опишите игрокам, как вы себе представляете будущую игру, и пусть они дадут вам обратную связь. Это и их игра тоже. Сделайте всё это заранее, чтобы ваши игроки смогли сделать осознанный выбор и помогли вам поддерживать выбранный тип игры.
Рассмотрим два крайних примера стилей игры.
!!!''Круши и руби''
Искатели приключений выбивают дверь в подземелье, сражаются с чудовищами и захватывают сокровища. Это очень простой, весёлый, захватывающий и ориентированный на действия стиль игры. Игроки тратят относительно мало времени на разработку характера для своих персонажей, на отыгрыш небоевых ситуаций, и на обсуждение чего-либо, кроме непосредственных опасностей подземелья.
В такой игре искатели приключений сталкиваются с чётко определёнными злыми чудовищами и противниками, а иногда и встречают чётко определённых хороших и полезных ПМ. Не ожидайте, что искателей приключений будет мучить вопрос, что делать с заключёнными, или что они устроят дебаты относительно морального права на уничтожение логова медвежатника. Не следите за деньгами или за временем, проведённым в городе. После того как задание выполнено, отправьте искателей приключений на новое как можно скорее. В данном случае простое желание убить чудовищ и забрать сокровище может служить достаточной мотивацией для любых действий персонажей.
!!''Глубокое повествование''
Глубоководью угрожает политическая нестабильность. Искатели приключений должны убедить Тайных Лордов, правителей города, урегулировать свои разногласия, но смогут это сделать только после того как договорятся с ними по всем расхождениям во взглядах и определятся с повесткой дня. Это глубокий, сложный и требующий усилий стиль игры. В центре внимания находятся не боевые действия, а переговоры, политические манёвры и взаимодействия персонажей. Целое собрание может пройти без единого броска атаки.
В этом стиле игры ПМ такие же сложные и богато проработанные, как и искатели приключений, а акцент в игре смещён с цифр на мотивацию и личность. Ожидайте от каждого игрока длинные отступления о том, что его персонаж делает и почему. Поход в храм, чтобы попросить совета у священника, может быть таким же важным, как сражение с орками (и не ждите, что искатели приключений вообще станут биться с орками, пока у них не появятся на то причины). Персонаж иногда будет действовать не так как думает игрок, потому что «так бы поступил мой персонаж в данной ситуации».
Так как сражения здесь не столь важны, правила игры уступают место развитию персонажа. Модификаторы проверки умений и уровень развития навыков имеют приоритет над боевыми бонусами. Не стесняйтесь изменять или игнорировать правила, чтобы соответствовать ролевым потребностям игроков, используя советы, представленные в 3 части этой книги.
<<<
!!!''Мир для исследования''
Большую часть кампании составляют путешествия искателей приключений с места на место, исследование окружающей среды и познание фэнтезийного мира. Эти исследования могут проводиться в любых условиях, в том числе и в дикой глуши, в лабиринте подземелья, в тёмных проходах Подземья, на переполненных улицах города и в морских водах. Нахождение обходного пути, поиски скрытого объекта, исследование странной темницы, расшифровка улик, решение головоломок и отключение ловушек — всё это может быть частью исследования.
Иногда исследование в игре носит случайный характер. Например, вы можете пропустить незначительное путешествие, рассказав игрокам, что они проводят три дня в дороге без происшествий, после чего добираются до места назначения. Или вы можете поставить приключение в центр внимания, чтобы описать изумительную часть мира или истории, ведь это увеличивает чувство погружения в игру. Кроме того, вы должны увеличить количество исследований если вашим игрокам нравится решать головоломки, искать обходные пути вокруг препятствий, и ощупывать подземные коридоры в поисках секретных дверей.
<<<
!!!''Что-то среднее''
Стиль игры в большинстве кампаний находится между этими двумя крайностями. В них есть много действий, но также есть постоянный сюжет и взаимодействие между персонажами. Игроки раскрывают мотивацию своих героев и получают шанс доказать свои навыки в бою. Для поддержания баланса предоставьте игрокам смесь из ролевых и боевых сцен. Даже в подземелье вы можете представить ПМ, которые не предназначены для сражения, а скорее помогут, продадут что-то, или просто поговорят.
Подумайте над стилем своей игры с учётом следующих вопросов:
* Вы являетесь поклонником реализма и суровых последствий, или вы больше хотите, чтобы игра выглядела как боевик?
* Вы хотите, чтобы игра сохранила атмосферу средневекового фэнтези, или вы хотите попробовать другие временные рамки и современное мышление?
* Вы хотите поддерживать серьёзную атмосферу или ваша цель — юмор?
* Вы решили играть серьёзно, а события в вашей игре беззаботные или напряжённые?
* Для игры важны смелые действия, или же игроки должны быть вдумчивыми и осторожными?
* Вам нравится всё тщательно планировать заранее, или вы предпочитаете импровизировать на месте?
* Будет ли игра наполнена разнообразными элементами D&D, или она будет тематической, например, в жанре ужасов?
* Игра предназначена для всех возрастов, или только для взрослых?
* Как вы относитесь к с моральной двусмысленности, сможете ли поставить героев в ситуацию, когда цель оправдывает средства? Или вам проще с простыми героическими принципами, такими как справедливость, жертвенность, и помощь слабым?
!!__''Имена персонаже''__й
Стиль игры в некоторой мере определяется именами персонажей. Отличная идея установить некоторые правила для ваших игроков в начале новой кампании. В группе персонажей, состоящей из Си-тис, Травока, Анастрианны и Кайрона, человек-воин по имени Боб II кажется лишним, особенно, когда он похож на Боба I, который был убит кобольдами. Хорошо ещё если все подходят беззаботно к созданию имени. Но если группа желает играть персонажами с более серьёзными именами, попросите играющего за Боба придумать более подходящее имя.
Имена персонажей должны подходить друг другу по стилю или концепции, а также соответствовать атмосфере мира вашей кампании — так должно быть и со всем, что вы создаёте — от имён персонажей Мастера до названий местности. Травок и Кайрон не захотят брать задание у Господина Кексика, посещать леденцовый остров или убивать сумасшедшую волшебницу по имени Селёдка.
!!__''Продолжение или эпизодические кампании''__
Костяк кампании — это связная серия приключений, но вы можете соединить их двумя различными способами.
В отличие от эпизодических приключений, приключения, которые продолжают сюжет основной кампании, всегда привносят ощущение высшей цели или общего сюжета. Искатели приключений могут столкнуться с возвращением злодеев, с грандиозными заговорами или с загадочным серым кардиналом, который в конечном счёте стоит за каждым приключением в кампании.
Кампания с продолжениями, объединёнными общей темой и историей, может стать поистине эпичной. Игроки получают удовольствие от осознания того, что действия, которые они принимают в течение одного приключения, будут иметь последствия в будущем. Построение и запуск такого рода кампании может стать сложной задачей для Мастера, но это всегда стоит того, ведь на выходе всегда получается большая и запоминающаяся история.
И наоборот, эпизодическая кампания похожа на телешоу, в котором еженедельный эпизод является отдельной историей, а не частью общего сценария. Она может быть построена на предпосылках, которые объясняют её характер: персонажи игроков наёмники или отважные исследователи, столкнувшиеся с чередой несвязанных опасностей. Они даже могут оказаться археологами, исследующими древние руины в поисках артефактов. Такая эпизодическая игра позволяет вам создавать приключения — или покупать уже готовые — и добавлять их в вашу кампанию, не беспокоясь о том, как они подойдут к другим приключениям, которые были раньше или будут после.
!!__''Тема кампании''__
Тема в кампании, как и в художественном произведении, выражает глубинный смысл истории и фундаментальные основы человеческого бытия. Ваша кампания не обязательно должна быть произведением искусства, но она может использовать общие темы, которые придадут ей особую атмосферу. Рассмотрим следующие примеры:
* Кампания о борьбе со смертностью, которая может быть реализована с помощью чудовищ-нежити или может выражаться через смерть близких.
* Кампания закручена вокруг коварного зла. Это могут быть тёмные боги, чудовищные расы, такие как юан-ти или существа из неизвестных, далёких от земных забот, миров. Во время битвы со злом героям придётся столкнуться с порочной природой их собственного вида.
* Кампания с участием проблемного героя (-ев), которому приходится столкнуться не просто с дикостью зверских созданий, а с собственным внутренним яростным зверем, живущим глубоко в сердце.
* Кампания, исследующая тему ненасытной жажды власти и господства, которая может быть реализована с участием хозяев Девяти Преисподних, или с помощью правителей гуманоидов, стремящихся завоевать мир.
С такой темой как «борьба со смертностью», вы сможете создать широкий спектр приключений, которые не обязательно будут связаны общим злодеем. В одном приключении могут фигурировать мертвецы, поднимающиеся из своих могил и угрожающие уничтожить весь город. В следующем приключении безумный колдун создаёт голема из плоти в попытке воскресить свою потерянную любовь. Злодей может пойти на крайние меры, чтобы достичь бессмертия и обмануть смерть. Искатели приключений могут помочь призраку принять смерть и двигаться дальше, а один из них вообще может стать призраком!
!!!''Смешивание тем''
Смешивание тем позволяет вашим игрокам насладиться разнообразием приключений. Даже узкотематические кампании могут иногда отклоняться от общей темы. Если ваша кампания в большей степени завязана на интригах, тайнах, и отыгрыше, то вашим игрокам не помешает изредка насладиться подземельем — особенно, если такое отклонение связано с важными событиями в кампании. Если большинство ваших приключений — это исследование подземелий, переключитесь на городскую загадку, которая в конечном итоге приведёт отряд в подземелье заброшенного здания или башни. Если вы из недели в неделю проводите приключения в жанре ужасов, то попробуйте использовать злодея, который окажется обычным, или даже глупым. «Разрядка смехом» это лучшая тема для любой кампании, хотя обычно игроки осуществляют её сами.
//3 уровень, Преобразование, Паладин//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность: '' Концентрация, вплоть до 1 часа
Немагическое оружие, которого вы касаетесь, становится магическим. Выберите один из следующих видов урона: звук, кислота, огонь, холод или электричество. Пока заклинание активно, оружие получает бонус +1 к броскам атаки и причиняет при попадании дополнительный урон выбранного вида 1к4.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 или 6 уровня, бонус к броску атаки увеличивается до +2, а дополнительный урон увеличивается до 2к4. Если вы используете ячейку заклинания 7 уровня или выше, бонус увеличивается до +3, а дополнительный урон увеличивается до 3к4.
//4 уровень, Вызов, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность: '' 8 часов
"""В выбранной и видимой вами свободной клетке в пределах дистанции появляется и начинает парить призрачный страж. Страж занимает своё пространство, и его контуры плохо видны за исключением сверкающего меча и щита, украшенного символом вашего божества.
Все существа, враждебные вам, перемещающиеся впервые за ход в пространство, находящееся в пределах 10 футов от стража, должны преуспеть в спасброске Ловкости. При провале такое существо получает урон излучением 20, или половину этого урона при успехе. Страж исчезает, когда причинит суммарно 60 урона."""
//6 уровень, Ограждение, Бард/Волшебник//
:''Время накладывания:'' 10 минут
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (горящее благовоние, немного серы и масла, завязанная узлом тетива, немного крови бурого увальня и маленький серебряный жезл, стоящий как минимум 10 зм)
:''Длительность: '' 24 часа
"""Вы создаёте защиту, охраняющую 2 500 квадратных футов пола (квадрат с длиной стороны 50 футов, сто клеток 5 × 5 футов или двадцать пять квадратов с длиной стороны 10 футов). Охраняемая область может быть до 20 футов в высоту и может иметь любую форму. Вы можете защитить несколько этажей крепости, поделив их на части, при условии, что во время накладывания этого заклинания вы можете туда попасть.
При накладывании заклинания вы можете указать тех, кто не будет попадать под действие одного или всех выбранных вами эффектов. Вы можете также указать пароль, произношение которого дарует иммунитет к этим эффектам.
Заклинание стражи создаёт в охраняемой местности следующие эффекты:
//''Двери.''// Все двери в охраняемой области запираются магией, как если бы они были закрыты заклинанием волшебный замок. Кроме того, вы можете покрыть до десяти дверей иллюзией (эквивалентной функции «иллюзорный предмет» заклинания малая иллюзия), заставляя их выглядеть как гладкая стена.
//''Коридоры.''// Коридоры заполняются туманом, делающим местность сильно заслоняющей. Кроме того, на каждом перекрёстке или развилке, где есть выбор направления, есть 50% шанс того, что существо (но не вы) будет считать, что идёт в сторону, противоположную той, в которую она на самом деле идёт.
//''Лестницы.''// Все лестницы в охраняемой области сверху донизу заполняются паутиной, как от одноимённого заклинания. Нити восстанавливаются через 10 минут, если их сожгут или разрежут, а заклинание стражи ещё активно.
//''Прочие эффекты заклинания.''// Вы можете добавить к охраняемой области один из следующих эффектов:"""
* Поместите пляшущие огоньки в четыре коридора. Вы можете задать простую последовательность, которую огоньки будут выполнять, пока активно заклинание стражи.
* Поместите волшебные уста в два места.
* Поместите зловонное облако в два места. Испарения появляются в указанных вами местах; они возвращаются через 10 минут, если рассеются ветром, а заклинание стражи ещё будет активно.
* Поместите постоянный порыв ветра в один коридор или комнату.
* Поместите внушение в одно место. Выберите область с размером не больше клетки 5 × 5 футов, и все существа, входящие в эту область или проходящие по ней, мысленно воспринимают внушение.
Вся охраняемая область излучает магию. Рассеивание магии, наложенное на конкретный эффект, в случае успеха устраняет только этот эффект.
Вы можете сделать эту магию постоянной, накладывая это заклинание каждый день в течение одного года.
!''Страна Фей''
//"""Прохождение через портал походило на принятие тёплой ванны, хотя прохлада в воздухе никуда не делась. Вначале всё затихло — рёв воды, перекатывающейся по камням, крики лягушек и стрёкот сверчков на берегу, вечерний гомон города за его спиной... Но уже через миг мир оказался переполненным жизнью. Лягушки и ночные птицы пели хором; в воздухе были разлиты осенние запахи; лунный свет окрасил цветы в синий, серебристый и фиолетовый; а рокот воды стал сложной симфонией."""//
<<AlignRight "— Джеймс Уайетт, //Клятва мести//">>
Страна Фей, также называемая Планом Фей, это земля приглушённого света и чудес, место музыки и смерти. Это царство вечных сумерек, с волшебными огоньками, носящимися на лёгком ветру и огромными бабочками, порхающими по рощам и полям. Небо постоянно окрашено в цвета заходящего солнца, которое никогда не заходит (да и не восходит, раз уж на то пошло); солнце здесь застыло на одном месте, над самым горизонтом. Вдалеке от населённых мест, которыми правят благие феи, составляющие Летний Двор, находятся земли с переплетёнными колючими кустами и топкими болотами — идеальные охотничьи угодья для неблагих фей.
Страна Фей существует параллельно Материальному Плану, это альтернативное измерение, занимающее то же самое место в космологии. Ландшафт Страны Фей подобен миру природы, но здесь его элементы принимают потрясающие обличья. Там, где на Материальном Плане стоит вулкан, в Стране Фей стоит гора, увенчанная кристаллами размером с небоскрёб, пылающими внутренним огнём. Широкая и грязная река Материального Плана может иметь отражение в виде чистого извилистого родника невероятной красоты. Болото может отражаться в виде огромной зловещей топи. А перемещение в Страну Фей из развалин на Материальном Плане может перенести путников к дверям замка архифеи.
Страна Фей населена лесными существами, такими как эльфы, дриады, сатиры, пикси и спрайты, а также кентаврами и такими магическими созданиями как мерцающие псы, волшебные драконы, тренты и единороги. Тёмные области этого плана — дом для таких злобных существ как карги, заразы, гоблины, огры и великаны.
<<<
!!!''Благие и неблагие феи''
В Стране Фей есть две королевы со своими придворными, и большая часть фей предана или той, или другой. Королева Титания и её Летний Двор возглавляет благих фей, а Королева Воздуха и Тьмы, правящая Сумеречным Двором, возглавляет неблагих фей.
Благие и неблагие не являются аналогом добра и зла, хотя многие смертные ставят между этими понятиями знак равенства. Многие благие феи добрые, и многие неблагие злы, но их противостояние друг другу исходит от вражды их королев, а не абстрактных понятий смертных. Уродливые обитатели Страны Фей, такие как фоморы и карги, практически никогда не состоят ни при том, ни при другом дворе, а феи с независимым духом полностью отрицают дворы. Иногда дворы устраивают кровопролитные схватки, но они также соперничают в других, более-менее мирных состязаниях, а иногда даже заключают небольшие и тайные союзы.
<<<
!!__''Перекрёстки фей''__
Перекрёстки фей это загадочные и красивые места на Материальном Плане, у которых есть практически идеальные отражения в Стране Фей, что и создаёт портал в месте соприкосновения двух планов. Путник может пройти через перекрёсток фей, зайдя на поляну, войдя в пруд, наступив в круг грибов, или забравшись под ствол дерева. Ему покажется, что он оказался в Стране Фей, просто совершив очередной шаг. Для стороннего же наблюдателя такой путник просто исчезает в воздухе.
Как и другие порталы между планами, большинство перекрёстков фей то открывается, то закрывается. Перекрёсток может открываться только в полнолуние, на рассвете определённого дня, или для тех, кто несёт определённый предмет. Перекрёсток фей можно закрыть навсегда, если местность с одной из сторон изменится в значительной степени — например, если на поляне в Материальном Плане построят замок.
!!__''Опциональные правила: Магия Страны Фей''__
Поговаривают о детях, похищенных феями и утащенных в Страну Фей, которые через несколько лет возвращаются к родителям, не постарев ни на день, и ничего не помня ни о похитителях, ни о месте, из которого они вернулись. Искатели приключений, вернувшиеся с вылазки в Страну Фей, тоже могут обнаружить, что время на Плане Фей течёт иначе, и что их собственные воспоминания затуманены. Можете использовать эти опциональные правила, чтобы продемонстрировать необычную магию, пропитывающую этот план.
!!!''Потеря памяти''
Существа, покидающие Страну Фей, должны совершить спасбросок Мудрости со Сл 10. Фейские существа автоматически преуспевают в этом спасброске, равно как существа с особенностью Наследие фей, такие как эльфы. Провалившее спасбросок существо ничего не помнит о времени, проведённом в Стране Фей. В случае успеха воспоминания существа не теряются, но слегка затуманиваются. Все заклинания, способные снять проклятье, могут восстановить утраченные воспоминания такого существа.
!!!''Искажение времени''
В самой Стране Фей время течёт нормально, но персонажи могут провести там один день, а покинув её, узнать, что в остальной мультивселенной прошло значительно больше или меньше времени.
Каждый раз, когда существо или группа существ покидает Страну Фей, проведя там как минимум 1 день, вы можете изменить прошедшее время так, как нужно для вашей кампании, или воспользоваться приведённой ниже таблицей. Заклинание исполнение желаний может снять этот эффект с существ, количество которых не превышает десяти. Некоторые мощные феи могут исполнять такие желания, и готовы помочь, если их гости согласятся стать целью заклинания обет и выполнят задание после накладывания заклинания исполнение желаний.
//Оружие (стрела), очень редкое//
Стрела убийства это магическое оружие, предназначенное для убийства существ определённого вида. Область применения может быть как широкой, так и более конкретной; например, существуют и стрелы убийства драконов и стрелы убийства синих драконов. Если существо, принадлежащее к виду, расе или группе, связанной со стрелой убийства, получает от неё урон, оно должно совершить спасбросок Телосложения со Сл 17, получая дополнительный колющий урон 6к10 при провале или половину этого урона при успехе.
После того как стрела убийства причиняет существу дополнительный урон, она становится немагической стрелой.
Есть и другие разновидности боеприпасов с такой же магией, такие как арбалетные болты убийства, хотя стрелы встречаются чаще всего.
Как и любая другая история, типичное приключение имеет начало, середину и конец.
!!__''Начало''__
Приключение начинается с чего-то, что должно заинтересовать игроков. Лучше всего, если это «что-то» задевает интересы игроков и создаёт убедительные причины, чтобы их персонажи всё же приняли участие в приключении. Искатели приключений могут натолкнуться на что-то, что они не должны были увидеть, на них могут напасть чудовища на дороге, на их жизнь может покуситься убийца, а может, просто возле городских ворот появится дракон. Подобные сюжетные повороты могут мгновенно вовлечь игроков в вашу историю.
Начало хорошего приключения должно быть захватывающим и целенаправленным. Если вы хотите, чтобы игроки пошли домой в ожидании следующего собрания, то дайте им понять, к чему всё идёт, а также добавьте что-то, чего они будут с нетерпением ждать.
!!__''Середина''__
Вся основная часть истории разворачивается в середине приключения. Шаг за шагом, искатели приключений принимают важные решения, которые оказывают влияние на концовку.
В течение приключения герои могут обнаружить тайны, которые поставят для них новые цели или вообще изменят первоначальную цель. В процессе игры герои даже могут изменить своё понимание окружающей обстановки. Может случиться так, что слухи о сокровище были специальной уловкой, чтобы заманить их в смертельную ловушку. Возможно, так называемый шпион в королевском суде — на самом деле обманка, выдуманная самим монархом, чтобы захватить ещё больше власти.
В то время как искатели приключений пытаются помешать своим противникам, противники претворяют в жизнь свои гнусные планы. Враги также могут скрывать свои поступки, вводить в заблуждение потенциальных противников, или решать свои проблемы напрямую, убивая всех, кто встанет на их пути.
Помните, что персонажи — это герои истории. Никогда не позволяйте им становиться просто зрителями, беспомощно наблюдающими за тем, как вокруг них разворачиваются события.
!!__''Конец''__
Концовка — это кульминация, апогей — сцена, в которой напряжённость, нарастающая по ходу всего приключения, достигает своего пика. Сильный кульминационный момент должен поставить игроков в критическое положение, судьба персонажей, мира и всего прочего должна висеть на волоске. Результат, зависящий от действий и решений героев, никогда не должен быть предрешён заранее.
Концовка не обязательно должна расставлять всё по местам. Сюжетные ветки могут остаться незавершёнными, ожидая разрешения в следующих приключениях. Несколько незавершённых дел — это лучший способ перехода от одного приключения к другому.
//Чудесный предмет, очень редкий//
На первый взгляд эта сумка напоминает сумку хранения, но на самом деле это ротовое отверстие гигантского межпространственного существа. Если сумку вывернуть наизнанку, ротовое отверстие закроется.
Существо, связанное с сумкой, может чувствовать всё, что помещают в сумку. Материя животного или растительного происхождения, помещённая в сумку, пожирается и исчезает навсегда. Если в сумку будет помещена часть живого существа, как в случае, когда кто-нибудь засовывает в неё руку, существует 50-процентный шанс, что существо затянет в сумку. Существо в сумке может действием попытаться высвободиться, совершая проверку Силы со Сл 15. Другое существо может действием залезть рукой в сумку, чтобы вытянуть оттуда другое существо, совершая проверку Силы со Сл 20 (при условии, что его самого не затянет туда). Все существа, начинающие ход в сумке, пожираются, а их тела уничтожаются.
Неживые предметы могут храниться в сумке, которая вмещает один кубический фут такой материи. Однако, один раз в день сумка пожирает все хранящиеся в ней предметы, выплёвывая их на другом плане существования. Мастер сам определяет время и план.
Если сумку проткнут или разорвут, она уничтожается, а всё её содержимое переносится в случайным образом выбранное место на Астральном Плане.
//Чудесный предмет, редкий//
Внутри этой тяжёлой тканой сумки находятся 3к4 сухих боба. Сумка весит 1/2 фунта, плюс 1/4 фунта за каждый боб, находящийся внутри.
Если вы высыпаете содержимое сумки на землю, то они взрываются с радиусом 10 футов. Все существа в этой зоне, включая вас, должно совершить спасбросок Ловкости со Сл 15, получая урон огнём 5к4 при провале или половину этого урона, если спасбросок был успешен. Этот огонь также поджигает легковоспламеняющиеся объекты в зоне поражения, которые никто не несёт и не носит.
Если вы извлечёте боб из сумки, посадите его в землю или песок и затем польёте его, то боб спустя 1 минуту после того, как вы посадили его, произведёт некоторый эффект. Мастер может сам выбрать эффект из таблицы, может определить эффект случайным образом, или же придумать свой вариант.
<table>
<tr>
<th class="SpecHead">к100</th>
<th>Эффект</th>
</tr>
<tr>
<td>01</td>
<td>Вырастают 5к4 поганок. Если существо съедает поганку, то необходимо бросить любую кость для определения эффекта. При выпадении нечётного числа существо должно преуспеть в спасброске Телосложения со Сл 15, иначе оно получит урон ядом 5к6 и становится отравленным на 1 час. Если же выпадет чётное число, то существо получает 5к6 временных хитов на 1 час.</td>
</tr>
<tr>
<td>2-10</td>
<td>Появляется гейзер, фонтанирующий на высоту 30 футов потоками воды, пива, ягодного сока, чая, уксуса или масла (по выбору Мастера) в течение 1к12 раундов.</td>
</tr>
<tr>
<td>11-20</td>
<td>Появляется трент (характеристики смотрите в Бестиарии). Существует 50-процентный шанс, что появившийся трент будет обладать хаотично-злым мировоззрением и нападёт.</td>
</tr>
<tr>
<td>21-30</td>
<td>Появляется ожившая, но неподвижная каменная статуя, похожая на вас и выкрикивающая в ваш адрес угрозы. Если вы уходите от неё, а кто-то другой приближается к ней, статуя описывает вас как самого гнусного злодея и побуждает новоприбывших найти и атаковать вас. Если вы находитесь с ней на одном плане существования, то статуя знает ваше местоположение. По прошествии 24 часов статуя перестаёт быть ожившей.</td>
</tr>
<tr>
<td>31-40</td>
<td>Появляется походный костёр с синими языками пламени ,который горит в течение 24 часов (или пока не будет погашен).</td>
</tr>
<tr>
<td>41-50</td>
<td>Вырастают 1к6 + 6 визгунов (характеристики смотрите в Бестиарии).</td>
</tr>
<tr>
<td>51-60</td>
<td>Наружу выползают 1к4 + 8 ярко-розовых жаб. Всякий раз, когда кто-либо прикасается к жабе, та превращается в чудовище (размером вплоть до Большого) по выбору Мастера. Это чудовище существует в течение минуты, после чего исчезает в клубах ярко-розового дыма.</td>
</tr>
<tr>
<td>61-70</td>
<td>Из норы выползает голодная панцирница (характеристики смотрите в Бестиари^) и немедленно нападает.</td>
</tr>
<tr>
<td>71-80</td>
<td>Вырастает фруктовое дерево. На дереве растёт 1к10 + 20 фруктов, 1 к8 из которых действуют как магические зелья (определяются случайным образом), в то время, как один из фруктов, будучи съеденным, действует как пищевой яд на выбор Мастера. Дерево исчезает спустя 1 час. Сорванные фрукты остаются, сохраняя свои магические свойства в течение 30 дней.</td>
</tr>
<tr>
<td>81-90</td>
<td>Появляется гнездо, содержащее 1к4 + 3 яиц. Существа, съедающие одно из этих яиц, должно совершить спасбросок Телосложения со Сл 20. При успехе существо навсегда увеличивает на единицу значение своей самой низкой характеристики. Если две или более характеристики имеют минимальное значение, то случайно выбирается какая-либо одна. При провале существо получает урон силовым полем 10к6 от внутреннего взрыва магической природы.</td>
</tr>
<tr>
<td>91-99</td>
<td>Вверх возносится пирамида с квадратным основанием 60 х 60 футов. Внутри неё находится саркофаг с покоящемся в нём владыкой мумий (характеристики смотрите в Бестиарии). Эта пирамида считается логовом владыки мумий, а в саркофаге находится сокровище на усмотрение Мастера.</td>
</tr>
<tr>
<td>00</td>
<td>Вырастает гигантский бобовый стебель такой высоты, какой будет угодно Мастеру. Мастер также решает, что ждёт добравшегося до его вершины персонажа: ему откроется величественный вид, он окажется в замке облачного великана или же вершина стебля приведёт его на другой план существования.</td>
</tr>
</table>
//Чудесный предмет, необычный//
Эта обычная с виду сумка, изготовленная из серой, рыжей или коричневой ткани, выглядит пустой. Однако если засунуть в неё руку, можно нащупать маленький пушистый предмет. Весит сумка половину фунта.
Вы можете действием вынуть из сумки пушистый предмет и бросить его на 20 футов. Когда предмет приземляется, он превращается в существо, которое вы выбираете броском к8, консультируясь с приведённой таблицей, соответствующей цвету сумки. Характеристики существ смотрите в Бестиарии. Существо исчезает на следующем рассвете или когда его хиты будут уменьшены до 0.
Существо дружественно к вам и вашим спутникам, и действует в ваш ход. Вы можете бонусным действием отдать команду, как существу перемещаться, и какое действие ему совершать в следующем ходу, или можете отдать общий приказ, такой как «атакуй врагов». Если приказов нет, существо действует сообразно своей природе.
Как только из сумки достанут три пушистых предмета, её нельзя будет использовать до следующего рассвета.
<table>
<tr>
<th colspan="4">Серая сумка фокусов</th>
</tr>
<tr>
<th>к8</th>
<th>Существо</th>
<th>к8</th>
<th>Существо</th>
</tr>
<tr>
<td>1</td>
<td>Куница</td>
<td>5</td>
<td>Пантера</td>
</tr>
<tr>
<td>2</td>
<td>Гигантская крыса</td>
<td>6</td>
<td>Гигантский барсук</td>
</tr>
<tr>
<td>3</td>
<td>Барсук</td>
<td>7</td>
<td>Лютый волк</td>
</tr>
<tr>
<td>4</td>
<td>Кабан</td>
<td>8</td>
<td>Гигантский лось</td>
</tr>
<tr>
<th colspan="4">Рыжая сумка фокусов</th>
</tr>
<tr>
<th>к8</th>
<th>Существо</th>
<th>к8</th>
<th>Существо</th>
</tr>
<tr>
<td>1</td>
<td>Крыса</td>
<td>5</td>
<td>Гигантский козёл</td>
</tr>
<tr>
<td>2</td>
<td>Сова</td>
<td>6</td>
<td>Гигантский кабан</td>
</tr>
<tr>
<td>3</td>
<td>Мастиф</td>
<td>7</td>
<td>Лев</td>
</tr>
<tr>
<td>4</td>
<td>Козёл</td>
<td>8</td>
<td>Бурый медведь</td>
</tr>
<tr>
<th colspan="4">Коричневая сумка фокусов</th>
</tr>
<tr>
<th>к8</th>
<th>Существо</th>
<th>к8</th>
<th>Существо</th>
</tr>
<tr>
<td>1</td>
<td>Шакал</td>
<td>5</td>
<td>Чёрный медведь</td>
</tr>
<tr>
<td>2</td>
<td>Человекообразнаяобезьяна</td>
<td>6</td>
<td>Гигантская куница</td>
</tr>
<tr>
<td>3</td>
<td>Бабуин</td>
<td>7<br></td>
<td>Гигантская гиена</td>
</tr>
<tr>
<td>4</td>
<td>Топороклюв</td>
<td>8</td>
<td>Тигр</td>
</tr>
</table>
//Чудесный предмет, необычный//
Эта сумка внутри гораздо больше, чем можно было предположить, исходя из её внешних размеров (приблизительно 2 фута в диаметре и 4 фута глубины). Сумка может вместить до 500 фунтов, не превышающих в объёме 64 кубических фута. При этом сумка всегда весит 15 фунтов, вне зависимости от её содержания. Извлечение чего-либо из сумки совершается действием.
Если сумка перегружена, проткнута, или порвана, она рвётся окончательно, уничтожается, и её содержимое разбрасывается по Астральному Плану. Если сумка оказывается вывернутой наизнанку, то её содержимое вываливается наружу невредимым, но прежде, чем её можно будет снова использовать, сумку необходимо вывернуть обратно. Дышащие существа, помещённые внутрь мешка, способны оставаться в живых в течение времени, равного десяти минутам, поделённым на количество существ (минимум 1 минута), после чего они начинают задыхаться.
Помещение сумки хранения в межпространство, созданное с помощью удобного рюкзака Хе-варда, переносной дыры или подобного предмета, оба предмета мгновенно уничтожаются и открываются врата, ведущие на Астральный План. Врата появляются в месте, где один предмет пытались поместить в другой. Все существа в пределах 10 футов от врат затягиваются внутрь и помещаются в случайным образом определённое место на Астральном Плане. После этого врата закрываются. Врата односторонние, и повторно не открываются.
//Чудесный предмет, легендарный//
Этот чёрный шар диаметром 2 фута является дырой в ткани мультивселенной, стабилизированной окружающим магическим полем и парящей на месте.
Сфера уничтожает всю материю, через которую проходит и всю материю, проходящую сквозь неё. Артефакты — исключение. Если в описании артефакта не сказано, что он подвержен урону от сферы аннигиляции., то он проходит сквозь сферу невредимым. Всё остальное, что касается сферы, но не помещается в неё целиком, получает урон силовым полем 4к10.
Сфера находится в состоянии покоя, пока кто-нибудь не начнёт её контролировать. Если вы находитесь в пределах 60 футов от неконтролируемой сферы, вы можете действием совершить проверку Интеллекта (Магия) со Сл 25. При успехе сфера левитирует в выбранном вами направлении на расстояние в футах, не превышающее 5 х ваш модификатор Интеллекта (минимум 5 футов). При провале сфера перемещается на 10 футов в вашу сторону. Существа, в чьё пространство входит сфера, должны преуспеть в спасброске Ловкости со Сл 13, иначе они коснутся сферы и получат урон силовым полем 4к10.
Если вы пытаетесь контролировать сферу, находящуюся под контролем другого существа, вы совершаете проверку Интеллекта (Магия), противопоставленную проверке Интеллекта (Магия) другого существа. Победитель получает контроль над сферой и может управлять ей как описано выше.
Если сфера вступает в контакт с планарным порталом, например, созданным заклинанием врата, или межпространственным феноменом, таким как переносная дыра, Мастер случайным образом определяет, что произойдёт, используя следующую таблицу:
<table>
<tr>
<th>к100</th>
<th>Результат</th>
</tr>
<tr>
<td>01-50</td>
<td>Сфера уничтожается.</td>
</tr>
<tr>
<td>51-85</td>
<td>Сфера проходит через портал или оказывается в межпространственном месте.</td>
</tr>
<tr>
<td>86-00</td>
<td>Разрыв в пространстве отправляет все существа и предметы, находящиеся в пределах 180 футов от сферы, включая саму сферу, на случайный план существования.</td>
</tr>
</table>
//6 уровень, Ограждение, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (10-футовый радиус)
:''Компоненты:'' В, С, М (стеклянная или кристаллическая бусина, рассыпающаяся, когда заклинание заканчивается)
:''Длительность: '' Концентрация, вплоть до 1 минуты
"""Вокруг вас возникает неподвижный слабо мерцающий барьер с радиусом 10 футов, существующий, пока активно заклинание.
Все заклинания 5 уровня и ниже, наложенные снаружи барьера, не могут подействовать на существ и предметы, находящиеся внутри, даже если заклинание наложено с помощью ячейки большего уровня. Такие заклинания могут быть нацелены на существ и предметы, находящиеся внутри барьера, но не будут на них воздействовать. Пространство, защищённое барьером, тоже не включается в область действия таких заклинаний."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, барьер защищает от заклинаний с уровнем на 1 больше за каждый уровень ячейки выше шестого.
!!!__''Схваченный''__
* Скорость схваченного существа равна 0, и оно не получает выгоды ни от каких бонусов к скорости.
* Состояние оканчивается, если схвативший становится недееспособен (см. состояние).
* Это состояние также оканчивается, если какой-либо эффект выводит схваченное существо из зоны досягаемости того, кто его удерживает, или из зоны удерживающего эффекта. Например, когда существо отбрасывается заклинанием волна грома.
Несмотря на то, что города и посёлки обещают безопасность, они опасны не менее чем мрачные подземелья. Зло таится у всех на виду и в тёмных углах. Канализация, тенистые аллеи, трущобы, прокуренные таверны, ветхие жилища и многолюдные рынки могут быстро превратиться в место сражения. Вдобавок ко всему, искатели приключений должны вести себя тихо, если не хотят привлекать внимание местных властей.
С другой стороны, персонажи, не нарывающиеся на неприятности, могут пользоваться всеми преимуществами поселений.
!!__''Закон и порядок''__
Будут ли в поселении правоохранительные войска, зависит от его размера и характера. В законопослушном городе может быть городская стража, охраняющая порядок, и тренированные ополченцы, охраняющие стены, а в городе на фрон-тире могут полагаться на искателей приключений, либо же его горожане сами будут отпетыми бандитами, на которых никто не рискнёт напасть.
!!!''Суд''
В большинстве поселений судами заправляют судьи или местные правители. В некоторых судах допускаются прения, когда спорящие стороны или их адвокаты демонстрируют доказательства и ищут прецеденты, пока судья не примет решение, причём возможно применение заклинаний и допросы. В других решение выносит божий суд или испытание поединком. Если доказательства вины неоспоримы, магистрат или местный правитель может отменить суд, сразу вынеся решение.
!!!''Наказания''
В поселении может быть тюрьма, в которой держат подозреваемых до суда, но мало где есть тюрьмы для отбывания наказания лишением свободы. Тот, кого признали виновным, обычно выплачивает штраф, выполняет несколько лет каторжную работу, изгоняется или идёт на казнь, в зависимости от тяжести правонарушения.
!!__''Случайные встречи в поселениях''__
Представленная таблица пригодится в приключениях, проходящих в городах и посёлках. Совершайте проверку как минимум один раз в день, и ещё один раз за ночь, если персонажи не спят, а слоняются. Перебросьте результат, если он не имеет смысла в текущее время.
{{$:/Случайные встречи в поселениях}}
;
://''Животное на свободе.''// Персонажи неожиданно видят одно или несколько животных, свободно бродящих по улице. Это может быть кто угодно, от стаи обезьян до сбежавшего циркового медведя, тигра или слона.
://''Глашатай.''// Глашатай, вестник, безумец, или кто-нибудь другой выступает для всех на углу улицы. Объявление может предвещать грядущие события (такие как публичная казнь), передавать народу важную информацию (такую как новый королевский указ), или озвучивать жуткое предзнаменование или предупреждение.
://''Уличная драка.''// Рядом с искателями приключений происходит драка. Это может быть драка в таверне; сражение между враждующими фракциями, семьями или бандами, или же сражение городских стражей с преступниками. Персонажи могут быть просто свидетелями, могут стать жертвой случайно пущенной стрелы, либо их могут принять за членов одной из сторон.
://''Задиры.''// Персонажи видят, как 1к4 + 2 задиры пристают к иногороднему (используйте для всех характеристики обывателя из Бестиария). Задиры сбегут, получив любой урон.
://''Спутник.''// К одному или нескольким персонажам подходит местный житель, заинтересованный в деятельности отряда. В качестве сюжетного поворота, этот спутник может оказаться шпионом, посланным для сбора информации.
://''Соревнование.''// Искателей приключений затягивают в импровизированное состязание — это может быть как интеллектуальная игра, так и соревнование, кто кого перепьёт — или же они становятся свидетелями такой дуэли.
://''Труп.''// Искатели приключений находят труп гуманоида.
://''Набор призывников.''// Персонажей нанимает представитель города или городской стражи, нуждающийся в помощи для решения проблемы. В качестве сюжетного поворота, он может оказаться преступником, пытающимся заманить отряд в засаду (используйте для него и его приспешников характеристики головореза из Бестиария).
://''Пьяница.''// Пьяница, шатаясь, подходит к одному из членов отряда, приняв его по ошибке за кого-то другого.
://''Пожар.''// Начинается пожар, и у персонажей есть шанс потушить пламя, пока оно не распространилось.
://''Безделушка.''// Персонажи находят случайную безделушку. Можете определить её броском по таблице из Книги игрока.
://''Притесняющий страж.''// Искателей приключений зажимают в угол 1к4 + 1 страж. Если стражникам угрожать, они позовут на помощь, и могут привлечь внимание других стражников и горожан.
://''Карманная кража.''// Вор (используйте характеристики шпиона из Бестиария) пытается обворовать случайным образом выбранного персонажа. Персонажи, чьё пассивное значение Мудрости (Внимательность) равняется результату проверки Ловкости (Ловкость рук) плута или превышает его, замечают попытку.
://''Процессия.''// Искатели приключений встречают группу горожан, идущую в праздничной или похоронной процессии.
://''Протест.''// Искатели приключений видят группу горожан, мирно протестующих против нового закона или указа. Несколько стражей охраняют порядок.
://''Катящаяся карета.''// Упряжка лошадей мчит по улицам телегу. Искатели приключений должны уклониться от лошадей. Если они остановят телегу, владелец (бегущий следом) будет им благодарен.
://''Незаконная сделка.''// Персонажи видят, как две фигуры в плащах заключают какую-то противозаконную сделку.
://''Представление.''// Персонажи видят некое общественное развлечение, такое как выступление умелого барда, уличный цирк, кукольное шоу, яркое магическое представление, королевский визит, или публичную казнь.
://''Бродяжка.''// Уличный бродяжка увязывается за искателями приключений и следует за ними, пока его не припугнут.
<table>
<tr>
<th rowspan="2">к100</th>
<th rowspan="2">Эффект</th>
</tr>
<tr>
</tr>
<tr>
<td>03–04</td>
<td>В течение минуты вы можете видеть невидимых существ, если у вас есть линия обзора до них.</td>
</tr>
<tr>
<td>05–06</td>
<td>В свободном пространстве в пределах 5 футов от вас появляется модрон, выбранный и контролируемый Мастером. Модрон исчезает через 1 минуту.</td>
</tr>
<tr>
<td>07–08</td>
<td>Вы накладываете огненный шар как заклинание 3 уровня, с центром на себе.</td>
</tr>
<tr>
<td>09–10</td>
<td>Вы накладываете волшебную стрелу как заклинание 5 уровня.</td>
</tr>
<tr>
<td>11–12</td>
<td>Бросьте к10. Ваш рост изменяется на количество дюймов, равное результату броска. Если бросок нечётный, вы уменьшаетесь. Если бросок чётный, вы растёте.</td>
</tr>
<tr>
<td>13–14</td>
<td>Вы накладываете заклинание смятение с центромна себе.</td>
</tr>
<tr>
<td>15–16</td>
<td>В течение следующей минуты вы восстанавливаете по 5 хитов в начале каждого своего хода.</td>
</tr>
<tr>
<td>17–18</td>
<td>У вас вырастает длинная борода из перьев, которая остаётся, пока вы не чихнёте, и в этот момент перья разлетаются во все стороны.</td>
</tr>
<tr>
<td>19–20</td>
<td>Вы накладываете заклинание скольжение с центром на себе.</td>
</tr>
<tr>
<td>21–22</td>
<td>Существа получают помеху к спасброскам от следующего заклинания, которое вы сотворите в течение следующей минуты, требующего совершить спасбросок.</td>
</tr>
<tr>
<td>23–24</td>
<td>Ваша кожа окрашивается в ярко-синий цвет. Заклинание снятие проклятья отменяет этот эффект.</td>
</tr>
<tr>
<td>25–26</td>
<td>На вашем лбу на минуту появляется глаз. В течение этого времени, вы совершаете с преимуществом проверки Мудрость (Внимательность), полагающиеся на зрение.</td>
</tr>
<tr>
<td>27–28</td>
<td>В течение следующей минуты все ваши заклинания со временем накладывания «1 действие» могут быть сотворены бонусным действием.</td>
</tr>
<tr>
<td>29–30</td>
<td>Вы телепортируетесь на расстояние до 60 футов в свободное пространство по вашему выбору, которое видите.</td>
</tr>
<tr>
<td>31–32</td>
<td>Вы перемещаетесь на Астральный План до конца своего следующего хода, после чего вы вернётесь в пространство, ранее занимаемое, или ближайшее свободное пространство, если это пространство занято.</td>
</tr>
<tr>
<td>33–34</td>
<td>Урон от следующего заклинания, причиняющего урон и сотворённого в течение следующей минуты, будет максимальным.</td>
</tr>
<tr>
<td>35–36</td>
<td>Бросьте к10. Ваш возраст изменяется на число лет, равное броску. Если бросок нечётный, вы молодеете (минимум 1 год). Если бросок чётный, вы стареете.</td>
</tr>
<tr>
<td>37–38</td>
<td>В пределах 60 футов от вас в свободном пространстве появляются 1к6 флампов, контролируемых Мастером, и напуганных вами. Они исчезают через 1 минуту.</td>
</tr>
<tr>
<td>39–40</td>
<td>Вы восстанавливаете 2к10 хитов.</td>
</tr>
<tr>
<td>41–42</td>
<td>Вы превращаетесь в горшок с цветами до начала своего следующего хода. Будучи растением, вы недееспособны и уязвимы для всех видов урона. Если ваши хиты опускаются до 0, ваш горшок раскалывается, и вы возвращаетесь в свою форму.</td>
</tr>
<tr>
<td>43–44</td>
<td>В течение следующей минуты вы можете в каждый свой ход бонусным действием телепортироваться на расстояние до 20 футов.</td>
</tr>
<tr>
<td>45–46</td>
<td>Вы накладываете заклинание левитация на себя.</td>
</tr>
<tr>
<td>47–48</td>
<td>В пределах 5 футов от вас появляется единорог, контролируемый Мастером. Он исчезает через 1 минуту.</td>
</tr>
<tr>
<td>49–50</td>
<td>Вы не можете говорить в течение следующей минуты. Всякий раз, когда вы пытаетесь говорить, из вашего рта вылетают розовые пузырьки.</td>
</tr>
<tr>
<td>51–52</td>
<td>В течение следующей минуты рядом с вами парит призрачный щит, предоставляющий бонус +2 к КД и иммунитет к волшебной стреле.</td>
</tr>
<tr>
<td>53–54</td>
<td>Вы получаете иммунитет к воздействию алкоголя на ваш организм в течение следующих 5к6 дней.</td>
</tr>
<tr>
<td>55–56</td>
<td>У вас выпадают все волосы, но отрастают обратно за 24 часа.</td>
</tr>
<tr>
<td>57–58</td>
<td>В течение следующей минуты все легковоспламеняющиеся предметы, не несомые и не носимые другим существом, которых вы касаетесь, загораются.</td>
</tr>
<tr>
<td>59–60</td>
<td>Вы восстанавливаете самую низкоуровневую ячейку заклинания, потраченную вами.</td>
</tr>
<tr>
<td>61–62</td>
<td>В течение следующей минуты вы должны кричать, когда говорите.</td>
</tr>
<tr>
<td>63–64</td>
<td>Вы накладываете туманное облако с центром на себе.</td>
</tr>
<tr>
<td>65–66</td>
<td>До трёх существ на ваш выбор в пределах 30 футов от вас получают урон электричеством 4к10.</td>
</tr>
<tr>
<td>67–68</td>
<td>Вы испуганы ближайшим к вам существом до конца своего следующего хода.</td>
</tr>
<tr>
<td>69–70</td>
<td>Все существа в пределах 30 футов от вас становятся невидимыми на 1 минуту. Невидимость прекращается, если существо атакует или накладывает заклинание.</td>
</tr>
<tr>
<td>71–72</td>
<td>Вы получаете на 1 минуту сопротивление ко всем видам урона.</td>
</tr>
<tr>
<td>73–74</td>
<td>Случайное существо в пределах 60 футов от вас становится отравленным на 1к4 часа.</td>
</tr>
<tr>
<td>75–76</td>
<td>Вы в течение минуты излучаете яркий свет в радиусе 30 футов. Все существа, оканчивающие ход в пределах 5 футов от вас, становятся ослепшими до конца своего следующего хода.</td>
</tr>
<tr>
<td>77–78</td>
<td>Вы накладываете на себя заклинание превращение. Если вы проваливаете спасбросок, то на время действия заклинания превращаетесь в овцу.</td>
</tr>
<tr>
<td>79–80</td>
<td>В течение минуты в пределах 10 футов от вас в воздухе порхают иллюзорные бабочки и лепестки цветов.</td>
</tr>
<tr>
<td>81–82</td>
<td>Вы можете немедленно совершить одно дополнительное действие.</td>
</tr>
<tr>
<td>83–84</td>
<td>Все существа в пределах 30 футов от вас получают урон некротической энергией 1к10. Вы восстанавливаете хиты, равные сумме причинённого урона.</td>
</tr>
<tr>
<td>85–86</td>
<td>Вы накладываете отражения.</td>
</tr>
<tr>
<td>87–88</td>
<td>Вы накладываете полёт на случайное существо в пределах 60 футов от вас.</td>
</tr>
<tr>
<td>89–90</td>
<td>Вы становитесь невидимым на 1 минуту. При этом другие существа не могут услышать вас. Невидимость оканчивается, если вы атакуете или накладываете заклинание.</td>
</tr>
<tr>
<td>91–92</td>
<td>Если вы погибнете в течение следующей минуты, то мгновенно вернётесь к жизни, как если бы вас воскресили заклинанием реинкарнация.</td>
</tr>
<tr>
<td>93–94</td>
<td>Ваш размер на 1 минуту увеличивается на одну категорию.</td>
</tr>
<tr>
<td>95–96</td>
<td>Вы и все существа в пределах 30 футов от вас получаете на 1 минуту уязвимость к колющему урону.</td>
</tr>
<tr>
<td>97–98</td>
<td>В течение следующей минуты вы окружены тихой неземной музыкой.</td>
</tr>
<tr>
<td>99–00</td>
<td>Вы восстанавливаете все потраченные единицы чародейства.</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заговоры</th>
<th rowspan="2">Известные заклинания</th>
<th colspan="9">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Использование заклинаний|Использование заклинаний (Бард)]], [[Вдохновение барда (к6)|Вдохновение барда (Бард)]]</td>
<td>2</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Мастер на все руки|Мастер на все руки (Бард)]], [[Песнь отдыха (к6)|Песнь отдыха (Бард)]]</td>
<td>2</td>
<td>5</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>[[Коллегия бардов|Коллегии бардов (Бард)]], [[Компетентность|Компетентность (Бард)]]</td>
<td>2</td>
<td>6</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>[[Вдохновение барда (к8)|Вдохновение барда (Бард)]], [[Источник вдохновения|Источник вдохновения (Бард)]]</td>
<td>3</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Контрочарование|Контрочарование (Бард)]], [[Умение коллегии бардов|Коллегии бардов (Бард)]]</td>
<td>3</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>—</td>
<td>3</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>[[Песнь отдыха (к8)|Песнь отдыха (Бард)]]</td>
<td>3</td>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Вдохновение барда (к10)|Вдохновение барда (Бард)]], [[Компетентность|Компетентность (Бард)]], [[Тайны магии|Тайны магии (Бард)]]</td>
<td>4</td>
<td>14</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>—</td>
<td>4</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>[[Песнь отдыха (к10)|Песнь отдыха (Бард)]]</td>
<td>4</td>
<td>16</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Тайны магии|Тайны магии (Бард)]], [[Умение коллегии бардов|Коллегии бардов (Бард)]]</td>
<td>4</td>
<td>18</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>[[Вдохновение барда (к12)|Вдохновение барда (Бард)]]</td>
<td>4</td>
<td>19</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>19</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>[[Песнь отдыха (к12)|Песнь отдыха (Бард)]]</td>
<td>4</td>
<td>20</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Тайны магии|Тайны магии (Бард)]]</td>
<td>4</td>
<td>22</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>22</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Превосходное вдохновение|Превосходное вдохновение (Бард)]]</td>
<td>4</td>
<td>22</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
<table>
<tr>
<th>Уровень</th>
<th>Бонус мастерства</th>
<th>Умения</th>
<th>Ярость</th>
<th>Урон ярости</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Защита без доспехов|Защита без доспехов (Варвар)]], [[Ярость|Ярость (Варвар)]]</td>
<td>2</td>
<td>+2</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Безрассудная атака|Безрассудная атака (Варвар)]], [[Чувство опасности|Чувство опасности (Варвар)]]</td>
<td>2</td>
<td>+2</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>[[Путь дикости|Путь дикости (Умение Варвара)]]</td>
<td>3</td>
<td>+2</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>+2</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>[[Быстрое передвижение|Быстрое передвижение (Варвар)]], [[Дополнительная атака|Дополнительная атака]]</td>
<td>3</td>
<td>+2</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Умение пути|Пути дикости (Варвар)]]</td>
<td>4</td>
<td>+2</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>[[Дикий инстинкт|Дикий инстинкт (Варвар)]]</td>
<td>4</td>
<td>+2</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>+2</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>[[Сильный критический удар (1 кость)|Сильный критический удар (Варвар)]]</td>
<td>4</td>
<td>+3</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Умение пути|Пути дикости (Варвар)]]</td>
<td>4</td>
<td>+3</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>[[Непреклонная ярость|Непреклонная ярость (Варвар)]]</td>
<td>4</td>
<td>+3</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>+3</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>[[Сильный критический удар (2 кости)|Сильный критический удар (Варвар)]]</td>
<td>5</td>
<td>+3</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Умение пути|Пути дикости (Варвар)]]</td>
<td>5</td>
<td>+3</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>[[Непрерывная ярость|Непрерывная ярость (Варвар)]]</td>
<td>5</td>
<td>+3</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>+4</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>[[Сильный критический удар (3 кости)|Сильный критический удар (Варвар)]]</td>
<td>6</td>
<td>+4</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Неукротимая мощь|Неукротимая мощь (Варвар)]]</td>
<td>6</td>
<td>+4</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>6</td>
<td>+4</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Дикий чемпион|Дикий чемпион (Варвар)]]</td>
<td>Неограниченно</td>
<td>+4</td>
</tr>
</table>
<table class="tg">
<tr>
<th class="tg-amwm" rowspan="2">Уровень</th>
<th class="tg-amwm" rowspan="2">Бонус Мастерства</th>
<th class="tg-amwm" rowspan="2">Умения</th>
</tr>
<tr>
</tr>
<tr>
<td class="tg-baqh">1<br></td>
<td class="tg-baqh">+2</td>
<td class="tg-baqh">[[Боевой стиль|Боевой стиль (Воин)]], [[Второе дыхание|Второе дыхание (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">2</td>
<td class="tg-baqh">+2</td>
<td class="tg-baqh">[[Всплеск действий (Одно использование)|Всплеск действий (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">3</td>
<td class="tg-baqh">+2</td>
<td class="tg-baqh">[[Воинский архетип|Воинские архетипы (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">4</td>
<td class="tg-baqh">+2</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">5</td>
<td class="tg-baqh">+3</td>
<td class="tg-baqh">[[Дополнительная атака|Дополнительная атака (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">6</td>
<td class="tg-baqh">+3</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">7</td>
<td class="tg-baqh">+3</td>
<td class="tg-baqh">[[Умение воинского архетипа|Воинские архетипы (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">8</td>
<td class="tg-baqh">+3</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">9</td>
<td class="tg-baqh">+4</td>
<td class="tg-baqh">[[Упорный (Одно использование)|Упорный (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">10</td>
<td class="tg-baqh">+4</td>
<td class="tg-baqh">[[Умение воинского архетипа|Воинские архетипы (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">11</td>
<td class="tg-baqh">+4</td>
<td class="tg-baqh">[[Дополнительная атака (2)|Дополнительная атака (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">12</td>
<td class="tg-baqh">+4</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">13</td>
<td class="tg-baqh">+5</td>
<td class="tg-baqh">[[Упорный (Два использования)|Упорный (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">14</td>
<td class="tg-baqh">+5</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">15</td>
<td class="tg-baqh">+5</td>
<td class="tg-baqh">[[Умение воинского архетипа|Воинские архетипы (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">16</td>
<td class="tg-baqh">+5</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">17</td>
<td class="tg-baqh">+6</td>
<td class="tg-baqh">[[Всплеск действий (Два использования)|Всплеск действий (Воин)]], [[Упорный (Три использования)|Упорный (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">18</td>
<td class="tg-baqh">+6</td>
<td class="tg-baqh">[[Умение воинского архетипа|Воинские архетипы (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">19</td>
<td class="tg-baqh">+6</td>
<td class="tg-baqh">[[Увеличение характеристик|Увеличение характеристик (Воин)]]</td>
</tr>
<tr>
<td class="tg-baqh">20</td>
<td class="tg-baqh">+6</td>
<td class="tg-baqh">[[Дополнительная атака (3)|Дополнительная атака (Воин)]]</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заговоры</th>
<th colspan="9">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Использование заклинаний|Использование заклинаний (Волшебник)]], [[Магическое восстановление|Магическое восстановление (Волшебник)]]</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Магические традиции|Магические традиции (Волшебник)]]</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>—</td>
<td>3</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Умение магической традиции|Магические традиции (Волшебник)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Умение магической традиции|Магические традиции (Волшебник)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>—</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>—</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Умение магической традиции|Магические традиции (Волшебник)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>—</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>—</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Мастерство заклинателя|Мастерство заклинателя (Волшебник)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Фирменное заклинание|Фирменное заклинание (Волшебник)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заговоры</th>
<th colspan="9">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Друидический язык|Друидический язык (Друид)]], [[Использование заклинаний|Использование заклинаний (Друид)]]</td>
<td>2</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Дикий облик|Дикий облик (Друид)]], [[Круг друидов|Круги друидов (Друид)]]</td>
<td>2</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>—</td>
<td>2</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Улучшение дикой формы|Дикий облик (Друид)]], [[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>—</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Умение круга друидов|Круги друидов (Друид)]]</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>—</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Улучшение дикой формы|Дикий облик (Друид)]], [[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>—</td>
<td>3</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Умение круга друидов|Круги друидов (Друид)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Умение круга друидов|Круги друидов (Друид)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>—</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Безвременное тело|Безвременное тело (Друид)]], [[Заклинания зверя|Заклинания зверя (Друид)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Архидруид|Архидруид (Друид)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заговоры</th>
<th colspan="9">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Использование заклинаний|Использование заклинаний (Жрец)]], [[Божественный домен|Божественные домены (Жрец)]]</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Божественный канал (1/отдых)|Божественный канал (Жрец)]], [[Умение божественного домена|Божественные домены (Жрец)]]</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>---</td>
<td>3</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>[[Уничтожение нежити (ПО 1/2)|Уничтожение нежити (Жрец)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Божественный канал (2/отдых)|Божественный канал (Жрец)]], [[Умение божественного домена|Божественные домены (Жрец)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>---</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]], [[Уничтожение нежити (ПО 1)|Уничтожение нежити (Жрец)]], [[Умение божественного домена|Божественные домены (Жрец)]]</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>---</td>
<td>4</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Божественное вмешательство|Божественное вмешательство (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>[[Уничтожение нежити (ПО 2)|Уничтожение нежити (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>---</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Уничтожение нежити (ПО 3)|Уничтожение нежити (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>---</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>[[Уничтожение нежити (ПО 4)|Увеличение характеристик]], [[Умение божественного домена|Божественные домены (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Божественный канал (3/отдых)|Божественный канал (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Улучшение божественного вмешательства|Божественное вмешательство (Жрец)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
<table>
<tr>
<th>Уровень</th>
<th>Бонус мастерства</th>
<th>Умения</th>
<th>Известные заговоры</th>
<th>Известные заклинания</th>
<th>Ячейки заклинаний</th>
<th>Уровень ячеек</th>
<th>Известные воззвания</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Потусторонний покровитель|Потусторонние покровители (Колдун)]], [[Магия договора|Магия договора (Колдун)]]</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Таинственные воззвания|Таинственные воззвания (Колдун)]]</td>
<td>2</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>[[Предмет договора|Предмет договора (Колдун)]]</td>
<td>2</td>
<td>4</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>5</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>—</td>
<td>3</td>
<td>6</td>
<td>2</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Умение покровителя|Потусторонние покровители (Колдун)]]</td>
<td>3</td>
<td>7</td>
<td>2</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>—</td>
<td>3</td>
<td>8</td>
<td>2</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>9</td>
<td>2</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>—</td>
<td>3</td>
<td>10</td>
<td>2</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Умение покровителя|Потусторонние покровители (Колдун)]]</td>
<td>4</td>
<td>10</td>
<td>2</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>[[Таинственный арканум (6 уровень)|Таинственный арканум (Колдун)]]</td>
<td>4</td>
<td>11</td>
<td>3</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>11</td>
<td>3</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>[[Таинственный арканум (7 уровень)|Таинственный арканум (Колдун)]]</td>
<td>4</td>
<td>12</td>
<td>3</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Умение покровителя|Потусторонние покровители (Колдун)]]</td>
<td>4</td>
<td>12</td>
<td>3</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>[[Таинственный арканум (8 уровень)|Таинственный арканум (Колдун)]]</td>
<td>4</td>
<td>13</td>
<td>3</td>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>13</td>
<td>3</td>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>[[Таинственный арканум (9 уровень)|Таинственный арканум (Колдун)]]</td>
<td>4</td>
<td>14</td>
<td>4</td>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>—</td>
<td>4</td>
<td>14</td>
<td>4</td>
<td>5</td>
<td>8</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>15</td>
<td>4</td>
<td>5</td>
<td>8</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Таинственный мастер|Таинственный мастер (Колдун)]]</td>
<td>4</td>
<td>15</td>
<td>4</td>
<td>5</td>
<td>8</td>
</tr>
</table>
<table>
<tr>
<th>Уровень</th>
<th>Бонус мастерства</th>
<th>Боевые искусства</th>
<th>Очки ци</th>
<th>Скорость без доспехов</th>
<th>Умения</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>1к4</td>
<td>—</td>
<td>—</td>
<td>[[Защита без доспехов|Защита без доспехов (Монах)]], [[Боевые искусства|Боевые искусства (Монах)]]</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>1к4</td>
<td>2</td>
<td>+10 фт.</td>
<td>[[Движение без доспехов|Движение без доспехов (Монах)]], [[Ци|Ци (Монах)]]</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>1к4</td>
<td>3</td>
<td>+10 фт.</td>
<td>[[Монастырская традиция|Монастырские традиции (Монах)]], [[Отражение снарядов|Отражение снарядов (Монах)]]</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>1к4</td>
<td>4</td>
<td>+10 фт.</td>
<td>[[Медленное падение|Медленное падение (Монах)]], [[Увеличение характеристик|Увеличение характеристик]]</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>1к6</td>
<td>5</td>
<td>+10 фт.</td>
<td>[[Дополнительная атака|Дополнительная атака]], [[Ошеломляющий удар|Ошеломляющий удар (Монах)]]</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>1к6</td>
<td>6</td>
<td>+15 фт.</td>
<td>[[Умение монастырской традиции|Монастырские традиции (Монах)]], [[Энергетические удары|Энергетические удары (Монах)]]</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>1к6</td>
<td>7</td>
<td>+15 фт.</td>
<td>[[Спокойствие разума|Спокойствие разума (Монах)]], [[Увёртливость|Увёртливость (Монах)]]</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>1к6</td>
<td>8</td>
<td>+15 фт.</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>1к6</td>
<td>9</td>
<td>+15 фт.</td>
<td>[[Улучшенное движение без доспехов|Движение без доспехов (Монах)]]</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>1к6</td>
<td>10</td>
<td>+20 фт.</td>
<td>[[Чистота тела|Чистота тела (Монах)]]</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>1к8</td>
<td>11</td>
<td>+20 фт.</td>
<td>[[Умение монастырской традиции|Монастырские традиции (Монах)]]</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>1к8</td>
<td>12</td>
<td>+20 фт.</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>1к8</td>
<td>13</td>
<td>+20 фт.</td>
<td>[[Язык солнца и луны|Язык солнца и луны (Монах)]]</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>1к8</td>
<td>14</td>
<td>+25 фт.</td>
<td>[[Алмазная душа|Алмазная душа (Монах)]]</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>1к8</td>
<td>15</td>
<td>+25 фт.</td>
<td>[[Безвременное тело|Безвременное тело (Монах)]]</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>1к8</td>
<td>16</td>
<td>+25 фт.</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>1к10</td>
<td>17</td>
<td>+25 фт.</td>
<td>[[Умение монастырской традиции|Монастырские традиции (Монах)]]</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>1к10</td>
<td>18</td>
<td>+30 фт.</td>
<td>[[Пустое тело|Пустое тело (Монах)]]</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>1к10</td>
<td>19</td>
<td>+30 фт.</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>1к10</td>
<td>20</td>
<td>+30 фт.</td>
<td>[[Совершенство|Совершенство (Монах)]]</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th colspan="5">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Божественное чувство|Божественное чувство (Паладин)]], [[Наложение рук|Наложение рук (Паладин)]]</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Боевой стиль|Боевой стиль (Паладин)]], [[Использование заклинаний|Использование заклинаний (Паладин)]], [[Божественная кара|Божественная кара (Паладин)]]</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>[[Божественное здоровье|Божественное здоровье (Паладин)]], [[Священная клятва|Священные клятвы (Паладин)]]</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>[[Дополнительная атака|Дополнительная атака]]</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>[[Аура защиты|Аура защиты (Паладин)]]</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>[[Умение священной клятвы|Священные клятвы (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>—</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>[[Аура отваги|Аура отваги (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>[[Улучшенная божественная кара|Улучшенная Божественная кара (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>—</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Очищающее касание|Очищающее касание (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>[[Умение священной клятвы|Священные клятвы (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>—</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>Улучшения [[ауры отваги|Аура отваги (Паладин)]] и [[ауры защиты|Аура защиты (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Умение священной клятвы|Священные клятвы (Паладин)]]</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
</tr>
</table>
<table>
<tr>
<th>Уровень</th>
<th>Бонус мастерства</th>
<th>Скрытая атака</th>
<th>Умения</th>
</tr>
<tr>
<td>1<br> </td>
<td>+2<br> </td>
<td>1к6<br> </td>
<td>[[Компетентность|Компетентность (Плут)]], [[Скрытая атака|Скрытая атака (Плут)]], [[Воровской жаргон|Воровской жаргон (Плут)]]<br> </td>
</tr>
<tr>
<td>2<br> </td>
<td>+2<br> </td>
<td>1к6<br> </td>
<td>[[Хитрое действие|Хитрое действие (Плут)]]<br> </td>
</tr>
<tr>
<td>3<br> </td>
<td>+2<br> </td>
<td>2к6<br> </td>
<td>[[Архетип плута|Архетипы плута (Плут)]]<br> </td>
</tr>
<tr>
<td>4<br> </td>
<td>+2<br> </td>
<td>2к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>5<br> </td>
<td>+3<br> </td>
<td>3к6<br> </td>
<td>[[Невероятное уклонение|Невероятное уклонение (Плут)]]<br> </td>
</tr>
<tr>
<td>6<br> </td>
<td>+3<br> </td>
<td>3к6<br> </td>
<td>[[Компетентность|Компетентность (Плут)]]<br> </td>
</tr>
<tr>
<td>7<br> </td>
<td>+3<br> </td>
<td>4к6<br> </td>
<td>[[Увёртливость|Увёртливость (Плут)]]<br> </td>
</tr>
<tr>
<td>8<br> </td>
<td>+3<br> </td>
<td>4к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>9<br> </td>
<td>+4<br> </td>
<td>5к6<br> </td>
<td>[[Умение архетипа плута|Архетипы плута (Плут)]]<br> </td>
</tr>
<tr>
<td>10<br> </td>
<td>+4<br> </td>
<td>5к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>11<br> </td>
<td>+4<br> </td>
<td>6к6<br> </td>
<td>[[Надёжный талант|Надёжный талант (Плут)]]<br> </td>
</tr>
<tr>
<td>12<br> </td>
<td>+4<br> </td>
<td>6к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>13<br> </td>
<td>+5<br> </td>
<td>7к6<br> </td>
<td>[[Умение архетипа плута|Архетипы плута (Плут)]]<br> </td>
</tr>
<tr>
<td>14<br> </td>
<td>+5<br> </td>
<td>7к6<br> </td>
<td>[[Слепое зрение|Слепое зрение (Плут)]]<br> </td>
</tr>
<tr>
<td>15<br> </td>
<td>+5<br> </td>
<td>8к6<br> </td>
<td>[[Скользкий ум|Скользкий ум (Плут)]]<br> </td>
</tr>
<tr>
<td>16<br> </td>
<td>+5<br> </td>
<td>8к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>17<br> </td>
<td>+6<br> </td>
<td>9к6<br> </td>
<td>[[Умение архетипа плута|Архетипы плута (Плут)]]<br> </td>
</tr>
<tr>
<td>18<br> </td>
<td>+6<br> </td>
<td>9к6<br> </td>
<td>[[Неуловимость|Неуловимость (Плут)]]<br> </td>
</tr>
<tr>
<td>19<br> </td>
<td>+6<br> </td>
<td>10к6<br> </td>
<td>[[Увеличение характеристик|Увеличение характеристик]]<br> </td>
</tr>
<tr>
<td>20<br> </td>
<td>+6<br> </td>
<td>10к6<br> </td>
<td>[[Удача|Удача (Плут)]]<br> </td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заклинания</th>
<th colspan="5">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>[[Избранный враг|Избранный враг (Следопыт)]][[Избранный враг (Следопыт)]], [[Исследователь природы|Исследователь природы (Следопыт)]]</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>[[Боевой стиль|Боевой стиль (Следопыт)]], [[Использование заклинаний|Использование заклинаний (Следопыт)]]</td>
<td>2</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>[[Архетип следопыта|Архетипы следопыта (Следопыт)]], [[Первозданная осведомлённость|Первозданная осведомлённость (Следопыт)]]</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>[[Дополнительная атака|Дополнительная атака]]</td>
<td>4</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>Улучшение [[избранного врага|Избранный враг (Следопыт)]] и [[исследователя природы|Исследователь природы (Следопыт)]]</td>
<td>4</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>[[Умение архетипа следопыта|Архетипы следопыта (Следопыт)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>[[Увеличение характеристик|Увеличение характеристик]], [[Тропами земли|Тропами земли (Следопыт)]]</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>—</td>
<td>6</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>Улучшение [[исследователя природы|Исследователь природы (Следопыт)]], [[Маскировка на виду|Маскировка на виду (Следопыт)]]</td>
<td>6</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>[[Умение архетипа следопыта|Архетипы следопыта (Следопыт)]]</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>—</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>[[Улучшение избранного врага|Избранный враг (Следопыт)]], [[Исчезновение|Исчезновение (Следопыт)]]</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>[[Умение архетипа следопыта|Архетипы следопыта (Следопыт)]]</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>[[Увеличение характеристик|Увеличение характеристик]]</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>—</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>[[Дикие чувства|Дикие чувства (Следопыт)]]</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>[[Улучшение характеристик|Увеличение характеристик]]</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>[[Убийца врагов|Убийца врагов (Следопыт)]]</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
</tr>
</table>
<table>
<tr>
<th rowspan="2">Уровень</th>
<th rowspan="2">Бонус мастерства</th>
<th rowspan="2">Единицы чародейства</th>
<th rowspan="2">Умения</th>
<th rowspan="2">Известные заговоры</th>
<th rowspan="2">Известные заклинания</th>
<th colspan="9">Ячейки заклинаний на уровень заклинаний</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
<tr>
<td>1</td>
<td>+2</td>
<td>—</td>
<td>Использование заклинаний, Происхождение чародея</td>
<td>4</td>
<td>2</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>2</td>
<td>+2</td>
<td>2</td>
<td>Источник магии</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>3</td>
<td>+2</td>
<td>3</td>
<td>Метамагия</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>4</td>
<td>+2</td>
<td>4</td>
<td>Увеличение характеристик</td>
<td>5</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>5</td>
<td>+3</td>
<td>5</td>
<td>—</td>
<td>5</td>
<td>6</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>6</td>
<td>+3</td>
<td>6</td>
<td>Умение происхождения чародея</td>
<td>5</td>
<td>7</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>7</td>
<td>+3</td>
<td>7</td>
<td>—</td>
<td>5</td>
<td>8</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>8</td>
<td>+3</td>
<td>8</td>
<td>Улучшение характеристик</td>
<td>5</td>
<td>9</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>9</td>
<td>+4</td>
<td>9</td>
<td>—</td>
<td>5</td>
<td>10</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>10</td>
<td>+4</td>
<td>10</td>
<td>Метамагия</td>
<td>6</td>
<td>11</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>11</td>
<td>+4</td>
<td>11</td>
<td>—</td>
<td>6</td>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>12</td>
<td>+4</td>
<td>12</td>
<td>Увеличение характеристик</td>
<td>6</td>
<td>12</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>13</td>
<td>+5</td>
<td>13</td>
<td>—</td>
<td>6</td>
<td>13</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>14</td>
<td>+5</td>
<td>14</td>
<td>Умение происхождения чародея</td>
<td>6</td>
<td>13</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>15</td>
<td>+5</td>
<td>15</td>
<td>—</td>
<td>6</td>
<td>14</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>16</td>
<td>+5</td>
<td>16</td>
<td>Увеличение характеристик</td>
<td>6</td>
<td>14</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>—</td>
</tr>
<tr>
<td>17</td>
<td>+6</td>
<td>17</td>
<td>Метамагия</td>
<td>6</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>18</td>
<td>+6</td>
<td>18</td>
<td>Умение происхождения чародея</td>
<td>6</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>19</td>
<td>+6</td>
<td>19</td>
<td>Увеличение характеристик</td>
<td>6</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>20</td>
<td>+6</td>
<td>20</td>
<td>Чародейское восстановление</td>
<td>6</td>
<td>15</td>
<td>4</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>1</td>
</tr>
</table>
!!''Таинственные воззвания''
Если таинственное воззвание имеет требования, вы должны выполнить их, чтобы познать его. Вы можете узнать воззвание сразу же, как только выполните все необходимые требования. Указанный в требованиях уровень относится к уровню колдуна, а не персонажа.
{{Ведьмачий взор}}
{{Взор двух умов}}
{{Видения далёких королевств}}
{{Вор пяти судеб}}
{{Восходящий шаг}}
{{Глаза хранителя рун}}
{{Глас цепного мастера}}
{{Доспех теней}}
{{Дьявольский взгляд}}
{{Жаждущий клинок}}
{{Животная речь}}
{{Завораживающий шёпот}}
{{Знак дурного предзнаменования}}
{{Книга древних секретов}}
{{Маска многих лиц}}
{{Мастер бесчисленных обликов}}
{{Мистическое копьё}}
{{Могильный шёпот}}
{{Мощь исчадия}}
{{Мучительный взрыв}}
{{Обманчивое влияние}}
{{Один среди теней}}
{{Отталкивающий заряд}}
{{Потусторонний прыжок}}
{{Пьющий жизнь}}
{{Скульптор плоти}}
{{Слуги хаоса}}
{{Таинственный взгляд}}
{{Туманные видения}}
{{Ужасающее слово}}
{{Цепи Карцери}}
!!!__''Таинственные воззвания''__
"""В процессе изучения оккультных знаний вы раскопали таинственные воззвания: фрагменты запрещённых знаний, которые даруют магические способности.
На 2 уровне вы получаете два воззвания на свой выбор. Смотрите список воззваний в конце описания этого класса. Получая новые уровни колдуна, вы получаете дополнительные воззвания на свой выбор, как показано в колонке «известные воззвания».
Кроме того, когда вы получаете новый уровень этого класса, вы можете выбрать одно известное вам воззвание и заменить его другим, которое вы способны выучить на этом уровне."""
!!!__''Таинственный арканум''__
"""На 11 уровне ваш покровитель дарует вам магический секрет, называемый арканумом. Выберите одно заклинание 6 уровня из списка заклинаний колдуна в качестве арканума.
Вы можете сотворить это заклинание, не используя ячейку заклинаний. Вы должны окончить продолжительный отдых, чтобы сделать это ещё раз.
На следующих уровнях вы получаете новые заклинания, которые можно применить таким образом — одно 7 уровня на 13 уровне, одно 8 уровня на 15 уровне и одно 9 уровня на 17 уровне. После окончания продолжительного отдыха вы восстанавливаете все потраченные использования арканумов."""
!!!''Таинственный взгляд''
"""Вы можете неограниченно накладывать заклинание обнаружение магии, не тратя ячейки заклинаний."""
!!!''__Таинственный мастер__''
На 20 уровне вы можете обратиться к внутреннему резерву мистической силы, умоляя при этом покровителя восстановить потраченные ячейки заклинаний. Вам надо потратить 1 минуту, умоляя покровителя, чтобы восстановить все использованные ячейки заклинаний, дарованные умением Магия договора. Вы должны закончить продолжительный отдых, чтобы применить это умение вновь.
//7 уровень, Иллюзия, Бард/Волшебник/Друид//
:''Время накладывания:'' 10 минут
:''Дистанция:'' Обзор
:''Компоненты:'' В, С
:''Длительность:'' 10 дней
"""Вы заставляете местность в пределах 1 квадратной мили выглядеть, звучать, пахнуть и даже ощущаться как другая местность. Общая форма местности остаётся той же самой. Открытые поля и дороги можно сделать похожими на болото, холм, расселину или другую труднопроходимую или непроходимую местность. Пруд можно сделать похожим на травяную лужайку, пропасть сделать пологим склоном, а каменистый овраг — широкой и ровной дорогой.
Точно так же, вы можете изменять внешний облик строений, или создавать их там, где их не было. Это заклинание не маскирует, не скрывает и не добавляет существ.
Иллюзия включает в себя слышимые, видимые, тактильные и обонятельные элементы, так что она может сделать обычную местность труднопроходимой (и наоборот), и как-то иначе препятствовать перемещению. Все части иллюзорной местности (такие как камни и палки), вынесенные за пределы области пространства, мгновенно исчезают.
Существа с истинным зрением могут видеть сквозь иллюзию настоящую местность; однако, все элементы иллюзии для него остаются, так что хоть оно и будет знать о наличии иллюзии, оно всё ещё может взаимодействовать с ней."""
!!!''__Тайны магии__''
"""К 10 уровню вы успели набрать знаний из самого широкого спектра магических дисциплин. Выберите два заклинания любого класса, включая ваш собственный. Эти заклинания должны быть того уровня, который вы можете использовать, или являться заговорами.
Теперь эти заклинания считаются для вас заклинаниями барда, и они уже включены в общее количество известных вам заклинаний согласно таблице «Бард».
Ещё по два заклинания других классов вы выучите на 14 и 18 уровнях."""
//Чудесный предмет, легендарный (требуется настройка существом со злым мировоззрением)//
Этот предмет символизирует чистое зло. Существа, чьё мировоззрение и не доброе и не злое, получают урон некротической энергией 6к6, когда прикасаются к талисману. Доброе существо получает урон некротической энергией 8к6, когда прикасается к талисману. Все эти существа получают такой же урон каждый раз, когда оканчивают ход, держа или неся талисман.
Если вы — злой жрец или паладин, вы можете использовать талисман как святой символ, и вы получаете бонус +2 к броскам атаки заклинаний, пока носите или держите его.
У талисмана есть 6 зарядов. Если вы носите или держите его, вы можете действием потратить 1 заряд и выбрать одно существо, которое видите находящимся на полу в пределах 120 футов от вас. Если у цели доброе мировоззрение, под ней откроется огненная расщелина. Цель должна преуспеть в спасброске Ловкости со Сл 20, иначе она упадёт в расщелину и уничтожится, не оставив после себя останков.
Расщелина после этого закрывается, не оставляя следов. Когда вы тратите последний заряд, талисман растворяется дурно пахнущей слизью и уничтожается.
//Чудесный предмет, легендарный (требуется настройка)//
Когда вы совершаете проверку Интеллекта (Магия) для контроля сферы аннигиляции, держа этот талисман, вы удваиваете бонус мастерства для этой проверки. Кроме того, если вы начинаете ход, удерживая контроль над сферой аннигиляции, вы можете действием сделать так, что она переместится на 10 футов плюс количество футов, равное 10 х ваш модификатор Интеллекта.
//Чудесный предмет, легендарный (требуется настройка существом с добрым мировоззрением)//
Этот талисман — могущественный символ добра. Существа, чьё мировоззрение и не доброе и не злое, получают урон излучением 6к6, когда прикасаются к талисману. Злое существо получает урон излучением 8к6, когда прикасается к талисману. Все эти существа получают такой же урон каждый раз, когда оканчивают ход, держа или неся талисман.
Если вы — добрый жрец или паладин, вы можете использовать талисман как святой символ, и вы получаете бонус +2 к броскам атаки заклинаний, пока носите или держите его.
У талисмана есть 7 зарядов. Если вы носите или держите его, вы можете действием потратить 1 заряд и выбрать одно существо, которое видите находящимся на полу в пределах 120 футов от вас. Если у цели злое мировоззрение, под ней откроется огненная расщелина.
Цель должна преуспеть в спасброске Ловкости со Сл 20, иначе она упадёт в расщелину и уничтожится, не оставив после себя останков. Расщелина после этого закрывается, не оставляя следов. Когда вы тратите последний заряд, талисман распадается искрами золотистого света и уничтожается.
//Оружие (любой меч), очень редкое (требуется настройка)//
Вы можете бонусным действием бросить этот магический меч в воздух и произнести командное слово. После этого меч начнёт парить, пролетает до 30 футов и атакует одно существо на ваш выбор в пределах 5 футов от него. Меч использует ваш бросок атаки и ваш модификатор характеристики для броска урона.
Пока меч парит, вы можете бонусным действием заставить его перелететь на расстояние 30 футов в другое место, находящееся в пределах 30 футов от вас. Частью этого же бонусного действия вы можете заставить меч атаковать одно существо, находящееся в пределах 5 футов от него.
После того как парящий меч совершит четвёртую атаку, он пролетает до 30 футов и пытается вернуться в вашу руку. Если у вас нет свободных рук, он падает на землю у ваших ног. Если у меча нет свободного пути до вас, он перемещается максимально близко к вам и потом падает на землю. Он перестаёт парить, если вы хватаете его или перемещаетесь более чем на 30 футов от него.
//5 уровень, Преобразование, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы получаете способность перемещать силой мысли существ и предметы, а также манипулировать ими. Когда вы накладываете это заклинание, а также в каждом последующем раунде, новым действием, вы можете воздействовать на одно существо или предмет, видимый в пределах дистанции, вызывая один из описанных ниже эффектов. Вы можете действовать на одну и ту же цель, а можете каждый раз выбирать новую. Если вы меняете цель, предыдущая перестаёт быть под действием этого заклинания.
//''Предмет.''// Вы можете попытаться переместить предмет, весящий до 1 000 фунтов. Если предмет не несут и не носят, вы автоматически перемещаете его на 30 футов в любом направлении, но не за пределы дистанции заклинания.
Если предмет несёт или носит существо, вы должны совершить проверку базовой характеристики, противопоставив её проверке Силы существа. Если вы выиграете проверку, вы вырываете предмет у этого существа, и можете переместить его на 30 футов в любом направлении, но не за пределы дистанции заклинания.
Вы очень хорошо контролируете предмет телекинетической хваткой, так что можете манипулировать простыми инструментами, открывать двери и контейнеры, доставать и убирать предметы из открытых контейнеров, а также выливать содержимое сосудов.
//''Существо.''// Вы можете попытаться переместить существо с размером не больше Огромного. Совершите проверку своей базовой характеристики, противопоставив её проверке Силы существа. Если вы выиграете проверку, вы перемещаете существо на 30 футов в любом направлении, включая вверх, но не за пределы дистанции заклинания. До конца вашего следующего хода существо становится опутанным телекинетической хваткой. Существо, поднятое вверх, висит в воздухе.
В последующих раундах вы можете действием пытаться поддерживать телекинетический захват существа, повторяя встречную проверку."""
//8 уровень, Воплощение, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Без ограничений
:''Компоненты:'' В, С, М (два переплетённых серебряных кольца)
:''Длительность:'' 24 часа
"""Вы создаёте телепатическую связь между собой и знакомым согласным существом. Это существо может находиться где угодно на том же плане существования, что и вы. Заклинание оканчивается, если вы с целью перестанете находиться на одном плане.
Пока заклинание активно, вы и цель можете мгновенно обмениваться словами, образами, звуками и прочими сенсорными посланиями, и цель воспринимает вас как существо, с которым она общается. Это заклинание позволяет существу с Интеллектом как минимум 1 понимать смысл ваших слов и воспринимать посылаемые вами сенсорные послания."""
//7 уровень, Вызов, Бард/Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В
:''Длительность:'' Мгновенная
"""Это заклинание мгновенно переносит вас и до восьми согласных существ на ваш выбор, видимых вами и находящихся в пределах дистанции, или один предмет, видимый в пределах дистанции, в выбранное вами место. Если целью является предмет, он должен полностью помещаться в куб с длиной ребра 10 футов, и его не может носить или нести несогласное существо.
Выбранное место назначения должно быть известно вам, и оно должно находиться на одном плане существования с вами. Ваша ознакомленность с местом назначения определяет, успешным ли будет перемещение. Мастер бросает к100 и сверяется с таблицей."""
<table>
<tr>
<th>Ознакомленность</th>
<th>Неудача</th>
<th>Похожее место</th>
<th>Мимо цели</th>
<th>Точно в цель</th>
</tr>
<tr>
<td>Постоянный круг</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>01–100</td>
</tr>
<tr>
<td>Связанный предмет</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>01–100</td>
</tr>
<tr>
<td>Очень знакомое</td>
<td>01–05</td>
<td>06–13</td>
<td>14–24</td>
<td>25–100</td>
</tr>
<tr>
<td>Изредка видимое</td>
<td>01–33</td>
<td>34–43</td>
<td>44–53</td>
<td>54–100</td>
</tr>
<tr>
<td>Виденное один раз</td>
<td>01–43</td>
<td>44–53</td>
<td>54–73</td>
<td>74–100</td>
</tr>
<tr>
<td>Описанное</td>
<td>01–43</td>
<td>44–53</td>
<td>54–73</td>
<td>74–100</td>
</tr>
<tr>
<td>Ложно описанное</td>
<td>01–50</td>
<td>51–100</td>
<td>—</td>
<td>—</td>
</tr>
</table>
"""//''Ознакомленность.''// «Постоянный круг» означает постоянный круг телепортации, последовательность знаков которого вам известна. «Связанный предмет» означает, что у вас есть предмет, взятый из места назначения не позднее шести месяцев назад, например, книга из библиотеки волшебника, постельное бельё из королевской спальни, или кусок мрамора из потайного склеп лича.
«Очень знакомое» это место, в котором вы часто бываете, место, которое вам довелось изучить, или место, которое вы видите в процессе накладывания заклинания. «Изредка видимое» это место, которое вы видели несколько раз, но которое вам не очень хорошо известно. «Виденное один раз» это место, которое вы видели один раз, возможно, при помощи магии. «Описанное» это место, чьё местоположение и внешний облик вам известно со слов других, возможно, по карте.
«Ложно описанное» это место, которое не существует. Возможно, вы пытались подсмотреть святилище врага, но на самом деле видели иллюзию, или вы пытались телепортироваться в знакомое место, которое больше не существует.
//''Точно в цель.''// Вы и ваша группа (или предмет) появляетесь там, где было задумано.
//''Мимо цели.''// Вы и ваша группа (или предмет) появляетесь на случайном расстоянии от места назначения в случайном направлении. Расстояние от цели равно (1к10 × 1к10) процентов от расстояния, на которое вы перемещались. Например, если вы пытались перенестись на 120 миль, промахиваетесь мимо цели, и на двух 1к10 у вас выпадает «5» и «3», то вы промахиваетесь мимо цели на 15 процентов, то есть на 18 миль. Мастер определяет направление случайным образом, бросая к8, где «1» означает север, «2» — северо-восток, «3» — восток, и так далее. Если вы телепортировались в город на побережье, и оказываетесь в море на расстоянии 18 миль, вы окажетесь в беде.
//''Похожее место.''// Вы и ваша группа (или предмет) оказываетесь в другом месте, визуально или тематически похожем на место назначения. Например, если вы направлялись в свою лабораторию, вы можете оказаться в лаборатории другого волшебника или алхимическом магазине с таким же оборудованием как в вашей лаборатории. Обычно вы появляетесь в ближайшем похожем месте, но так как у заклинания нет ограничений по дистанции, вы можете оказаться где угодно на текущем плане.
//''Неудача.''// Непредсказуемая магия заклинания делает перемещение опасным. Все телепортирующиеся существа (или предмет) получают урон силовым полем 3к10, и Мастер совершает новый бросок по таблице, чтобы определить место назначения (возможны несколько неудач, и каждая будет причинять урон)."""
//2 уровень, Преобразование, Бард/Волшебник/Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (щепотка сушёной морковки или агат)
:''Длительность:'' 8 часов
Вы касаетесь согласного существа и даруете ему возможность видеть в темноте. Пока заклинание активно, это существо обладает тёмным зрением в пределах 60 футов.
//1 уровень, Вызов, Волшебник (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (капля ртути)
:''Длительность:'' 1 час
"""Это заклинание создаёт круглый горизонтальный диск из силового поля диаметром 3 фута и толщиной 1 дюйм (2,5 сантиметра), парящий в 3 футах над полом в свободном пространстве на ваш выбор, видимом в пределах дистанции. Диск существует, пока заклинание активно, и может вынести на себе 500 фунтов. Если на него поместить больший вес, заклинание окончится, и всё, что было на диске, падает на пол.
Диск неподвижен, пока вы находитесь в пределах 20 футов от него. Если вы переместитесь от него на расстояние, превышающее 20 футов, диск следует за вами, оставаясь в пределах 20 футов. Он может перелетать по неровной поверхности, перемещаться по лестницам, склонам и подобным препятствиям, но не может пересекать перепады по высоте в 10 футов и более. Например, диск не сможет перелететь над 10-футовой ямой, и не сможет из неё выбраться, если будет создан на её дне.
Если вы переместитесь более чем на 100 футов от диска (например, если он из-за препятствия не сможет последовать за вами), заклинание оканчивается."""
//6 уровень, Вызов, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С, М (пригоршня шипов)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Вы создаёте стену из крепких, гибких, перевитых кустов с острыми как иглы шипами. Стена появляется в пределах дистанции на твёрдой поверхности и существует, пока активно заклинание. Вы можете сделать стену до 60 футов в длину, до 10 футов в высоту и толщиной 5 футов или кругом с диаметром 20 футов, высотой до 20 футов и толщиной 5 футов. Эта стена блокирует линию обзора.
Когда стена появляется, все существа, находящиеся в ней, должны совершить спасбросок Ловкости. При провале существо получает колющий урон 7к8, или половину этого урона при успехе.
Существа могут проходить сквозь стену, но медленно и болезненно. За каждый 1 фут перемещения через стену существо должно потратить 4 фута перемещения. Кроме того, в первый раз за ход, когда существо входит в стену или оканчивает там ход, оно должно совершать спасбросок Ловкости. Оно получает рубящий урон 7к8 при провале, или половину этого урона при успехе."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 7 уровня или выше, оба вида урона увеличиваются на 1к8 за каждый уровень ячейки выше шестого.
//Заговор, Преобразование, Друид//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (стебель растения с шипами)
:''Длительность:'' Мгновенная
Вы создаёте длинный, похожий на лозу кнут, покрытый шипами, бьющий по вашей команде существо, находящееся в пределах дистанции. Совершите рукопашную атаку заклинанием по цели. Если атака попадает, существо получает колющий урон 1к6, и если размер существа не больше Большого, вы подтягиваете существо на 10 футов к себе.
Урон этого заклинания увеличивается на 1к6, когда вы достигаете 5 уровня (2к6), 11 уровня (3к6) и 17 уровня (4к6).
Приключение может быть основано на локациях или на событиях. Более подробно это обсуждается в следующих разделах.
<<Button "$:/01. Приключения, основанные на локациях" "Приключения, основанные на локациях">>
<<Button "$:/02.Приключения, основанные на событиях" "Приключения, основанные на событиях">>
<<Button "$:/03. Детектив" "Детектив">>
<<Button "$:/04. Основные события" "Основные события">>
//"""
«Но ты же видишь, как люди смотрят на тебя, дитя дьявола».
Взгляд чёрных глаз, холодных, как зимняя метель, был устремлён прямо в её душу. Её потрясла неожиданная серьёзность его тона.
«Как там говорится? — спросил он. — Один — любопытство, двое — заговор...»
«А трое — проклятье. — закончила она. — Думаешь, я никогда не слышала этот бред?»
«Конечно, слышала». Когда она уставилась на него, он добавил: «Для этого не обязательно копаться в твоих мыслях, девочка. Это ноша каждого тифлинга. Некоторые ломаются под её тяжестью, некоторые спокойно несут это бремя, некоторые даже наслаждаются им». Он снова наклонил голову, разглядывая её с озорным блеском в глазах. «А ты с этим борешься, не так ли? Как дикая кошка, я бы сказал. Все упрёки и замечания лишь делают твои когти острее».
"""//"""
— Эрин М. Эванс, Серные ангелы"""
Быть тифлингом — значит постоянно натыкаться на пристальные взгляды и перешёптывания, терпеть страдания и оскорбления, видеть страх и недоверие в глазах каждого встречного. Беда в том, что тифлинги знают причину этого — договор, заключённый много поколений назад и позволивший Асмодею — владыке Девяти Преисподних — внести вклад в их родословную. Такая внешность и природа — не их вина, а последствие древнего прегрешения, расплачиваться за которое предстоит им, их детям, и детям их детей.
!!!''__Дьявольская родословная__''
Тифлинги произошли от людей, и по большому счёту всё ещё выглядят как люди. Тем не менее, их дьявольское наследие оставило заметный отпечаток на внешности. У тифлингов есть большие рога, принимающие различные формы: у некоторых витые рога, как у барана, у других длинные и прямые, как у газели, у третьих спиральные, как у антилопы. Их толстый хвост, от 120 до 150 сантиметров длиной, вьётся между ног, похлёстывая их, когда тифлинг нервничает. Острые зубы превращают улыбку в звериный оскал, а их глаза сплошного цвета без намёка на зрачок или белок, обычно чёрного, красного, белого, серебряного или золотого цвета. Цвет кожи тифлингов может принимать все тона, характерные для человека, а также различные оттенки красного. Их волосы, струящиеся из-за рогов, обычно тёмные, от чёрного или коричневого до тёмно-красного, синего или фиолетового.
!!!''__Самодостаточные и недоверчивые__''
Тифлинги живут небольшими общинами, в основном в людских городах, чаще всего в самых трущобах, где из них вырастают жулики, воры и короли преступного мира. Иногда они живут группами среди других меньшинств, которые относятся к ним с чуть большим уважением.
У тифлингов нет родины, и они знают, что им нужно найти свой путь в жизни, и что им понадобится сила для выживания. Они с опаской относятся ко всем, кто называется их другом, но когда кто-то проявляет доверие по отношению к ним, они стремятся отплатить той же монетой. Для того, кто заслужит верность тифлинга, он станет верным другом и надёжным союзником до конца своей жизни.
<<<
"""
''Взаимное недоверие''
Люди склонны с недоверием относиться к тифлингам, полагая, что их дьявольское наследие выражается не только во внешнем виде, но и в их личных качествах. Владельцы магазинов с особой тщательностью следят за вошедшими к ним тифлингами, городская стража может пройтись за тифлингом пару кварталов — на всякий случай, а молва часто винит тифлингов в происходящих вокруг странностях. На самом же деле родословная тифлингов ни к коей мере не влияет на их характер. Но годы жизни в атмосфере недоверия не проходят даром, по-разному сказываясь на поведении тифлингов. Некоторые соответствуют распространённым стереотипам, другие — нет. Большинство просто относятся к другим так же, как те относятся к ним. Вырастая в таком недоверии, тифлинги зачастую учатся преодолевать предрассудки при помощи обаяния или запугивания."""
<<<
!!!''__Имена тифлингов__''
Имена тифлингов можно разделить на три категории. Тифлинги, выросшие в какой-либо другой культуре, часто носят имена, характерные для этой среды. Некоторые носят имена, передающиеся из поколения в поколение и произошедшие из Инфернального языка. А некоторые молодые тифлинги, стремящиеся найти своё место в этом мире, берут имена, отражающие какую-либо добродетель или другую концепцию, а затем стараются воплотить её в жизнь. Для некоторых выбранное имя становится путеводной звездой, для другим — тяжким грузом.
;Мужские инфернальные имена:
:Акменос, Амнон, Баракас, Дамакос, Йадос, Кайрон, Люцис, Мелех, Мордай, Мортос, Пелайос, Скамос, Терай, Экемон
;Женские инфернальные имена:
:Акта, Анакис, Брисеис, Дамая, Каллиста, Криелла, Лерисса, Макария, Немея, Орианна, Риета, Фелая, Эа
;«Идейные» имена:
:Безрассудство, Вера, Идеал, Искусство, Музыка, Мука, Надежда, Напев, Нигде, Открытость, Отчаяние, Падаль, Поиск, Почтение, Поэзия, Превосходство, Скорбь, Слава, Случайность, Страх, Усталость
!!!''__Особенности тифлингов__''
"""Из-за своего дьявольского происхождения все тифлинги обладают некоторыми общими качествами.
''Увеличение характеристик.'' Значение вашего Интеллекта увеличивается на 1, а значение Харизмы увеличивается на 2.
''Возраст.'' Тифлинги взрослеют тогда же, когда и люди, но живут немного дольше.
''Мировоззрение.'' Может, у тифлингов и нет врождённой тяги к злу, однако многие из них в итоге склоняются к нему. Злые они или нет, но независимая природа определяет хаотичное мировоззрение большинства тифлингов.
''Размер.'' Тифлинги по росту и телосложению схожи с людьми. Ваш размер — средний.
''Скорость.'' Ваша базовая скорость передвижения составляет 30 футов.
''Тёмное зрение.'' Благодаря вашему дьявольскому наследию, вы отлично видите при тусклом свете и в темноте. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Адское сопротивление.'' Вы получаете сопротивление к урону огнём.
''Дьявольское наследие.'' Вы знаете заклинание чудотворство. При достижении 3 уровня вы можете один раз в день активировать адское возмездие как заклинание 2 уровня. При достижении 5 уровня вы также можете один раз в день активировать заклинание тьма. «Раз в день» означает, что бы должны окончить продолжительный отдых, прежде чем сможете наложить это заклинание ещё раз посредством данного умения. Базовой характеристикой для этих заклинаний является Харизма.
''Языки.'' Вы можете говорить, читать и писать на Общем и Инфернальном."""
//2 уровень, Иллюзия, Бард/Жрец/Следопыт (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 10 минут
Пока заклинание активно, никакие звуки не могут раздаться в пределах сферы с радиусом 20 футов с центром на точке, выбранной в пределах дистанции, а также не могут проходить сквозь неё. Все существа и предметы, полностью находящиеся в сфере, получают иммунитет к урону звуком, и существа считаются оглохшими, когда полностью находятся в ней. Там невозможно накладывать заклинания с вербальным компонентом.
Богатство исчисляется не только монетами. Оно может измеряться домашним скотом, зерном, землями, правами на сбор налогов или правами добывать ресурсы (в шахте или лесу).
Гильдии, дворяне и королевства постоянно обмениваются товарами. Нанятым компаниям дают право торговать по определённым маршрутам, отправлять торговые корабли в разные порты или покупать и продавать определённые товары. Гильдии устанавливают цены на контролируемые ими товары и услуги, а также определяют, кто может, а кто не может пользоваться их товарами и услугами. Торговцы обычно обмениваются между собой товарами, не используя монеты. Приведённая таблица указывает стоимость самых распространённых товаров.
!!!''Товары''
<table>
<tr>
<th>Стоимость</th>
<th>Товар</th>
</tr>
<tr>
<td>1 мм</td>
<td>1 фунт пшеницы</td>
</tr>
<tr>
<td>2 мм</td>
<td>1 фунт муки или 1 курица</td>
</tr>
<tr>
<td>5 мм</td>
<td>1 фунт соли</td>
</tr>
<tr>
<td>1 см</td>
<td>1 фунт железа или 1 кв. м холста</td>
</tr>
<tr>
<td>5 см</td>
<td>1 фунт меди или 1 кв. м хлопчатобумажной ткани</td>
</tr>
<tr>
<td>1 зм</td>
<td>1 фунт имбиря или 1 коза</td>
</tr>
<tr>
<td>2 зм</td>
<td>1 фунт корицы или перца или 1 овца</td>
</tr>
<tr>
<td>3 зм</td>
<td>1 фунт гвоздики или 1 свинья</td>
</tr>
<tr>
<td>5 зм</td>
<td>1 фунт серебра или 1 кв. м льняной ткани</td>
</tr>
<tr>
<td>10 зм</td>
<td>1 кв. м шёлка или 1 корова</td>
</tr>
<tr>
<td>15 зм</td>
<td>1 фунт шафрана или один вол</td>
</tr>
<tr>
<td>50 зм</td>
<td>1 фунт золота</td>
</tr>
<tr>
<td>500 зм</td>
<td>1 фунт платины</td>
</tr>
</table>
//Чудесный предмет, очень редкий//
Эта книга содержит руководства по оказанию влияния на других, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваша Харизма, а также её максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет.
//Чудесный предмет, легендарный (требуется настройка волшебником)//
У этого толстого тома с кожаным переплётом к обложке пришит язык. Всего существует пять таких томов, и никто не может сказать, какой из них оригинальный. Жуткое украшение на обложке первого тома когда-то было языком вероломного слуги лича-бога Векны, хранителя тайн. Языки на обложках четырёх копий принадлежали заклинателям, предавшим Векну. Первые несколько страниц каждого тома исписаны непонятными каракулями. Оставшиеся страницы девственно чисты.
Если вы можете настроиться на этот том, вы можете использовать его в качестве магической фокусировки. Кроме того, держа этот том в руке, вы можете бонусным действием наложить заклинание, которое вы в него записали, не тратя ячейку заклинания и не используя ни вербальный, ни соматический компонент. Вы не можете повторно использовать это свойство тома до следующего рассвета.
Будучи настроенным на эту книгу, вы можете оторвать язык с обложки. Если вы это сделаете, все заклинания, записанные в ней, мгновенно стираются.
Векна следит за всеми, кто использует этот том. Он также записывает в книгу таинственные сообщения. Эти сообщения появляются в полночь и исчезают после прочтения.
//Чудесный предмет, очень редкий//
Эта книга содержит упражнения по тренировке интуиции и проницательности, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваша Мудрость, а также её максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет.
//Чудесный предмет, очень редкий//
Эта книга содержит упражнения по тренировке памяти и логики, и её слова наполнены магией. Если вы потратите 48 часов за 6 дней на изучение содержимого книги и применение его на практике, ваш Интеллект, а также его максимум увеличатся на 2. После этого руководство теряет магию, но восстанавливает её через 100 лет
//Оружие (любой топор), редкое (требуется настройка)//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием. Кроме того, пока вы настроены на это оружие, максимум ваших хитов увеличивается на 1 за каждый полученный уровень.
//''Проклятье.''// Этот топор проклят, и это проклятье простирается и на того, кто настраивается на него. Пока вы остаётесь прокляты, вы не хотите расставаться с топором, и всегда держите его под рукой. Вы также совершаете с помехой броски атаки другим оружием, кроме случаев, когда в пределах 60 футов нет врагов, которых вы можете видеть или слышать.
Каждый раз, когда враждебное существо причиняет вам урон, а топор при этом находится при вас, вы должны преуспеть в спасброске Мудрости со Сл 15, иначе станете берсерком. Будучи берсерком, вы обязаны своим действием в каждом раунде атаковать этим топором ближайшее существо. Если вы можете совершать дополнительные атаки частью действия Атака, вы совершаете эти атаки, переходя к следующему ближайшему существу, после того как расправитесь с текущей целью. Если у вас есть несколько возможных целей, вы атакуете того, кого выберете случайным образом. Вы остаётесь берсерком, пока не получится так, что в начале вашего хода в пределах 60 футов от вас не останется существ, которых вы можете видеть или слышать.
!!!!''Топор Владык Дварфов''
//Оружие (боевой топор), артефакт (требуется настройка)//
Увидев проблемы, с которыми столкнулся его народ, молодой принц дварфов понял, что его народу нужно что-то, что его объединило бы. Так он выковал оружие, которое стало бы таким символом.
Уйдя глубоко в горы, глубже, чем когда-либо копали дварфы, он дошёл до пылающего сердца огромного вулкана. С помощью Морадина, дварф-ского бога творения, он создал четыре инструмента: Жестокую кирку, Горн сердца земли, Наковальню песен и Формирующий молот. С их помощью он выковал Топор Владык Дварфов.
Вооружившись этим артефактом, принц вернулся к кланам дварфов и принёс им мир. Его топор покончил с взаимными обидами и презрением. Кланы стали союзниками, отбросили врагов, и настала эра благополучия. Этого дварфа помнят как Первого Короля. Когда он постарел, он передал это оружие, ставшее символом власти, своему наследнику. Его преемники передавали топор много поколений подряд.
Позже, в тёмную эру, ознаменовавшуюся предательствами и пороками, топор был утрачен в кровавой гражданской войне, которая как раз возникла из-за стремления заполучить топор вместе с силой и статусом, который он даёт. Прошло много веков, и дварфы всё ещё ищут топор, и многие искатели приключений гонялись за слухами и разоряли старые склепы в его поисках.
;
://''Магическое оружие.''// Топор Владык Дварфов это магическое оружие, дающее бонус +3 к броскам атаки и урона им. Этот топор также функционирует как пояс дварфов, дварфский метатель и меч остроты.
://''Случайные свойства.''// Этот топор обладает несколькими свойствами, определяемыми случайным образом:
* 2 малых положительных свойства
* 1 основное положительное свойство
* 2 малых отрицательных свойства
://''Благословение Морадина.''// Если вы — дварф, настроенный на этот топор, вы получаете следующие преимущества:
* Вы получаете иммунитет к урону ядом.
* Дистанция вашего тёмного зрения увеличивается на 60 футов.
* Вы получаете владение инструментами ремесленника, связанными с кузнечным делом, пивоварением и каменной кладкой.
://''Призыв земляного элементаля.''// Если вы держите этот топор, вы можете действием наложить им заклинание призыв элементаля, призывая земляного элементаля. Вы не сможете повторно использовать это свойство до следующего рассвета.
://''Путешествие в глубину.''// Вы можете действием коснуться топором неподвижной части дварфской каменной кладки и наложить топором заклинание телепортация. Если место назначения находится под землёй, шансы промахнуться мимо или прибыть в другое место равны нулю. Вы не можете использовать это свойство ещё раз, пока не пройдёт 3 дня.
://''Проклятье.''// Этот топор хранит проклятье, падающее на не-дварфов, настроенных на него. Даже если настройка окончится, проклятье останется. С каждым днём его внешность становится всё больше и больше похожей на облик дварфа. Через семь дней существо выглядит как обычный дварф, хотя и не теряет своих расовых особенностей и не приобретает расовых особенностей дварфа. Эти физические изменения не считаются магическими (и потому их нельзя рассеять), но их можно отменить эффектом, снимающим проклятья, например, заклинаниями высшее восстановление и снятие проклятья.
://''Уничтожение Топора.''// Топор можно уничтожить только расплавив его в Горне сердца земли, в котором он и был создан. Он должен оставаться в пылающем горне пятьдесят лет, после чего, наконец, расплавится и перестанет существовать.
//Оружие (трезубец), необычное (требуется настройка)//
Этот трезубец — магическое оружие. У него есть 3 заряда. Если вы его держите, вы можете действием потратить 1 заряд, чтобы наложить им заклинание подчинение зверя (Сл спасброска 15) на зверя, у которого есть врождённая скорость плавания. Трезубец ежедневно восстанавливает 1к3 заряда на рассвете.
!!!''__Тропами земли__''
"""Начиная с 8 уровня перемещение по немагической труднопроходимой местности не стоит вам никакого дополнительного перемещения. Вы также можете проходить через немагические растения без замедления, и не получая от них урона, даже если у них есть шипы, колючки или аналогичная опасность.
Кроме того, вы совершаете с преимуществом спасброски от растений, которые были магическим образом созданы или управляются магией, препятствуя движению, например, созданных заклинанием опутывание."""
//2 уровень, Преобразование, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (экстракт зерна и петля из пергамента)
:''Длительность:'' 1 час
"""Вы касаетесь верёвки длиной до 60 футов. Один её конец поднимается в воздух, а остальная часть висит перпендикулярно полу. На верхнем конце верёвки появляется невидимый вход в межпространство, существующий, пока заклинание активно.
В межпространство можно попасть, забравшись по верёвке наверх. В этом межпространстве может поместиться восемь существ с размером не больше Среднего. Верёвку можно затянуть внутрь, после чего снаружи её не будет видно.
Атаки и заклинания не могут проходить через вход внутрь межпространства и наружу, но те, кто находятся внутри, могут всё видеть как через окно 3 × 5 футов с центром на верёвке.
Всё, что находится в межпространстве, вываливается наружу, когда заклинание заканчивается."""
!!!''Трясина разума''
"""//Требование: 5 уровень//
Вы можете один раз сотворить заклинание замедление, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
//1 уровень, Вызов, Волшебник/Друид/Следопыт/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 120 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 часа
Вы создаёте сферу с радиусом 20 футов из тумана с центром на точке в пределах дистанции. Сфера обходит углы, и её пространство — сильно заслонённая местность. Она существует до окончания действия заклинания, или пока её не рассеет ветер (со скоростью как минимум 10 миль в час).
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, радиус тумана увеличивается на 20 футов за каждый уровень ячейки выше первого.
!!!''Туманные видения''
"""Вы можете неограниченно накладывать заклинание безмолвный образ, не тратя ячейки заклинаний и материальные компоненты."""
//2 уровень, Вызов, Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' На себя
:''Компоненты:'' В
:''Длительность:'' Мгновенная
Окутавшись серебристым туманом, вы телепортируетесь на 30 футов в свободное пространство, видимое вами.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эту лёгкую обувь, вы можете перемещаться по вертикальным поверхностям, а также вверх ногами по потолку, оставляя руки свободными. Вы получаете скорость лазания, равную скорости хождения. Однако туфли не позволяют перемещаться так по скользкой поверхности, например, покрытой маслом или льдом.
//2 уровень, Воплощение, Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, М (мех летучей мыши и либо капля дёгтя, либо кусочек угля)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Из точки, выбранной вами в пределах дистанции, расползается магическая тьма сферой с радиусом 15 футов. Тьма огибает углы. Существа с тёмным зрением не могут видеть сквозь эту тьму, и немагический свет не может её осветить.
Если выбранная вами точка находится на предмете, который вы держите, несёте или носите, тьма исходит из предмета и перемещается вместе с ним. Если полностью накрыть источник тьмы непрозрачным предметом, например, чашей или шлемом, тьма будет заблокирована.
Если часть зоны этого заклинания накрывает зону света, созданного заклинанием с уровнем не выше 2, заклинание, создавшее свет, рассеивается."""
//1 уровень, Ограждение, Жрец//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (маленькое серебряное зеркало)
:''Длительность:'' 1 минута
"""Вы защищаете одно существо в пределах дистанции от атаки. Пока заклинание активно, все существа, нацеливающиеся на защищённое существо атаками или вредоносными заклинаниями, должны вначале совершить спасбросок Мудрости. При провале существо должно выбрать новую цель или потеряет атаку или заклинание. Это заклинание не защищает от эффектов, действующих на площадь, таких как взрыв огненного шара.
Если защищённое существо совершает атаку или накладывает заклинание, оказывающее действие на враждебное существо, это заклинание оканчивается."""
!!!__''Убийца''__
Вы сосредоточили своё обучение на мрачном искусстве смерти. Те, кто придерживаются этого архетипа, разнообразны: наёмные убийцы, шпионы, охотники за головами и даже особо помазанные священники, обученные истреблять врагов своего божества. Скрытность, яд и маскировка помогут в борьбе с врагами со смертоносной эффективностью.
!!!''Дополнительные владения''
Когда вы выбираете архетип на 3 уровне, вы получаете владение набором для грима и инструментами отравителя.
!!!''Ликвидация''
Начиная с 3 уровня вы становитесь смертоносными для врагов. Вы совершаете с преимуществом броски атаки по всем существам, которые ещё не совершали ход в этом бою. Кроме того, все попадания по существам, захваченным врасплох, являются критическими попаданиями.
!!!''Мастер проникновения''
"""Начиная с 9 уровня, вы можете создавать себе ложную биографию. Вы должны потратить семь дней и 25 зм, чтобы сделать её достоверной и установить нужные связи. Вы не можете взять биографию, принадлежащую другому лицу. Например, вы можете приобрести соответствующую одежду, рекомендательные письма и официального вида сертификаты, чтобы обозначить себя в качестве члена торгового дома из далёкого города, или внушить, что вы из группы богатых торговцев.
После принятия новой личности в качестве маскировки другие существа верят, что вы являетесь этой личностью, пока не подадите очевидный повод решить обратное."""
!!!''Самозванец''
"""На 13 уровне вы получаете способность безошибочно подражать чужой речи, почерку и привычкам. Вы должны провести не менее трёх часов изучения этих трёх компонентов поведения существа, слушая его речь, рассматривая почерк и наблюдая за привычками.
Ваши уловки не видны для случайного наблюдателя. Если осторожное существо подозревает что-то неладное, вы совершаете с преимуществом все проверки Харизмы (Обман), чтобы избежать обнаружения."""
!!!''Смертельный удар''
Начиная с 17 уровня вы становитесь мастером мгновенной смерти. Если вы атакуете и попадаете по существу, захваченному врасплох, оно должно совершить спасбросок Телосложения (Сл 8 + ваш модификатор Ловкости + ваш бонус мастерства). Проваленный спасбросок означает удвоение урона от вашей атаки по этому существу.
//Оружие (любой меч или топор), редкое//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием.
Если вы попадаете им по великану, великан получает дополнительный урон 2к6, соответствующий виду оружия, и должен преуспеть в спасброске Силы со Сл 15, иначе он будет сбит с ног. Для этого оружия «великан» означает любое существо с видом «великан», включая эттинов и троллей.
!!!''__Убийца врагов__''
"""На 20 уровне вы становитесь беспрецедентным охотником на своих врагов. Один раз в каждом своём ходу вы можете добавить модификатор Мудрости к броску атаки или урона по существу из списка ваших избранных врагов. Вы можете использовать это умение до или после броска, но до того, как эффекты броска вступят в силу."""
//Оружие (любой меч), редкий//
Вы получаете бонус +1 к броскам атаки и урона, совершённым этим магическим оружием.
Если вы попадаете этим оружием по дракону, он получит дополнительный урон 3к6, соответствующий виду оружия. Для этого оружия «дракон» означает любое существо с видом «дракон», включая виверн и дракочерепах.
!!!''__Увеличение характеристик__''
При достижении 4, 8, 12, 16 и 19 уровней вы можете повысить значение одной из ваших характеристик на 2 или двух характеристик на 1. Как обычно, значение характеристики при этом не должно превысить 20.
!!!__''Увеличение характеристик''__
При достижении 4, потом 6, 8,12,14, 16 и 19 уровней вы можете повысить значение одной из ваших характеристик на 2 или двух характеристик на 1. Как обычно, значение характеристики при этом не должно превысить 20.
//2 уровень, Преобразование, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (щепотка толчёного железа)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы увеличиваете или уменьшаете существо или предмет, видимый вами в пределах дистанции, на время действия заклинания. Выберите или существо или предмет, который никто не несёт и не носит. Если цель хочет, она может совершить спасбросок Телосложения. В случае успеха заклинание не оказывает на неё никакого влияния.
Если цель — существо, всё, что она носит и несёт, изменяет размер вместе с ней. Всё, что это существо бросит, тут же обретает свой естественный размер.
//''Увеличение.''// Размеры цели удваиваются по всем измерениям, а вес увеличивается в восемь раз. Это увеличивает размер на одну категорию — от Среднего до Большого, например. Если для цели не хватает пространства, она приобретает максимально возможный размер. Пока заклинание активно, цель совершает с преимуществом проверки и спасброски Силы. Оружие цели тоже увеличивается. Атаки увеличенным оружием причиняют дополнительный урон 1к4.
//''Уменьшение.''// Размеры цели уменьшаются вдвое по всем измерениям, а вес уменьшается до одной восьмой от обычного. Это уменьшает размер на одну категорию — от Среднего до Маленького, например. Пока заклинание активно, цель совершает с помехой проверки и спасброски Силы. Оружие цели тоже уменьшается. Атаки уменьшенным оружием причиняют на 1к4 меньше урона (урон не может быть меньше 1)."""
!!!''__Увёртливость__''
На 7 уровне ваше инстинктивное проворство позволяет вам уклоняться от эффектов, направленных на определённую область, вроде дыхания синего дракона или заклинания огненный шар. Если вы попадаете под действие эффекта, позволяющего совершить спасбросок Ловкости, чтобы получить только половину урона, вы вместо этого не получаете урона при успешном спасброске и получаете только половину урона при проваленном.
!!!''__Увёртливость__''
Начиная с 7 уровня вы можете ловко увернуться от зональных эффектов, например, огненного дыхания красного дракона или заклинания град. Если вы попадаете под действие эффекта, который позволяет вам совершить спасбросок Ловкости, чтобы получить только половину урона, вместо этого вы не получаете вовсе никакого урона, если спасбросок был успешен, и только половину урона, если он был провален.
!!!''__Удача__''
"""Начиная с 20 уровня вы получаете сверхъестественный дар преуспевать, когда это нужнее всего. Если ваша атака промахивается по цели, находящейся в пределах досягаемости, вы можете изменить промах на попадание. В качестве альтернативы, если вы провалили проверку характеристики, вы можете заменить результат, выпавший на к20, на «20».
Использовав это умение, вы не можете использовать его повторно, пока не завершите короткий или продолжительный отдых."""
//2 уровень, Очарование, Бард/Волшебник/Друид/Жрец/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (небольшой прямой кусочек железа)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Выберите гуманоида, которого видите в пределах дистанции. Цель должна преуспеть в спасброске Мудрости, иначе станет парализованной на период действия заклинания. В конце каждого своего хода цель может совершать новые спасброски Мудрости. В случае успеха заклинание на этой цели оканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше 2. Эти гуманоиды должны находиться в пределах 30 футов друг от друга, когда вы нацеливаетесь на них.
//5 уровень, Очарование, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (небольшой прямой кусочек железа)
:''Длительность:'' Концентрация, вплоть до 1 минуты
Выберите существо, которое видите в пределах дистанции. Цель должна преуспеть в спасброске Мудрости, иначе станет парализованной на период действия заклинания. Это заклинание не оказывает эффекта на нежить. В конце каждого своего хода цель может совершать новые спасброски Мудрости. В случае успеха заклинание на этой цели оканчивается.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 6 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше пятого. Эти существа должны находиться в пределах 30 футов друг от друга, когда вы нацеливаетесь на них.
//Чудесный предмет, редкий//
У этого рюкзака есть центральный карман и два боковых кармана, и все они являются межпространственными местами. В каждом боковом кармане помещается по 20 фунтов материи, не превышающей в объёме 2 кубических фута. В центральном кармане помещается до 8 кубических футов материи, весящей не больше 80 фунтов. Этот рюкзак всегда весит 5 фунтов, что бы в нём ни хранилось.
Помещение предмета в рюкзак использует обычные правила взаимодействия с предметами. Достаются предметы из рюкзака действием. Если вы достаёте из рюкзака конкретную вещь, она магическим образом всегда оказывается на самом верху.
У рюкзака есть несколько ограничений. Если он будет переполнен или если острый предмет проткнёт или разорвёт его, рюкзак разрывается и уничтожается. Если рюкзак уничтожается, всё его содержимое навсегда теряется, но артефакты появляются в новых местах. Если рюкзак вывернуть наизнанку, его содержимое выпадет наружу, но рюкзак придётся вывернуть обратно, чтобы его снова можно было использовать. Если в рюкзак поместить дышащее существо, оно может выжить 10 минут, после чего начнёт задыхаться.
Помещение рюкзака в межпространство, созданное сумкой хранения, переносной дырой или подобным предметом, мгновенно уничтожает оба предмета и открывает врата в Астральный План. Врата появляются в месте, где один предмет пытались поместить в другой. Все существа в пределах 10 футов от врат затягиваются внутрь и помещаются в случайным образом определённое место на Астральном Плане. После этого врата закрываются. Врата односторонние, и повторно не открываются.
//3 уровень, Иллюзия, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя (30-футовый конус)
:''Компоненты:'' В, С, М (белое перо или сердце курицы)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы проецируете призрачное изображение худших кошмаров других существ. Все существа в 30-футовом конусе должны преуспеть в спасброске Мудрости, иначе они бросают всё, что держат в руках, и становятся испуганными на время действия заклинания.
Будучи испуганным этим заклинанием, существо должно каждый свой ход совершать действие Рывок, и перемещаться прочь от вас по самому безопасному маршруту, пока у неё есть куда перемещаться. Если существо оканчивает ход в месте, откуда у него нет линии обзора до вас, оно может совершить спасбросок Мудрости. В случае спасения заклинание перестаёт действовать на это существо."""
!!!''Ужасающее слово''
"""//Требование: 7 уровень//
Вы можете один раз сотворить заклинание смятение, используя ячейку заклинаний колдуна. Вы не можете сделать это повторно, пока не окончите продолжительный отдых."""
//7 уровень, Воплощение, Бард/Волшебник/Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 100 футов
:''Компоненты:'' В, С, М (порошок рубина, стоящий 1 500 зм)
:''Длительность:'' 1 час
"""Вокруг области, выбранной вами в пределах дистанции, возникает неподвижная, невидимая тюрьма в форме куба, созданная из магической силы. Тюрьма может быть клеткой или сплошной коробкой, на ваш выбор.
Тюрьма в форме клетки может быть с длиной ребра до 20 футов, и состоит из сантиметровых прутьев (диаметр 1/2 дюйма), отстоящих друг от друга на 1 сантиметр (1/2 дюйма).
Тюрьма в форме коробки может быть с длиной ребра до 10 футов, и она является сплошным барьером, останавливающим любую материю, и блокирующую заклинания, накладываемые как внутрь коробки, так и направленные из неё наружу.
Когда вы накладываете это заклинание, под его действие попадают все существа, находящиеся целиком внутри области. Существа, находящиеся в области лишь частично, или слишком большие для заточения внутри, отталкиваются от центра области, пока не окажутся снаружи.
Существо, находящееся в узилище, не может покинуть его без помощи магии. Если оно пытается использовать телепортацию или перемещение между планами, оно должно вначале преуспеть в спасброске Харизмы. В случае успеха существо может использовать эту магию для выхода из узилища. При провале существо не может покинуть узилище, и тратит впустую использование заклинания или эффект. Узилище простирается и на Эфирный План, запрещая перемещение через него.
Это заклинание нельзя рассеять рассеиванием магии."""
//Заговор, Прорицание, Друид/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
Вы касаетесь одного согласного существа. Один раз, пока заклинание активно, цель может бросить к4 и добавить выпавшее число к одной проверке характеристики на свой выбор. Эту кость можно бросить до или после совершения проверки. После этого заклинание оканчивается.
"""Стены, деревья, существа и прочие препятствия могут предоставлять укрытие в бою, осложняя причинение цели урона. Цель получает преимущества за счёт укрытия только от атак и эффектов, исходящих с противоположной стороны укрытия.
Есть несколько степеней укрытия. Если у цели есть несколько источников укрытия, применяется эффект только самого большого; степени не складываются между собой. Например, если цель находится позади существа, дающего укрытие на половину, и ствола дерева, дающего укрытие на три четверти, у неё будет укрытие на три четверти.
Цель с ''укрытием на половину'' получает бонус +2 к КД и спасброскам Ловкости. Цель получает укрытие на половину если препятствие закрывает как минимум половину её тела. Это может быть низкая стена, большая мебель, узкий ствол дерева или существо, как враждебное, так и дружественное.
Цель с ''укрытием на три четверти'' получает бонус +5 к КД и спасброскам Ловкости. Цель получает укрытие на три четверти если препятствие закрывает как минимум три четверти её тела. Это может быть опускная решётка, бойница в стене или широкий ствол дерева.
На цель с ''полным укрытием'' нельзя непосредственно нацеливать атаки и заклинания, хотя некоторые заклинания могут захватить цель областью воздействия. Цель обладает полным укрытием если полностью скрыта за препятствием."""
//2 уровень, Преобразование, Бард/Друид/Жрец/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (мех или перо зверя)
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы касаетесь существа и улучшаете его при помощи магии. Выберите один из следующих эффектов; цель получает этот эффект, пока заклинание активно.
//''Бычья сила.''// Цель совершает с преимуществом проверки Силы, а грузоподъёмность удваивается.
//''Кошачья ловкость.''// Цель совершает с преимуществом проверки Ловкости. Кроме того, она не получает урон за падение с высоты 20 футов или меньше, если она дееспособна.
//''Лисья хитрость.''// Цель совершает с преимуществом проверки Интеллекта.
//''Медвежья выносливость.''// Цель совершает с преимуществом проверки Телосложения. Она также получает 2к6 временных хитов, которые исчезают в конце заклинания.
//''Орлиное великолепие.''// Цель совершает с преимуществом проверки Харизмы.
//''Совиная мудрость.''// Цель совершает с преимуществом проверки Мудрости."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 3 уровня или выше, вы можете сделать целью одно дополнительное существо за каждый уровень ячейки выше второго.
!!!''__Улучшенная Божественная кара__''
На 11 уровне вы проникаетесь праведной мощью, что даёт всем вашим атакам рукопашным оружием божественную силу. Каждый раз, когда вы попадаете по существу рукопашным оружием, это существо получает дополнительный урон излучением 1к8. Если вы также используете Божественную кару, вы добавляете этот урон к дополнительному урону от Божественной кары.
//2 уровень, Очарование, Бард/Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы пытаетесь подавить сильные эмоции у группы существ. Все гуманоиды в сфере с радиусом 20 футов с центром в точке, выбранной в пределах дистанции, должны совершить спасбросок Харизмы; существо может добровольно провалить этот спасбросок, если пожелает. Если существо проваливает спасбросок, выберите один из двух описанных ниже эффектов:
Вы можете подавить все эффекты, делающие цель очарованной или испуганной. Когда это заклинание оканчивается, все подавленные эффекты восстанавливаются, при условии, что за это время их действие не окончилось.
В качестве альтернативы, вы можете сделать цель безразличной к выбранным вами существам, к которым она относилась враждебно. Это безразличие оканчивается, если цель атакована или ей причинён вред заклинанием, или если она станет свидетелем того, как причиняют вред её друзьям. Когда заклинание оканчивается, существо становится вновь враждебным, если Мастер не решит по-другому."""
//Чудесный предмет, легендарный//
В этом тюбике находится молочно-белая жидкость с сильным запахом спирта. Вы можете действием вылить содержимое тюбика на поверхность в пределах досягаемости. Она мгновенно растворяет до 1 квадратного фута клейкой субстанции, которой касается, включая превосходный клей.
!!!__''Уничтожение нежити''__
Начиная с 5 уровня, когда нежить проваливает спасбросок от вашего умения Изгнание нежити, существо мгновенно уничтожается, если его показатель опасности не превышает значения, указанного в таблице:
''Уничтожение нежити''
|!Уровень жреца|!Уничтожается нежить с ПО...|
|5|1/2 или ниже|
|8|1 или ниже|
|11|2 или ниже|
|14|3 или ниже|
|17|4 или ниже|
!!!__''Упорный''__
"""Начиная с 9 уровня вы можете перебросить проваленный спасбросок, и должны использовать новый результат. После этого вы можете повторно использовать это умение только после завершения продолжительного отдыха.
Вы можете использовать это умение дважды между периодами продолжительного отдыха после достижения 13 уровня, и трижды после достижения 17 уровня."""
Раны и угроза смерти постоянно сопровождают тех, кто исследуют миры D&D. Выпад меча, меткая стрела, пламя от заклинания огненный шар — всё это может причинить урон и даже убить самых стойких существ.
!!!__''Хиты''__
"""Хиты отражают комбинацию физической и умственной стойкости, стремление к существованию и удачу. Существ с большим числом хитов трудно убить. Те, у кого хитов мало — менее жизнеспособны.
Текущие хиты существа (обычно называются просто хитами) могут быть любым числом от 0 до максимума его хитов. Это число часто меняется, когда существо получает урон и лечится.
Каждый раз, когда существо получает урон, этот урон вычитается из его хитов. Потеря хитов никак не сказывается на возможностях существа, пока хиты не опускаются до 0."""
!!!__''Бросок урона''__
"""У оружия, заклинаний и боевых умений чудовищ указан причиняемый ими урон. Вы бросаете указанную кость или кости, добавляете модификаторы и причиняете цели получившийся урон. Бонусы к урону предоставляет магическое оружие, особые умения и прочие факторы.
При совершении атаки ''оружием'' вы добавляете к урону модификатор характеристики — той же самой характеристики, что использовалась для броска атаки. В ''заклинании'' написано, какие кости бросать для определения урона и какие модификаторы применяются.
Если заклинание или эффект причиняет урон сразу ''нескольким целям'', бросок урона совершается один на всех. Например, если волшебник накладывает огненный шар или жрец накладывает небесный огонь, урон от их заклинаний определяется лишь один раз и причиняется всем существам, по которым попал взрыв."""
!!!''Критические попадания''
"""Если вы совершаете критическое попадание, вы бросаете кости урона по цели два раза. Бросьте кости урона два раза и сложите сумму. Затем добавьте все уместные модификаторы. Для ускорения можете бросить все кости одновременно.
Например, если вы совершили критическое попадание кинжалом, бросьте для урона 2к4, а не 1к4, затем добавьте модификатор характеристики. Если в атаку входят другие кости урона, например, от умения плута Скрытая атака, вы бросаете по два раза и эти кости."""
!!!''Виды урона''
"""Разные атаки, заклинания и прочие эффекты причиняют разные виды урона. Сами по себе разные виды урона не подчиняются особым правилам, но от них зависят другие элементы игры, такие как сопротивление урону.
Виды урона идут с примерами, помогающими Мастеру определить вид урона для нового эффекта.
//''Дробящий.''// Тяжёлые силовые атаки — молотом, падением, сдавливанием и т. п. — причиняют дробящий урон.
//''Звук.''// Оглушительные звуковые волны, такие как от заклинания волна грома, причиняют урон звуком.
//''Излучение.''// Урон излучением, причиняемый заклинанием небесный огонь жреца и карающим оружием ангела, опаляют плоть как огонь и переполняют дух силой.
//''Кислота.''// Едкое дыхание чёрного дракона и растворяющая слизь чёрного пудинга причиняют урон кислотой.
//''Колющий.''// Колющие и пронзающие атаки, включая удары копьём и укусы чудовищ, причиняют колющий урон.
//''Некротическая энергия.''// Некротическая энергия, излучаемая некоторой нежитью и такими заклинаниями как леденящее прикосновение, иссушают плоть и даже душу.
//''Огонь.''// Красный дракон, выдыхающий пламя, и многие заклинания, создающие жар, причиняют урон огнём.
//''Психическая энергия.''// Атаки силой разума, такие как у иллитидов, причиняют урон психической энергией.
//''Рубящий.''// Мечи, топоры и когти чудовищ причиняют рубящий урон.
//''Силовое поле.''// Силовое поле это чистая магия, сфокусированная в разрушительную силу. Чаще всего силовым полем причиняют урон заклинания, такие как волшебная стрела и божественное оружие.
//''Холод.''// Лютый холод от копья ледяного дьявола и морозное дыхание белого дракона причиняют урон холодом.
//''Электричество.''// Заклинание молния и дыхание синего дракона причиняют урон электричеством.
//''Яд.''// Ядовитые укусы и токсичное дыхание зелёного дракона причиняют урон ядом."""
<<<
!!!''Описание эффектов урона''
Мастер описывает потерю хитов разными путями. Если ваши хиты не меньше половины от максимума хитов, обычно у вас не будет признаков ранения. Когда хиты опускаются ниже половины от максимума, у вас появятся первые порезы и синяки. Атака, опускающая хиты до 0, попадает точно по вам, оставляя кровоточащие раны и другие травмы, либо просто лишает вас сознания.
<<<
!!!__''Сопротивление урону и уязвимость''__
"""Некоторым существам и предметам чрезвычайно трудно или наоборот, легко причинить вред определёнными видами урона.
Если у существа или предмета есть ''сопротивление'' виду урона, то урон этого вида, причиняемый ему, уменьшается вдвое. Если у существа или предмета есть ''уязвимость'' виду урона, урон этого вида для него удваивается.
Сопротивление и уязвимость применяются к урону после всех остальных модификаторов. Например, по существу с сопротивлением к дробящему урону попадает атака, причиняющая дробящий урон 25. Это существо также находится в магической ауре, уменьшающей весь урон на 5. Вначале из урона 25 вычитается 5 а результат делится пополам, так что существо получает урон 10.
Многократные сопротивления или уязвимости к одному и тому же виду урона не складываются. Например, если у существа есть сопротивление к урону огнём и сопротивление к немагическому урону, то урон от немагического огня уменьшается в два, а не в четыре раза."""
!!!__''Лечение''__
"""Если урон не вызвал смерть, он не постоянен. И даже смерть можно обратить мощной магией. Хиты существа восстанавливаются отдыхом (объясняется в [[главе 8|05. Отдых]]), а магия, такая как заклинание лечение ран или зелье лечения устраняют урон мгновенно.
Если существо получает какое-либо лечение, восстановленные хиты добавляются к его текущим хитам. Хиты существа не могут превышать его максимум хитов, поэтому лишние хиты теряются. Например, друид восстанавливает следопыту 8 хитов. Если у следопыта сейчас 14 хитов, а максимум хитов 20, следопыт восстанавливает 6 хитов, а не 8.
Умершее существо не может восстанавливать хиты, пока такая магия как возрождение не вернёт его к жизни."""
!!!__''Опускание хитов до 0''__
Если ваши хиты опустились до 0, вы либо тут же умираете, либо теряете сознание.
!!!''Мгновенная смерть''
"""Большой урон может убить вас мгновенно. Если урон опускает ваши хиты до 0, и ещё остаются излишки, вы умираете, если излишки равны максимуму ваших хитов или превышают его.
Например, у жрицы с максимумом хитов 12 сейчас 6 хитов. Если она получает от атаки урон 18, хиты опускаются до 0, но остаётся ещё 12 урона. Так как этот урон равен максимуму хитов, жрица умирает."""
!!!''Потеря сознания''
Если урон опускает ваши хиты до 0, но не убивает вас, вы теряете сознание (смотрите приложение А). Вы приходите в сознание, если восстанавливаете хиты.
!!!''Спасброски от смерти''
"""Если вы начинаете ход с 0 хитов, вы должны совершить особый спасбросок, называемый спасброском от смерти, чтобы определить, приближаетесь ли вы к смерти или цепляетесь за жизнь. В отличие от других спасбросков, этот не привязан ни к какой характеристике. Теперь вы находитесь в руках судьбы, и помочь вам могут только заклинания и умения, улучшающие шансы на совершение успешных спасбросков.
Бросьте к20. Если результат будет «10» или выше, вы преуспели. В противном случае спасбросок провален. Сами по себе успехи и неудачи не оказывают никакого эффекта. В случае трёх успехов вы становитесь стабилизированным (смотрите ниже). В случае трёх провалов вы умираете. Успехи и провалы не должны быть последовательными; отслеживайте количество и тех и других, пока не накопите три одинаковых результата. И те и другие сбрасываются до нуля, когда вы восстанавливаете любое количество хитов или становитесь стабилизированным.
//''Выпадение «1» или «20».''// Если вы совершаете спасбросок от смерти и выпадает «1», это считается двумя провалами. Если выпадет «20», вы восстанавливаете 1 хит.
//''Урон при 0 хитов.''// Если вы получаете урон, когда у вас уже 0 хитов, вы получаете проваленный спасбросок от смерти. Если это урон от критического попадания, вы получаете два провала. Если урон равен максимуму ваших хитов или превышает его, вы мгновенно умираете."""
!!!''Стабилизация существа''
"""Самый надёжный способ помочь существу с 0 хитов это его лечение. Если лечение недоступно, существо можно хотя бы стабилизировать, чтобы оно не умерло от проваленного спасброска от смерти.
Вы можете действием оказать первую помощь находящемуся без сознания существу и попытаться стабилизировать его, для чего требуется совершить проверку Мудрости (Медицина) со Сл 10.
''Стабилизированное'' существо не совершает спасброски от смерти, несмотря на то, что хиты равны 0, но и в сознание не приходит. Получив урон, существо перестаёт быть стабилизированным и снова начинает совершать спасброски от смерти. Стабилизированное существо, не получившее лечения, восстанавливает 1 хит после 1к4 часов."""
!!!''Чудовища и смерть''
"""Большинство чудовищ под управлением Мастера сразу умирают, когда их хиты опускаются до 0, не теряя сознание и не совершая спасбросков от смерти.
Могущественные злодеи и особые неигровые персонажи могут стать исключением; Мастер может позволить им потерять сознание и использовать правила, предназначенные для персонажей игроков."""
!!!''Нокаутирование существа''
Иногда нападающий хочет обезвредить врага, а не убивать его. Если атакующий опускает хиты существа до 0 рукопашной атакой, он может заявить, что нокаутирует его. Этот выбор можно сделать уже после причинения урона. В этом случае цель теряет сознание, но сразу становится стабилизированной.
!!!__''Временные хиты''__
"""Некоторые заклинания и особые умения дают существам временные хиты. Временные хиты это не настоящие хиты; это заслон от урона, буфер, защищающий от ран.
Если у вас есть временные хиты и вы получаете урон, временные хиты снимаются первыми, а излишки урона переносятся на обычные хиты. Например, если у вас есть 5 временных хитов и вы получаете урон 7, вы теряете все временные хиты и получаете урон 2.
Из-за того, что временные хиты это не настоящие хиты, их количество может превышать максимум хитов. Таким образом, персонаж может иметь полные хиты и получать при этом временные хиты.
Лечение не восстанавливает временные хиты, и они не складываются вместе. Если у вас есть временные хиты, и вы получаете ещё некоторое количество их, вы сами решаете, какие использовать: старые или новые. Например, если заклинание дарует вам 12 временных хитов, когда у вас уже есть 10, у вас может быть или 10 или 12 временных хитов, но не 22.
Если у вас 0 хитов, получение временных хитов не приводит вас в сознание и не стабилизирует вас. Они всё ещё могут поглощать урон, причиняемый вам, но спасти вас может только настоящее лечение.
Если умение, даровавшее временные хиты, не указывает их длительность, они существуют, пока не кончатся или пока вы не закончите продолжительный отдых."""
//3 уровень, Преобразование, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (стружка корня лакрицы)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Выберите согласное существо, видимое в пределах дистанции. Пока заклинание активно, скорость цели удваивается, она получает бонус +2 к КД, она совершает с преимуществом спасброски Ловкости, и в каждом ходу может совершать дополнительное действие. Этим действием может быть только Атака (одна атака оружием), Засада, Использование предмета, Отход или Рывок.
Когда заклинание оканчивается, цель не может перемещаться и совершать действия, пока не пропустит свой следующий ход, так как становится заторможенной."""
Иногда приключение оказывается не таким простым, как может показаться.
!!__''Моральный выбор''__
Если вы хотите, чтобы у персонажей возникли проблемы, которые не может решить никакое оружие или заклинания, то добавьте в приключение моральный выбор. Моральные сложности возникают, когда искатели приключений должны сделать один-единственный выбор, но этот выбор не будет простым.
{{$:/Моральный выбор}}
;
://''Дилемма с другом.''// ПМ, о котором заботится один или несколько членов отряда, может потребовать от персонажей невозможного. Любовные отношения могут требовать, чтобы персонаж отказался от опасного задания. Старый друг может умолять персонажей пощадить злодея, прося их не уподобляться врагу. Слабый ПМ может попытаться завоевать расположение персонажей, отправившись на самоубийственную, но важную для него миссию.
://''Дилемма с союзником.''// У искателей приключений больше шансов достигнуть своих целей с помощью двух лиц, чей опыт и знания для них необходимы. В то же время, эти два ПМ ненавидят друг друга и откажутся работать вместе, даже если судьба мира будет висеть на волоске. Искатели приключений должны выбрать одного из двух.
://''Дилемма с уважением.''// Два важных союзника дают искателям приключений противоречивые указания или рекомендации. Возможно, первосвященник советует персонажам пойти на мирные переговоры с воинственными эльфами, а воин-ветеран призывает доказать свою силу решительным первым ударом. Искатели приключений не могут выбрать оба варианта, а тот союзник, чей совет они проигнорируют, потеряет уважение к ним и больше не станет помогать.
://''Дилемма с честью.''// Персонаж вынужден выбирать между победой и кодексом чести. Паладин, давший Клятву Преданности, может осознать, что самый простой путь к успеху лежит через обман и хитрость. Верный священнослужитель может поддаться соблазну не повиноваться приказам своей веры. Если вы вводите такую дилемму в игру, не забудьте предоставить персонажу возможность искупить вину за нарушение присяги.
://''Дилемма со спасением.''// Искатели приключений должны выбрать между погоней за злодеем и спасением невинных. Например, они могут узнать, что злодей расположился неподалёку, но помимо этого они узнают, что часть его войск собирается идти в деревню и сравнять её с землёй. Персонажи должны выбрать между поимкой злодея и спасением невинных жителей деревни, некоторые из которых могут быть друзьями или членами семьи.
!!__''Сюжетные повороты''__
Сюжетные повороты могут сделать историю интересней и усложнить персонажам жизнь.
{{$:/Сюжетные повороты}}
!!__''Побочные задания''__
Вы также можете добавить одно или несколько побочных заданий, которые на время уведут героев с главного сюжетного пути. Выполнять побочные задания не обязательно, но их успешное завершение может облегчить выполнение основного задания.
{{$:/Побочные задания}}
//1 уровень, Очарование, Бард/Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (щепотка мелкого песка, лепестки розы или сверчок)
:''Длительность:'' 1 минута
"""Это заклинание посылает существ в магический сон. Бросьте 5к8; результат будет количеством хитов существ, на которых это заклинание может подействовать. Существа в пределах 20 футов от точки, выбранной вами в пределах дистанции, попадают под действие в порядке увеличения их текущих хитов (игнорируя тех, что находятся без сознания).
Начиная с существа с наименьшим количеством текущих хитов все существа, попадающие под действие этого заклинания, теряют сознание до окончания действия заклинания, пока не получат урон, или пока кто-нибудь другой не разбудит их, потратив действие на тряску или пощёчину. Вычитайте хиты каждого существа из общей суммы, после чего переходите к следующему существу с наименьшим числом хитов. Для того чтобы существо попало под действие заклинания, нужно чтобы количество её текущих хитов не превышало оставшуюся сумму.
Нежить и существа, обладающие иммунитетом к очарованию, не попадают под действие этого заклинания."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, бросайте дополнительно 2к8 за каждый уровень ячейки выше первого.
//4 уровень, Некромантия, Волшебник/Друид/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
"""Некротическая энергия омывает выбранное вами существо, которое вы видите в пределах дистанции, забирая из него жидкость и жизненные силы. Цель должна совершить спасбросок Телосложения. Цель получает урон некротической энергией 8к8 в случае провала или половину этого урона в случае успеха. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
Если цель — растительное существо или магическое растение, оно совершает спасбросок с помехой, и заклинание причиняет ему максимальный урон.
Если цель — немагическое растение, не являющееся существом, например, дерево или куст, оно не совершает спасбросок; а просто засыхает и умирает."""
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 5 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше четвёртого.
//7 уровень, Вызов, Волшебник/Друид/Жрец/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (раздвоенный металлический прут, стоящий как минимум 250 зм, настроенный на конкретный план существования)
:''Длительность:'' Мгновенная
"""Вы и до восьми согласных существ, взявшиеся за руки кругом, перемещаетесь на другой план существования. Вы можете указать в общих чертах точку прибытия, например, Медный город на Стихийном Плане Огня или дворец Диспатера на втором уровне Девяти Преисподних, и вы появитесь возле этого места. Например, если вы хотели оказаться в Медном городе, вы можете прибыть на Стальную улицу, перед Вратами Пепла, или оказаться посреди Моря Огня, на выбор Мастера.
В качестве альтернативы, если вы знаете последовательность знаков телепортационного круга на другом плане существования, это заклинание может перенести вас в этот круг. Если круг телепортации слишком мал для переносимого количества существ, они появляются в ближайшем свободном пространстве рядом с кругом.
Вы можете использовать это заклинание, чтобы изгонять несогласных существ на другой план. Выберите существо в пределах досягаемости и совершите по нему рукопашную атаку заклинанием. При попадании существо должно совершить спасбросок Харизмы. Если существо его проваливает, оно переносится в случайным образом выбранное место на выбранном вами плане существования. Перенесённое таким образом существо должно будет самостоятельно найти дорогу на ваш текущий план существования."""
//Заговор, Некромантия, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы касаетесь живого существа, у которого 0 хитов. Оно становится стабилизированным. Это заклинание не оказывает никакого эффекта на нежить и конструктов.
//5 уровень, Иллюзия, Бард/Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' С
:''Длительность:'' Концентрация, вплоть до 1 часа
"""Вы становитесь невидимым, и в то же время в том месте, где вы были, появляется ваш иллюзорный двойник. Двойник существует, пока заклинание активно, но невидимость оканчивается, если вы атакуете или накладываете заклинание.
Вы можете действием переместить своего иллюзорного двойника на расстояние, вдвое превышающее вашу скорость, и заставить его жестикулировать, говорить и вести себя так, как вам хочется.
Вы можете видеть его глазами и слышать его ушами, как если бы вы находились там же, где он. В каждом своём ходу вы можете бонусным действием переключиться с его чувств на свои, или обратно. Пока вы используете его чувства, вы слепы и глухи для своего окружения."""
!!!''__Фирменное заклинание__''
"""Когда вы достигаете 20 уровня, вы получаете власть над двумя мощными заклинаниями и можете творить их без усилий. Выберите два заклинания волшебника 3 уровня из своей книги заклинаний в качестве фирменных заклинаний. Для вас эти заклинания всегда считаются подготовленными, они не учитываются в количестве подготовленных заклинаний, и вы можете сотворить каждое из этих заклинаний 3 уровня, не тратя ячейку заклинаний. Когда вы так поступаете, вы не можете сотворить их повторно таким же образом, пока не завершите короткий или продолжительный отдых.
Если вы хотите сотворить заклинание более высокого уровня, вы должны потратить ячейку заклинаний как обычно."""
//Заговор, Преобразование, Бард/Волшебник/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С
:''Длительность:'' Вплоть до 1 часа
Это заклинание — небольшой магический трюк, на котором практикуются начинающие заклинатели. Вы создаёте один из следующих магических эффектов в пределах дистанции:
* Вы создаёте мгновенный безвредный сенсорный эффект, такой как сноп искр, порыв ветра, тихую мелодию, или необычный запах.
* Вы мгновенно зажигаете или тушите свечу, факел или небольшой костёр.
* Вы мгновенно чистите или мараете предмет, размерами не превышающий 1 кубического фута.
* Вы остужаете, нагреваете или придаёте запах 1 кубическому футу неживой материи на 1 час.
* Вы создаёте на поверхности или предмете маленькую цветную метку или символ, существующую 1 час.
* Вы создаёте немагическую безделушку или иллюзорный предмет, помещающийся в вашу ладонь, и существующий до конца вашего следующего хода.
Если вы накладываете это заклинание несколько раз, вы можете иметь не более трёх немгновенных эффектов одновременно, и можете действием окончить один любой из этих эффектов.
//Чудесный предмет, необычный//
Этот закрытый фонарь способен гореть в течение шести часов на одной пинте масла, распространяя яркий свет в радиусе 30 футов и тусклый свет в радиусе ещё 30 футов. Все невидимые предметы и существа становятся видимыми, если они находятся в ярком свете этого фонаря. Вы можете действием опустить козырёк, уменьшив освещение до тусклого света в пределах 5 футов.
Храмы, гильдии, ордены, тайные общества, и университеты являются важными силами в социальном устройстве любой цивилизации. Их влияние может распространяться на многие города, с применением политической воли или без. Организации могут играть важную роль в жизни персонажей, становясь их покровителями, союзниками или врагами, прямо как отдельные персонажи Мастера. Когда персонажи вступают в организацию, они становятся частью чего-то большего, чем они сами, это может открыть для них новые возможности в мире.
!!__''Искатели приключений и организации''__
На старте кампании предыстории персонажей могут стать отличным способом для ввода искателей приключений в ваш мир. Но по ходу игры прошлые связи персонажей зачастую становятся не такими важными.
Фракции и организации, направленные на персонажей, это лучший способ удерживать искателей приключений высоких уровней в вашей игре, ведь они обеспечивают связь с ключевыми ПМ, и ставят повестку дня выше личной выгоды. Таким же образом, злодейские организации создают постоянное чувство угрозы, гораздо более сильное, чем угроза от одиночных врагов.
Наличие персонажей, привязанных к разным фракциям, может спровоцировать интересные ситуации за игровым столом, поскольку эти фракции имеют схожие цели и не находятся в оппозиции друг к другу всё время. Искатели приключений, представляющие разные фракции, могут быть конкурентами в каких-то вопросах, даже если в целом они преследуют одни и те же цели.
Организация для искателя приключений также может быть отличным источником особых наград, отличающихся от банальных очков опыта и сокровищ. Увеличение ранга в организации имеет значение само по себе, и может также приносить конкретные преимущества, такие как доступ к информации, оборудованию, магии и другим ресурсам.
!!!''Создание фракций''
Фракции и организации, которые вы создаёте, должны обрасти историями, имеющими значение для мира. Создавайте такие организации, с которыми игроки захотят взаимодействовать в качестве союзников, участников или врагов.
Вначале решите, какую роль вы хотите, чтобы организация играла в вашем мире. Что это за организация? Каковы её цели? Кто её основал и почему? Кто её члены? Ответы на эти вопросы должны дать вам лучшее понимание характера организации. Далее подумайте о типичных представителях организации. Как люди могли бы описать их? Какие классы и мировоззрения типичны для них? Какие личностные качества они, как правило, имеют?
<<<
!!!''Пример фракции: Арфисты''
Арфисты — это распространённая сеть заклинателей и шпионов, которые выступают за равенство и тайно противодействуют злоупотреблениям властью, магической или иной другой.
Эта организация появлялась, её разрушали, и она появлялась опять несколько раз. Своей долговечностью и устойчивостью она в значительной степени обязана своей децен-трализованности, поддержке у населения, тайному характеру, и автономии различных её членов. Арфисты имеют небольшие ячейки и одиночных оперативников по всему миру Забытых Королевств, но, несмотря на это, они время от времени взаимодействуют и обмениваются информацией друг с другом. Идеология Арфистов благородна, а её члены гордятся своей изобретательностью и неподкупностью. Арфисты не стремятся к власти или славе, только к справедливости и равному отношению для всех.
//''Девиз.''// «Долой тиранию. Справедливость и равенство для всех».
''//Убеждения.//'' Убеждения Арфистов можно резюмировать следующим образом:
* Никто не может иметь слишком много информации или тайных знаний.
* Слишком большая власть приводит к разврату, а злоупотребления магией должны тщательно контролироваться.
* Никто не должен оставаться без поддержки.
//''Цели.''// Сбор информации в Фаэруне, слежка за политической динамикой в каждом регионе, а также содействие справедливости и равенству тайными способами. Действовать открыто только в крайнем случае. Мешать тиранам, любым лидерам, правительствам, или группам, которые становятся слишком мощными. Помогать слабым, бедным и угнетённым.
//''Типичные задания.''// Типичные задания Арфистов включают в себя получение артефактов, которые могут нарушить баланс сил в регионе, сбор информации о влиятельных лицах или организациях, и определение истинных намерений амбициозного политического деятеля или злого волшебника.
<<<
Выбор символа и девиза — финальная стадия работы над организацией. Фракция, которая использует оленя как символ, скорее всего, сильно отличается от той, что использует крылатую змею. Работая над девизом, придумайте не только послание, но также тон и стиль речи, которые соответствует организации. Оцените девиз Арфистов: «Долой тиранию! Справедливость и равенство для всех...» Арфисты несут простое послание о свободе и процветании. Сравните его с девизом группы политически союзных городов на севере, называющих себя Альянсом Лордов: «Угрозы для дома должны быть безжалостно уничтожены. Превосходство — вот наша безопасность». Сразу понятно, что это непростые люди, состоящие в хрупком политическом союзе, больше направленном на стабильность, чем на справедливость и равенство.
Наконец, подумайте о том, как персонажи могут войти в контакт с этой организацией. С кем из её важных сотрудников, не обязательно лидером, искатели приключений могут столкнуться?
В каких местах действуют агенты организации, и где их штаб- квартира или база? Если всё же искатели приключений вступят в организацию, то на какие миссии их могут направить? Какие награды они могут получить?
!!__''Слава''__
Слава — это необязательное правило, которое вы можете использовать для отслеживания положения искателя приключений в конкретной фракции или организации. Слава — это числовое значение, которое начинается с 0 и увеличивается, как только персонаж зарабатывает репутацию и благосклонность конкретной организации. Вы можете привязать к славе персонажа награды в организации, такие как ранги, звания и доступ к ресурсам.
Игрок получает очки славы отдельно для каждой организации, членом которой он является. Например, искатель приключений может иметь 5 очков славы внутри одной фракции и 20 очков внутри другой, очки начисляются за взаимодействие персонажа с каждой организацией на протяжении всей кампании.
!!!''Получение очков славы''
Персонаж получает очки славы, выполняя миссии и задания в интересах организации или затрагивающие организацию напрямую. Вы награждаете персонажей очками славы по своему усмотрению, как только они завершат эти миссии или задания, как правило, в одно время с получением опыта.
Продвижение интересов организации увеличивает славу персонажа на 1 Выполнение особой миссии, специально созданной для этой организации, или такой, которая приносит ей непосредственную пользу, повышает славу персонажа на 2.
Например, персонажи со связами в благородном Ордене Перчатки завершают миссию, в которой они освобождают город от тирании синего дракона. Ввиду того, что орден любит наказывать злодеев, можно увеличить славу каждого персонажа в ордене на 1 Однако если убийство дракона было заданием, полученным искателями приключений от старшего наставника ордена, его выполнение может увеличить славу каждого персонажа на 2, ведь оно показало искателей приключений как эффективных союзников.
Между тем, плут из отряда мог стащить коробку редких ядов из запасов дракона и продать её скупщику, который по совместительству является тайным агентом Жентарима. Вы можете увеличить славу плута внутри Жентарима на 2, так как такое действие напрямую увеличивает силу и богатство организации, несмотря на то, что задача не была явно назначена агентом Жентарима.
!!!''Преимущества славы''
Преимущества от увеличения славы внутри организации могут включать звания и власть, дружеские отношения с членами организации и другие льготы.
;
:"""//''Звания и ранги.''// Вместе с увеличением уровня славы персонажи могут получать повышения по должности. Вы можете установить определённые ступени славы, которые послужат предпосылками (хотя, не обязательно только предпосылками) для продвижения по званию, как показано в приведённой ниже таблице. Например, персонаж может присоединиться к Альянсу Лордов после получения 1 очка славы в этой организации, получив звание «Мантия». С увеличением славы персонажа в организации, он может получить право на дальнейшее повышение ранга.
Вы можете добавить требования для получения звания. Например, персонаж, связанный с Альянсом Лордов, должен быть как минимум 5 уровня, прежде чем стать «Острым клинком», по крайней мере, 10 уровня, чтобы стать «Военным герцогом», и, по крайней мере, 15 уровня, чтобы стать «Королевским львом».
Вы можете выставить этим ступеням славы любые требования и цифры, индивидуальные для вашей игры, создавая соответствующие ранги и титулы для организаций в своей кампании."""
://''Отношения между членами организации.''// Чем выше слава персонажа в организации, тем выше вероятность, что члены этой организации уже слышали о нём. Вы можете придумать диапазоны значений, при которых отношение незнакомых членов организации к персонажу становится равнодушным или дружественным. Например, члены Изумрудного Анклава — фракции, посвящённой сохранению естественного порядка, могут вести себя не очень дружелюбно с персонажами, которые не получили по крайней мере 3 очка славы в этой организации, и становиться дружественными по умолчанию только тогда, когда персонаж получил 10 очков славы в Изумрудном Анклаве. Эти диапазоны применяются только к отношениям по умолчанию у большинства членов организации, и такие отношения не являются автоматическими. Другим участникам фракции искатель приключений может не нравиться несмотря на его известность и славу, или, наоборот, из-за них.
:"""//''Льготы.''// Получение звания в организации приводит к определённым льготам. Персонаж низкого ранга может получить надёжные связи и куратора в приключениях, безопасный дом, или торговца, готового предложить скидку на снаряжение.
Среднего ранга персонаж может получить последователя (см. главу 4, «создание персонажей Мастера»), доступ к зельям и свиткам, сможет получать покровительство или подкрепление на опасных миссиях. Высокоуровневый персонаж может обращаться за помощью к небольшой армии, брать на хранение редкий магический предмет, получать помощь от заклинателей, или назначать специальные миссии для членов более низкого ранга."""
://''Время простоя.''// Вы можете позволить персонажам провести время между приключения в укреплении отношений и получении очков славы в организации. Для получения большей информации о деятельности между приключениями смотрите главу 6, «между приключениями».
{{$:/Примеры званий во фракции}}
!!!''Потеря очков славы''
Разногласий с членами организации недостаточно, чтобы потерять славу в организации. Тем не менее, серьёзные правонарушения, совершённые в отношении организации или её членов могут привести к потере очков славы и ранга. Степень потерь зависит от конкретного нарушения и остаётся на ваше усмотрение. Слава персонажа в организации никогда не может упасть ниже 0.
!!!''Благочестие''
С некоторыми изменениями, система очков славы также может служить в качестве меры связи персонажа с богами. Это отличный вариант для кампаний, где боги занимают активную позицию в мире.
С таким подходом ваши игроки смогут получать очки славы для конкретных богов из вашей кампании. Каждый персонаж сможет выбрать для себя божество-покровителя или пантеон богов с задачами, доктринами, и табу, которые вы создали. Любая слава, которую он зарабатывает, будет называться очками благочестия или набожности. Персонаж получает очки благочестия, прославляя своих богов, выполняя их команды, и уважая их табу. Персонаж теряет очки благочестия, работая против своих богов, пороча их имя, оскверняя их храмы, и срывая их цели.
Боги даруют благосклонность тем, кто доказал свою преданность. С каждым новым рангом благочестия персонаж может молить бога о милости один раз в день. Божья милость, как правило, снисходит в виде заклинания священника, такого как благословение. Милость часто снисходит со знаком божественного благодетеля; например, персонаж, поклоняющийся Тору, может получить заклинание, сопровождающееся раскатами грома.
Высокий уровень благочестия может дать персонажу более ощутимую пользу в виде благословения или очарования (смотрите главу 7, «Сокровища», чтобы узнать больше о сверхъестественных дарах).
!!!''__Хитрое действие__''
Начиная со 2 уровня ваше мышление и ловкость позволяют двигаться и действовать быстрее. Вы можете в каждом ходу боя совершать бонусное действие. Это действие может быть использовано только для Рывка, Отхода или Засады.
//6 уровень, Преобразование, Друид//
:''Время накладывания:'' 1 минута
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (огонь и святая вода)
:''Длительность:'' 8 часов
"""Вы и до десяти согласных существ, видимых вами в пределах дистанции, на время длительности заклинания принимаете газообразную форму, становясь лёгкими облачками. Находясь в форме облака, существо получает скорость полёта 300 футов и сопротивление к урону от немагического оружия. Единственное действие, которое существо может совершать в этой форме, это Рывок или возвращение в естественную форму. Возврат занимает 1 минуту, во время которой существо недееспособно и не может перемещаться. Пока заклинание активно, существо может вернуться в форму облака, для чего снова требуется преображение в течение 1 минуты.
Если существо находится в форме облака и летит, когда оканчивается эффект, существо в течение 1 минуты снижается на 60 футов в раунд, пока не приземлится безопасно. Если через 1 минуту оно не сможет приземлиться, оно падает на оставшуюся дистанцию."""
//3 уровень, Преобразование, Друид/Жрец/Следопыт/Чародей (ритуал)//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С, М (кусочек пробки)
:''Длительность:'' 1 час
"""Это заклинание дарует способность перемещаться по жидкой поверхности — такой как вода, кислота, грязь, снег, зыбучий песок или лава — как если бы это была безвредная твёрдая поверхность (существа, идущие по жидкой лаве, всё равно получают урон от жара). До десяти согласных существ, видимых вами в пределах дистанции, получают эту же способность на время действия заклинания.
Если вы делаете целью существо, погружённое в жидкость, заклинание поднимает его на поверхность со скоростью 60 футов в раунд."""
//Чудесный предмет, очень редкий или легендарный (требуется настройка)//
Обычный хрустальный шар является очень редким предметом, примерно 6 дюймов диаметром. Если вы его касаетесь, вы можете действием накладывать им заклинание наблюдение (Сл спасброска 17).
Описанные ниже разновидности являются легендарными предметами, обладающими дополнительными свойствами.
;
://''Хрустальный шар истинного зрения.''// Если вы смотрите в этот шар, вы обладаете истинным зрением в радиусе 120 футов с центром на сенсоре заклинания.
://''Хрустальный шар телепатии.''// Если вы смотрите в этот хрустальный шар, вы можете телепатически общаться с существами, видимыми вами в пределах 30 футов от сенсора. Вы также можете действием наложить заклинание внушение (Сл спасброска 17) через сенсор на одно из таких существ. Вы не обязаны концентрироваться на внушении, но это заклинание оканчивается вместе с наблюдением. Вы не можете повторно использовать внушающую способность этого хрустального шара до следующего рассвета.
://''Хрустальный шар чтения мыслей.''// Вы можете действием наложить заклинание обнаружение мыслей (Сл спасброска 17), пока смотрите в этот хрустальный шар, нацеливаясь на существо, которое вы видите в пределах 30 футов от сенсора заклинания. Вы не обязаны концентрироваться на обнаружении мыслей, но это заклинание оканчивается вместе с наблюдением.
//"""Ривен стоял в самой верхней комнате центральной башни своей цитадели — крепости из теней и тёмного камня, вытесанной из горной вершины... Беззвёздная бездна неба раскинулась над серо-чёрным ландшафтом, где обитали мрачные подобия живых существ. Тени, призраки, спектры, привидения и прочая нежить летала в воздухе над цитаделью и рыскала по окрестным холмам и равнинам. Их многочисленные светящиеся глаза походили на рои светлячков. Он чувствовал тьму во всём, что видел, чувствовал её как продолжение самого себя, и ему казалось, что он стал в полтора раза больше."""//
<<AlignRight "— Пол С. Кемп, //Богорождённый//">>
Царство Теней, также называемое Планом Тени, это измерение чёрного, серого и белого цвета, где все остальные цвета словно отсутствуют. Это место тьмы, ненавидящей свет, где в чёрной бездне неба нет ни солнца, ни звёзд.
Царство Теней нахлёстывается на Материальный План точно так же как Страна Фей. Если не отвлекаться на лишённый цветов ландшафт, это место похоже на Материальный План. Ориентиры Материального Плана узнаваемы и в Царстве Теней, но они искажены и изуродованы. Там, где на Материальном Плане стоит гора, в Царстве Теней торчит зазубренная скала, похожая на череп, с грудами валунов и, возможно, руинами когда-то величественного замка. Лес в Царстве Теней будет тёмным и кривым, ветки будут хватать путников за плащи, а корни будут стараться сбить с ног чужаков.
Этот бледный план населён теневыми драконами и нежитью, а также прочими существами, процветающими во мраке, включая плащевиков и чёрных мантий.
!!__''Перекрёстки теней''__
Подобно перекрёсткам фей, перекрёстки теней это места, в которых вуаль между Материальным Планом и Царством Теней настолько тонка, что существа могут переходить с одного плана на другой. Сгусток тьмы в углу пыльного склепа может быть перекрёстком теней, так же как и могильная яма. Перекрёстки теней формируются в мрачных местах, в которых обитают духи или запах смерти, например, на полях сражений, кладбищах и в склепах. Они проявляются только во тьме, закрываясь от малейших проблесков света.
!!__''Домены ужаса''__
В удалённых уголках Царства Теней можно найти жуткие демипланы, в которых правят проклятые ужасно злые создания. Самым известным таким местом является долина Баровия, над которой возвышаются шпили Замка Равенлофт, и которой правит граф Страд фон Зарович, первый вампир. Сущности Царства Теней, именуемые Тёмными Силами, создают эти домены в качестве тюрем для таких «Тёмных Владык», и из-за жестокости или беспечности иногда забрасывают туда ни в чём неповинных смертных.
!!__''Опциональное правило: Отчаяние Царства Теней''__
Царство Теней пронизано меланхолией. Долгие экскурсы в этот план могут окутать персонажей отчаянием, что и отражено в этом опциональном правиле.
Каждый раз, когда вы посчитаете нужным (обычно, не чаще раза в день), вы можете заставить персонажей, не происходящих из Царства Теней, совершить спасбросок Мудрости со Сл 10. При провале персонажа охватывает отчаяние. Совершите бросок к6, чтобы определить эффект с помощью приведённой таблицы. Вы можете придумать свои собственные эффекты отчаяния.
{{$:/Отчаяние Царства Теней}}
Если персонаж уже страдает от эффекта отчаяния, и проваливает этот спасбросок, новый эффект отчаяния заменяет старый. Окончив продолжительный отдых, персонаж может попытаться побороть отчаяние, совершив спасбросок Мудрости со Сл 15 (Сл выше, потому что избавиться от уже охватившего отчаяния гораздо сложнее). В случае успеха эффект отчаяния для этого персонажа оканчивается.
Заклинание умиротворение, а также все заклинания и эффекты, снимающие проклятье, отменяют отчаяние.
<<<
!!!''Вечная Ночь''
У города Невервинтер в мире Забытых Королевств есть тёмное отражение в Царстве Теней: город Вечная Ночь. Вечная Ночь это город растрескавшихся каменных домов и строений из гниющих брёвен. Дороги там по большей части представляют собой утоптанную могильную землю, а в малочисленных мостовых отсутствует столько булыжников, что они выглядят безобразно. Небо здесь серое как кожа трупа, а ветер холодный и влажный, он сильно холодит кожу.
В число живых обитателей города входят безумные некроманты, поставщики человеческой плоти, адепты злых божеств и прочие индивидуумы, достаточно безумные для этого. Однако живые в Вечной Ночи находятся в значительном меньшинстве, так как основную часть населения составляют ходячие мертвецы. Зомби, умертвия, вампиры и прочая нежить сделала этот город своим домом, и всё это под присмотром правящей касты разумных поедающих плоть упырей.
Ходят слухи, что этот город является отражением одного города в каждом из существующих миров.
<<<
//1 уровень, Воплощение, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (алмаз, стоящий как минимум 50 зм)
:''Длительность:'' Мгновенная
Вы бросаете 4-дюймовую (10-сантиметровую) сферу энергии в существо, которое видите в пределах дистанции. Выберите звук, кислоту, огонь, холод, электричество или яд при создании сферы, а затем совершите по цели дальнобойную атаку заклинанием. Если атака попадает, существо получает урон 3к8 выбранного вида.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 2 уровня или выше, урон увеличивается на 1к8 за каждый уровень ячейки выше первого.
!!!''Цепи Карцери''
"""//Требование: 15 уровень, умение Договор цепи//
Вы можете неограниченно накладывать заклинание удержание чудовища, если цель — исчадие, небожитель или элементаль. При этом вы не тратите ячейки заклинаний и материальные компоненты. Вы должны закончить продолжительный отдых, прежде чем снова сможете использовать это заклинание против этого же существа."""
//4 уровень, Вызов, Друид/Следопыт//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Вы создаёте лозу, вырастающую из земли в свободном пространстве на ваш выбор, видимом вами в пределах дистанции. Когда вы накладываете это заклинание, вы можете приказать лозе ухватить видимое вами существо, находящееся в пределах 30 футов от неё. Это существо должно преуспеть в спасброске Ловкости, иначе его подтянет на 20 футов к лозе.
Пока заклинание активно, вы можете в каждом своём ходу бонусным действием приказывать лозе ухватить то же самое или другое существо."""
!!!''__Ци__''
"""Начиная со 2 уровня ваши тренировки позволяют вам управлять мистической энергией ци. Ваш доступ к этой энергии выражается количеством очков ци. Ваш уровень монаха определяет это количество, согласно колонке «очки ци».
Вы можете использовать эти очки чтобы активировать различные умения ци. Вначале вам известны следующие три умения: Поступь ветра, Терпеливая оборона и Шквал ударов. С повышением уровня в этом классе вы выучите новые умения ци.
Все потраченные очки ци восполняются по окончании короткого или продолжительного отдыха. Вы должны потратить как минимум 30 минут на медитацию для их восстановления.
Некоторые из ваших умений ци требуют от цели спасброска, позволяющего избежать эффекта. Сл такого спасброска определяется следующим образом:"""
;
:''Сл спасброска ци'' = 8 + бонус мастерства + модификатор Мудрости
!!!''Поступь ветра''
Вы можете потратить 1 очко ци в свой ход, чтобы совершить бонусным действием Отход или Рывок. В этот ход дальность ваших прыжков удваивается.
!!!''Терпеливая оборона''
Вы тратите 1 очко ци в свой ход, чтобы совершить бонусным действием Уклонение.
!!!''Шквал ударов''
Сразу же после того, как вы в свой ход совершили действие Атака, вы можете потратить 1 очко ци, чтобы совершить бонусным действием две безоружные атаки.
//8 уровень, Вызов, Друид//
:''Время накладывания:'' 1 минута
:''Дистанция:'' Видимость
:''Компоненты:'' В, С
:''Длительность:'' Концентрация, вплоть до 6 раундов
"""В выбранной точке в пределах дистанции появляется стена из воды. Вы можете создать стену длиной до 300 футов, высотой 300 футов и толщиной 50 футов. Стена существует, пока заклинание активно.
Когда стена появляется, все существа в её области должны совершить спасбросок Силы. При провале они получают дробящий урон 6к10 или половину этого урона при успехе.
В начале каждого вашего хода, после того как стена появилась, стена, вместе со всеми находящимися в ней существами, перемещается на 50 футов от вас. Все существа с размером не больше Огромного, находящиеся внутри стены, или те, в чьё пространство стена входит при перемещении, должны преуспеть в спасброске Силы, иначе они получают дробящий урон 5к10. Существо может получить этот урон только один раз за раунд. В конце хода высота стены уменьшается на 50 футов, а получаемый существами урон в последующие раунды уменьшается на 1к10. Когда высота стены достигает 0 футов, заклинание оканчивается.
Существа, оказавшиеся в стене, могут перемещаться, плавая. Однако, из-за того, что волна очень сильная, существо должно совершить успешную проверку Силы (Атлетика) против Сл ваших заклинаний, чтобы получить возможность перемещаться. Провалив проверку, существо не может перемещаться. Существо, выбравшееся из области цунами, падает на землю."""
Золотые глаза вспыхивают, человек протягивает вперёд руку и высвобождает всепоглощающее пламя, что горит в его жилах. Пока адское пламя бушует вокруг его врагов, кожистые крылья раскрываются у него за спиной, и он взмывает в воздух.
Длинные волосы развеваются от магического ветра, полуэльф широко разводит руки в стороны и запрокидывает голову. Моментально подняв его над землёй, волны магической энергии проходят сквозь него и выплёскиваются в окружающее пространство громадной вспышкой молний.
Крадущийся за сталагмитом полурослик указывает пальцем на троглодита. Огненная струя устремляется из его пальца к существу. С усмешкой он прячется обратно за скалу, не подозревая, что дикая магия изменила цвет его кожи на ярко-синий.
Чародеи являются носителями магии, дарованной им при рождении их экзотической родословной, неким потусторонним влиянием или воздействием неизвестных вселенских сил. Никто не может обучиться чародейству, как, например, выучить язык, так же как никто не может обучить, как прожить легендарную жизнь. Никто не может избрать путь чародейства, сила сама выбирает носителя.
!!!''__Грубая магия__''
Магия является частью каждого чародея, наполняя тело, разум и дух скрытой силой, которая ждёт, когда её используют. Некоторые чародеи владеют магией, которая проистекает из древней родословной, связанной с магией драконов. Другие же несут в себе сырую, неконтролируемую силу, хаотичный шторм, который может выплеснуться самым неожиданным образом.
Проявление сил чародея крайне непредсказуемо. Некоторые драконьи родословные получают ровно одного чародея в каждом поколении, в других же родословных каждый индивид может являться чародеем. В большинстве случаев способность к чародейству возникает случайно. Некоторые чародеи не могут назвать источник своей силы, в то время как другие связывают его со странными событиями в своей жизни. Прикосновение демона, благословление дриады при рождении, или вода из мистического источника — всё это может разжечь искру чародейского дара. Это может быть дар божества магии, воздействие стихийных сил из Внутренних Планов, прикосновение к безумному хаосу Лимбо или понимание внутреннего устройства реальности.
Чародеи не используют книги заклинаний, на которые полагаются волшебники, и, в отличие от колдунов, не полагаются на высокого покровителя, даровавшего им заклятья. Научившись использовать и направлять свою собственную врождённую магию, они могут открыть для себя новые ошеломляющие способы высвобождения этой силы.
!!!__''Необъяснимые силы''__
Чародеи довольно редко встречаются в мире, и совсем уж необычно встретить чародея, каким-либо образом не вовлечённого в приключения. Люди с магическими силами, текущими по их жилам, вскоре обнаруживают, что данные силы не могут постоянно дремать. Чародейская магия требует использования, и имеет тенденцию вырываться самым непредсказуемым образом, если её игнорировать.
Зачастую, у чародеев туманные мотивы, толкающие их на приключения. Некоторые ищут более глубокого понимания магических сил, влияющих на них, или разгадок их таинственного происхождения. Другие же надеются найти способ избавления от своего дара, или раскрытия его полного потенциала. Вне зависимости от их целей, чародеи столь же полезны в отряде искателей приключений, как и волшебники. Хотя чародеи и не владеют множеством заклинаний, это с лихвой компенсируется большой гибкостью в использовании тех заклятий, что им известны.
{{Таблица развития Чародея}}
{{Создание Чародея}}
!!!__''Чародейское восстановление''__
На 20 уровне вы восстанавливаете 4 единицы чародейства по окончании короткого отдыха.
<<list-links "[tag[Часть 01]sort[order]]">>
<<list-links "[tag[Часть 02]sort[order]]">>
<<list-links "[tag[Часть 03]sort[order]]">>
<div class="tc-table-of-contents">
<<toc-selective-expandable "02. Часть 1" "sort[order]">>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable "03. Часть 2" "sort[order]">>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable "04. Часть 3" "sort[order]">>
</div>
//Чудесный предмет, редкий//
Если эта чаша наполнена водой, вы можете действием произнести командное слово и призвать водяного элементаля, как если бы наложили заклинание призыв элементаля. Чашу нельзя использовать повторно, пока не наступит следующий рассвет.
Чаша диаметром примерно 1 фут, а в высоту она в два раза меньше. Она весит 3 фунта и вмещает 3 галлона.
//"""
Это были рассказы о беспокойном народе, путешествовавшем по морям и рекам на длинных кораблях, сперва для грабежа и разбоя, потом в поисках мест для поселений. Но с каждой страницы била энергия, любовь к приключениям. Лириэль читала большую часть ночи, тратя драгоценные свечи.
Она никогда не задумывалась о людях, но эти истории восхищали ее. В этих пожелтевших страницах говорилось о храбрых героях, странных и яростных животных, могучих богах и магии, которая была неотъемлемой частью той дальней земли.
"""//
—Элейн Каннингем, Дочь дроу
В большинстве миров люди — это самая молодая из распространённых рас. Они поздно вышли на мировую сцену и живут намного меньше, чем дварфы, эльфы и драконы. Возможно, именно краткость их жизней заставляет их стремиться достигнуть как можно большего в отведённый им срок. А быть может, они хотят что-то доказать старшим расам, и поэтому создают могучие империи, основанные на завоеваниях и торговле. Что бы ни двигало ими, люди всегда были инноваторами и пионерами во всех мирах.
!!! ''__Многоликие__''
Со своей склонностью к миграции и завоеваниям, люди более разнообразны физически, чем другие распространенные расы. Не существует типичной внешности человека. Рост отдельного представителя может составлять от 5 до 6 футов (от 152 до 184 сантиметров), а вес — от 125 до 250 фунтов (от 60 до 112 килограмм). Оттенок кожи у людей варьируется от почти чёрного до очень бледного, а волосы — от чёрного до светлого тонов (волнистые, кудрявые или прямые); мужчины могут носить волосы на лице, густые или редкие. Многие люди имеют примесь нечеловеческой крови, выдающей черты эльфа, орка, или предков другого происхождения. Люди достигают совершеннолетия около двадцати лет, и редко проживают одно столетие.
!!! __''Разнообразие во всём''__
Люди являются самыми приспособленным и амбициозным народом среди распространённых рас. Их вкусы, нравы и обычаи сильно отличаются во множестве разных земель, где они поселились. Однако там, где они селятся, они остаются надолго: строят города, стоящие веками, и великие королевства, сохраняющиеся множество столетий. У отдельного человека может быть относительно короткая продолжительность жизни, но человеческая нация и культура сохраняет традиции от своих истоков на время, намного превышающее память одного человека. Они живут сегодняшним днём, что весьма хорошо подходит для приключенческой жизни, и позволяет вдобавок строить планы на будущее, со стремлением оставить после себя прочное наследие. Индивидуально или в группах, люди легко приспосабливаются к ситуации, и всегда остаются внимательными к изменяющейся политической и социальной динамике.
!!! __''Прочные институты''__
Там где один эльф или дварф могут взять ответственность за охрану особого места или великой тайны, человек создаёт священные порядки и институты. В то время как кланы дварфов и старейшины полуросликов передают свои традиции новым поколениям, человеческие храмы, государства, библиотеки и своды законов запечатлевают их традиции в анналах истории. Люди мечтают о бессмертии, но (за исключением тех, кто становится нежитью или достигает божественного восхождения, чтобы избежать оков смерти) достигают его, когда продолжают жить в памяти, после смерти.
Хотя некоторые люди могут быть ксенофобами, в целом их общество очень смешано. На землях людей обитает большое количество нечеловеческих рас, по сравнению с количеством людей, живущих на землях не-людей.
<<<
"""
''Вторые лучшие друзья для каждого''
Так же легко как они смешиваются друг с другом, люди ассимилируются с представителями других рас. Они могут ужиться почти со всеми, хотя и редко сближаются. Люди служат послами, дипломатами, магистрами, торговцами и чиновниками всех мастей.
''О дварфах.'' «Это крепкий народ, верные друзья, и они держат своё слово. И всё же, их жажда золота однажды погубит их».
''Об эльфах.'' «Лучше не бродить в эльфийских лесах. Они не любят незваных гостей, и вы будете, вероятно, околдованы или изрешечены стрелами. Но если эльф сможет преодолеть проклятую расовую гордость и общаться с вами как с равным, вы можете многому у него научиться».
''О полуросликах.'' «Трудно превзойти ужин в доме полурослика, примерно так же трудно как не проломить голову о его потолок; хорошая еда и хорошие истории перед уютным тёплым очагом. Ели бы у полуросликов была бы ещё толика амбиций, они могли бы действительно чего-то стоить».
"""
<<<
!!!__''Воплощение амбиций''__
Люди, ищущие приключений, являются самыми смелыми и амбициозными представителями смелой и амбициозной расы. Они стремятся заработать славу в глазах своих товарищей, накапливая власть, богатство и популярность. Более чем другие народы люди борются за цель, а не за расширение территорий или процветание отдельных фракций.
!!!__''Человеческие имена и этносы''__
Поскольку культура людей самая разнообразная среди всех существующих рас, у них нет типичных имён. Некоторые родители дают своим детям имена из других наречий, например, из Дварфского или Эльфийского (произносимые более или менее правильно), но большинство родителей даёт имена, связанные с культурой своего региона или традициями предков.
Культура быта и физические характеристики людей могут сильно меняться в зависимости от региона. В Забытых Королевствах, например, одежда, архитектура, кухня, музыка, и литература в северо-западных землях Серебряных Пустошей отличаются от тех, что есть в далёком Тёрмише или Импилтуре на востоке, и совсем не похожи на их аналоги в далёком Кара-Туре. Физические характеристики людей различаются в соответствии с переселениями их предков, поэтому люди Серебряных Пустошей имеют все возможные сочетания цветов кожи.
В Забытых Королевствах широко известны девять этнических групп, хотя более дюжины других находятся в более локализованных областях Фаэруна. Эти группы и типичные имена их представителей могут быть использованы в качестве примера, вне зависимости от того, из какого мира ваш человек.
!! Дамарец
Начавшие свою историю на северо-западе Фаэруна, Дамарцы имеют средний рост и сложение, оттенок их кожи варьируется от смуглого до светлого. Их волосы обычно коричневые или чёрные, а цвет глаз сильно отличается, хотя карие — самые распространённые.
''Имена дамарцев:''
;(Мужские)
:Айвор, Бор, Глэр, Григор, Иган, Козеф, Миваль, Орел, Павел, Сергор, Фодель;
;(женские)
:Алетра, Зора, Кара, Катернин, Мара, Натали, Ольма, Тана;
;(фамилии)
:Берск, Дотск, Куленов, Марск, Немецк, Стараг, Чернин, Шемов;
!! Иллусканец
Иллусканцы — высокий, светлокожий народ с голубыми или серыми со стальным оттенком глазами. У большинства чёрные волосы цвета вороньего крыла, но у тех, кто населяет край северо-запада — светлые, рыжие или светло-русые волосы.
''Имена иллусканцев:''
;(Мужские)
:Блас, Бран, Гет, Ландер, Лют, Малсер, Стор, Таман, Урт, Фрат, Эндер;
;(женские)
:Амафрея, Бетха, Вестра, Кетра, Мара, Ольга, Силифрей, Цефрея;
;(фамилии)
:Брайтвуд, Виндривер, Лакмэн, Хелдер, Хорнрейвен, Штормвинд;
!! Калишит
Более низкие и стройные, чем большинство других людей, калишиты имеют смугло-коричневую кожу, волосы и глаза. Они обитают в основном на юго-западе Фаэруна.
''Имена калишитов:''
;(Мужские)
:Асеир, Бардеид, Зашеир, Кхемед, Мехмен, Судейман, Хасеид;
;(женские)
:Атала, Джасмаль, Зашеида, Мейлиль, Сейдиль, Сейпора, Хама, Яшеира;
;(фамилии)
:Баша, Джассан, Думеин, Кхалид, Мостана, Пашар, Рейн
!! Мулан
Преобладающие на восточных и юго-восточных берегах Внутреннего моря, муланы, как правило, высокие, стройные, с кожей цвета янтаря и карими или светло-коричневыми глазами. Волосы у них от чёрного до тёмно-коричневого оттенков, но на землях, где муланы наиболее многочисленны, дворяне и другие жители сбривают все волосы.
''Имена муланов:''
;(Мужские)
:Аот, Барерис, Кетот, Мумед, Рамас, Со-Кехур, Тхазар-Де, Урхур, Эхпут-Ки;
;(женские)
:Аризима, Золис, Мурити, Нефис, Нулара, Сефрис, Тола, Умара, Чатхи;
;(фамилии)
:Анкхалаб, Анскульд, Натандем, Серпет, Уутракт, Фезим, Хахпет
!! Рашеми
Рашеми, обитающие к востоку от Внутреннего моря и часто смешивающиеся с муланами, обычно низкорослые, коренастые и мускулистые. У них, как правило, тёмная кожа, чёрные глаза, и густые чёрные волосы.
''Имена рашеми:''
;(Мужские)
:Боривик, Владислак, Джандар, Канитар, Мадислак, Ральмевик, Фаургар, Шаумар;
;(женские)
:Имзель, Иммит, Наварра, Таммит, Файварра, Хульмарра, Шеварра, Юльдра;
;(фамилии)
:Дайрнина, Илтазяра, Мурнитара, Стаянога, Улмокина, Чергоба;
!! Тетирец
Распространившиеся вдоль всего побережья Меча в западной части Фаэруна, тетирцы являются людьми среднего сложения и роста со смуглой кожей, которая светлее у северных поселенцев. Цвет волос и глаз у них сильно различается, но коричневые волосы и голубые глаза — наиболее типичны. Тетирцы в основном используют чондатанские имена.
!! Тёрами
Рожденные на южных берегах Внутреннего моря, Тёрами, как правило, высокие и мускулистые люди с тёмно-красной кожей, чёрными волнистыми волосами и чёрными глазами.
''Имена тёрами:''
;(Мужские)
:Антон, Диеро, Маркон, Пьерон, Римардо, Ромеро, Салазар, Умберо;
;(женские)
:Балама, Вонда, Джалана, Дона, Куара, Луиза, Марта, Селизе, Фаила;
;(фамилии)
:Агосто, Асторио, Домине, Калабра, Маривальди, Писакар, Рамондо, Фалоне
!! Чондатанец
Чондатанцы — стройный, смуглый народ с коричневыми, от светлых до почти чёрных, волосами. Они высокие, у них зелёные или карие глаза, но это применимо не ко всем. Чондатанцы преобладают в центральных землях Фаэруна, вокруг Внутреннего моря.
''Имена чондатанцев:''
;(Мужские)
:Горстаг, Грим, Дарвин, Дорн, Маларк, Морн, Рэндал, Стедд, Хельм, Эвендур;
;(женские)
:Арвин, Джессаиль, Керри, Лурин, Мири, Рован, Тесселе, Шандри, Эсвель;
;(фамилии)
:Бакмэн, Грэйкасл, Дандрэгон, Толстаг, Эвенвуд, Эмблкроун
!! Шу
Шу — наиболее многочисленная и могущественная раса в Кара-Туре, далеко на востоке Фаэруна. У них желтовато-бронзовый оттенок кожи, с тёмными волосами и чёрными глазами. Фамилии шу обычно стоят перед именами.
''Имена шу:''
;(Мужские)
:Ан, Вэнь, Лонг, Лянь, Менг, Он, Фай, Цзюн, Цзянь, Чен, Чи, Шань, Шуй;
;(женские)
:Бай, Ксяо, Лей, Мей, Тай, Цзя, Чао, Шуй;
;(фамилии)
:Вань, Као, Кунг, Лао, Линг, Мей, Пинь, Сум, Тань, Хуан, Чиень, Шин
!!! __''Особенности людей''__
"""
Сложно делать какие либо обобщения относительно людей, но ваш персонаж-человек обладает следующими особенностями.
''Увеличение характеристик.'' Значение всех ваших характеристик увеличивается на 1.
''Возраст.'' Люди становятся взрослыми в районе 20 лет, и живут менее столетия.
''Мировоззрение.'' Люди не имеют склонности к определённому мировоззрению. Среди них встречаются как лучшие, так и худшие представители.
''Размер.'' Люди сильно различаются по размерам. Некоторые с трудом достигают 5 футов (152 сантиметров) ростом, тогда как другие имеют рост, превосходящий 6 футов (183 сантиметра). Вне зависимости от роста, ваш размер — Средний.
''Скорость.'' Ваша базовая скорость перемещения составляет 30 футов.
''Языки.'' Вы можете говорить, читать и писать на Общем и ещё одном языке на ваш выбор. Люди обычно изучают языки народов, с которыми имеют дело, включая редкие диалекты. Они любят разбавлять собственную речь словами, позаимствованными из других языков: орочьими ругательствами, эльфийскими музыкальными терминами, дварфскими военными командами.
"""
<<<
"""
''Альтернативные особенности людей''
Если в своей компании вы используете дополнительные правила об использовании черт из главы 5, ваш Мастер может позволить использовать эти альтернативные особенности вместо указанного выше стандартного увеличения характеристик.
''Увеличение характеристик.'' Значение двух характеристик на ваш выбор увеличивается на 1.
''Навыки.'' Вы получаете владение одним навыком на ваш выбор.
''Черта.'' Вы получаете одну черту на ваш выбор.
"""
<<<
!!__''Чемпион''__
Обычно чемпионы фокусируются на использовании чистой физической силы, отточенной до смертельного совершенства. Выбравший для себя архетип чемпиона сочетает суровые тренировки с физическим совершенством, позволяющим наносить смертоносные удары.
!!!''Улучшенные критические попадания''
Если вы выбрали этот архетип на 3 уровне, ваши атаки оружием совершают критическое попадание при выпадении «19» или «20» на кости атаки.
!!!''Выдающийся атлет''
Начиная с 7 уровня, вы можете добавлять половину бонуса мастерства, округлённую в большую сторону, ко всем проверкам Силы, Ловкости или Телосложения, куда этот бонус ещё не включён.
Кроме того, если вы совершаете прыжок в длину с разбега, дальность прыжка увеличивается на количество футов, равное модификатору Силы.
!!!''Дополнительный боевой стиль''
На 10 уровне вы можете выбрать второй боевой стиль.
!!!''Превосходные критические попадания''
Начиная с 15 уровня, ваши атаки оружием совершают критическое попадание при выпадении «18–20» на кости атаки.
!!!''Уцелевший''
К 18 уровню вы достигаете вершин стойкости в бою. В начале каждого своего хода вы восстанавливаете количество хитов, равное 5 + ваш модификатор Телосложения, если количество ваших хитов не превышает половины от максимума. Эта способность не работает, если у вас 0 хитов.
!!!''Чёрный клинок''
//Оружие (двуручный меч), легендарное (требуется настройка существом с любым мировоззрением кроме законного)//
Скрытый в подземельях горы Белый Шлейф, Чёрный клинок сияет как кусочек ночного неба, заполненный звёздами. Его чёрные ножны украшены кусочками обсидиана.
Вы получаете бонус +3 к броскам атаки и урона, совершённым этим оружием. Оно обладает следующими дополнительными свойствами:
;
:"""//''Пожирание души.''// Каждый раз, когда вы опускаете этим мечом хиты существа до 0, он убивает существо и пожирает его душу, если только это не конструкт и не нежить. Существо, чья душа пожрана Чёрным клинком, может вернуться к жизни только посредством заклинания исполнение желаний.
Пожрав душу, Чёрный клинок дарует вам временные хиты, равные максимуму хитов убитого существа. Эти хиты исчезнут через 24 часа. Пока у вас есть эти временные хиты, и вы держите Чёрный клинок в руке, вы совершаете с преимуществом броски атаки, спасброски и проверки характеристик.
Если вы попадаете этим оружием по нежити, вы получаете урон некротической энергией 1к10, а цель восстанавливает 1к10 хитов. Если этот урон опускает ваши хиты до 0, Чёрный клинок пожирает вашу душу."""
:"""//''Охотник на души.''// Пока вы держите это оружие в руках, вы знаете о присутствии существ с размером не меньше Крохотного в пределах 60 футов от вас, не являющихся конструктами и нежитью. Кроме того, вы не можете быть очарованными и испуганными.
Чёрный клинок может один раз в день наложить на вас заклинание ускорение. Он сам решает, когда это сделать, и сам поддерживает концентрацию."""
:"""//''Разум.''// Чёрный клинок — разумное хаотичнонейтральное оружие с Интеллектом 17, Мудростью 10 и Харизмой 19. Он обладает слухом и тёмным зрением в пределах 120 футов.
Это оружие может понимать Общий язык, а также говорить и читать на нём и телепатически общаться с владельцем. У него низкий и раскатистый голос. Пока вы настроены на Чёрный клинок, он также понимает все языки, известные вам."""
:"""//''Индивидуальность.''// Чёрный клинок разговаривает повелительным тоном, словно привыкнув, что ему подчиняются.
Его предназначение в пожирании душ. Ему всё равно чью душу он пожрёт, даже если это будет владелец. Он считает, что все виды материи и энергии происходят от пустоты негативной энергии, и когда-нибудь туда вернутся. Сам же он лишь ускоряет этот процесс.
Несмотря на весь нигилизм, Чёрный клинок чувствует странное родство с Волной и Сокрушителем, двумя другими оружиями, хранящимися под горой Белый Шлейф. Он хочет, чтобы эти три оружия были вместе и совместно использовались в сражениях, несмотря на то, что он не согласен с Сокрушителем и считает Волну занудной.
Жажду душ Чёрного клинка нужно постоянно удовлетворять. Если меч в течение трёх дней не пожрёт ничью душу, на следующем закате у него возникает конфликт с владельцем."""
"""Черты отражают дарование или обучение, дающее персонажу особые знания. Они воплощают тренировки, опыт и способности, превышающие те, что даёт класс.
На некоторых уровнях класс даёт вам умение Улучшение характеристик. При помощи этого опционального правила вы можете отказаться от этого умения и взять вместо него черту. Каждую черту можно брать только один раз, если в её описании не сказано обратное.
Для получения черты вы должны выполнять её требования. Если вы перестали выполнять требования черты, вы не можете её использовать, пока снова не начнёте выполнять требования. Например, черта Борец требует наличия Силы 13 или выше. Если ваша Сила по каким-то причинам опустится ниже 13 (например, из-за проклятья) вы не получаете преимуществ от этой черты, пока не восстановите Силу."""
!!!__''Артистичный''__
Научившись театральному искусству и подражанию, вы получаете следующие преимущества:
* Увеличьте значение Харизмы на 1, при максимуме 20.
* Вы совершаете с преимуществом проверки Харизмы (Выступление) и Харизма (Обман), когда пытаетесь выдать себя за кого-то другого.
* Вы можете подражать речи кого-то другого, а также звукам, издаваемым другими существами. Перед этим вы должны как минимум в течение 1 минуты слышать чужую речь или звуки существа. Успешная проверка Мудрости (Проницательность), противопоставленная вашей проверке Харизмы (Обман), позволяет слушающему понять, что источник звука не настоящий.
!!!__''Атлетичный''__
Вы прошли интенсивную физическую подготовку и получаете следующие преимущества:
* Увеличьте значение Силы или Ловкости на 1, при максимуме 20.
* Если вы лежите ничком, вставание использует только 5 футов перемещения.
* Лазание не заставляет вас тратить дополнительное перемещение.
* Вы можете совершать прыжок в длину или высоту с разбега, переместившись только на 5 футов, а не на 10.
!!!__''Бдительный''__
Вы всегда готовы к опасностям и получаете следующие преимущества:
* Вы получаете бонус +5 к проверкам инициативы.
* Вас не могут застать врасплох, пока вы в сознании.
* Другие существа не получают преимущество для бросков атаки по вам за то, что они скрыты от вас.
!!!__''Боевой заклинатель''__
"""//Требование: Способность накладывать хотя бы одно заклинание//
Вы научились накладывать заклинания в пылу сражения и узнали техники, дающие следующие преимущества:"""
* Вы совершаете с преимуществом спасброски Телосложения для поддержания концентрации на заклинании при получении урона.
* Вы можете выполнять телесный компонент заклинаний даже если используете оружие или щит в одной или обеих руках.
* Если перемещение враждебного существа провоцирует от вас атаку, вы можете вместо совершения провоцированной атаки реакцией наложить на это существо заклинание. Время накладывания этого заклинания должно быть «1 действие» и оно должно нацеливаться только на это существо.
!!!__''Борец''__
"""//Требование: Сила 13 или выше//
Вы развили навыки, нужные для тесного захвата противников. Вы получаете следующие преимущества:"""
* Вы совершаете с преимуществом броски атаки по существу, которое держите в захвате.
* Вы можете действием попытаться скрутить захваченное вами существо. Для этого совершите ещё одну проверку захвата. В случае успеха и вы и это существо становитесь опутанными до окончания захвата.
!!!__''Везунчик''__
"""Вам непонятным образом везёт как раз тогда, когда это нужно.
У вас есть 3 единицы удачи. Каждый раз, когда вы совершаете бросок атаки, проверку характеристики или спасбросок, вы можете потратить одну единицу удачи, чтобы бросить дополнительный к20. Вы можете решить потратить единицу удачи после обычного броска кости, но до определения последствий. После этого вы сами выбираете, какую к20 использовать для броска атаки, проверки характеристики или спасброска.
Вы также можете потратить одну единицу удачи, когда по вам совершается бросок атаки. Бросьте к20, а потом решите, какую из костей будет использовать атакующий, вашу или свою.
Если сразу несколько существ тратят единицы удачи для оказания влияния на один бросок, единицы отменяют друг друга и дополнительные кости никто не кидает.
Вы восстанавливаете потраченные единицы удачи в конце продолжительного отдыха."""
!!!__''Верховой боец''__
Вы — опасный враг, когда вы верхом на скакуне. Если вы находитесь верхом и не выведены из строя, вы получаете следующие преимущества:
* Вы совершаете с преимуществом броски рукопашных атак по существам, чей размер меньше вашего скакуна, и не находящимся при этом верхом.
* Вы можете сделать так, что атака, нацеленная на вашего скакуна, будет перенацелена на вас.
* Если ваш скакун попадает под эффект, позволяющий совершить спасбросок Ловкости для получения половины урона, то он не получает урон в случае успеха и получает всего половину урона при провале.
!!!__''Внимательный''__
Вы быстро улавливаете мелкие подробности и получаете следующие преимущества:
* Увеличьте значение Интеллекта или Мудрости на 1, при максимуме 20.
* Если вы видите рот существа, когда оно говорит на языке, который вы понимаете, вы можете прочитать по его губам, что оно говорит.
* Вы получаете бонус +5 к пассивной проверке Мудрости (Внимательность) и пассивной проверке Интеллекта (Анализ).
!!!__''Воинский адепт''__
Вы прошли военную подготовку, позволяющую совершать особые боевые приёмы. Вы получаете следующие преимущества:
* Вы узнаёте два приёма на свой выбор из списка архетипа воина Мастер боевых искусств. Если приём требует, чтобы цель совершила спасбросок для сопротивления эффекту приёма, Сл спасброска равна 8 + ваш бонус мастерства + модификатор Силы или Ловкости (на ваш выбор).
* Если у вас уже есть кости превосходства, вы получаете ещё одну; в противном случае вы получаете одну кость превосходства: к6. Эта кость подпитывает ваши приёмы. Кость превосходства тратится, когда вы её используете, и восстанавливается после окончания короткого или продолжительного отдыха. Эта кость превосходства останется у вас даже если позже вы получите новые кости из другого источника.
!!!__''Воодушевляющий лидер''__
"""//Требование: Харизма 13 или выше//
Вы можете потратить 10 минут на воодушевление спутников, укрепляя их решимость. Если вы делаете это, выберите до шести дружественных существ (можете включить себя) в пределах 30 футов от себя, которые могут видеть или слышать вас, и которые могут вас понять. Все эти существа получают временные хиты в количестве, равном вашему уровню + ваш модификатор Харизмы. Существа больше не могут получать временные хиты от этой черты, пока не окончат короткий или продолжительный отдых."""
!!!__''Дикий атакующий''__
Один раз в ход, когда вы совершаете бросок урона для атаки рукопашным оружием, вы можете перебросить все кости урона оружия и использовать любой из вариантов.
!!!__''Драчун''__
Привыкнув к мордобою с использованием подручных предметов, вы получаете следующие преимущества:
* Увеличьте значение Силы или Телосложения на 1, при максимуме 20.
* Вы получаете владение импровизированным оружием.
* Ваш безоружный удар использует для урона к4.
* Если вы в свой ход попадаете по существу безоружным ударом или импровизированным оружием, вы можете бонусным действием попытаться захватить цель.
!!!''__Знаток лёгких доспехов__''
Вы обучились ношению лёгких доспехов и получаете следующие преимущества:
* Увеличьте значение Силы или Ловкости на 1, при максимуме 20.
* Вы получаете владение лёгкими доспехами.
!!!__''Знаток средних доспехов''__
"""//Требование: Владение лёгкими доспехами//
Вы обучились ношению средних доспехов и щитов, и получаете следующие преимущества:"""
* Увеличьте значение Силы или Ловкости на 1, при максимуме 20.
* Вы получаете владение средними доспехами и щитами.
!!!__''Знаток тяжёлых доспехов''__
"""//Требование: Владение средними доспехами//
Вы обучились ношению тяжёлых доспехов и получаете следующие преимущества:"""
* Увеличьте значение Силы на 1, при максимуме 20.
* Вы получаете владение тяжёлыми доспехами.
!!!__''Использование двух оружий''__
Вы знаете как использовать сразу два оружия, и получаете следующие преимущества:
* Вы получаете бонус +1 к КД, когда держите в каждой руке по рукопашному оружию.
* Вы можете использовать сражение с двумя оружиями даже если ни у одного из ваших одноручных оружий нет свойства «лёгкое».
* Вы можете вынимать и убирать два одноручных оружия когда обычно позволяется вынуть или убрать только одно.
!!!__''Исследователь подземелий''__
Научившись искать скрытые ловушки и потайные двери в подземельях, вы получаете следующие преимущества:
* Вы совершаете с преимуществом проверки Мудрости (Внимательность) и Интеллекта (Анализ), совершённые для обнаружения потайных дверей.
* Вы совершаете с преимуществом спасброски для избегания ловушек и сопротивления их эффектам.
* Вы получаете сопротивление к урону от ловушек.
* Вы можете искать ловушки, идя с обычной скоростью, а не медленной.
!!!''__Крепкий__''
Максимум ваших хитов увеличивается на количество, равное удвоенному уровню, на котором берётся эта черта. Каждый раз, когда вы впоследствии будете получать уровень, максимум ваших хитов будет дополнительно увеличиваться на 2.
!!!__''Лекарь''__
Вы способный медик, что позволяет быстро залечивать раны и возвращать союзников в строй. Вы получаете следующие преимущества:
* Когда вы используете комплект целителя для стабилизации умирающего существа, это существо также восстанавливает 1 хит.
* Вы можете действием потратить одно использование комплекта целителя, чтобы позаботиться о существе и восстановить ему 1к6 + 4 хита, плюс дополнительные хиты, равные максимальному значению его Кости Хитов. Это существо не сможет повторно восстанавливать хиты от этой черты, пока не закончит короткий или продолжительный отдых.
!!!__''Мастер большого оружия''__
Вы научились использовать вес своего оружия, позволяя инерции усиливать ваши атаки. Вы получаете следующие преимущества:
* В свой ход, когда вы совершаете критическое попадание рукопашным оружием или опускаете им хиты существа до 0, вы можете бонусным действием совершить одну атаку рукопашным оружием.
* Перед совершением атаки рукопашным оружием со свойством «тяжёлое», которым вы владеете, вы можете принять штраф −5 к броску атаки. Если такая атака попадает, вы добавляете +10 к урону от этой атаки.
!!!__''Мастер древкового оружия''__
Вы можете сдерживать врагов оружием со свойством «досягаемость». Вы получаете следующие преимущества:
* Если вы совершаете действие Атака и атакуете только алебардой, боевым посохом или глефой, вы можете бонусным действием совершить рукопашную атаку противоположным концом оружия. Кость урона для этой атаки равна к4, и атака причиняет дробящий урон. Бонусная атака использует модификатор той же характеристики, что и основная.
* Если вы используете алебарду, боевой посох, глефу или пику, другие существа провоцируют от вас атаку, когда входят в пределы вашей досягаемости.
!!!__''Мастер оружия''__
Вы знаете как пользоваться множеством видов оружия и получаете следующие преимущества:
* Увеличьте значение Силы или Ловкости на 1, при максимуме 20.
* Вы получаете владение четырьмя выбранными видами оружия. Выбранное оружие должно быть или простым или воинским.
!!!__''Мастер средних доспехов''__
"""//Требование: Владение средними доспехами//
Вы привыкли к перемещению в средних доспехах и получаете следующие преимущества:"""
* Ношение среднего доспеха не накладывает помеху к проверкам Ловкости (Скрытность).
* Когда вы носите средний доспех, вы можете добавлять к КД 3, а 2, если ваша Ловкость 16 или выше.
!!!__''Мастер тяжёлых доспехов''__
"""//Требование: Владение тяжёлыми доспехами//
Вы можете своим доспехом отклонять удары, которые других убили бы. Вы получаете следующие преимущества:"""
* Увеличьте значение Силы на 1, при максимуме 20.
* Если вы носите тяжёлый доспех, дробящий, колющий и рубящий урон, получаемый вами от немагического оружия, уменьшается на 3.
!!!__''Мастер щитов''__
Вы используете щиты не только для обороны, но и для нападения. Вы получаете следующие преимущества, когда используете щит:
* Если вы в свой ход совершаете действие Атака, вы можете бонусным действием попытаться оттолкнуть щитом существо, находящееся в пределах 5 футов от вас.
* Если вы не выведены из строя, вы можете добавлять бонус к КД от щита ко всем спасброскам Ловкости, совершённым от заклинаний и прочих вредоносных эффектов, нацеленных только на вас.
* Если вы подвергаетесь действию эффекта, позволяющего совершить спасбросок Ловкости для получения половины урона, вы можете реакцией вообще не получить урон в случае успешного спасброска, выставив щит между собой и источником эффекта.
!!!__''Меткие заклинания''__
"""//Требование: Способность накладывать хотя бы одно заклинание//
Вы узнали технику, улучшающую атаку некоторыми видами заклинаний, и получаете следующие преимущества:"""
* Если вы накладываете заклинание, требующее совершение броска атаки, дистанция заклинания удваивается.
* Ваши дальнобойные атаки заклинаниями игнорируют укрытие на половину и укрытие на три четверти.
* Вы узнаёте один заговор, требующий броска атаки. Выберите заговор из списка заклинаний барда, волшебника, друида, жреца, колдуна или чародея. Базовая характеристика для этого заговора зависит от выбранного класса: Харизма для барда, колдуна и чародея; Интеллект для волшебника; Мудрость для друида и жреца.
!!!__''Меткий стрелок''__
Вы овладели дальнобойным оружием и можете совершать выстрелы, которые другие считали невозможными. Вы получаете следующие преимущества:
* Совершение атаки в пределах максимальной дистанции не вызывает помеху к броску атаки дальнобойным оружием.
* Ваши атаки дальнобойным оружием игнорируют укрытие на половину и укрытие на три четверти.
* Перед совершением атаки дальнобойным оружием, которым вы владеете, вы можете принять штраф −5 к броску атаки. Если такая атака попадает, вы добавляете +10 к урону от этой атаки.
!!!__''Налётчик''__
"""Когда вы используете действие Рывок, вы можете бонусным действием совершить одну рукопашную атаку оружием или оттолкнуть другое существо.
Если вы перед совершением этого бонусного действия переместились минимум на 10 футов по прямой линии, вы либо получаете бонус +5 к броску урона этой атаки (если вы решили совершить рукопашную атаку и попали), либо толкаете цель на 10 футов от себя (если решили толкать и преуспели)."""
!!!__''Оборонительный дуэлянт''__
"""//Требование: Ловкость 13 или выше//
Если вы используете оружие со свойством «фехтовальное», которым владеете, и другое существо попадает по вам рукопашной атакой, вы можете для этой атаки реакцией добавить бонус мастерства к КД, что потенциально может привести к промаху атаки."""
!!!__''Одарённый''__
Вы получаете владение любой комбинацией из трёх навыков и инструментов на ваш выбор.
!!!__''Отличная память''__
Вы с невероятной точностью можете отслеживать время, направление и подробности. Вы получаете следующие преимущества:
* Увеличьте значение Интеллекта на 1, при максимуме 20.
* Вы всегда знаете, в какой стороне находится север.
* Вы всегда знаете, через сколько часов наступит следующий закат или восход.
* Вы можете с точностью вспомнить всё, что видели или слышали за последний месяц.
!!!__''Подвижный''__
Вы невероятно быстры и ловки. Вы получаете следующее преимущество:
* Ваша скорость увеличивается на 10 футов.
* Когда вы используете действие Рывок, труднопроходимая местность в этом ходу не замедляет ваше перемещение.
* Если вы совершаете рукопашную атак по существу, вы до конца этого хода не провоцируете от него атаки, вне зависимости от того, попадёте или нет.
!!!__''Посвящённый в магию''__
"""Выберите класс: бард, волшебник, друид, жрец, колдун или чародей. Вы узнаёте два заговора на свой выбор из списка заклинаний этого класса.
Кроме того, выберите одно заклинание 1 уровня из этого же списка. Вы узнаёте это заклинание и можете накладывать его на минимально возможном уровне. После использования заклинания вы должны закончить продолжительный отдых, прежде чем сможете снова использовать его этой чертой.
Базовая характеристика для этих заклинаний зависит от выбранного класса: Харизма для барда, колдуна и чародея; Интеллект для волшебника; Мудрость для друида и жреца."""
!!!__''Проныра''__
"""//Требование: Ловкость 13 или выше//
Вы знаете, как сливаться с тенями. Вы получаете следующие преимущества:"""
* Вы можете попытаться спрятаться даже если слабо заслонены от существа, от которого прячетесь.
* Если вы прячетесь от существа и промахиваетесь по нему атакой дальнобойным оружием, эта атака не выдаёт вашу позицию.
* Тусклый свет не причиняет помеху вашим проверкам Мудрости (Внимательность), полагающимся на зрение.
!!!__''Ритуальный заклинатель''__
"""//Требование: Интеллект или Мудрость 13 или выше//
Вы узнали несколько заклинаний, которые можете накладывать как ритуалы. Эти заклинания записаны в ритуальной книге, которую вы должны держать в руке во время их использования.
Когда вы выбираете эту черту, вы получаете ритуальную книгу, содержащую два заклинания 1 уровня на ваш выбор. Выберите один из классов: бард, волшебник, друид, жрец, колдун или чародей. Вы должны выбирать заклинания из списков для этого класса, но у этих заклинаний должно быть ключевое слово «ритуал». Выбранный класс также определяет базовую характеристику для этих заклинаний: Харизма для барда, колдуна и чародея; Интеллект для волшебника; Мудрость для друида и жреца.
Найдя заклинание, записанное в письменной форме, такой как магический свиток заклинания или книга заклинаний волшебника, вы можете скопировать его в свою ритуальную книгу. Это заклинание должно быть в списке заклинаний выбранного вами класса, уровень его не должен превышать половину вашего уровня (округлённую в большую сторону), и у него должно быть ключевое слово «ритуал». Процесс переписывания занимает по 2 часа за каждый уровень заклинания и стоит по 50 зм за каждый уровень. Это стоимость материальных компонентов, расходуемых в процессе экспериментов с заклинанием, а также особых чернил, которыми оно записывается."""
!!!__''Стихийный адепт''__
"""//Требование: Способность накладывать хотя бы одно заклинание//
Когда вы получаете эту черту, выберите один из видов урона: звук, кислота, огонь, холод или электричество.
Накладываемые вами заклинания игнорируют сопротивление к выбранному виду урона. Кроме того, когда вы определяете урон от наложенного вами заклинания, причиняющего урон этого вида, вы можете считать все выпавшие на костях «1» как «2».
Вы можете брать эту черту несколько раз. Каждый раз, когда вы это делаете, вы выбираете новый вид урона."""
!!!__''Стойкий''__
Вы стойкий и живучий, и получаете следующие преимущества:
* Увеличьте значение Телосложения на 1, при максимуме 20.
* Когда вы бросаете Кость Хитов для восстановления хитов, минимум равен удвоенному модификатору Телосложения (минимум 2).
!!!__''Страж''__
Вы овладели техникой, позволяющей пользоваться всеми брешами в обороне противника, и получаете следующие преимущества:
* Если вы попадаете по существу провоцированной атакой, скорость этого существа падает до 0 до конца текущего хода.
* Существа перед выходом из вашей досягаемости провоцируют от вас атаки, даже если совершают действие Отход.
* Если существо, находящееся в пределах 5 футов от вас, совершает атаку не по вам (и у цели нет этой черты), вы можете реакцией совершить атаку рукопашным оружием по атакующему.
!!!__''Убийца магов''__
Вы разработали техники, полезные в рукопашном сражении с заклинателями, и получаете следующие преимущества:
* Если существо в пределах 5 футов от вас использует заклинание, вы можете реакцией совершить атаку рукопашным оружием по этому существу.
* Когда вы причиняете урон существу, концентрирующемуся на заклинании, это существо совершает с помехой спасбросок для поддержания концентрации.
* Вы совершаете с преимуществом спасброски от заклинаний, наложенных существами, находящимися в пределах 5 футов от вас.
!!!__''Устойчивый''__
Выберите одну характеристику. Вы получаете следующие преимущества:
* Увеличьте значение выбранной характеристики на 1, при максимуме 20.
* Вы получаете владение спасбросками этой характеристики.
!!!__''Эксперт в арбалетах''__
Благодаря обширной практике с арбалетом вы получаете следующие преимущества:
* Вы игнорируете свойство «перезарядка» у арбалетов, которыми владеете.
* Нахождение в пределах 5 футов от враждебного существа не накладывает помеху к вашим броскам дальнобойной атаки.
* Когда вы используете действие Атака и атакуете одноручным оружием, вы можете бонусным действием атаковать заряженным ручным арбалетом, находящимся в руке.
!!!__''Языковед''__
Вы изучали языки и способы кодирования текстов, и получаете следующие преимущества:
* Увеличьте значение Интеллекта на 1, при максимуме 20.
* Вы узнаёте три языка на свой выбор.
* Вы можете писать шифрованные письма. Другие не могут расшифровать код, пока либо вы не научите их, либо они не преуспеют в проверке Интеллекта (Сл равна вашему значению Интеллекта + ваш бонус Мастерства), либо они не используют для расшифровки магию.
!!!''__Чистота тела__''
На 10 уровне ваше мастерство ци даёт вам иммунитет к болезням и яду.
"""Заклинание это единый магический эффект, магическая энергия, пропитывающая мультивселенную, сформированная в конкретное обличье. Накладывая заклинание, персонаж бережно хватает невидимые пряди сырой магии, пропитывающей мир, переплетает их особым узором, заставляет вибрировать, а потом отпускает, вызывая желаемый эффект — чаще всего всё это происходит за доли секунды.
Заклинания могут быть универсальными инструментами, оружием, и даже защитой. Они могут причинять и устранять урон, накладывать и снимать состояния (смотрите приложение А), вытягивать жизненную энергию и возвращать к жизни.
За ход истории мультивселенной было создано бессчётное множество заклинаний, и большая их часть давно забыта. Часть из них записана в ветхих книгах, лежащих в древних руинах, или заперта в сознании мёртвых богов. Они могут быть повторно изобретены персонажем, накопившим нужную энергию и мудрость для понимания."""
!!!__''Уровень заклинания''__
"""У каждого заклинания есть уровень, от 0 до 9. Уровень заклинания это примерный индикатор того, насколько оно сильно. У скромной (но всё равно впечатляющей) волшебной стрелы 1 уровень, а всемогущее исполнение желаний — 9 уровня. Заговоры — простые, но мощные заклинания, которые персонажи могут накладывать без особых усилий, имеют уровень 0. Чем выше уровень заклинания, тем больший уровень должен быть у заклинателя, собирающегося его использовать.
Уровень заклинания и уровень персонажа связаны, но не линейно. Обычно персонажу нужно иметь 17 уровень, чтобы накладывать заклинания 9 уровня."""
!!!__''Известные и подготовленные заклинания''__
"""Перед тем, как заклинатель сможет использовать заклинание, он должен зафиксировать его в сознании, или получить доступ к заклинанию, хранящемуся в магическом предмете. Представители некоторых классов, включая бардов и чародеев, обладают ограниченным набором заклинаний, который всегда находится в их сознании. То же самое справедливо для большинства практикующих магию чудовищ. Другие заклинатели, такие как жрецы и волшебники, подготавливают свои заклинания. У всех классов этот процесс выглядит по-разному; подробности смотрите в их описании.
В любом случае, количество заклинаний, которое заклинатель может удерживать в сознании, зависит от его собственного уровня."""
!!!__''Ячейки заклинаний''__
"""Вне зависимости от того, сколько заклинаний знает или подготовил заклинатель, он может использовать ограниченное их количество, после чего ему вновь понадобиться отдохнуть. Манипулирование тканью магии и пропускание через себя её энергии выматывает физически и умственно, особенно если заклинание высокоуровневое. Таким образом, в описании всех классов заклинателей (колдун — исключение) есть таблица, показывающая, сколько ячеек заклинаний того или иного уровня заклинаний у персонажа есть на данном уровне. Например, у волшебницы 3 уровня Умары есть четыре ячейки заклинаний 1 уровня и две ячейки 2 уровня.
Когда персонаж накладывает заклинание, он тратит ячейку с уровнем, не меньше, чем уровень заклинания, как будто бы «заполняя» ячейку заклинанием. Можете считать ячейку заклинания ёмкостью определённого размера — ячейка 1 уровня маленькая, а ячейки более высоких уровней большие.
Заклинание 1 уровня поместится в ячейку любого размера, но заклинание 9 уровня поместится только в ячейку 9 уровня. Таким образом, когда Умара накладывает волшебную стрелу, заклинание 1 уровня, она тратит одну из четырёх ячеек 1 уровня, и их останется только три.
Окончание продолжительного отдыха восстанавливает все потраченные ячейки заклинаний (смотрите правила отдыха в главе 8).
У некоторых персонажей и чудовищ есть особые умения, позволяющие использовать заклинания без использования ячеек. Примерами могут послужить монах, следующий Пути четырёх стихий, колдун, выбравший особые воззвания, и чудовище «исчадие преисподней» из Девяти Преисподних."""
<<<
!!!''Накладывание заклинаний в доспехе''
Из-за необходимости поддерживать концентрацию и совершать аккуратные движения, вы должны владеть доспехом, в котором собираетесь накладывать заклинание. В противном случае ваши движения слишком стеснены, и вы теряете возможность использовать заклинания.
<<<
!!!''Накладывание заклинания с увеличенным уровнем''
"""Если заклинатель накладывает заклинание, используя ячейку с уровнем, превышающим уровень заклинания, заклинание при этом считается имеющим увеличенный уровень. Например, если Умара накладывает волшебную стрелу, используя одну из своих ячеек 2 уровня, это будет магическая стрела 2 уровня. Фактически, заклинание усиливается, заполняя предоставленную ему ячейку.
Некоторые заклинания, такие как волшебная стрела и лечение ран, обладают усиленными эффектами, когда накладываются с увеличенным уровнем, что указано в их описании."""
!!!__''Заклятья''__
"""Заклятье это заклинание, которое накладывается очень легко, без использования ячеек заклинаний и подготовки. Постоянное использование закрепило их в сознании заклинателя и даровало магию, необходимую для постоянного воплощения их эффектов. Уровень заклятий всегда 0."""
!!!__''Ритуалы''__
"""У некоторых заклинаний есть специальное ключевое слово: «ритуал». Такое заклинание можно использовать по обычным правилам использования заклинаний, или же использовать его как ритуал. Ритуальная версия накладывается на 10 минут дольше, чем обычно. Она не использует ячейку заклинания, а значит, ритуальную версию заклинания нельзя использовать с увеличенным уровнем.
Для использования заклинания в качестве ритуала заклинатель должен иметь умение, позволяющее делать это. У жрецов и друидов, например, есть такое умение. Заклинатель должен при этом иметь это заклинание подготовленным или просто иметь его в списках известных заклинаний, если в ритуальном умении не сказано обратное, как, например, у волшебника."""
!!!__''Чувство опасности''__
"""На 2 уровне вы получаете обострённое ощущение происходящего вокруг, помогающее вам избегать опасности.
Вы совершаете с преимуществом спасброски Ловкости от эффектов, которые вы можете видеть, такие как заклинания и ловушки. Для использования этого преимущества вы не должны быть ослеплены, оглушены и не должны быть недееспособны."""
//Чудесный предмет, очень редкий//
Обычно эти краски находят в 1к4 баночках в красивом деревянном ящике вместе с кисточкой (весь набор весит 1 фунт). Эти краски позволяют рисовать трёхмерные предметы в двух измерениях. Краска сама стекает с кисти и формирует желаемый предмет, когда вы концентрируетесь на изображении.
Одной баночки достаточно, чтобы покрыть 1000 квадратных футов поверхности, что позволяет вам создавать неживые предметы и особенности местности — такие как двери, ямы, цветы, деревья, решётки, комнаты или оружие — не превышающие в объёме 10000 кубических футов. Разрисовать 100 квадратных футов можно за 10 минут.
Когда вы заканчиваете рисовать, предмет (или особенность местности) становится реальным, немагическим предметом. Нарисовав дверь на стене, вы создаёте настоящую дверь, которая ведёт на ту сторону стены. Нарисовав яму на полу, вы получаете настоящую яму, а её глубина учитывается при подсчёте объёма создаваемого предмета.
То, что создаётся этими красками, не должно стоить больше 25 зм. Если вы нарисуете что-то, что стоит больше (например, бриллиант или кучу золота), предмет будет выглядеть настоящим, но тщательное исследование даст понять, что он изготовлен из глины, кости или другого бросового материала.
Если вы нарисуете энергию, такую как огонь или электричество, в конце рисования энергия возникает, но тут же исчезает, не причиняя ничему урон.
//1 уровень, Преобразование, Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С, М (ветка омелы)
:''Длительность:'' Мгновенная
"""В вашей руке появляются до десяти ягод, наполненных магией. Любое существо может действием съесть одну ягоду. Это восстанавливает 1 хит, и ягода настолько питательна, что насыщает существо на весь день.
Ягоды теряют силу, если их не съесть через 24 часа после создания."""
//Заговор, Преобразование, Жрец//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 30 футов
:''Компоненты:'' В
:''Длительность:'' Вплоть до 1 минуты
Вы создаёте небольшое чудо, знак сверхъестественной силы. Вы создаёте один из следующих магических эффектов в пределах дистанции:
* Ваш голос в течение 1 минуты звучит в три раза громче.
* Вы заставляете пламя в течение 1 минуты мерцать, светить ярче или тусклее, или изменять цвет.
* Вы вызываете безвредную дрожь в полу в течение 1 минуты.
* Вы создаёте мгновенный звук, исходящий из выбранной вами точки в пределах дистанции, такой как раскат грома, крик ворона или зловещий шёпот.
* Вы мгновенно заставляете незапертое окно или дверь распахнуться или захлопнуться.
* Вы на 1 минуту изменяете внешний вид своих глаз.
Если вы накладываете это заклинание несколько раз, у вас может быть до трёх активных эффектов с длительностью в 1 минуту, и вы можете оканчивать такие эффекты действием.
Вы выросли в глуши, вдали от цивилизации и её благ. Вы видели миграцию стад, чей размер был больше леса, выживали при температуре, которую горожанам и не представить, и наслаждались таким уединением, что на многие мили вокруг вы были единственным мыслящим существом. Дикая природа в вашей крови, будь вы кочевником, исследователем, затворником, охотником-собирателем или даже мародёром. Даже в неизвестном месте вы найдёте что-то, что вам понятно.
;
:''Владение навыками:'' Атлетика, Выживание
:''Владение инструментами:'' Один вид музыкального инструмента
:''Языки:'' Один на ваш выбор
;
:''Снаряжение:'' Посох, капкан, трофей с убитого животного, комплект одежды путешественника, поясной кошель с 10 зм
!!!''Занятие''
Вы были в необычных местах и видели такое, что другие не могут даже вообразить. Подумайте, какие далёкие земли вы посетили, и как они на вас повлияли. Можете совершить бросок по прилагающейся таблице, чтобы определить, чем вы занимались в глуши, а можете сделать выбор самостоятельно.
<table>
<tr>
<th>к10</th>
<th>Занятие</th>
<th>к10</th>
<th>Занятие</th>
</tr>
<tr>
<td>1</td>
<td>Лесник</td>
<td>6</td>
<td>Охотник за головами</td>
</tr>
<tr>
<td>2</td>
<td>Траппер</td>
<td>7</td>
<td>Пилигрим</td>
</tr>
<tr>
<td>3</td>
<td>Поселенец</td>
<td>8</td>
<td>Кочевник</td>
</tr>
<tr>
<td>4</td>
<td>Проводник</td>
<td>9</td>
<td>Охотник-собиратель</td>
</tr>
<tr>
<td>5</td>
<td>Изгнанник</td>
<td>10</td>
<td>Мародёр</td>
</tr>
</table>
!!!''Умение: Странник''
Вы отлично запоминаете карты и местность, и всегда можете вспомнить общие характеристики местности, поселения, и прочие особенности в окрестностях. Кроме того, вы каждый день можете находить еду и пресную воду для себя и пяти других товарищей, при условии, что вокруг вас можно найти ягоды, дичь, воду и так далее.
!!!''Персонализация''
Часто считающиеся цивилизованными народами грубыми и неотёсанными, чужеземцы не прельщаются жизнью в городе. Узы племени, клана, семьи и положенное место в природе — вот самые важные привязанности чужеземцев.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Мной руководит жажда приключений, которая и увела меня из дома.</td>
</tr>
<tr>
<td>2</td>
<td>Я слежу за друзьями, как если бы они были слепыми котятами.</td>
</tr>
<tr>
<td>3</td>
<td>Однажды я пробежал 40 километров без остановки, чтобы предупредить свой клан о приближающейся орде орков. Если понадобится, я повторю это.</td>
</tr>
<tr>
<td>4</td>
<td>Для любой ситуации у меня есть уроки, извлечённые из наблюдений за природой.</td>
</tr>
<tr>
<td>5</td>
<td>Я не понимаю богатых и воспитанных. Деньги и хорошие манеры не спасут тебя от голодного волка.</td>
</tr>
<tr>
<td>6</td>
<td>Я всё время что-то беру в руки, рассеянно кручу и иногда ломаю.</td>
</tr>
<tr>
<td>7</td>
<td>Я гораздо комфортнее чувствую себя среди зверей, чем среди людей.</td>
</tr>
<tr>
<td>8</td>
<td>Меня действительно вырастили волки.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Перемены. Жизнь как времена года, постоянно меняется, и мы должны меняться вместе с ней. (Хаотичный)</td>
</tr>
<tr>
<td>2</td>
<td>Процветание. Каждый должен поступать так, чтобы всё племя было счастливо. (Добрый)</td>
</tr>
<tr>
<td>3</td>
<td>Честь. Если я обесчещу себя, я обесчещу весь свой клан. (Законный)</td>
</tr>
<tr>
<td>4</td>
<td>Мощь. Самый сильный имеет право приказывать. (Злой)</td>
</tr>
<tr>
<td>5</td>
<td>Природа. Мир природы гораздо важнее построек цивилизации. (Нейтральный)</td>
</tr>
<tr>
<td>6</td>
<td>Слава. Я должен завоёвывать славу в сражениях, для себя и своего клана. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Моя семья, клан или племя — самые важные вещи в моей жизни, даже когда они далеко от меня.</td>
</tr>
<tr>
<td>2</td>
<td>Осквернение дикой местности на моей родине я считаю личным оскорблением.</td>
</tr>
<tr>
<td>3</td>
<td>Я вымещу свой чудовищный гнев на злодеях, уничтоживших мои земли.</td>
</tr>
<tr>
<td>4</td>
<td>Я последний из своего племени, и должен сделать так, чтобы наши имена вошли в легенды.</td>
</tr>
<tr>
<td>5</td>
<td>Мне являются жуткие видения грядущей катастрофы, и я сделаю всё, чтобы её предотвратить.</td>
</tr>
<tr>
<td>6</td>
<td>Я должен создавать новых детей, которые будут поддерживать моё племя.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я слишком пристрастен к элю, вину и прочим спиртным напиткам.</td>
</tr>
<tr>
<td>2</td>
<td>В жизни на полную катушку нет места осторожности.</td>
</tr>
<tr>
<td>3</td>
<td>Я помню все полученные оскорбления и таю злобу на всех обидчиков.</td>
</tr>
<tr>
<td>4</td>
<td>Я с трудом доверяю представителям других рас, племён и сообществ.</td>
</tr>
<tr>
<td>5</td>
<td>На любые неурядицы я почти всегда отвечаю насилием.</td>
</tr>
<tr>
<td>6</td>
<td>Не думайте, что я буду спасать тех, кто не может сам о себе позаботиться. Сильные должны процветать, а слабые погибают, и это нормально.</td>
</tr>
</table>
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите эту шапку, вы можете неограниченно действием накладывать ей заклинание маскировка. Это заклинание оканчивается, если снять шапку.
//Чудесный предмет, необычный//
Если вы находитесь под водой и на вас надета эта шапка, вы можете действием произнести командное слово, после чего вокруг вашей головы возникнет воздушный пузырь. Это позволит вам свободно дышать под водой. Пузырь остаётся до тех пор, пока вы не произнесёте командное слово ещё раз, или не выберетесь из-под воды.
"""Вы хорошо знаете людей. Вы понимаете, что ими движет, и можете распознать их самые сокровенные желания спустя всего пару минут после начала разговора. Несколько наводящих вопросов, и вот вы уже читаете их словно книжки, написанные для детей. Это полезный талант, и вы вполне готовы использовать его себе на благо.
Вы знаете, что люди хотят, и вы даёте им это, или же обещаете дать. Чувство здравого смысла должно заставлять людей держаться подальше от тех вещей, которые слишком хорошо звучат, чтобы быть правдой. Но здравый смысл куда-то улетучивается, когда вы неподалёку. Бутылочка с розовой жидкостью всенепременно вылечит эту неблаговидную сыпь, а эта чудодейственная мазь (не более чем горсть жира, смешанного с серебряной пылью) без сомнения вернёт молодость и энергичность. Все эти чудеса, конечно, звучат неправдоподобно, но вы знаете, как преподнести их так, чтобы они казались крайне выгодным делом."""
;
:''Владение навыками:'' Ловкость рук, Обман
:''Владение инструментами:'' Набор для грима, набор для фальсификации
;
:''Снаряжение:'' Комплект отличной одежды, набор для грима, приспособление для жульничества на ваш выбор (десять запечатанных бутылей с подкрашенной жидкостью, набор шулерских костей, колода краплёных карт или кольцо с печатью какого-нибудь воображаемого герцога), поясной кошель с 15 зм.
!!!''Излюбленные махинации''
У каждого шарлатана есть свой излюбленный подход к совершению афер.
<table>
<tr>
<th>к6</th>
<th>Афера</th>
</tr>
<tr>
<td>1</td>
<td>Я мухлюю в азартных играх.</td>
</tr>
<tr>
<td>2</td>
<td>Я подделываю монеты или документы.</td>
</tr>
<tr>
<td>3</td>
<td>Я втираюсь к людям в доверие, чтобы потом играть на их слабостях и наживаться за их счёт.</td>
</tr>
<tr>
<td>4</td>
<td>Я меняю личности как перчатки.</td>
</tr>
<tr>
<td>5</td>
<td>Я занимаюсь уличным жульничеством с помощью ловкости рук.</td>
</tr>
<tr>
<td>6</td>
<td>Я убеждаю людей, что эта бесполезная куча хлама стоит их кровно заработанных денег.</td>
</tr>
</table>
!!!''Умение: Поддельная личность''
Вы создали себе вторую личность, включая необходимые документы, знакомства и маскировку, что позволяет вам перевоплощаться в этот образ. В дополнение к этому вы можете подделывать документы, включая официальные документы и личные письма, если ранее видели пример подобного документа или почерк, который пытаетесь скопировать.
!!!''Персонализация''
Шарлатаны — яркие персонажи, скрывающиеся за создаваемыми масками. Они являются отражениями того, что другие хотят видеть, во что другие верят, и как другие видят мир. Их истинную натуру может мучить совесть, постоянное недоверие, и им может угрожать враг.
<table>
<tr>
<th>к8</th>
<th>Черта характера</th>
</tr>
<tr>
<td>1</td>
<td>Я легко начинаю и разрываю романтические отношения, и постоянно нахожусь в поиске новой пассии.</td>
</tr>
<tr>
<td>2</td>
<td>У меня припасены шуточки на все случаи жизни, особенно на те, где юмор вообще неуместен.</td>
</tr>
<tr>
<td>3</td>
<td>Лесть — мой излюбленный способ добиться желаемого.</td>
</tr>
<tr>
<td>4</td>
<td>Я прирождённый игрок, и не могу удержаться от риска, если на кону стоит что-то стоящее.</td>
</tr>
<tr>
<td>5</td>
<td>Я постоянно вру, зачастую даже без малейшей на то причины.</td>
</tr>
<tr>
<td>6</td>
<td>Сарказм и оскорбления — мои излюбленные приёмы.</td>
</tr>
<tr>
<td>7</td>
<td>Я ношу с собой различные святые символы, и взываю к тем божествам, что лучше подходят для каждого конкретного случая.</td>
</tr>
<tr>
<td>8</td>
<td>Я тащу в карман всё, что плохо лежит и имеет хоть какую-то ценность.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Идеал</th>
</tr>
<tr>
<td>1</td>
<td>Независимость. У меня свободолюбивая натура — никто не смеет указывать мне, что делать. (Хаотичный)</td>
</tr>
<tr>
<td>2</td>
<td>Честность. Я никогда не выберу своей жертвой людей, которые находятся в бедственном положении. (Законный)</td>
</tr>
<tr>
<td>3</td>
<td>Милосердие. Я распределяю добытые деньги между людьми, которые в них действительно нуждаются. (Добрый)</td>
</tr>
<tr>
<td>4</td>
<td>Креативность. Я никогда не иду проторённой дорожкой. (Хаотичный)</td>
</tr>
<tr>
<td>5</td>
<td>Дружба. Материальные блага приходят и уходят, а друзья остаются. (Добрый)</td>
</tr>
<tr>
<td>6</td>
<td>Стремление. Я собираюсь стать кем-то значимым в этой жизни. (Любой)</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Привязанность</th>
</tr>
<tr>
<td>1</td>
<td>Я перешёл дорожку не тому человеку, и должен постоянно заботиться о том, чтобы мне и моим близким не навредили.</td>
</tr>
<tr>
<td>2</td>
<td>Я всем обязан своему наставнику — ужасному человеку, который, вполне вероятно, гниёт сейчас в какой-нибудь тюрьме.</td>
</tr>
<tr>
<td>3</td>
<td>Где-то живёт мой ребёнок, который не знает обо мне. И для него я пытаюсь сделать этот мир лучше.</td>
</tr>
<tr>
<td>4</td>
<td>Я отпрыск благородного рода, и когда-нибудь заберу свои земли и титул у тех, кто их украл.</td>
</tr>
<tr>
<td>5</td>
<td>Влиятельный враг убил дорогого мне человека. И однажды я отомщу.</td>
</tr>
<tr>
<td>6</td>
<td>Я пустил по миру человека, который того не заслуживал. Я стремлюсь искупить свой проступок, но скорее всего никогда себя не прощу.</td>
</tr>
</table>
<table>
<tr>
<th>к6</th>
<th>Слабость</th>
</tr>
<tr>
<td>1</td>
<td>Я не могу устоять перед смазливой мордашкой.</td>
</tr>
<tr>
<td>2</td>
<td>Я постоянно в долгах. Я трачу свои нечестно нажитые деньги быстрее, чем их добываю.</td>
</tr>
<tr>
<td>3</td>
<td>Я убеждён в том, что никто не сможет одурачить меня так, как я одурачиваю других.</td>
</tr>
<tr>
<td>4</td>
<td>Я слишком жаден до золота. И не могу противиться риску, если в этом замешаны деньги.</td>
</tr>
<tr>
<td>5</td>
<td>Я не могу устоять и не облапошить людей, стоящих гораздо выше, чем я.</td>
</tr>
<tr>
<td>6</td>
<td>Я ненавижу себя за это, но я сбегу, чтобы спасти свою собственную шкуру, если вдруг запахнет жареным.</td>
</tr>
</table>
//2 уровень, Преобразование, Друид/Следопыт//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 150 футов
:''Компоненты:'' В, С, М (семь острых шипов или семь заострённых веточек)
:''Длительность:'' Концентрация, вплоть до 10 минут
"""Пол в пределах 20-футового радиуса с центром на точке в пределах дистанции покрывается шипами и колючками. Эта местность становится труднопроходимой на время действия заклинания. Когда существо перемещением входит в эту область или идёт по ней, оно получает колющий урон 2к4 за каждые 5 пройдённых футов.
Трансформация поверхности проходит практически незаметно, и шипы хорошо замаскированы. Существа, которые не видели эту местность в момент накладывания заклинания, должны совершить проверку Мудрости (Внимательность) против Сл ваших заклинаний, чтобы распознать местность опасной, перед тем как в неё войти."""
!!!''__Школа Воплощения__''
Вы сосредоточили свои исследования на магии, которая создаёт могущественные стихийные эффекты, такие как ледяной холод, жгучее пламя, раскатистый гром, трещащие молнии и едкая кислота. Некоторые боевые маги находят своё призвание в армии, идя на службу в артиллерию и уничтожая вражеские армии издалека. Другие используют свои впечатляющие возможности, чтобы защитить слабых. Остальные же ищут свою собственную выгоду на поприще бандита, искателя приключений или начинающего тирана.
!!!''Мастер Воплощения''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Воплощения в свою книгу заклинаний, уменьшаются вдвое.
!!!''Построение заклинаний''
Начиная со 2 уровня, когда вы накладываете разрушительное заклинание, то можете создать относительно безопасные участки внутри зоны поражения, которые оно не затрагивает. При сотворении заклинания школы Воплощения, воздействующего на других существ, которых вы видите, вы можете выбрать количество существ, равное 1 + уровень заклинания. Выбранные существа автоматически преуспевают в спасбросках от этого заклинания и не получают урона, если по описанию должны получить половину урона от заклинания при успешном спасении.
!!!''Мощный заговор''
С 6 уровня ваши причиняющие урон заговоры воздействуют даже на тех существ, которые избегают основного эффекта. Если существо преуспевает в спасброске от вашего заговора, оно получает половину урона от него (если есть), но не получает дополнительных эффектов от него.
!!!''Усиленное воплощение''
Начиная с 10 уровня, при броске урона от заклинания школы Воплощения, сотворённого вами, вы добавляете к одному броску урона свой модификатор Интеллекта.
!!!''Перегрузка''
"""Начиная с 14 уровня вы можете увеличить силу своих простейших заклинаний. Когда вы накладываете причиняющее урон заклинание волшебника 5 уровня или ниже, вы можете причинить им максимальный урон. Это умение не распространяется на заговоры.
Без вреда для себя вы можете использовать это умение один раз. Если вы повторно используете это умение до окончания продолжительного отдыха, то получаете урон некротической энергией 2к12 за каждый уровень заклинания сразу после его сотворения. Каждый следующий раз, при использовании данного умения до окончания продолжительного отдыха урон некротической энергией увеличивается на 1к12. Этот урон игнорирует сопротивление и иммунитет."""
!!!''__Школа Вызова__''
Являясь вызывателем, вы предпочитаете заклинания, которые создают предметы и существ из воздуха. Вы можете силой мысли вызвать клубящиеся облака убийственного тумана или призвать откуда угодно существ для битвы на вашей стороне. С ростом мастерства вы узнаёте заклинания перемещения и сможете в мгновение ока телепортироваться на огромные расстояния, и даже на другие планы существования.
!!!''Мастер созидания''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Вызова в свою книгу заклинаний, уменьшаются вдвое.
!!!''Малый вызов''
"""Начиная со 2 уровня, когда вы выбираете эту школу, вы можете действием создать неодушевлённый предмет в своей руке или на земле в свободном пространстве, которое вы можете видеть, и которое расположено в пределах 10 футов от вас. Этот предмет не должен превышать в длину 1 фут (30 сантиметров) и весить более 10 фунтов, и его форма должна быть как у немагического предмета, который вы уже видели. Видно, что предмет магический, и он излучает тусклый свет в пределах 5 футов.
Предмет исчезает через 1 час, когда вы используете это умение вновь, или когда он получает любой урон."""
!!!''Безопасное перемещение''
Начиная с 6 уровня, вы можете действием телепортироваться на 30 футов в свободное пространство, которое можете видеть. В качестве альтернативы, вы можете выбрать пространство в пределах этого диапазона, занятое существом Маленького или Среднего размера. Если это существо согласно, вы оба телепортируетесь, меняясь местами.
Использовав это умение один раз, вы не можете использовать его вновь до окончания продолжительного отдыха или пока не сотворите заклинание школы Вызова 1 уровня или выше.
!!!''Фокусированный вызов''
Начиная с 10 уровня, когда вы концентрируетесь на заклинании школы Вызова, ваша концентрация не может быть нарушена в результате получения урона.
!!!''Надёжный призыв''
Начиная с 14 уровня, все призванные или созданные вами заклинанием школы Вызова существа имеют 30 временных хитов.
!!!''__Школа Иллюзии__''
Вы обучаетесь магии, которая обманывает чувства, затмевает разум и дурачит даже самых мудрых. Ваша магия утончённа, но иллюзии, сотканные вашим острым умом, заставляют казаться реальным невозможное. Некоторые иллюзионисты — включая многих волшебников гномов — являются трюкачами, использующими свои заклинания в представлениях. Другие, более зловещие мастера обмана, используют свои иллюзии, чтобы пугать и обманывать других для собственной выгоды.
!!!''Мастер иллюзий''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Иллюзии в свою книгу заклинаний, уменьшаются вдвое.
!!!''Улучшенная малая иллюзия''
"""Когда вы выбираете данную школу на 2 уровне, вы узнаёте заговор малая иллюзия. Если вам уже известен этот заговор, то вы изучаете любой другой заговор волшебника на свой выбор. Этот заговор не учитывается в общем количестве известных вам заговоров.
При сотворении малой иллюзии вы можете использовать эффекты звука и изображения вместе, единым заклинанием."""
!!!''Пластичные иллюзии''
Начиная с 6 уровня, если вы сотворили заклинание школы Иллюзии длительностью как минимум 1 минута, вы можете действием изменить характер этой иллюзии (используя обычные ограничения для этой иллюзии), при условии, что можете видеть эту иллюзию.
!!!''Собственная иллюзорность''
"""Начиная с 10 уровня вы можете инстинктивно создать иллюзорную копию самого себя в ответ на внезапную опасность. Если существо совершает по вам бросок атаки, вы можете реакцией создать иллюзорную копию между атакующим и собой. Атака автоматически промахивается по вам и уничтожает иллюзию.
После использования данного умения вы должны завершить короткий или продолжительный отдых, прежде чем сможете воспользоваться им вновь."""
!!!''Иллюзорная реальность''
"""К 14 уровню вы постигли секреты плетения теневых заклятий, что делает ваши иллюзии наполовину реальными. Когда вы накладываете заклинание Иллюзии 1 уровня или выше, вы можете выбрать любой неодушевлённый и немагический объект, являющийся частью данной иллюзии, чтобы сделать его реальным. Вы можете сделать это в свой ход бонусным действием, пока действует заклинание. Объект становится реальным на 1 минуту. Например, вы можете создать иллюзию моста через разлом и держать его реальным достаточно долго, чтобы ваши союзники могли по нему перебраться.
Объект не может причинять урон или непосредственно ранить кого-либо."""
!!!__''Школа Некромантии''__
"""Школа Некромантии изучает вселенские силы жизни, смерти и не-жизни. Если вы сосредоточите свои изыскания в этом направлении, то узнаете, как манипулировать той энергией, которая питает все живые организмы. По мере увеличения ваших знаний вы научитесь вытягивать жизненные силы существ, разрушая своей магией их тела, трансформируя их в магическую энергию, которой можете манипулировать.
Большинство обычных людей видит в некромантах угрозу или даже вселенское зло, благодаря их тесной связи со смертью. Но не все некроманты злые. Просто силы, которыми они управляют, являются табу для общества."""
!!!''Мастер Некромантии''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Некромантии в свою книгу заклинаний, уменьшаются вдвое.
!!!''Мрачная жатва''
На 2 уровне вы получаете возможность собирать жизненные силы существ, которых вы убиваете своими заклинаниями. Один раз за ход, когда вы убиваете одно или несколько существ заклинанием 1 и более высокого уровня, вы восстанавливаете хиты в количестве, равном удвоенному уровню этого заклинания, или утроенному, если заклинание принадлежало школе Некромантии. Вы не получаете это преимущество, убивая конструктов и нежить.
!!!''Неживые рабы''
"""На 6 уровне вы добавляете заклинание восставший труп в свою книгу заклинаний, если его в ней ещё нет. Когда вы творите восставший труп, вы можете сделать его целью один дополнительный труп или кучу костей, создавая зомби или скелета соответственно.
Каждый раз, когда вы создаёте нежить, используя заклинание школы Некромантии, она получает дополнительные преимущества:"""
* Максимум хитов создаваемой нежити увеличивается на значение, равное вашему уровню волшебника.
* Создаваемые существа добавляют ваш бонус мастерства к броскам урона оружием.
!!!''Единение с не-жизнью''
На 10 уровне вы получаете сопротивление к урону некротической энергией и максимум ваших хитов уже не может уменьшаться. Вы провели так много времени в контакте с нежитью и оживляющей их энергией, что научились преодолевать их самые опасные побочные эффекты.
!!!''Управление нежитью''
"""Начиная с 14 уровня вы можете магией подчинить себе нежить, даже если она создана другим волшебником. Вы можете действием выбрать одну нежить в пределах 60 футов от себя, которую можете видеть. Это существо должно совершить спасбросок Харизмы против Сл вашего заклинания волшебника. Если он успешен, вы не можете больше использовать это умение на данной цели. Если он провален, цель становится дружественной по отношению к вам и подчиняется вашим командам, пока вы не используете это умение снова.
Разумная нежить управляется подобным способом куда как труднее. Если у цели Интеллект 8 или выше, она совершает спасбросок с преимуществом. Если она проваливает спасбросок и имеет Интеллект 12 или выше, она может повторять спасбросок в конце каждого часа, пока не преуспеет и не высвободится."""
!!!__''Школа Ограждения''__
"""Школа Ограждения делает упор на магию блокировки, изгнания и защиты. Противники этой школы говорят, что её традиции в отрицании, а не в положительном утверждении. Однако вы понимаете, что прекращение действия ужасных эффектов, защита слабых и воздаяние злу может быть чем угодно, но только не философской пустотой. Это гордое и уважаемое призвание.
Называемые оградителями, члены это школы становятся востребованными, когда злобные духи нуждаются в экзорцизме, когда важные места должны быть защищены от магического шпионажа, и когда порталы на другие планы бытия должны быть закрыты."""
!!!''Мастер Ограждения''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Ограждения в свою книгу заклинаний, уменьшаются вдвое.
!!!''Магическая защита''
"""Начиная со 2 уровня вы можете плести вокруг себя магию для защиты. Когда вы накладываете заклинание школы Ограждения 1 уровня или выше, вы можете одновременно с этим использовать прядь магии для создания магической защиты, существующей до окончания продолжительного отдыха. Защита имеет хиты, равные вашему удвоенному уровню волшебника + модификатор Интеллекта. Когда вы получаете урон, его вместо вас получает защита. Если урон опускает хиты защиты до 0, то оставшийся после этого урон получаете вы.
Когда у защиты остаётся 0 хитов, она не может поглощать урон, но её магия остаётся. Если вы накладываете заклинание школы Ограждения 1 уровня или выше, защита восстанавливает количество хитов, равное удвоенному уровню заклинания.
Единожды создав защиту, вы не можете создать её вновь, пока не завершите продолжительный отдых."""
!!!''Проекция защиты''
Начиная с 6 уровня, когда видимое вами существо, находящееся в пределах 30 футов от вас, получает урон, вы можете реакцией поглотить этот урон вашей Магической Защитой. Если урон опускает хиты защиты до 0, то защищаемое существо получает весь оставшийся урон.
!!!''Улучшенное ограждение''
Начиная с 10 уровня, когда вы накладываете заклинание школы Ограждения, которое требует совершить проверку характеристики частью творимого заклинания (как в случае контрзаклинания и рассеивания магии), вы добавляете к этой проверке бонус мастерства.
!!!''Сопротивление заклинаниям''
Начиная с 14 уровня вы совершаете спасброски от заклинаний с преимуществом.
Кроме того, вы получаете сопротивление к урону от заклинаний.
!!!__''Школа Очарования''__
В качестве адепта школы Очарования, вы знаете, как с помощью магии заворожить и обмануть других существ и чудовищ. Некоторые обаятели являются миротворцами, подчиняющими враждебных существ, чтобы те сложили оружие или чтобы жестокие проявили милосердие. Другие чародеи являются тиранами, завораживающими не желающих идти к ним на службу. Существует также множество других обаятелей, представляющих нечто среднее.
!!!''Мастер Очарования''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Очарования в свою книгу заклинаний, уменьшаются вдвое.
!!!''Гипнотический взгляд''
"""Начиная со 2 уровня ваши тихие слова и завораживающий взгляд волшебным образом могут одурманить другое существо. Выберите действием одно видимое вами существо в пределах 5 футов от себя. Если цель может видеть или слышать вас, она должна преуспеть в спасброске Мудрости против Сл вашего заклинания волшебника, иначе она будет очарована вами до конца вашего следующего хода. Скорость очарованного существа падает до 0, оно выводится из строя и выглядит потрясённым.
В следующие ходы вы можете действием поддерживать этот эффект, продлевая его до конца своего следующего хода. Однако эффект прекращается, если вы удалитесь от существа более чем на 5 футов, если существо не может больше ни видеть, ни слышать вас, или если существо получает урон.
После окончания эффекта, или если существо успешно совершило спасбросок от него, вы не можете использовать данное умение против этого существа, пока не завершите продолжительный отдых."""
!!!''Инстинктивное очарование''
"""Начиная с 6 уровня, когда существо, которое вы видите, и которое находится в пределах 30 футов от вас, совершает бросок атаки по вам, вы можете реакцией перенаправить атаку, при условии, что есть другое существо, находящееся в пределах досягаемости этой атаки. Атакующий должен совершить спасбросок Мудрости против Сл вашего заклинания волшебника. При провале атакующий должен выбрать в качестве цели ближайшее существо (кроме вас и себя). Если есть несколько потенциальных целей, атакующий сам выбирает из них цель. В случае успеха вы не можете использовать данное умение против атакующего, пока не завершите продолжительный отдых.
Вы обязаны решить, будете ли использовать это умение, до того как будет известно, попала атака или промахнулась. Существа, которых нельзя очаровать, обладают иммунитетом к этому эффекту."""
!!!''Усиленное очарование''
Начиная с 10 уровня, при накладывании вами заклинания школы Очарования 1 уровня или выше, которое нацеливается только на одно существо, вы можете сделать целью второе существо.
!!!''Ложные воспоминания''
"""На 14 уровне вы получаете способность заставить существо забыть о магическом воздействии, которое вы на него оказали. При сотворении заклинания школы Очарования, которое очаровывает одно или несколько существ, вы можете изменить восприятие и воспоминания одного из них так, что оно забудет о том, что было очаровано.
Кроме того, перед тем как заклинание развеется, вы можете действием попытаться заставить выбранное существо забыть некоторые моменты его пребывания в зачарованном состоянии. Существо должно преуспеть в спасброске Интеллекта против Сл вашего заклинания волшебника, или оно потеряет воспоминания за промежуток времени, измеряемый в часах и равный 1 + ваш модификатор Харизмы (минимум 1). Вы можете заставить существо забыть меньшее количество времени. Количество забытого времени не может превышать продолжительность самого заклинания."""
!!!__''Школа Преобразования''__
"""Вы были обучены заклинаниям, изменяющим энергию и материю. Для вас мир не является чем-то постоянным, напротив, он в высшей степени изменчив, и вы наслаждаетесь своей ролью агента перемен. Вы умеете манипулировать сырьём создания и можете изменять как физическую форму, так и ментальные качества. Ваша магия даёт вам возможность стать кузнецом в кузне реальности.
Некоторые преобразователи являются проказниками, превращающими людей в жаб и преобразующими медь в серебро ради забавы и случайной наживы. Другие проводят свои магические исследования со всей возможной серьёзностью, ища силу богов, чтобы создавать и разрушать миры."""
!!!''Мастер Преобразования''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Преобразования в свою книгу заклинаний, уменьшаются вдвое.
!!!''Малая алхимия''
Начиная со 2 уровня вы можете временно изменять физические свойства одного немагического предмета, превращая структуру вещества из одной в другую. Вы совершаете специальную алхимическую процедуру на одном предмете, состоящем полностью из дерева, камня (но не драгоценного камня), железа, меди или серебра, превращая его в один из этих материалов. За каждые 10 минут вы можете преобразовать до 1 кубического фута материала. Через 1 час, или когда вы теряете концентрацию (как если бы вы концентрировались на заклинании), материал возвратится в своё первоначальное состояние.
!!!''Камень преобразования''
"""Начиная с 6 уровня вы можете потратить 8 часов для создания камня преобразования, хранящего магию преобразования. Вы можете извлечь выгоду из камня самостоятельно, или передать его другому существу. Существо получает выгоду по вашему выбору до тех пор, пока камень находится в его распоряжении. Когда вы создаёте камень, выберите создаваемое им преимущество из следующего списка:"""
* Тёмное зрение в пределах 60 футов, как описано в главе 8
* Увеличение скорости на 10 футов, пока существо не перегружено
* Владение спасбросками Телосложения
* Сопротивление звуку, кислоте, огню, холоду или электричеству (совершите выбор при сотворении камня)
Каждый раз, когда вы накладываете заклинание преобразования 1 и выше уровней, вы можете изменить эффект вашего камня, если он находится у вас.
Если вы создаёте новый камень преобразования, предыдущий перестаёт работать.
!!!''Перевёртыш''
"""На 10 уровне вы добавляете заклинание превращение в свою книгу заклинаний, если его ещё нет там. Вы можете накладывать превращение, не тратя ячейку заклинаний. Когда вы так поступаете, вы можете выбрать в качестве цели только себя и превратиться можете в зверя, ПО которого не больше 1.
Активировав превращение подобным путём один раз, вы не можете делать это ещё раз до завершения короткого или продолжительного отдыха, хотя вы можете накладывать это заклинание обычным способом, за ячейки заклинаний."""
!!!''Гений преобразования''
Начиная с 14 уровня, вы можете действием потребить запас магии, хранящийся в вашем камне преобразования. Когда вы так поступаете, выберите один из следующих эффектов. Ваш камень преобразования уничтожается, и не может быть использован вновь, пока вы не завершите продолжительный отдых.
;
:''Большая трансформация.'' Вы можете преобразовать один немагический предмет объёмом не более 5 кубических футов в другой немагический предмет схожего размера и массы, и равного или меньшего объёма. Вы должны 10 минут держать предмет в руках для его трансформации.
:''Возвращение к жизни.'' Вы накладываете заклинание оживление на существо, которого коснулись своим камнем преобразования, не тратя ячейку заклинания и даже без необходимости иметь это заклинание в книге заклинаний.
:''Вернуть молодость.'' Вы касаетесь камнем преобразования согласное существо, и видимый возраст этого существа уменьшается на 3к10 лет до минимума в 13 лет. Этот эффект не увеличивает его срок жизни.
:''Панацея.'' Вы снимаете все эффекты проклятий, болезней и ядов с существа, которого касаетесь камнем преобразования. Кроме того, это существо восстанавливает все хиты.
!!!''__Школа Прорицания__''
Советник-прорицатель востребован у знати и простолюдинов, так как все хотят знать о прошлом, настоящем и будущем. Являясь прорицателем, вы стремитесь снять покровы пространства, времени и сознания, чтобы видеть более ясно. Вы работаете над освоением заклинаний проницательности, удалённого наблюдения, сверхъестественного знания и предвидения.
!!!''Мастер Прорицания''
Когда вы выбираете эту школу на 2 уровне, золото и время, которое вы тратите на копирование заклинания Прорицания в свою книгу заклинаний, уменьшаются вдвое.
!!!''Знамение''
"""Начиная со 2 уровня, когда вы выбираете эту школу, в вашем сознании возникают проблески будущего. Когда вы заканчиваете продолжительный отдых, сделайте два броска к20 и запишите их результаты. Вы можете заменить любой бросок атаки, спасбросок, или проверку характеристики, сделанную вами или существом, которое вы можете видеть, одним из этих бросков предсказания. Вы должны сделать выбор о том, что так поступаете, до броска, и вы можете заменить значение броска подобным путём только один раз за ход.
Каждый бросок предсказания может быть использован только один раз. Когда вы заканчиваете продолжительный отдых, вы теряете все неиспользованные броски предсказания."""
!!!''Эксперт прорицания''
Начиная с 6 уровня, вы так легко творите заклинания школы Прорицания, что расходуете лишь малую часть своих сил. Когда вы накладываете заклинание школы Прорицания 2 уровня или выше, используя ячейку заклинаний, вы восстанавливаете одну уже израсходованную ячейку заклинаний. Восстанавливаемая ячейка должна быть ниже уровнем, чем заклинание, которое вы накладываете, и не может быть выше 5 уровня.
!!!''Третий глаз''
Начиная с 10 уровня вы можете действием увеличить силу восприятия. Когда вы так поступаете, выберите одно преимущество, которое будет длиться, пока вы не станете недееспособны или пока вы не совершите короткий или продолжительный отдых. Вы не можете использовать это умение повторно, пока не завершите отдых.
;
:''Большое понимание.'' Вы можете читать на любых языках.
:''Видеть невидимое.'' Вы можете видеть находящихся на линии обзора невидимых существ и предметы в пределах 10 футов.
:''Тёмное зрение.'' Вы получаете тёмное зрение в пределах 60 футов, как описано в главе 8.
:''Эфирный взгляд.'' Ваше зрение простирается на Эфирный План в пределах 60 футов.
!!!''Великое знамение''
Начиная с 14 уровня видения в ваших грёзах усиливаются и рисуют более точную картину того, что грядёт. Вы совершаете три броска к20 для вашего умения Знамение вместо двух.
//Чудесный предмет, очень редкий (требуется настройка)//
Этот сверкающий шлем украшен 1к10 бриллиантами, 2к10 рубинами, 3к10 огненными опалами и 4к10 опалами. Любой камень, извлечённый из шлема, рассыпается в пыль. Если все камни изымут или уничтожат, шлем теряет свою магию.
Вы получает следующие преимущества, пока носите его:
* Вы можете действием наложить одно из следующих заклинаний (Сл спасброска 18), используя один из камней шлема определённого вида в качестве компонента: дневной свет (опал), огненная стена (рубин), огненный шар (огненный опал) или радужные брызги (бриллиант). Соответствующий драгоценный камень уничтожается, когда накладывается заклинание, и исчезает со шлема.
* Пока у шлема есть хотя бы один бриллиант, он испускает тусклый свет в радиусе 30 футов, если в пределах этой области есть хотя бы одна нежить. Нежить, начинающая ход в этой области, получает урон излучением 1к6.
//Чудесный предмет, необычный//
Пока вы носите этот шлем, вы можете неограниченно действием накладывать заклинание понимание языков.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите этот шлем, вы можете действием накладывать им заклинание обнаружение мыслей (Сл спасброска 13). Пока вы поддерживаете концентрацию на этом заклинании, вы можете бонусным действием отправить телепатическое послание существу, на котором вы сосредоточились. Оно может ответить бонусным действием, если вы продолжите сосредотачиваться на нём.
Сосредоточившись на существе обнаружением мыслей, вы можете действием наложить шлемом на него заклинание внушение (Сл спасброска 13). Вы не можете использовать свойство внушения повторно до следующего рассвета.
//Чудесный предмет, редкий (требуется настройка)//
У этого шлема есть 3 заряда. Если вы его носите, вы можете действием потратить 1 заряд, чтобы наложить им заклинание телепортация. Шлем ежедневно восстанавливает 1к3 заряда на рассвете.
//1 уровень, Ограждение, Волшебник/Чародей//
:''Время накладывания:'' 1 реакция, совершаемая, когда по вам попадает атака или вы становитесь целью волшебной стрелы
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' 1 раунд
Невидимый барьер из магической силы появляется, защищая вас. Вы получаете до начала своего следующего хода бонус +5 к КД, в том числе и против вызвавшей срабатывание атаки, и вы не получаете урон от волшебной стрелы.
//1 уровень, Ограждение, Жрец/Паладин//
:''Время накладывания:'' 1 бонусное действие
:''Дистанция:'' 60 футов
:''Компоненты:'' В, С, М (небольшой пергамент со святыми письменами)
:''Длительность:'' Концентрация, вплоть до 10 минут
Мерцающее поле появляется, окружая выбранное вами существо в пределах дистанции, даруя ему на время длительности бонус +2 к КД.
//Доспех (щит), очень редкий (требуется настройка)//
Пока вы держите этот щит, вы совершаете с преимуществом спасброски от заклинаний и других магических эффектов, и броски атаки заклинаниями совершаются по вам с помехой.
//Доспех (щит), редкий (требуется настройка)//
Вы получаете сопротивление к урону от дальнобойных атак оружием, пока держите этот щит.
//''Проклятье.''// Этот щит проклят. Если вы настраиваетесь на него, вы становитесь проклятым, пока не станете целью заклинания снятие проклятья или другой подобной магии. Простое снятие щита не оканчивает проклятье на вас. Каждый раз, когда по цели, находящейся в пределах 10 футов от вас, совершается дальнобойная атака оружием, проклятье заставляет стать целью вас.
//Доспех (щит), необычный//
Пока вы держите этот щит, вы совершаете с преимуществом проверки инициативы и проверки Мудрости (Внимательность). Сам щит украшен символом глаза.
//Доспех (щит), необычный (+1), редкий (+2) или очень редкий (+3)//
Пока вы держите этот щит, вы получаете бонус к КД зависящий от редкости щита. Этот бонус идёт в дополнение к обычному бонусу щита к КД.
//4 уровень, Вызов, Волшебник//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 90 футов
:''Компоненты:'' В, С, М (кусочек щупальца гигантского осьминога или гигантского кальмара)
:''Длительность:'' Концентрация, вплоть до 1 минуты
"""Чёрные извивающиеся щупальца заполняют квадрат на полу с длиной стороны 20 футов, который вы видите в пределах дистанции. Пока заклинание активно, эти щупальца делают местность труднопроходимой.
Когда существо впервые за ход входит в область заклинания или начинает там ход, оно должно преуспеть в спасброске Ловкости, иначе получит дробящий урон 3к6 и станет опутанным щупальцами до окончания заклинания. Существо, начинающее ход в этой области, уже опутанное щупальцами, получает дробящий урон 3к6.
Опутанное щупальцами существо может действием совершить проверку Силы или Ловкости (на свой выбор) против Сл ваших заклинаний. В случае успеха оно высвобождается."""
//Заговор, Воплощение, Волшебник/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Молния спрыгивает с вашей руки и ударяет существо, которого вы пытались коснуться. Совершите по цели рукопашную атаку заклинанием. Вы совершаете бросок атаки с преимуществом, если цель носит доспех из металла. При попадании цель получает урон электричеством 1к8, и до начала своего следующего хода не может совершать реакции.
Урон заклинания увеличивается на 1к8, когда вы достигаете 5 уровня (2к8), 11 уровня (3к8) и 17 уровня (4к8).
У хороших приключений есть несколько общих вещей.
!!!''Реальная угроза''
Приключению необходима угроза, достойная внимания героев. Угрозой могут стать злодей или чудовище, злодей с прислужниками, группа чудовищ или злая организация. Какой бы природы ни были антагонисты, у них должны быть цели, которые герои могут раскрыть и сорвать.
!!!''Клише с хитроумными поворотами''
Построение приключения вокруг драконов, орков и безумных магов в башнях может показаться стереотипным, но как бы там ни было, это основы фэнтези повествования. Приключение, начинающееся в таверне, тоже может показаться банальным, но это один из элементов D&D. Клишированные элементы истории — это хорошо, если вы и ваши игроки иногда неожиданно закручиваете их. Например, таинственная личность, которая знакомит искателей приключений с заданием от имени короля, может оказаться замаскированным королём. Сумасшедший маг в башне может оказаться иллюзией, созданной бандой жадных воров-гномов для охраны своей добычи.
!!!''Четкий фокус на настоящем времени''
Приключение рассказывает о том, что происходит здесь и сейчас. Предыстория нужна, чтобы оживить повествование, а искатели приключений смогли раскрыть подробности о прошлом. Но в целом, лучше сделать историю мира наглядной. Вместо того чтобы копаться в прошлом, лучше сосредоточиться на описании текущей ситуации, объяснить игрокам, кто здесь плохие парни, и как их персонажи были втянуты в эти события.
!!!''Герои, имеющие значение''
Действия и решения искателей приключений должны иметь значение. Каким бы ни было ваше приключение, в нём должны быть предусмотрены альтернативные концовки. Если вы этого не сделаете, игроки могут почувствовать, что их посадили в поезд, у которого только один пункт назначения, вне зависимости от того, как сильно они пытаются изменить его. Например, если в мире появляется крупный злодей, то необходимо допустить возможность, что герои могут победить его.
!!!''Кое-что для всех видов игроков''
Как уже говорилось, игроки приходят на игру с различными ожиданиями. Приключение должно учитывать различных игроков и персонажей в вашей группе, вписывая их в историю настолько эффективно, насколько возможно.
В качестве отправной точки, рассмотрите своё приключение с точки зрения баланса трёх основных видов деятельности в игре: исследования, социального взаимодействия и сражения. Если ваше приключение включает в себя все три типа, то, скорее всего, оно будет интересно всем видам игроков.
Ваше приключение не должно быть рассчитано на каких-то абстрактных игроков — оно должно быть только для тех, кто сидят с вами за столом. Если за вашим столом нет игроков, которые любят только сражения, то вам не стоит создавать много боевых сцен.
!!!''Сюрпризы''
Ищите возможности удивлять и радовать своих игроков. Например, исследование разрушенного замка на холме может привести к открытию скрытой под ним драконьей гробницы. Поход через пустыню может привести к открытию башни, которая появляется только по ночам в полнолуние. Игроки запоминают такие места.
Перебор с сюрпризами может обескуражить игроков, а вот добавляемые время от времени неожиданности заставят игроков корректировать свою тактику и творчески мыслить. Например, вы можете добавить в логово гоблинов сапёров с бочонками масла на спине. А нападение на поместье злодея может осложниться неожиданным приходом особого гостя.
При подготовке к возможным боевым сценам подумайте о необычных сочетаниях чудовищ, таких как хобгоблин военачальник и его ручная манти-кора, или о болотных огоньках вместе с молодым черным драконом. Ещё, к примеру, противники вдруг могут получить неожиданное подкрепление, а чудовища могут использовать нестандартную тактику. Изредка добавляя отвлекающие манёвры, уловки, и повороты сюжета, вы сможете удержать игроков в напряжении, но постарайтесь не переборщить. Всё-таки иногда вашим игрокам будет весело просто сразиться с орками-стражниками.
!!!''Полезные карты''
Хорошему приключению необходимы продуманные карты. Дикие области, усыпанные интересными местами и прочими особенностями лучше, чем бескрайние просторы неизменной местности. Подземелья с ветвящимися коридорами дают игрокам возможность выбрать, в каком направлении их персонажи должны идти. Ставя игроков в ситуации, в которых нужно сделать выбор, вы делаете приключение более непредсказуемым.
Если рисование карт — не ваша сильная сторона, то вы можете найти в Интернете карты приключений, поэтажные планы реальных зданий, а также изображения, которые могут вдохновить вас на создание своей карты. Вы также можете использовать для этого специальные программы.
//Зелье, редкое//
Если вы выпьете это зелье, оно вылечит вас от всех болезней, а также устраняет состояния «оглушён», «ослеплён», «отравлен» и «парализован». Это прозрачная красная жидкость с пузырьками света в ней.
//
"""
— Могла ли я думать, что где-то на свете есть подобная красота!.. — тихо выговорила Золотая Луна. Дневной переход выдался нелёгким, зато награда, ожидавшая в конце, превосходила всякое вероятие. С высокого утёса взглядам путников открылся овеянный легендами город Квалиност.
По углам города возносились, подобно сверкающим веретёнам, четыре высоких тонких шпиля, сложенных из белого камня, отделанного серебром. От шпиля к шпилю тянулись невесомые арки. Их некогда выковали искуснейшие мастера-гномы; каждая способна была выдержать вес марширующих армий, но казалось — сядет птица, и они рухнут. Арки обозначали границу города; Квалиност не прятался за стеной, но, наоборот, с любовью распахивал объятия лесу.
"""//
—Маргарет Уэйс и Трейси Хикмэн,Драконы осенних сумерек
Эльфы это волшебный народ, обладающий неземным изяществом, живущий в мире, но не являющийся его частью. Они живут в местах, наполненных воздушной красотой, в глубинах древних лесов или в серебряных жилищах, увенчанных сверкающими шпилями и переливающихся волшебным светом. Там лёгкие дуновения ветра разносят обрывки тихих мелодий и нежные ароматы. Эльфы любят природу и магию, музыку и поэзию, и всё прекрасное, что есть в мире.
!!! ''__Стройные и изящные__''
Обладая неземным изяществом и тонкими чертами, эльфы кажутся людям и представителям других рас чересчур красивыми. В среднем, они немного ниже людей, их рост колеблется от 5 до 6 футов (от 150 до 185 сантиметров). Они стройнее людей, и весят от 100 до 145 фунтов (от 45 до 65 килограмм). Мужчины и женщины почти одинакового роста, и мужчины весят лишь незначительно больше.
Цвета кожи у эльфов включают в себя все человеческие оттенки, а также цвета с медным, бронзовым и голубовато-белым отливом. Волосы помимо человеческих цветов могут быть зелёными или синими, а глаза приобретать цвет жидкого золота или серебра. У эльфов не растут волосы на лице, и почти отсутствуют волосы на теле. Они предпочитают элегантную одежду ярких цветов и простые, но красивые украшения.
!!! ''__Неподвластный времени взгляд__''
Эльфы способны жить более 700 лет, что даёт им более широкий взгляд на проблемы, беспокоящие короткоживущие расы. События чаще кажутся им забавными, чем волнующими, и ими чаще движет любопытство, чем жадность. В случае мелких происшествий они чаще проявляют равнодушие и остаются в стороне. В случае же преследования цели, выполнения задания или изучения нового навыка эльфы остаются собранными и целеустремлёнными. Они не торопятся заводить друзей или врагов, а прощают ещё медленнее. На мелкие оскорбления они отвечают пренебрежением, на крупные же — местью.
Подобно молодым ветвям дерева эльфы проявляют гибкость перед лицом опасности. Они верят в дипломатию и предпочитают с помощью компромисса уладить разногласие прежде чем оно перешло в насилие. Они способны отступить перед лицом вторжения вглубь своих лесов, уверенные, что просто смогут подождать, пока захватчики уйдут. Но если придёт нужда, эльфы способны проявить свою воинскую сторону, продемонстрировав владение мечом, луком и стратегией.
!!! ''__Скрытые лесные королевства__''
Большинство эльфов живёт в маленьких лесных деревнях, спрятанных среди деревьев. Эльфы охотятся на дичь, собирают пищу и растят овощи. Их навыки и магия позволяют им прокормить себя без вырубки леса и вспахивания земли. Они талантливы в ремёслах, изготавливают качественную одежду и предметы искусства. Их контакты с другими народами обычно ограничены, но некоторые эльфы всё же преуспели в торговле, выменивая свои товары на металлы, которые эльфы не любят добывать сами.
Эльфы, встречающиеся за пределами родных земель, чаще всего оказываются путешествующими менестрелями, артистами или мудрецами. Людские дворяне соревнуются за услуги эльфа-наставника, способного обучить их детей фехтованию или магии.
!!! ''__Исследования и приключения__''
Эльфы берутся за приключения из страсти к путешествиям. Благодаря большому сроку жизни, они могут посвятить столетия изучению и исследованию. Им не нравится темп человеческого общества, упорядоченный изо дня в день, но полностью меняющийся за десятилетие, и они предпочитают найти себе занятие, позволяющее им часто путешествовать, устанавливая свой собственный темп жизни. Эльфам также нравится оттачивать своё воинское мастерство, или добиваться великой волшебной мощи, и приключения способствуют этому. Некоторые могут присоединиться к повстанцам, борющимся против угнетателей, а другие становятся борцами за моральные ценности.
!!! ''__Эльфийские имена__''
Эльфы считаются детьми, пока они не объявят себя взрослыми, где-то вскоре после сотого дня рождения. До этого времени их называют детским именем.
Достигая зрелости, эльф выбирает себе новое, взрослое имя, хотя те, кто знал его под детским именем, могут продолжать пользоваться им. Имя каждого взрослого эльфа уникально, хотя может отражать имена уважаемых личностей или членов семьи. Мужские и женские имена различаются лишь незначительно, и чёткой границы тут нет. Также каждый эльф носит фамилию, обычно это сочетание нескольких эльфийских слов. Некоторые эльфы, путешествующие среди людей, переводят фамилию на Общий, другие сохраняют эльфийскую версию.
;''Детские имена:''
:Ара, Брин, Валь, Дель, Иннил, Лаэль, Мелла, Наиль, Наэрис, Раэль, Ринн, Сай, Силлин, Тиа, Фанн, Фаэн, Эрин
;''Мужские взрослые имена:''
:Адран, Арамиль, Араннис, Ауст, Аэлар, Бейро, Берриан, Варис, Галинндан, Ивеллиос, Иммераль, Каррик, Куарион, Лаусиан, Миндартис, Паэлиас, Перен, Риардон, Ролен, Совелисс, Тамиорн, Таривол, Терен, Хадарай, Химо, Хэйян, Эниалис, Эрдан, Эреван
;''Женские взрослые имена:''
:Адрие, Альтеа, Анастрианна, Андрасте, Антинуа, Бетринна, Бирель, Вадания, Валанте, Джеленетт, Друсилиа, Йелениа, Каэлинн, Квеленна, Квиласи, Кейлет, Ксанафия, Лешанна, Лиа, Миали, Мэриэль, Найвара, Сариэль, Силакви, Теирастра, Тиа, Фелосиаль, Шава, Шанайра, Энна
;''Фамилии (перевод на Общий):''
:Амакиир (Сверкающий Цветок), Амастасия (Звёздный Цветок), Галанодель (Лунный Шёпот), Ильфелкиир (Сверкающий Бутон), Ксилосент (Золотой Лепесток), Лиадон (Серебряный Лист), Найло (Ночной Бриз), Сианодель (Лунный Ручей), Холимион (Алмазная Роса)
Высокомерные, но любезные
Хотя эльфы могут быть высокомерными, они обычно любезны даже с теми, кто не оправдал их высоких ожиданий. Как правило, это все не-эльфы. Но всё же, они способны найти что-то хорошее почти в каждом.
О дварфах. «Дварфы скучные, неотёсанные болваны. Но свой недостаток чувства юмора, утончённости и манер они способны компенсировать отвагой. И смею заметить, изделия их лучших кузнецов способны сравниться с эльфийскими».
О полуросликах. «Полурослики — народ простых удовольствий, и это не повод их презирать. Они хороший народ, заботятся друг о друге и ухаживают за своими садами, и они доказали, что они намного крепче, чем это может показаться, когда возникает такая необходимость».
О людях. «Вся эта поспешность, их амбиции и стремление совершить что-нибудь, прежде чем окончатся их краткие жизни — всё это кажется иногда настолько бесполезным. Но взгляните на то, чего они добились, и вы начнёте ценить их достижения. Если бы только они могли немного сбавить обороты и приобрести хоть толику изящества».
!!! ''__Особенности эльфов__''
"""
Ваш персонаж эльф обладает рядом разнообразных качеств, отражающих тысячелетия эльфийского совершенствования.
''Увеличение характеристик.'' Значение вашей Ловкости увеличивается на 2.
''Возраст.'' Несмотря на то, что физически эльфы взрослеют в том же возрасте, что и люди, их понимание о взрослении выходит за рамки физического развития, и располагается в сфере житейского опыта. Обычно эльф получает статус взрослого и взрослое имя в возрасте 100 лет, и может прожить до 750 лет.
''Мировоззрение.'' Эльфы любят свободу, разнообразие и самовыражение. Таким образом, они относятся к добрым аспектам хаоса. Они ценят защиту чужой свободы так же как и своей, и чаще они скорее добры, чем нет. Исключением из этого правила являются дроу. Их изгнание в Подземье сделало их злобными и опасными. Дроу чаще являются злыми.
''Размер.'' Рост эльфов колеблется между 5 и 6 футами (152 и 183 сантиметрами), у них стройное телосложение. Ваш размер — Средний.
''Скорость.'' Ваша базовая скорость перемещения — 30 футов.
''Тёмное зрение.'' Привыкнув к сумраку леса и ночному небу, вы обладаете превосходным зрением в темноте и при тусклом освещении. На расстоянии в 60 футов вы при тусклом освещении можете видеть так, как будто это яркое освещение, и в темноте так, как будто это тусклое освещение. В темноте вы не можете различать цвета, только оттенки серого.
''Обострённые чувства.'' Вы владеете навыком Внимательность.
''Фейское происхождение.'' Вы совершаете с преимуществом спасброски от очарования, и вас невозможно магически усыпить.
''Транс.'' Эльфы не спят. Вместо этого они погружаются в глубокую медитацию, находясь в полубессознательном состоянии до 4 часов в сутки (обычно такую медитацию называют трансом). Во время этой медитации вы можете грезить о разных вещах. Некоторые из этих грёз являются ментальными упражнениями, выработанными за годы тренировок. После такого отдыха вы получаете все преимущества, которые получает человек после 8 часов сна.
''Языки.'' Вы можете говорить, читать и писать на Общем и Эльфийском языках. Эльфийский язык текучий, с утончёнными интонациями и сложной грамматикой. Эльфийская литература богата и разнообразна, а стихи и песни известны среди представителей других рас. Многие барды учат эльфийский язык, чтоб добавить песни в свой репертуар.
''Разновидности.'' Древний раскол среди эльфийских народов привёл к возникновению трёх видов: высоких эльфов, лесных эльфов и тёмных эльфов, которых обычно называют дроу. Выберите один из этих видов. В некоторых мирах они делятся ещё сильнее, (например на солнечных и лунных эльфов в мире Забытых Королевств) так что если хотите, можете выбрать более уточнённый вариант.
"""
!!! ''Высший эльф''
"""
Поскольку вы — высокий эльф, у вас острый ум и вы знакомы, по крайней мере, с основами магии. Во многих мирах D&D существует два вида высоких эльфов. Один вид (который включает серых эльфов и эльфов долин Серого Ястреба, сильванести Саги о Копье и солнечных эльфов Забытых Королевств) высокомерен и замкнут, считая себя выше не-эльфов и даже других эльфов. Другой вид (включающий высших эльфов Серого Ястреба, квалинести из Саги о Копье и лунных эльфов из Забытых Королевств) более распространён и дружелюбен, и часто встречается среди людей и других рас.
У солнечных эльфов Фаэруна (также называемых золотыми эльфами или эльфами восхода) бронзовая кожа и волосы медного, чёрного или золотистого оттенка. У них золотые, серебристые или чёрные глаза. Лунные эльфы (также называемые серебряными или серыми эльфами) гораздо бледнее, с алебастровой кожей, имеющей иногда оттенок синего. У них часто серебристо-белые, чёрные или синие волосы, но и различные оттенки светлых, коричневых и рыжих тонов также не являются редкими. У них синие или зелёные глаза с золотыми вкраплениями.
''Увеличение характеристик.'' Значение вашего Интеллекта увеличивается на 1.
''Владение эльфийским оружием.'' Вы владеете длинным мечом, коротким мечом, коротким и длинным луками.
''Заговор.'' Вы знаете один заговор из списка заклинаний волшебника. Базовой характеристикой для его использования является Интеллект.
''Дополнительный язык.'' Вы можете говорить, читать и писать на ещё одном языке, на ваш выбор.
"""
!!! ''Лесной эльф''
"""
Поскольку вы — лесной эльф, у вас обострённые чувства и интуиция, и ваши стремительные ноги несут вас быстро и незаметно через ваши родные леса. Эта категория включает диких эльфов Серого Ястреба и кагонести из Саги о Копье, а также расы, называемые лесными эльфами Серого Ястреба и Забытых Королевств. В Фаэруне лесные эльфы (также называемые дикими или зелёными) являются затворниками, не доверяющими не-эльфам.
Кожа лесных эльфов, как правило, имеет медный оттенок, иногда со следами зелёного. У них часто коричневые и чёрные волосы, но иногда они бывают светлого или бронзового оттенков. У них зелёные, карие или орехового цвета глаза.
''Увеличение характеристик.'' Значение вашей Мудрости увеличивается на 1.
''Владение эльфийским оружием.'' Вы владеете длинным мечом, коротким мечом, коротким и длинным луками.
''Быстрые ноги.'' Ваша базовая скорость перемещения увеличивается до 35 футов.
''Маскировка в дикой местности.'' Вы можете предпринять попытку спрятаться, даже если вы слабо заслонены листвой, сильным дождём, снегопадом, туманом или другими природными явлениями.
"""
!!! ''Тёмный эльф (дроу)''
"""
Произошедшие от более древней подрасы темнокожих эльфов, дроу были изгнаны с земной поверхности мира, и обречены поклоняться богине Лолс и следовать пути зла и упадка. Теперь они построили свою цивилизацию в глубинах Подземья, устроенную согласно Пути Лолс. Также называемые тёмными эльфами, дроу имеют чёрную кожу, которая напоминает полированный обсидиан и совершенно белые или очень светлые волосы. У них обычно бледные глаза (настолько бледные, что могут показаться белыми) с сиреневым, серебряным, розовым, красным или синим оттенком. Они, как правило, меньше и стройнее, чем большинство эльфов.
Искатели приключений дроу редки, и их раса существует не во всех мирах. Спросите вашего Мастера, можете ли вы играть персонажем дроу.
''Увеличение характеристик.'' Значение вашей Харизмы увеличивается на 1.
''Превосходное тёмное зрение.'' Ваше тёмное зрение имеет радиус 120 футов.
''Чувствительность к солнцу.'' Вы совершаете с помехой броски атаки и проверки Мудрости (Внимательность), основанные на зрении, если вы, цель вашей атаки или изучаемый предмет расположены на прямом солнечном свете.
''Магия дроу.'' Вы знаете заклинание пляшущие огоньки. Когда вы достигаете 3 уровня, вы можете один раз в день использовать заклинание огонь фей. При достижении 5 уровня вы также сможете раз в день использовать заклинание тьма. «Раз в день» означает, что бы должны окончить продолжительный отдых, прежде чем сможете наложить это заклинание ещё раз посредством данного умения. Базовой характеристикой для их использования является Харизма.
''Владение оружием дроу.'' Вы владеете рапирой, коротким мечом и ручным арбалетом.
"""
<<<
"""
''Тьма дроу''
Если бы не одно знаменитое исключение, раса дроу могла бы быть повсеместно презираема. Для большинства это раса демонопоклонников, обитающих в глубинах Подземья, появляющихся только в самые тёмные ночи, чтобы грабить и убивать обитателей поверхности, которых они ненавидят. Их общество развращено и обращено к Лолс, их богине-паучихе, которая поощряет убийство и истребление целых семей борющихся за власть.
Тем не менее, как минимум один дроу смог сломать стереотип. В мире Забытых Королевств Дриззт До’Урден, следопыт Севера, проявил себя как добродетельный защитник слабых и невинных. Отвергая своё наследие, и существуя в мире, взирающем на него с ужасом и отвращением, Дриззт стал образцом для тех немногих дроу, кто следует по его стопам, пытаясь найти жизнь вне злого общества их дома — Подземья.
Дроу растут в уверенности, что живущие на поверхности расы хуже их, и ни на что не годятся, кроме как стать рабами. Дроу, у которых пробуждается совесть, или тем, кто считает необходимым сотрудничать с представителями других рас, бывает трудно преодолеть предрассудки, особенно, когда они сами так часто являются объектом ненависти.
"""
<<<
//Доспех (кольчужная рубаха), редкий//
Вы получаете бонус +1 к КД, когда носите этот доспех. Считается, что вы владеете навыком ношения этого доспеха, даже если не владеете навыком ношения средних доспехов.
//Чудесный предмет, необычный//
Пока вы носите эти сапоги, ваши шаги не издают звука, вне зависимости от поверхности, по которой вы идёте. Вы также совершаете с преимуществом проверки Ловкости (Скрытность), которые полагаются на бесшумное передвижение.
//Чудесный предмет, необычный (требуется настройка)//
Пока вы носите этот плащ с накинутым капюшоном, проверки Мудрости (Внимательность), совершённые чтобы увидеть вас, совершаются с помехой, а вы совершаете с преимуществом проверки Ловкости (Скрытность), когда прячетесь — плащ способен изменять свой цвет, обеспечивая вам камуфляж. Накидывание и снятие капюшона совершается действием.
!!!''__Энергетические удары__''
Начиная с 6 уровня ваши безоружные удары считаются магическими при определении преодоления сопротивления и иммунитета к немагическим атакам и урону.
По мере того, как персонажи становятся сильнее, их способность изменять мир вокруг себя растёт вместе с ними. Создавая кампанию, думайте наперёд, учитывая эти изменения. Как только персонажи окажут мощное влияние на мир, они столкнутся с большой опасностью, хотят они этого или нет. Могущественные фракции увидят в них угрозу и объединятся против них, а дружественные станут добиваться их благосклонности в надежде заключить союз.
Этапы игры представляют собой идеальные вехи для введения новых сотрясающих мир событий. Как только персонажи решают одну проблему, возникает новая опасность или предыдущая проблема превращается в новую угрозу в ответ на действия героев. По мере того как персонажи становятся все более мощными, события должны увеличиваться в масштабах, поднимая ставки и усиливая драматичность. Такой подход также позволяет вам разбить работу на более мелкие части. Создавайте материал, приключения, ПМ, карты, и прочее только для одного этапа игры за раз. Вам не нужно беспокоиться о деталях следующего этапа до тех пор, пока персонажи не подошли к нему. Будет даже лучше, если игра приобретёт неожиданный поворот в ответ на выбор игроков, и вам не придётся переделывать много работы.
!!__''Уровни 1-4: местные герои''__
Персонажи на этих уровнях до сих пор изучают спектр возможностей выбранного ими класса, включая их выбор специализации. Но даже будучи персонажами 1 уровня они уже герои, ведь они выделяются среди обычных людей своими природным характеристиками, полученными навыками и намёком на великую судьбу, что их ожидает.
В самом начале пути персонажи используют заклинания 1 и 2 уровня и обычное снаряжение. Магические предметы, которые они находят, включают в себя обычные расходные материалы (зелья и свитки) и, если повезёт, необычные предметы. Магия таких предметов может иметь большое влияние на столкновения с противниками, но не меняет ход приключения.
От успеха искателей приключений низкого уровня может зависеть судьба деревни. Такие персонажи посещают опасную местность и изучают населённые привидениями склепы, в которых их могут ожидать сражений с дикими орками, свирепыми волками, гигантскими пауками, злыми сектантами, кровожадными упырями, и наёмными головорезами. Если они натолкнутся на молодого дракона, то им лучше избежать схватки с ним.
!!__''Уровни 5-10: герои королевства''__
К тому времени, когда герои достигают этого уровня, они уже освоили азы и особенности своих классов. Они нашли своё место в мире и начали вникать в опасности, которые их окружают.
Заклинатели изучают заклинания 3 уровня в начале этого этапа. Персонажи вдруг начинают летать, причинять урон группам врагов заклинаниями огненный шар и молния, и даже дышать под водой. В конце этого этапа они овладеют заклинаниями 5 уровня, а такие заклинания как круг телепортации, наблюдение, небесный огонь, знание легенд и оживление могут оказывать значительное влияние на их приключения. К тому же, они начинают приобретать больше магических предметов с постоянными магическими свойствами (необычные и редкие), которые будут служить им до конца их пути.
Судьба региона может зависеть от приключений, в которых участвуют персонажи от 5 до 10 уровней. Искатели приключений отправляются в страшные дебри и древние руины, где они сталкиваются с дикими великанами, свирепыми гидрами, бесстрашными големами, злыми юан-ти, коварными дьяволами, кровожадными демонами, лукавыми иллитидами и дроу убийцами. У них есть шанс победить молодого дракона, который устроил себе логово, но ещё не распространил своё влияние по окружающей территории.
!!__''Уровни 11-16: владыки земель''__
С 11 уровня персонажи становятся ярким примером мужества и решимости — истинные образцы совершенства в мире. На данном этапе искатели приключений гораздо более универсальны чем они были ранее, и они, как правило, способны найти решение для любой задачи.
Заклинатели получают доступ к заклинаниям 6 уровня на 11 уровне, и в списке новых заклинаний появляются такие, которые полностью меняют характер взаимодействия с миром. Яркие, мощные заклинания, такие как распад, стена клинков и полное исцеление, к примеру, оказывают серьёзное влияние на бой — но небоевые заклинания, такие как слово возврата, поиск пути, предосторожность, телепортация и истинное зрение полностью меняют подход игроков к приключениям. С этого момента каждый новый уровень заклинаний добавляет новые эффекты с одинаково сильным влиянием. Искатели приключений находят редкие (и очень редкие) магические предметы, которые даруют такие же мощные способности.
Судьба страны или даже мира зависит от действий, которые предпринимают такие персонажи. Искатели приключений исследуют неизведанные регионы и копаются в давно забытых подземельях, где они встречают страшных владык нижних планов, хитрых ракшасов, голодных лиловых червей и злобоглазов. Они могли бы даже победить сильного взрослого дракона, имеющего значительное влияние в мире.
На этом этапе искатели приключений влияют на мир по-разному: начиная с того, как они проводят свои приключения, заканчивая тем, как они тратят свои с трудом полученные сокровища и используют заслуженную репутацию. Персонажи этого уровня сооружают крепости на земле, выданной им местными правителями. Они основывают гильдии, храмы или боевые ордены, в которые они самостоятельно принимают учеников или студентов. Они заключают союзы между нациями или ввергают их в войну. А их грозная репутация привлекает внимание очень мощных врагов.
!!__''Уровни 17-20: владыки мира''__
К 17 уровню персонажи имеют супергеройские возможности, а их поступки и приключения становятся легендами. Обычные люди и мечтать не могут о такой силе или о таких опасностях.
Заклинатели на этом этапе овладевают эпохальными заклинаниями 9 уровня, такими как исполнение желаний, врата, гроза гнева и проекция в астрал. Персонажи имеют в своём распоряжении несколько редких и очень редких магических предметов, и начинают находить легендарные предметы, такие как меч головоруб или посох магов.
Приключения на этих уровнях имеют далеко идущие последствия, возможно, определяющие судьбы миллионов на Материальном Плане и даже в местах за его пределами. Персонажи путешествуют через потусторонние миры, исследуют демипланы и другие межпространственные места, где они сражаются с дикими балорами, титанами, архидьяволами, личами-архимагами, и даже c аватарами богов. Драконы, с которыми они сталкиваются, обладают огромной силой, чей сон тревожит королевства, а пробуждение грозит самому существованию.
Персонажи, получившие 20 уровень, достигли вершины достижений смертных. Их подвиги войдут в анналы истории, барды сложат о них песни и будут рассказывать веками. Их судьбы сбылись. Жреца могут отправить на небеса служить в качестве правой руки бога. Колдун может стать покровителем других колдунов. Волшебник, возможно, откроет секрет бессмертия и проведёт вечность в изучении самых дальних уголков мультивселенной. Друид может достичь единения с землёй, став природным духом определённого места или аспекта дикой природы. Другие персонажи могут основать кланы или династии, которые будут передавать память о своих великих предках из поколения в поколение, могут создать шедевры эпической литературы, которые будут воспевать и пересказывать в течение тысяч лет, а также могут создать гильдию или орден, сохраняющие в живых принципы и мечты искателей приключений.
Достижение этой точки не означает конец кампании. Таких мощных персонажей можно призвать на грандиозные приключения на космическом уровне. И в результате этих приключений их возможности могут продолжать развиваться. Персонажи не могут подняться выше 20 уровня, но они по-прежнему могут развиваться и совершать эпические подвиги, оставляющие резонанс по всей мультивселенной. В главе 7 описаны эпические бонусы, которые можно использовать в качестве награды для таких персонажей, чтобы сохранять ощущение прогресса.
!!__''Начиная игру с более высоким уровнем''__
Опытным игрокам, знакомым с возможностями классов персонажей и жаждущим более значимых приключений, может понравиться идея начать кампанию с персонажами выше 1 уровня. Создание персонажа высокого уровня использует принципы, изложенные в Книге игрока. Такой персонаж имеет больше хитов, больше классовых умений и заклинаний, и, скорее всего, начинает игру с более продвинутым снаряжением.
Начальное снаряжение для персонажей выше 1 уровня выдаётся полностью на ваше усмотрение, так как в каждой игре свой собственный темп. Тем не менее, вы можете использовать приведённую ниже таблицу с начальным снаряжением в качестве руководства.
//7 уровень, Преобразование, Бард/Волшебник/Жрец/Колдун/Чародей//
;
:''Время накладывания:'' 1 действие
:''Дистанция:'' На себя
:''Компоненты:'' В, С
:''Длительность:'' До 8 часов
Вы вступаете в пограничные окрестности Эфирного Плана, в местность, в которой он пересекается с вашим текущим планом. Вы остаётесь в Пограничном Эфире, пока активно заклинание, или пока вы не окончите его действием. Всё это время вы можете перемещаться в любом направлении. Если вы перемещаетесь вверх или вниз, каждый фут перемещения стоит 1 дополнительный фут. Вы можете видеть и слышать то, что происходит на плане, с которого вы пришли, но всё выглядит серым, и вы не видите то, что находится за пределами 60 футов.
Находясь на Эфирном Плане, вы можете воздействовать только на существ, которые находятся там же, и только они могут воздействовать на вас. Существа, не находящиеся на Эфирном Плане, не могут воспринимать вас и взаимодействовать с вами, если только у них нет особого умения или магии, позволяющей делать это.
Вы игнорируете все предметы и эффекты, не находящиеся на Эфирном Плане, что позволяет вам проходить сквозь предметы, оставленные на исходном плане.
Когда заклинание заканчивается, вы мгновенно возвращаетесь на план, с которого пришли, в месте, которое занимаете в данный момент. Если вы при этом находитесь в месте, занятом предметом или существом, вас мгновенно переносит в ближайшее свободное пространство, которое вы можете занимать, и вы получаете урон силовым полем, равный удвоенному количеству футов, на которое вас телепортировало.
Это заклинание не оказывает эффекта, если вы накладываете его, уже находясь на Эфирном Плане или плане, который не граничит с ним, например, на одном из Внешних Планов.
;На больших уровнях:
:Если вы накладываете это заклинание, используя ячейку 8 уровня или выше, вы можете сделать целью до трёх согласных существ (включая вас) за каждый уровень ячейки выше седьмого. Существа должны находиться в пределах 10 футов от вас, когда вы накладываете это заклинание.
//"""Тамлин чувствовал на себе руку, чувствовал, как тело его начинает мерцать и становится туманным. Крики и вопли остались где-то позади. Окружающие его стены выглядели как всего лишь серые тени. Ривален и Бреннус стояли возле него.
«Эфирный план, — сказал Ривален. — Здесь дыхание дракона нас не настигнет»."""//
<<AlignRight "— Пол С. Кемп, //Буря теней//">>
Эфирный План это затянутое туманом измерение. Его «берега», называемые Пограничным Эфиром, нахлёстываются на Материальный План и Внутренние Планы, так что у каждого места на этих планах есть соответствующее место на Эфирном Плане. Видимость в Пограничном Эфире ограничена 60 футами. В Глубинном Эфире туман ещё гуще, и там видимость ограничена 30 футами.
Персонажи могут с помощью заклинания эфирность попасть в Пограничный Эфир. Заклинание уход в иной мир позволяет переместиться как в Пограничный, так и в Глубинный Эфир, но если предполагаемое место назначения не является конкретным местом или кругом телепортации, точка прибытия может оказаться в любом месте этого плана.
!!__''Пограничный Эфир''__
У находящегося в Пограничном Эфире путника зрение простирается на тот план, с которым пересекается Эфир, но всё выглядит размытым и неразборчивым, цвета смешиваются друг с другом, а грани выглядят ворсистыми. Такой наблюдатель смотрит словно бы сквозь кривое и заиндевевшее стекло, и не видит ничего, что находится далее чем в 30 футах на другом плане. Сам же он, в свою очередь, обычно невидим для наблюдателя с соседнего плана, если не прибегать к помощи магии.
Обычно существа, находящиеся в Пограничном Эфире, не могут атаковать существ на смежном плане, и наоборот. Путник на Эфирном Плане невидим и абсолютно неслышим для тех, кто находится на смежном плане, и сплошные препятствия на смежном плане не мешают перемещению существа по Пограничному Эфиру. Существуют исключения для некоторых магических эффектов (включая всё, что состоит из магического силового поля) и живых существ. Это делает Эфирный План идеальным местом для разведки, шпионажа и тайного перемещения. Эфирный План также не подчиняется законам гравитации; существа могут перемещаться вверх и вниз так же легко, как в стороны.
!!__''Глубинный Эфир''__
Для того чтобы достичь Глубинного Эфира, нужно воспользоваться заклинаниями уход в иной мир или врата, либо же воспользоваться магическим порталом. Посетителей Глубинного Эфира окутывает клубящийся туман. По всему плану разбросаны завесы парящего цвета, и проход сквозь такую завесу переносит путника в область Пограничного Эфира, смежного с одним из Внутренних Планов, с Материальным Планом, Страной Фей или Царством Теней. Цвет завесы указывает на план, находящийся у Пограничного Эфира; смотрите прилагающуюся таблицу:
{{$:/Эфирные завесы}}
Путешествие по Глубинному Эфиру ради путешествия из одного плана в другой не похоже на физическое перемещение. Расстояние здесь не имеет значения, поэтому, несмотря на то, что путники чувствуют, что могут перемещаться простым усилием воли, скорость их нельзя измерить, да и прошедшее время трудно подсчитать. Переход между планами в Глубинном Эфире занимает 1к10 х 10 часов, вне зависимости от исходного и конечного планов. Однако в сражении существа считаются имеющими обычную скорость.
Эфирные циклоны
Эфирный циклон это закрученная колонна, блуждающая по плану. Такие циклоны появляются внезапно, рушат и вырывают эфирные тела на своём пути, и тащат с собой захваченные объекты на огромные расстояния. Путники с пассивным значением Мудрости (Внимательность) 15 и выше получают 1к4 раундов предупреждения: глубокий гул в эфирной материи. Путники, не способные воспользоваться завесой или порталом для перемещения прочь из текущего места, подвергаются действию циклона. Бросьте к20 и определите по прилагающейся таблице эффект для всех окрестных существ.
{{$:/Эфирный циклон}}
Чаще всего последствия эфирного циклона заключаются в том, что запланированное путешествие будет проходить дольше, чем предполагалось. Все персонажи в группе, путешествующие вместе, должны совершить спасбросок Харизмы со Сл 15. Если преуспеет как минимум половина группы, путешествие затягивается на 1к10 часов. В противном случае путешествие затягивается вдвое. Иногда группу сдувает в Пограничный Эфир, смежный с каким-нибудь планом. И очень редко циклон пробивает дыру в ткани плана и зашвыривает отряд на Астральный План.
!!__''Сцены на Эфирном Плане''__
Большинство сцен в Пограничном Эфире происходит с существами с Материального Плана, чьи чувства или умения простираются на Эфирный План (исчезающие пауки, например). Привидения тоже свободно перемещаются между Эфирным и Материальным Планами.
В Глубинном Эфире большинство сцен происходит с другими путниками, особенно часто с теми, что пришли с Внутренних Планов (элементали, гении и саламандры), а также с более редкими небожителями, исчадиями и феями.
//Заговор, Вызов, Волшебник/Чародей/Колдун//
:''Время накладывания:'' 1 действие
:''Дистанция:'' 10 футов
:''Компоненты:'' В, С
:''Длительность:'' Мгновенная
Вы простираете руку к существу, видимому в пределах дистанции, и выпускаете из ладони клубы токсичного газа. Это существо должно преуспеть в спасброске Телосложения, иначе оно получит урон ядом 1к12.
Урон этого заклинания увеличивается на 1к12, когда вы достигаете 5 уровня (2к12), 11 уровня (3к12) и 17 уровня (4к12).
Яды коварны и смертельно опасны, и потому запрещены в большинстве обществ, но всё равно остаются любимым оружием наёмных убийц, дроу и других злых существ.
Яды бывают четырёх видов.
://''Вдыхаемый.''// Эти яды — порошки или газы, подвергающие воздействию, когда их вдыхают. Выдувание порошка или выпускание газа подвергает действию яда существ, находящихся в 5футовом кубе. Получившееся в результате облако мгновенно исчезает. Задержка дыхание не спасает от вдыхаемых ядов, так как они действуют на носовые пазухи, слёзные каналы и другие части тела.
://''Контактный.''// Контактный яд можно нанести на предмет, и он остаётся активным, пока его не коснутся или не смоют. Существо, коснувшееся контактного яда голой кожей, подвергается его воздействию.
://''Оружейный.''// Оружейный яд наносится на оружие, боеприпасы, компоненты ловушек и другие предметы, причиняющие колющий или рубящий урон, и остаётся активным, пока не попадёт в рану или не будет смыт. Существо, получившее колющий или рубящий урон от оружия или боеприпаса, покрытого оружейным ядом, подвергается его воздействию.
://''Поглощаемый.''// Существо должно проглотить полную дозу поглощаемого яда, чтобы подвергнуться его воздействию. Эта доза может быть подмешана в еду или питьё. Вы можете решить, что частичная доза будет обладать ослабленным эффектом, например, позволит совершать спасбросок с преимуществом, или будет причинять только половину урона при провале спасброска.
!!!!''Яды''
<table>
<tr>
<th>Предмет</th>
<th>Вид</th>
<th>Цена за дозу</th>
</tr>
<tr>
<td>Бледная настойка</td>
<td>Поглощаемый</td>
<td>250 зм</td>
</tr>
<tr>
<td>Дым жжённого отура</td>
<td>Вдыхаемый</td>
<td>500 зм</td>
</tr>
<tr>
<td>Злоба</td>
<td>Вдыхаемый</td>
<td>250 зм</td>
</tr>
<tr>
<td>Змеиный яд</td>
<td>Оружейный</td>
<td>200 зм</td>
</tr>
<tr>
<td>Кровь ассасина</td>
<td>Поглощаемый</td>
<td>150 зм</td>
</tr>
<tr>
<td>Масло таггита</td>
<td>Контактный</td>
<td>400 зм</td>
</tr>
<tr>
<td>Полуночные слёзы</td>
<td>Поглощаемый</td>
<td>1 500 зм</td>
</tr>
<tr>
<td>Слизь ползающего падальщика</td>
<td>Контактный</td>
<td>200 зм</td>
</tr>
<tr>
<td>Ступор</td>
<td>Поглощаемый</td>
<td>600 зм</td>
</tr>
<tr>
<td>Сыворотка правды</td>
<td>Поглощаемый</td>
<td>150 зм</td>
</tr>
<tr>
<td>Эссенция эфира</td>
<td>Вдыхаемый</td>
<td>300 зм</td>
</tr>
<tr>
<td>Яд виверны</td>
<td>Оружейный</td>
<td>1 200 зм</td>
</tr>
<tr>
<td>Яд дроу</td>
<td>Оружейный</td>
<td>200 зм</td>
</tr>
<tr>
<td>Яд лилового червя</td>
<td>Оружейный</td>
<td>2 000 зм</td>
</tr>
</table>
!!__''Примеры ядов''__
У каждого яда свои деструктивные эффекты.
;//''Бледная настойка (Поглощаемый).''//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 16, иначе получит урон ядом 3 (1к6) и станет отравленным. Отравленное существо должно повторять спасбросок каждые 24 часа, получая урон ядом 3 (1к6) при провале. Пока яд действует, урон, причинённый им, ничем не может быть вылечен. После семи успешных спасбросков эффект оканчивается, и существо может лечиться как обычно.
;//Дым жжённого отура (Вдыхаемый).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 13, иначе оно получит урон ядом 10 (3к6) и будет должно повторять этот спасбросок в начале каждого своего хода. При каждом провале персонаж получит урон ядом 3 (1к6). После трёх успехов яд прекратит своё действие.
;//Злоба (Вдыхаемый).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 15, иначе оно станет отравленным на 1 час. Существо ослеплено, пока отравлено.
;//Змеиный яд (Оружейный).//
:Этот яд собирают с мёртвой или недееспособной гигантской ядовитой змеи. Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 11, получая урон ядом 10 (3к6) при провале, или половину этого урона при успехе.
;//Кровь ассасина (Поглощаемый).//
:Существо, подвергшееся действию этого яда, должно совершить спасбросок Телосложения со Сл 10. При провале оно получает урон ядом 6 (1к12) и становится отравленным на 24 часа. При успехе существо получает половину урона и не становится отравленным.
;//Масло таггита (Контактный).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 13, иначе оно станет отравленным на 24 часа. Существо также лишено сознания, пока отравлено. Существо приходит в сознание, если получает урон.
;//Полуночные слёзы (Поглощаемый).//
:Существо, проглотившее этот яд, до полуночи ни от чего не страдает. Если до этого момента яд не был нейтрализован, существо должно преуспеть в спасброске Телосложения со Сл 17, получая урон ядом 31 (9к6) при провале или половину этого урона при успехе.
;//Слизь ползающего падальщика (Контактный). //
:Этот яд собирают с мёртвого или недееспособного ползающего падальщика. Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 13, иначе оно станет отравленным на 1 минуту. Будучи отравленным, существо также парализовано. Существо может повторять спасбросок в конце каждого своего хода, оканчивая эффект на себе при успехе.
;//Ступор (Поглощаемый).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 15, иначе оно станет отравленным на 4к6 часов. Существо также недееспособно, пока отравлено.
;//Сыворотка правды (Поглощаемый).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 11, иначе станет отравленным на 1 час. Пока существо отравлено, оно не может сознательно говорить ложь, как если бы оно находилось под действием заклинания область истины.
;//Эссенция эфира (Вдыхаемый).//
:Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 15, иначе оно станет отравленным на 8 часов. Существо также лишено сознания, пока отравлено. Существо приходит в сознание, если получает урон или другое существо действием его потрясёт, чтобы разбудить.
;//Яд виверны (Оружейный).//
:Этот яд собирают с мёртвой или недееспособной виверны. Существо, подвергшееся действию этого яда, должно совершить спасбросок Телосложения со Сл 15, получая при провале урон ядом 24 (7к6) или половину этого урона при успехе.
;//Яд дроу (Оружейный).//
:Обычно этот яд изготавливают только дроу, к тому же в местах, где нет солнечного света. Существо, подвергшееся действию этого яда, должно преуспеть в спасброске Телосложения со Сл 13, иначе оно станет отравленным на 1 час. Если спасбросок провален на 5 или больше единиц, существо также лишено сознания, пока отравлено. Существо приходит в сознание, если получает урон или другое существо действием его потрясёт, чтобы разбудить.
;//Яд лилового червя (Оружейный).//
:Этот яд собирают с мёртвого или недееспособного лилового червя. Существо, подвергшееся действию этого яда, должно совершить спасбросок Телосложения со Сл 19, получая при провале урон ядом 42 (12к6), или половину этого урона при успехе.
!!__''Приобретение яда''__
В некоторых мирах закон запрещает хранить и использовать яды, но дельцы чёрного рынка и нечистые на руку фармацевты могут тайком держать яд на продажу. Персонажи со связями в преступном мире смогут добыть яд относительно легко. Другим персонажам придётся наводить много справок и подкупать многих лиц, пока, наконец, не выйдут на нужный им яд.
В приведённой выше таблице указаны цены для одной дозы каждого вида яда.
!!__''Создание и сбор ядов''__
Во время простоя между приключениями персонаж может использовать правила ремесла из Книги игрока, чтобы создавать простые яды, если владеет навыком использования инструментов отравителя. С вашего разрешения, персонаж может создавать и другие виды ядов. Не все ингредиенты для составления ядов есть в продаже, и поиски определённых компонентов могут вылиться в целое приключение.
Персонаж может попытаться собрать яд с ядовитого существа, такого как змея, виверна или ползающий падальщик. Существо должно быть мёртвым или недееспособным, и для сбора требуется 1к6 минут и проверка Интеллекта (Природа) со Сл 20 (применяется владение навыком использования инструментов отравителя, если персонаж не владеет навыком Природа).
При успехе персонаж собирает достаточно яда для одной дозы. При провале персонаж не может добыть яд. Если персонаж провалили проверку на 5 или больше единиц, персонаж сам подвергается действию яда этого существа.
//Оружие (любой меч), редкое (требуется настройка)//
Вы можете бонусным действием произнести командное слово этого магического меча, отчего из него вырвутся языки пламени. Это пламя испускает яркий свет в радиусе 40 футов и тусклый свет в радиусе ещё 40 футов. Пока меч пылает, он причиняет дополнительный урон огнём 2к6 целям, по которым попадает. Пламя остаётся, пока вы не произнесёте ещё раз командное слово бонусным действием, или пока не уберёте меч в ножны.
!!!''__Язык солнца и луны__''
Начиная с 13 уровня вы понимаете, как взаимодействовать с энергией ци в чужом разуме, и теперь вы понимаете речь на любом языке. Кроме того, все существа, способные понимать хотя бы один язык, понимают то, что вы сказали.
//3 уровень, Прорицание, Бард/Волшебник/Жрец/Колдун/Чародей//
:''Время накладывания:'' 1 действие
:''Дистанция:'' Касание
:''Компоненты:'' В, М (маленькая глиняная модель зиккурата)
:''Длительность:'' 1 час
Это заклинание дарует существу, которого вы касаетесь, способность понимать все языки, которые оно слышит. Более того, когда цель говорит, все существа, знающие хотя бы один язык, и слышащие цель, понимают, что она сказала.
При создании мира вы можете придумать новые языки и диалекты, чтобы показать его уникальную географию и историю. Вы можете заменить языки по умолчанию, представленные в Книге игрока на новые, или разделить языки на несколько различных диалектов.
В некоторых мирах региональные различия могут быть гораздо более важными, чем расовые. Возможно, все дварфы, эльфы, и люди, которые живут в одном царстве, говорят на общем языке, который полностью отличается от языков в соседнем королевстве. Это может значительно усложнить коммуникацию (и дипломатию) между двумя королевствами.
Широко используемые языки могут иметь древние версии, или там могут быть совершенно неизвестные древние языки, которые искатели приключений нашли на стенах гробниц или руин. Такие языки могут добавить элемент загадки надписям и символам, с которыми персонажи столкнутся.
Вы можете придумать дополнительные секретные языки, помимо языка друидов и воровского сленга, которые позволят членам определённых организаций или политических структур общаться.
Вы даже можете решить, что каждое мировоззрение имеет свой собственный язык, который может более походить на арго и использоваться главным образом для обсуждения философских концепций.
В месте, где одна раса покорила другую, язык завоевателей может стать символом социального статуса. К тому же, чтение и письмо может быть ограничено законом для всех низших классов общества.
!!!__''Ярость''__
"""В бою вы сражаетесь с первобытной свирепостью. В свой ход вы можете бонусным действием войти в состояние ярости.
В состоянии ярости вы получаете следующие преимущества, если не носите тяжёлую броню:"""
* Вы совершаете с преимуществом проверки и спасброски Силы.
* Если вы совершаете рукопашную атаку оружием, используя Силу, вы получаете бонус к броску урона, соответствующий вашему уровню варвара, как показано в колонке «урон ярости» таблицы «Варвар».
* Вы получаете сопротивление дробящему, колющему и рубящему урону.
"""Если вы были способны использовать заклинания, то вы не можете использовать или концентрироваться на заклинаниях, пока находитесь в состоянии ярости.
Ваша ярость длится 1 минуту. Она прекращается раньше, если вы потеряли сознание, если вы закончили ход, не атаковав враждебное по отношению к вам существо с момента окончания прошлого хода, или если вы с момента окончания прошлого хода не получили урон. Также вы можете прекратить свою ярость бонусным действием.
Если вы впадали в состояние ярости максимальное для вашего уровня количество раз (смотрите колонку «ярость»), то вы должны совершить продолжительный отдых, прежде чем сможете использовать ярость ещё раз."""