Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
If you'd like to change the colors, typeface, or other parts of your story's visual appearance, you may do so with a technology called Cascading Style Sheets (CSS).
You can add style rules to your story by adding passages with the stylesheet tag. When a story is first loaded, all passages tagged stylesheet are added as CSS rules. Tags are case-sensitive, so tagging a passage ''Stylesheet'' or ''STYLESHEET'' will have no effect. Also, there is no guaranteed order in which rules are added, so conflicting rules will produce unpredictable results.
Here are some useful CSS selectors. There are DOM inspectors for most major browsers that can also help you develop rules that produce the results you're looking for.
|Selector|Description|h
|{{{body}}} |Affects everything displayed — a great place to change the typeface for the entire page.|
|{{{#floater}}} |The story menu in the upper-right corner of the page.|
|{{{h1}}} |The story's title.|
|{{{h2}}} |The story's subtitle.|
|{{{h3}}} |The story's author.|
|{{{#passages}}} |A container for all passages displayed on the page.|
|{{{.passage}}} |A single passage on the page.|
|{{{.passage .title}}} |A passage's title.|
|{{{.passage .toolbar}}} |A container for the Bookmark and Rewind to Here links for each passage.|
|{{{.passage .body}}} |A passage's body text.|
|{{{.passage .body .internalLink}}} |A link to another passage in the story.|
|{{{.passage .body .brokenLink}}} |A link that points to a nonexistent passage in the story.|
|{{{.passage .body .externalLink}}} |A link that points to another Web page.|
|{{{.passage .body .choice}}} |A link created through the {{{<<choice>>}}} macro.|
|{{{.passage .body .disabled}}} |A link created through the {{{<<choice>>}}} macro that is not longer available to the reader.|
|{{{#footer}}} |The footer at the bottom of the page (e.g. "This story was built with Twee and is powered by TiddlyWiki").|
As an example, this passage hides all passage titles from view in the Jonah story format:
<<<
{{{.passage .title { display: none }}}}
<<<
To install Twine on a Windows computer, run the .exe file you downloaded. This installer will copy the necessary files to your computer, and add an entry to your Start menu for Twine. If you'd like to uninstall it, open the ''Add/Remove Programs'' control panel (on Windows XP or earlier) or the ''Programs and Features'' control panel (in Vista), find Twine in the list of applications, and then click the ''Uninstall'' button.
To install Twine on a Macintosh computer, expand the archive file you downloaded, then copy the entire Twine folder your Applications folder. To uninstall it, simply delete the folder you copied.
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[info.png]] Although there is no official Linux package for Twine, you can install it by [[checking out a copy of the Twine source code via Subversion|http://code.google.com/p/twee/source/checkout]], then running the app.py file with Python. You'll need to have [[wxPython installed|http://www.wxpython.org/]].
</div></html>
twee, the command-line Twee compiler, requires Python. If you are using a Unix-based system like OS X or Linux, you don't need to worry about this requirement; Python should already be installed on your computer. Windows users can get Python [[here|http://www.python.org/download/releases/]].
On Unix-based systems, you can make the command-line tools available to you by placing the entire extracted directory (including the ''lib'' and ''targets'' directories) into your PATH. If you use the bash shell, for example, you might put something like this in .bashrc:
<<<
{{{export PATH=$PATH:/home/useraccount/twee}}}
<<<
You can then run //twee// directly from the command prompt:
<<<
{{{$ twee}}}
<<<
On Windows, you can't run twee directly. Instead, you'll need to run the //python// interpreter on twee like so:
<<<
{{{> python twee}}}
<<<
If things are set up properly, running twee without any further input should produce this message:
<<<
{{{twee: no source files specified}}}
<<<
If you see this message, then you have installed //twee// correctly.
A Google Group is available for asking for help with a problem, reporting a bug, or even sharing work you've created with Twee. Membership is open to anyone; you may also want to check the archives to see if your question has already been answered.
The group can be found at http://groups.google.com/group/tweecode.
<html><div <span class='menubox' style='float:center;margin:0em'<div align="center"><iframe src="http://groups.google.com/group/tweecode" frameborder="0" width="100%" height="600"></iframe></div></html>
What Is Hypertext?
''Twee is a tool for writing hypertext''. But what does that mean? Maybe you've seen something like this notice that was at the beginning of a book called //Journey Under the Sea//:
<html><div align="center">
[img[cyoawarning.png]]</div></html>
//Journey Under the Sea// is a [[Choose Your Own Adventure|http://en.wikipedia.org/wiki/Choose_Your_Own_Adventure]], and depending on when you were born, is probably an example of hypertext that you're very familiar with. (It's also one of the most accessible forms of hypertext.) In these stories, the narrative is broken up into individual pages. When you reach the end of one, you get directions on what page to turn to next. Sometimes it tells you to go on to the next page, just like in a regular story. But other times it gives you the thing that defines hypertext: ''a choice''.
In the case of Choose Your Own Adventures, you get to choose what the story's protagonist will do next. But this is only one kind of choice that a reader can make in hypertext.
*A reader could choose to learn more about a certain topic. For example, a reader might click on a statue's name to learn about its history.
*A reader could choose to change perspectives in a story. Clicking a character's name might show what they're thinking, for example.
*A reader could choose to change the world of a story. Imagine a story that starts at its end and lets the reader undo certain choices already made.
These examples are just a sample of the possibilities in hypertext. There are as many kinds of ways a text can branch as there are writers.
Keep in mind that hypertext is best described as a ''medium'', not a genre. There can be hypertext fiction, nonfiction — even poetry. But in this document we'll talk about hypertext prose.
So far, the stories you have learned how to create with Twee have been displayed more or less as you have entered them in your source code. The only exceptions have been certain notations you use for formatting and creating links. You can create complete stories with what you already knew, but what if you wanted to recreate a passage like this?
<<<
As you reach the door you hear the crash of a giant stone slab as it falls from the ceiling. Turning around, you see that your exit is now blocked.
If you have a Silver Key, you may try to open the door by turning to 158.
If you do not possess a Silver Key, turn to 259.
<html><div align="right">(Joe Dever, //Flight from the Dark//)</div></html>
<<<
You could certainly ask your readers to click the appropriate link, but wouldn't it be better if your story could remember if the protagonist picked up the silver key earlier in the story, and only display it if it's appropriate? Code lets you accomplish these kinds of tasks. In short, ''code consists of instructions to be carried out by a computer'', not text to be read by the reader.
In Twee, code takes the form of ''macros'' placed in your story's text. These are set off by double angle brackets, {{{<<like this>>}}}. When a passage is displayed, the macro invocation isn't displayed; instead, its code runs. For example, this source code would produce something akin to the text quoted above:
<<<
{{{As you reach the door you hear the crash of a giant stone slab as it falls from the ceiling. Turning around, you see that your exit is now blocked.
<<if $hasSilverKey>>
* [[Open the door with your key]]
<<else>>
* [[Try to force the door open]]
<<endif>>}}}
<<<
Even though macros are never seen by a reader, they are designed so that they make sense to someone reading your source code — even someone who may not be familiar with them, as you are right now. Nevertheless, ''you don't need to understand how a macro works''. You only need to know how to use it to accomplish what your story needs to do.
The basic narrative unit of a book is a ''chapter''. Although there are books that don't divide themselves up into chapters, most do, and it's a useful way for writers and readers to keep track of a book's structure. The corresponding unit for hypertext is ''a choice and the text that leads to it''. In Choose Your Own Adventure books, this unit was a single printed page:
<<<
//If you decide to explore the ledge where the Seeker has come to rest, turn to page 6.
If you decide to cut loose from the Maray and dive with the Seeker into the canyon in the ocean floor, turn to page 4.//
<html><div align="right">
(R. A. Montgomery, //Journey Under the Sea//)</div></html>
<<<
As these books became more complex, more pages were required — and some of these pages didn't need to be terribly long. [[Gamebooks|http://en.wikipedia.org/wiki/Gamebook]] like the //[[Fighting Fantasy|http://en.wikipedia.org/wiki/Fighting_Fantasy]]// series began to use numbered passages, several of which might be printed on a single page:
<<<
You hear the sound of running feet approaching rapidly; you cannot yet see who or what is coming. Will you run through the nearest archway (turn to ''17''), or hold your ground and draw your sword (turn to ''30'')?
<html><div align="right">
(Steve Jackson, Talisman of Death)</div></html>
<<<
Using numbers to keep track of what to read next made sense for readers who had to locate the next part of the story themselves. But when hypertext leapt onto computer screens, choices could be made just by clicking underlined text:
<<<
Scholar and showman, Urquhart knew in all his most sensitive bones that __this was the time__. There was a furious logic to this day-after-the-day, a logic he would have recognized even without Tate's nudge and a wink and "my friends around the Beltway" over lunch.
He could feel the timing. He could feel a lot of things. Something had been at work in the world, __some wavefront of rapid change__ only dimly felt but no less powerful for that. The waves passed through everything and everyone, transforming as they went. You only had to __check the mirror__.
<html><div align="right">
(Stuart Moulthrop, Victory Garden)</div></html>
<<<
There have been many names for these individual parts of text that readers navigate through. In this document, we call them passages, a word that both means a section of a written work as well as a route one might pass through. In Twee, these passages are known by their title.
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]Passage titles are case-sensitive, which means that ''This door'' and ''THIS DOOR'' are two different passages.</div></html>
Just as you can tag a passage stylesheet to have its contents treated as CSS style rules, you can use the ''script'' tag to include custom JavaScript in your story. All passages with this tag are executed when the page loads, which you can use as an opportunity to do two things:
*''Perform some initialization''. This passage asks readers what their names are when they first open the story:
<<<
{{{prompt("Hi! What's your name?");}}}
<<<
This example is not particularly useful, but if you are integrating extra JavaScript code into your story, this can be a useful way to do some initialization.
*''Modify how your story will work''. To do this properly requires careful inspection of the [[Twee API|http://gimcrackd.com/etc/api/]], which is outside the scope of this document. As an example, however, this passage forces only one passage to be displayed at a time in the Jonah story template:
<<<
{{{History.prototype.originalDisplay = History.prototype.display;
History.prototype.display = function (title, link, render)
{
if ((render != 'quietly') && (render != 'offscreen'))
removeChildren($('passages'));
this.originalDisplay.apply(this, arguments);
};}}}
<<<
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]The execution order of passages tagged script is not guaranteed.</div></html>
Many choices a reader makes in a story ought to be ''exclusive''. Consider a passage like this:
<<<
R. N. Rupal nods his head and speaks quickly to his assistant in Nepali. Within minutes you have the necessary papers for the expedition, stamped in the proper places with the official seal of the Nepalese government. As you shake hands before leaving, he stops you. "If you are determined to go on your expedition, it could be easier and safer if I come with you."
What should you do? Having a government official along with you might just cause delays and bureaucratic snafus. On the other hand, he could smooth the way.
//If you accept Runal's offer to join you, turn to page 24.//
//If you decline his offer, turn to page 27.//
<html><div align="right">
(R. A. Montgomery, //The Abominable Snowman//)</div></html>
<<<
Obviously, the reader shouldn't be allowed to both bring along R. N. Rupal and leave him behind in the same session. (Of course, he could easily click the ''Rewind to Here'' link and try a different path.) ''The {{{<<choice>>}}} macro allows allows you to lock away paths in your story''. A choice looks exactly like a regular link, but as soon as it's clicked, it disables all the other choices in the same passage. Here's what the source code of the passage above might look like:
<<<
{{{:: Departing
R. N. Rupal nods his head and speaks quickly to his assistant in Nepali. Within minutes you have the necessary papers for the expedition, stamped in the proper places with the official seal of the Nepalese government. As you shake hands before leaving, he stops you. "If you are determined to go on your expedition, it could be easier and safer if I come with you."
What should you do? Having a government official along with you might just cause delays and bureaucratic snafus. On the other hand, he could smooth the way.
* <<choice "Accept his offer">>
* <<choice "Decline politely">>}}}
<<<
The title of the passage the choice links to may be enclosed by either quotation marks (") or single quotes ('), but they must be around the title. When you do this, you identify the title as something called a ''string''. This isn't important yet, but will come into play with more complex code.
If you'd like to display a different name for the choice than the passage's title, you may add it as a quoted phrase after the passage's title.
<<<
{{{* <<choice "Dining with R.N. Rupal" "Accept">>
* <<choice "Dining alone" "Decline">>}}}
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[info.png]] Obviously, the {{{<<choice>>}}} macro doesn't make sense if you're using the [[Sugarcane story template|]]. Readers can easily jump backwards in a story with their browsers' back buttons. If you try to use this macro in a Sugarcane story, it simply creates a normal link.</div></html>
Here's a selection of hypertext stories available for free on the Web, to help you get an idea of the range of the genre, and perhaps inspire some ideas in your own work:
[[Grammatron|http://www.grammatron.com/bandwidth.html]]
Written by Mark Amerika, this hypertext's prose is as sprawling and dizzying as the graphics that accompany it.
[[In the Changing Room|http://wordcircuits.com/gallery/changing/Menu.htm]]
A set of eight stories can be followed linearly to their conclusion, or readers may choose to leap from one to another via hyperlinks.
[[Mansion of Maleficence|http://user.tninet.se/~wcw454p/mansion/mansion.html]]
An online gamebook in the style of Fighting Fantasy.
[[Project Aon|http://www.projectaon.org/]]
Almost all of the gamebooks of the Lone Wolf print series are available online.
[[Six Sex Scenes|http://www.adrienneeisen.com/six_sex_scenes/]]
This hypertext pulls links from each passage to the bottom of the page, separating the text cleanly from reader choices.
[[Techno-Shamans in Texas|http://www.zug.com/scrawl/textrip/]]
Posted in the infancy of the Web by John Hargrave, this is a travelogue in the style of Hunter S. Thompson that uses hyperlinks to draw thematic connections.
[[Victory Garden|http://www.eastgate.com/VG/VGStart.html]] (excerpted)
This is a cutting from Stuart Moulthrop's critically acclaimed hypertext story set in the early days of Operation Desert Storm.
There are two kinds of files that Twine works with: ''story files'', which are editable versions of your stories that you can only open with Twine, and ''output files'', which are read-only versions that can be opened in a Web browser. While you write your story, you make changes to your story file, then check to see what the output file looks like. When you're done, you can post your output file to a Web site or e-mail it to others.
Twine story files have a .tws file extension; output files are saved with a .html extension.
<<<
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[info.png]] If you've worked with Adobe Flash before, the situation is similar to Flash's .fla and .swf formats.</div></html>
<<<
When you start Twine, it presents you with a blank story file. You can use the ''Save Story'' and ''Save Story As'' items in the ''File'' menu to save your work to your computer, and ''Open Story'' to retrieve it later. Twine also keeps track of story files you've recently used in its Open Recent submenu.
To create an output file, choose ''Build Story'' from the ''Story'' menu. This asks you to choose where the output file is saved, and then opens the resulting file in your Web browser so you can see your work. Once you've built an output file once, you can rebuild it in the same place by choosing ''Rebuild Story''. The View Last Build menu item opens the most recent build in your Web browser.
//twee// is designed to take text files you write yourself and generate HTML files from them. This means that you can use any text editor you like to write your story. It's important that you use a text editor, however, that saves to plain text format (.txt). Using a word processor like Word or ~OpenOffice won't work.
The format of a //twee// source code file is very simple:
<<<
{{{:: One Passage}}}
This is the body of a single passage. A passage title is set off by two colons at the start of a line.
You can place line breaks directly in the passage text.
{{{:: A Second Passage [tag1 tag2]}}}
You can leave as much space as you like between passages. Enclose tags with single square brackets on the same line as the passage title, separating them with spaces.
<<<
By convention, twee source files use a .tw file name suffix, but you don't have to follow this. You can save them with a .txt suffix instead, if you like.
Links are the glue between passages. They are the equivalent of being told to turn to another page in a nonlinear book; in gamebooks, for example, you do this to make decisions for the main character. But this isn't the only possible kind of link. Deena Larsen describes a whole taxonomy of links in [[Fundamentals: A Rhetorical Devices for Electronic Literature]].
Links are marked in the text of a passage by two square brackets, {{{[[like this]]}}}. For simplicity's sake, the text between the brackets matches the title of the passage it links to — remember that passage titles are case-sensitive.
It is possible to change what text is shown to the reader for a link, however. This can come in handy if you need to put a capitalized passage title in the middle of a sentence, for example. The format for this kind of link is slightly different: {{{[[displayed text|title of passage]]}}}.
If a story has a broken link in it, it is displayed with a red background in your story, and clicking it shows this message:
<html><div align="center">
//The passage 'The newspaper' doesn't exist.//</div></html>
Finally, you may build links to external sites. These links look like this: {{{[[Google|http://www.google.com/]]}}} You may link to any address that a reader's Web browser will understand.
The basic format of a twee compilation command is very simple, and doesn't differ across platforms.
<<<
{{{twee sourcefile sourcefile2 sourcefile3... > output.html}}}
<<<
You pass it a list of files with source code, and direct its output into an HTML page. There are a few optional switches:
|Switch|Description|Example|h
|-m|Merges changes with an already existing HTML file.|{{{twee -m oldfile.html mysource.tw > newfile.html}}}|
|-r|When coupled with the -m switch, generates an RSS file of recently changed passages.|{{{twee -m oldfile.html -r rss.xml mysource.tw > newfile.html}}}|
|-t|Targets a different platform when creating the output file. If omitted, this targets sugarcane. Other available targets are //jonah, tw// (TiddlyWiki 1) and //tw2// (TiddlyWiki 2.2).|{{{twee -t tw2 mysource.tw > tiddlywiki.html}}}|
Sometimes you'd like two diverging branches of a story to merge back into one. You can already do this with a well-placed link, but you can make the transition seamless with the {{{<<display>>}}} macro. Consider this source code, which paraphrases one of the first scenes of //The Hitchhiker's Guide to the Galaxy//:
<<<
''The world is ending''
{{{The world is about to end -- something about construction of a bypass? -- and you only have time to buy one thing at the pub.
* <<choice "Buy another beer">>
* <<choice "Buy a sandwich">>}}}
''Buy another beer''
{{{Ford had said something about muscle relaxant, and you decide to take him at his word.
<<display 'Vogons begin'>>}}}
''Buy a sandwich''
{{{For some odd reason you've been craving a cheese sandwich all day, and it looks like you won't have a chance to have one anytime soon.
<<display 'Vogons begin'>>}}}
''Vogons begin''
{{{You hear a great rumbling from outside, and rush outside to see what's going on...}}}
<<<
No matter what the reader chooses, the passage "Vogons begin" will be displayed after the text. The {{{<<display>>}}} macro uses the same syntax as the {{{<<choice>>}}} one does.
This example isn't particularly interesting, of course, but you could use {{{<<display>>}}} to merge together several diverging story threads. You can also do clever things like this:
<<<
''Yellow Submarine''
{{{In the town where I was born,
Lived a man who sailed the sea,
And he told us of his life,
In the land of submarines.
So we sailed on to the sun,
Till we found the sea of green,
And we lived beneath the waves,
In our yellow submarine.
<<display "Chorus">>
And our friends are all aboard,
Many more of them live next door,
And the band begins to play.
<<display "Chorus">>
As we live a life of ease,
Everyone of us has all we need,
Sky of blue and sea of green,
In our yellow submarine.
<<display "Chorus">>}}}
''Chorus''
{{{We all live in a yellow submarine,
Yellow submarine, yellow submarine.
We all live in a yellow submarine,
Yellow submarine, yellow submarine.}}}
<<<
This displays the entire lyrics to the Beatles's "Yellow Submarine."
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]''It is possible to lock up a reader's Web browser'' by using the {{{<<display>>}}} macro improperly, like this:
<<<
{{{:: Oops
<<display "Oops">>}}}
<<<
When displayed, the passage will keep attempting to display itself over and over until the reader force quits his Web browser. This doesn't do permanent damage, but it will not endear yourself to your reader.</div></html>
When you edit your story in Twine, most of the window is taken up by your ''story map''. Each passage in your story is shown as a box, with links between passages shown as lines between the boxes.
To gain a broader or narrower view of your story, you can zoom in and out with buttons on the toolbar, or press the + and - keys on your keyboard. As you zoom in, more text of each passage's body is displayed on the map. The ''Zoom to Fit'' button on the toolbar that will automatically zoom the story map so that all passages are visible at once.
You can use the scrollbars on the window to move around the story map, or hold down the space bar and drag the mouse around to quickly pan across your story map.
To add a passage to your story map, click the ''New Passage'' toolbar button or choose ''New Passage'' from the ''Story'' menu. You can also right-click an empty space in the story map to bring up a contextual menu allowing you to create a passage, or middle-click an empty space to immediately create a new passage there.
You can drag your passages in any arrangement you like on your story map; it won't affect what the output file will look like. You can also cut, copy, and paste passages as you would with any other application. To select more than one passage at a time, hold down the Shift key as you click on them, or create a rectangular selection box by dragging your mouse across an empty part of the story map.
<html><div <span class='menubox' style='float:center;margin:0em'<div align="center"><iframe src="http://gimcrackd.com/etc/src/" frameborder="0" width="100%" height="800"></iframe></div></html>
It's possible to write your own macros for use in your stories. Doing so will require knowledge of both ~JavaScript and the Twee API, but fortunately, Twee macros are written in almost the same format as ~TiddlyWiki ones. The [[Tiddlywiki.org|http://tiddlywiki.org/wiki/Dev:Custom_Macros]] documentation can be very useful.
<<<
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]
~TiddlyWiki macros extend the config.macros object; ''Twee macros extend an object named'' macros ''directly''. This is the only difference in how macros are created.</div></html>
<<<
Here's an example passage that creates a macro named {{{<<hello>>}}} that, when invoked in another passage, displays an alert that greets the reader.
<<<
''Hello macro''
{{{macros['hello'] =
{
handler: function()
{
alert('Hi, reader!');
}
}
}}}
''Start''
{{{<<hello>>}}}
<<<
If you're curious how a built-in macro works, browsing the [[source code repository|http://code.google.com/p/twee/source/browse/#svn/trunk]] may be helpful, too.
To edit a passage, you can either double-click it on the story map or select it, then choose ''Edit Passage'' from the ''Story'' menu. (You can open several passages for editing this way.)
The editor window has three main fields: the title of the passage, any tags that it has, and the body text. As you make changes here, the story map will update itself automatically. Close the window when you're done working.
The editor window's ''Passage'' menu contains a list of passages that the one you're editing link to (the ''Outgoing Links'' submenu), other passages that link to this one (Incoming Links), and links from this passage that don't have matching passages (''Broken Links''). Selecting a passage title from these menus will open it if it already exists, or create a new passage with the appropriate title if it doesn't.
To concentrate just on a passage's text, choose ''View Fullscreen'' from the ''Passage'' menu. In the fullscreen view, press the Escape key to close the passage and return to the story map, or press F12 to switch back to the windowed view.
Sometimes you'd like to apply styles to your text — to italicize a book title, for example. You can do this with simple formatting codes that are similar to the double brackets of a link. Here is what's available to you:
|Formatting|Source Code|Appears As|h
|Italics|{{{//text//}}}| //text//|
|Boldface|{{{''text''}}}|''text''|
|Underline|{{{__text__}}}|__text__|
|Subscript|{{{H~~2~~O}}}|H~~2~~O|
|Superscript|{{{meters/second^^2^^}}}|meters/second^^2^^|
|Monospace|{{{{{{text}}}}}}|{{{text}}}|
|Bulleted list|<<tiddler BulletedList1>> |<<tiddler BulletedList2>> |
|Numbered list|<<tiddler NumberedList1>> |<<tiddler NumberedList2>> |
|Horizontal line|{{{----}}} | <<tiddler HorisontalLine>> |
Lists in particular are useful for setting off choices at the end of a passage. Although it feels natural to leave an empty line between a paragraph and a list, this creates extra whitespace that looks a little strange. Here's what it should look like:
<<<
It's a dark and stormy night aboard the Orient Express. You can't sleep; something about the motion of the train disturbed you subtly. So instead you have elected to spend the night in the dining car, sipping coffee and perusing {{{[[the newspaper|The London Times]]}}}.
You hear the door to the car open behind you.
{{{* [[Look up]]}}}
{{{* [[Continue reading]]}}}
<<<
If there's a particular kind of formatting that you'd like to use that isn't supported natively by Twee, you can put HTML source code directly into your story's text by surrounding it with <html> and </html>. This passage, for example, blinks:
<<<
The bomb's timer now reads: {{{<html><blink>5:00</blink></html>}}}. You sure hope that's five hours, not five minutes.
Suppose you're writing a passage like this:
The door opens into a narrow sloping corridor which leads into another chamber. The walls are covered with hieroglyphics, and there are three clay pots standing on top of a stone table. Will you:
<<<
Lift the lid of the white pot? <html><div align="right"> Turn to ''14''</div></html>Lift the lid of the black pot?<html><div align="right">Turn to ''156''</div></html>Lift the lid of the red pot?<html><div align="right">Turn to ''183''</div></html>Walk through the chamber to the archway in the far wall?<html><div align="right">Turn to ''20''</div></html><html>
<div align="right">(Ian Livingstone, //Temple of Terror//)</div></html>
<<<
Lifting the lid of one pot shouldn't preclude the protagonist from lifting the lid of another afterwards — assuming, of course, that the pots don't kill the protagonist (which, unfortunately, they often do in these kinds of gamebooks). The {{{<<actions>>}}} macro shows the reader a list of choices, ''excluding any he has already seen''. You can combine this with the {{{<<display>>}}} macro to implement the passage above:
<<<
''Pot Chamber''
{{{The door opens into a narrow sloping corridor which leads into another chamber. The walls are covered with hieroglyphics, and there are three clay pots standing on top of a stone table.
<<display "Pot actions">>}}}
''Pot actions''
{{{<<actions "Lift the lid of the white pot" "Lift the lid of the black pot" "Lift the lid of the red pot"
"Walk to the archway">>}}}
''Lift the lid of the white pot''
{{{There are chocolates inside! And they're delicious.
<<display "Pot actions">>}}}
''Lift the lid of the black pot''
{{{There's licorice inside. You've never been that much of a fan, but maybe someone you encounter on your quest will like them.
<<display "Pot actions">>}}}
''Lift the lid of the red pot''
{{{It's empty! Looks like someone got here before you did.
<<display "Pot actions">>}}}
''Walk to the archway''
{{You continue on your brave quest...}}}
<<<
The reader can open one, none, or several pots in the room before proceeding onward. Make sure you have at least one choice that does not lead back to the {{{<<actions>>}}} macro. Otherwise, readers won't be able to continue.
1.<html><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5010370&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5010370&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/5010370">Creating A Simple Story</a> from <a href="http://vimeo.com/user1857640">Chris Klimas</a> on <a href="http://vimeo.com">Vimeo</a>.</p></html>
2.<html><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5011133&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5011133&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/5011133">Formatting a Story</a> from <a href="http://vimeo.com/user1857640">Chris Klimas</a> on <a href="http://vimeo.com">Vimeo</a>.</p></html>
3. <html><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5053107&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5053107&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/5053107">Finishing Touches</a> from <a href="http://vimeo.com/user1857640">Chris Klimas</a> on <a href="http://vimeo.com">Vimeo</a>.</p></html>
Before you learn about the rest of the macros available, you need to talk about a new concept called an ''expression''. An expression is a lot like a mathematical formula. When a computer sees an expression, it simplifies it into a single value. This is a very simple expression:
<<<
2 + 2
<<<
When a computer processes it, it results in the number 4. This process is called ''evaluation''. This isn't algebra; everything you start with has to be a known quantity. You can do all the basic mathematical things you'd expect in an expression.
<<<
(1 + 2) * 4 + (3 + 2) / 5
<<<
This expression evaluates to the number 13. The computer follows the normal order of operations in mathematics: first multiplying and dividing, then adding and subtracting. You can group ''subexpressions'' together and force them to be evaluated first with parentheses.
You can also use strings in an expression. As noted before, a string is a bunch of characters strung together, demarcated by either double or single quotes. You can use strings in expressions:
<<<
{{{"Hello" + " " + "sailor"}}}
<<<
This expression pushes the strings together, and evaluates to {{{"Hello sailor"}}}. Notice that a space had to be added between the words; computers aren't smart enough to do that for us. Also, you can only add strings together. You can't subtract them, much less multiply or divide them.
You can print out an expression in a passage using the {{{<<print>>}}} macro. This, for example, shows the number of rounds in a pistol in a roundabout fashion:
<<<
{{{:: You have found a pistol
It's got <<print 2 * 3>> bullets.}}}
<<<
By themselves, expressions are not terribly interesting. The one exception is when you would like to add an element of randomness to your story. You can call a built-in function named Math.random(), which evaluates to a random decimal between 0 and 1. (More documentation on the Math object, which includes basic mathematical functions like sine and absolute values, can be found [[here|http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Math]].) Combine this with {{{Math.round()}}}, which rounds a number to the nearest integer, and you can have a gun with a random number of bullets in it:
<<<
{{{:: You have found a pistol
It's got <<print Math.round(Math.random() * 6)>> bullets.}}}
<<<
You can try working with expressions below. Clicking the button will evaluate what you enter. If it doesn't seem to react, then you've made a mistake in your expression — for example, forgetting to put quotation marks around a string.<br>
<html><input id="evalTest"> <input onclick="document.getElementById('evalResults').innerHTML = 'This expression evaluates to: <code>' + eval(document.getElementById('evalTest').value) + '</code>'" value="Evaluate" type="button"><p id="evalResults"></p> </html>
Sometimes, it can be useful to add information about a passage that isn't visible to readers. ''Tags'' are a way to do this — they function as labels stuck on the side of a passage, visible to you while you are writing your story, but they cannot be seen in the published version of your story.
There are some tags that have special meaning to Twee, and change how your story behaves or appears to your readers. These special tags are described in later sections of this document. You are also free to assign tags to your passages if they help you keep organized. A tag can be any series of letters, numbers, or punctuation without spaces. You can assign as many tags as you like to a passage, as well.
To create a link in a passage, select the text you'd like to use for the link and then choose ''Create Link'', the first item on the ''Passage'' menu. This adds square brackets around the text you've selected, creates a new passage for the link to go to, and opens it for you for editing.
If you've already created a passage to match that text, the menu item will read ''Edit Passage'' instead, and will open the linked passage in a separate window.
If one of your passages contains a broken link — that is, it has a link pointing outward that does not have a matching passage — then an exclamation point emblem will appear on the passage on your story map, to warn you that there is a problem.
To remove a link, just delete the double brackets around the text.
<html><div <span class='menubox' style='float:center;margin:0em'<div align="center"><iframe src="http://groups.google.com/group/tiddlywiki/t/abbdfcab8b2996ab" frameborder="0" width="100%" height="800"></iframe></div></html>
When you publish your story to an HTML file, you can choose between story formats. These story formats control both the basic appearance and behavior of your story, though you can customize both of these via individual changes you make to your story.
There are two main story formats to choose from:
*''Jonah''<br>This displays your story with black text on a white background, and as a reader clicks links in your story, the text expands. A reader can review earlier passages of your story by scrolling upwards. This approach is called stretchtext.
*''Sugarcane''<br>This displays your story with white text on a black background. Readers can only see one passage at a time, though they can use their browsers' back buttons to return to a previous passage, or use a special Rewind menu to jump back to particularly significant passages.
You can switch story formats at any time.
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[info.png]] Both Twine and twee allow you to publish to ~TiddlyWiki format. This is included for backwards compatibility — both Jonah and Sugarcane are based on the ~TiddlyWiki codebase — but don't make for particularly compelling story experiences.
</div></html>
Expressions by themselves aren't much use to your stories. Unless you're writing a mathematical thriller, you probably don't need to evaluate 2 + 2 too often. Where they do come in handy, however, is when ''variables'' enter the picture.
A variable is a place to store a value so that you can remember it later. You can store both strings and numbers in variables. The variable {{{$name}}} might contain the main character's name, "Agatha Christie", or the variable {{{$money}}} might contain the amount of money Agatha has in her pocket — the number 15.75.
Variables have a few restrictions on their names. They must start with a dollar sign. That's called a ''sigil'' — it tells the computer that what's coming next is a variable, not a number or string.
After the initial dollar sign, a variable name can begin with a letter, either uppercase or lowercase, or an underscore (_). After the first letter, you can have any combination of letters, numbers, or underscores. Punctuation and spaces aren't allowed anywhere.
Here are some legitimate variable names:
<<<
{{{$housesDestroyed
$_my_favorite_color
$AN_EXTREMELY_IMPORTANT_NUMBER
$street8
$i
$_}}}
<<<
Some bad variable names:
<<<
{{{$what was it called
$Idon'tRemember
$3.95
I_Forgot_Something_Important
$8thSurprise
$$$make_money_fast$$$}}}
<<<
Variables are a good way to keep track of what a reader has chosen in a story, or to manage some other part of the story state. For example, many gamebooks start off with something like this:
<<<
All you possess is an Axe (note under Weapons on your Action Chart) and a Backpack containing 1 Meal (note under Meals on your Action Chart).<html><div align="right">
(Joe Dever, //Flight from the Dark//)</div></html>
<<<
You can keep track of the number of meals that the protagonist carries with the {{{<<set>>}}} macro, like so:
<<<
{{{All you possess is an Axe and a Backpack containing 1 Meal. <<set $meals = 1>>}}}
<<<
The left side of the equals sign has a single variable, and the expression to set it to is on the right. It's on the same line as the real text of the story so that extra whitespace doesn't appear in the story text.
Later on in the story, you can change the value of a variable with another {{{<<set>>}}} statement.
<<<
{{{You are feeling tired and hungry and you must stop to eat. <<set $meals = $meals - 1>>}}}
<<<
Notice how the same variable was used in the expression to decrease the number of meals by 1.
If you make a mistake with {{{<<set>>}}}, a pink highlighted message will appear where you invoked it. Here's a sample error message, in this case forgetting the sigil before the variable {{{$meals}}}:
<<<
@@bgcolor(#ff6666):bad expression: meals is not defined@@
<<<
Variables are reset every time the reader restarts a story. If you'd like to remember the value of a variable permanently, use the {{{<<remember>>}}} macro. It works exactly the same way as {{{<<set>>}}}, only it stores the variable in a browser cookie that remains between sessions.
<<<
{{{At long last, you have escaped the dungeons. <<remember $escapes = $escapes + 1>>
So far, you have escaped the dungeons <<print $escapes>> times.}}}
<<<
If you are only interested in remembering the current state of a variable, you don't need to include an assignment:
<<<
{{{<<remember $meals>>}}}
<<<
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]Since readers can't reset the value of a {{{<<remember>>}}}ed variable themselves, the macro should be used carefully.</div></html>
To change the format of your story, simply choose the one you'd like from the ''Story Format'' submenu of your story map's ''Story'' menu. You'll need to rebuild your story to see this change.
Variables can be very handy, but they would be much more useful if they could directly affect the text the reader sees. Consider a passage like this:
<<<
You return to Selator's hut. A merry fire is crackling in the kitchen, and something is cooking that smells delicious. He greets you warmly and asks, "Have you got the berry?" If you have got the purple berry of the Antherica plant, turn to ''175''. If not, turn to ''52''.<html><div align="right">
(Steve Jackson and Ian Livingstone, //Scorpion Swamp//)</div></html>
<<<
It would be nice if the story could track whether the protagonist found the berry or not, and branch accordingly. In order to do this, we need to use ''conditions''. A condition is a kind of expression that evaluates to either true or false. We can use these truth values directly to indicate whether the protagonist found the berries:
<<<
{{{You have no doubt, from Selator's description, that you have found the Antherica plant. Half your mission is completed. Now you must return to the village with the precious berry. <<set $foundBerry = true>>}}}
<<<
Then we can use the {{{<<if>>}}} macro to display a passage indicating victory:
<<<
{{{You return to Selator's hut. A merry fire is crackling in the kitchen, and something is cooking that smells delicious. He greets you warmly and asks, "Have you got the berry?"
<<if $foundBerry>>
"Wonderful!" he exclaims...
<<endif>>}}}
<<<
Anything in between the initial {{{<<if>>}}} and {{{<<endif>>}}} is displayed if the condition is true. You may also include macros inside {{{<<if>>}}} statements, so we could display a longer victory message this way:
<<<
{{{You return to Selator's hut. A merry fire is crackling in the kitchen, and something is cooking that smells delicious. He greets you warmly and asks, "Have you got the berry?"
<<if $foundBerry>>
<<display "Victory">>
<<endif>>}}}
<<<
Our only remaining issue is that if the reader hasn't found the berry, nothing is displayed at all. To remedy this, we can use an {{{<<else>>}}} clause like this:
<<<
{{{You return to Selator's hut. A merry fire is crackling in the kitchen, and something is cooking that smells delicious. He greets you warmly and asks, "Have you got the berry?"
<<if $foundBerry>>
<<display "Victory">>
<<else>>
"That's too bad," he says. "I had such high hopes for you..."
<<endif>>}}}
<<<
{{{<<else>>}}} clauses do the exact opposite as {{{<<if>>}}} ones; they are only displayed if the condition is false. In either case, it's important to remember the {{{<<endif>>}}} at the end; otherwise, it won't be clear where the story should resume.
Let's revisit the example of meals from the previous section. We had this passage:
<<<
{{{You are feeling tired and hungry and you must stop to eat. <<set $meals = $meals - 1>>}}}
<<<
Obviously, if the protagonist doesn't have any meals left, they can't eat. Let's fix this with {{{<<if>>}}}.
<<<
{{{You are feeling tired and hungry and you must stop to eat.
<<if $meals eq 0>>
<<display "Dying of hunger">>
<<else>>
You continue on your journey... <<set $meals = $meals - 1>>
<<endif>>}}}
<<<
{{{<eq>}}} is a ''logical operator'' that's short for 'equals.' Just like + adds two numbers together, eq compares two things together and returns whether they are identical. It works equally well with strings and numbers, but beware — the string "2" is not equal to the number 2.
There are several logical operators available:
|Operator|Function|Example|h
|eq|Evaluates to true if both sides are equal.|{{{$bullets eq 5}}}|
|neq|Evaluates to true if both sides are not equal.|{{{$friends neq $enemies}}}|
|gt|Evaluates to true if the left side is greater than the right side.|{{{$money gt 3.75}}}|
|gte|Evaluates to true if the left side is greater than or equal to the right side.|{{{$apples gte $carrots + 5}}}|
|lt|Evaluates to true if the left side is less than the right side.|{{{$shoes lt $people * 2}}}|
|lte|Evaluates to true if the left side is less than or equal to the right side.|{{{65 lte $age}}}|
|and|Evaluates to true if both sides evaluates to true.|{{{$hasFriends and $hasFamily}}}|
|or|Evaluates to true if either side is true.|{{{$boy or $girl}}}|
|not|Flips a true value to a false value, and vice versa.|{{{(not $hungry) or ($location eq "restaurant")}}}|
Conditions can quickly become complicated. The best way to keep things straight is to use parentheses to group things:
<<<
{{{<<if ($master eq 'Selator') and ($foundBerry)>>
The walk back to the village is a happy one...
<<else>>
Well, you may not have succeeded in your mission, but at least you're alive...
<<endif>>}}}
<<<
To create an output file for your story that is readable in a Web browser, choose ''Build Story'' from your story map window's ''Story'' menu. This prompts you to choose where to save your finished story; make sure to give the file a .html file extension. After you've saved your output file, Twine will open it for you in your Web browser.
Once you've build your story once, you can quickly rebuild it to reflect changes you've made by choosing ''Rebuild Story'' from the ''Story'' menu. For ease of access, this menu item also appears in the ''Passage'' menu of passage editing windows. Keep in mind that you'll need to reload your output story in your Web browser once you rebuild it. If you lose track of the file, the ''View Last Build'' menu item will open it your browser once more.
To check how long your story has become, choose ''Story Statistics'' from the ''Story'' menu. This counts how many words, passages, and links your story contains. It also displays how many broken links there are, so you can do a final check to make sure your story is complete.
You can generate an RTF version of your story suitable for proofreading by choosing ''Export Proofing Copy'' from the ''File'' menu. This compiles all of your passages into a single document that can be opened up in a word processor like Word or OpenOffice.
There are certain passage names that have special meaning, and let you make your stories look more polished. The most important is Start. It is the first passage displayed when your story is first loaded by a reader.
The first is ''~StoryTitle'', which sets your story's title. The other two are ''~StorySubtitle'', which lets you enter a brief subhead under the story, and ''~StoryAuthor'', which sets a byline.
Finally, the ''~StoryMenu'' passage lets you add items to the the menu that hovers in the upper-right corner of the page in the Jonah story format, or on the left side of the page in the Sugarcane story format. You can link directly to passages in your story from this menu.
<<<
About the Author
P.F. Wossname is a pseudonym used in this example. He or she currently resides in Walla Walla, Washington.
''~StoryMenu''
{{{[[About the Author]]}}}
<<<
Take care with the length of your menu items. A link will be displayed on a single line, even if it means that it will overlap your story's text.
<html><div <span class='menubox' style='float:center;margin:1em'<div align="left">
[img[caution.png]]
It's important that these passages' names are spelled and capitalized properly.
</div></html>
There are two applications for creating stories with Twee. Both have almost identical capabilities; they differ only in the interface you use to create a story.
''Twine'' provides a visual interface, where you can see a map of your story and easily visualize connections between passages. It includes an integrated text editor for editing passages. Most people will want to use Twine.
//''twee''// is meant to be run from the command line, after you write specially-formatted text files with the text editor of your choice. If you already are comfortable with a specific text editor or development environment, twee is a better choice for you. Creating stories with twee can also be automated or included in other scripts much more easily than Twine can.
In some cases, you'll want to do several things with macros at once. For example, in this passage from the previous section:
<<<
All you possess is an Axe (note under Weapons on your Action Chart) and a Backpack containing 1 Meal (note under Meals on your Action Chart).
<html><div align="right">(Joe Dever, //Flight from the Dark//)</div></html>
<<<
You'd probably want to set both the protagonist's weapon and number of meals. You can do this without any extraneous whitespace appearing in your story by putting all the {{{<<set>>}}} statements on the same line:
<<<
{{{All you possess is an Axe and a Backpack containing 1 Meal. <<set $meals = 1>> <<set $weapon = "axe">>}}}
<<<
This is not particularly readable, however. The {{{<<silently>>}}} macro can help in these situations, like so:
<<<
{{{All you possess is an Axe and a Backpack containing 1 Meal. <<silently>>
<<set $meals = 1>>
<<set $weapon = "axe">>
<<endsilently>>}}}
<<<
Everything between {{{<<silently>>}}} and {{{<<endsilently>>}}} is run, but nothing is displayed.
/***
|''Name:''|AccordionMenuPlugin|
|''Description:''|Turn an unordered list into an accordion style menu|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#AccordionMenuPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''|03/11/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.5|
!!Usage:
* put {{{<<accordion>>}}} on the line after your unordered list
!!Customizing:
* customize the css via the shadow tiddler StyleSheetAccordionMenuPlugin
* or give the list a custom class by passing the classes as parameters to the macro.
** Eg: {{{<<accordion ClassName1 ClassName2>>}}}
!!Examples:
*[[AccordionMenuPluginDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.accordion={
dropchar : " \u00BB",
handler : function(place,macroName,params,wikifier,paramString,tiddler){
list = findRelated(place.lastChild,"UL","tagName","previousSibling");
if (!list)
return;
addClass(list,"accordion");
if (params.length){
addClass(list,paramString);
}
this.fixLinks(list.childNodes);
},
fixLinks : function(els){
for (var i=0; i<els.length; i++){
if(els[i].tagName.toLowerCase()=="li"){
var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");
if(!link){
var ih = els[i].firstChild.data;
els[i].removeChild(els[i].firstChild);
link = createTiddlyElement(null,"a",null,null,ih+this.dropchar,{href:"javascript:;"});
els[i].insertBefore(link,els[i].firstChild);
}
else{
link.firstChild.data = link.firstChild.data + this.dropchar;
removeClass(link,"tiddlyLinkNonExisting");
}
link.onclick = this.show;
}
}
},
show : function(e){
var list = this.parentNode.parentNode;
var els = list.childNodes;
for (var i=0; i<els.length; i++){
removeClass(els[i],"accordion-active");
}
addClass(this.parentNode,"accordion-active");
}
};
config.shadowTiddlers["StyleSheetAccordionMenuPlugin"] = "/*{{{*/\n"+
"ul.accordion, ul.accordion li, ul.accordion li ul {margin:0; padding:0; list-style-type:none;text-align:left;}\n"+
"ul.accordion li ul {display:none;}\n"+
"ul.accordion li.accordion-active ul {display:block;}\n"+
"\n"+
"ul.accordion li.accordion-active a {cursor:default;}\n"+
"ul.accordion li.accordion-active ul li a{cursor:pointer;}\n"+
"\n"+
"ul.accordion a {display:block; padding:0.5em;}\n"+
"ul.accordion li a.tiddlyLink, ul.accordion li a.tiddlyLinkNonExisting, ul.accordion li a {font-weight:bold;}\n"+
"ul.accordion li a {background:#0066aa; color:#FFF; border-bottom:1px solid #fff;}\n"+
"ul.accordion li.accordion-active a, ul.accordion li a:hover {background:#00558F;color:#FFF;}\n"+
"\n"+
"ul.accordion li ul li{display:inline-block;overflow:hidden;}\n"+
"ul.accordion li.accordion-active ul li {background:#eff3fa; color:#000; padding:0em;}\n"+
"ul.accordion li.accordion-active ul li div {padding:1em 1.5em; background:#eff3fa;}\n"+
"ul.accordion li.accordion-active ul a{background:#eff3fa; color:#000; padding:0.5em 0.5em 0.5em 1.0em;border:none;}\n"+
"ul.accordion li.accordion-active ul a:hover {background:#e0e8f5; color:#000;}\n" +
"/*}}}*/";
store.addNotification("StyleSheetAccordionMenuPlugin",refreshStyles);
//!END-PLUGIN-CODE
// %/
@@display:none;clear:both;@@
''Creating a navigation menu using the AccordionMenuPlugin is as simple as:''
# writing a two level unordered list using ~TiddlyWiki syntax
# and placing {{{<<accordion>>}}} on the line after it.
Example:
{{{
* Section 1
** [[Link1]]
** [[Link2]]
** [[Link3]]
*Section 2
** [[Link4]]
** [[Link5]]
** [[Link6]]
*Section 3
**[[Link7]]
**[[Link8]]
**[[Link9]]
<<accordion>>
}}}
gives:
* Section 1
** [[Link1]]
** [[Link2]]
** [[Link3]]
*Section 2
** [[Link4]]
** [[Link5]]
** [[Link6]]
*Section 3
**[[Link7]]
**[[Link8]]
**[[Link9]]
<<accordion>>
''The AccordionMenuPlugin was written with navigation menu's in mind but can be put to other uses as well. ''
By wrapping the content in a DIV, you can have multi-line content as well. Example:
{{{
* [[section1]]
**{{myclass{
Praesent posuere sodales tortor. Mauris ut erat non lacus semper porta. Mauris enim.
Phasellus tempor, metus ut dapibus lobortis, leo magna ornare metus, et pellentesque neque massa eget turpis.
Proin nec tellus. Donec aliquet.
Nullam sed leo bibendum justo rutrum rhoncus.}}}
* section2
**{{myclass{
Donec rhoncus sem eget urna.
Aenean tempor dolor vitae nisi.
Donec leo urna, placerat porttitor, auctor ut, volutpat a, purus,
Etiam eu sapien id nulla malesuada scelerisque.
Maecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}
* section3
**{{myclass{
Donec rhoncus sem eget urna.
Aenean tempor dolor vitae nisi.
Donec leo urna, placerat porttitor, auctor ut, volutpat a, purus,
Etiam eu sapien id nulla malesuada scelerisque.
Maecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}
}}}
gives you:
* [[section1]]
**{{myclass{
Praesent posuere sodales tortor. Mauris ut erat non lacus semper porta. Mauris enim.
Phasellus tempor, metus ut dapibus lobortis, leo magna ornare metus, et pellentesque neque massa eget turpis.
Proin nec tellus. Donec aliquet.
Nullam sed leo bibendum justo rutrum rhoncus.}}}
* section2
**{{myclass{
Donec rhoncus sem eget urna.
Aenean tempor dolor vitae nisi.
Donec leo urna, placerat porttitor, auctor ut, volutpat a, purus,
Etiam eu sapien id nulla malesuada scelerisque.
Maecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}
* section3
**{{myclass{
Donec rhoncus sem eget urna.
Aenean tempor dolor vitae nisi.
Donec leo urna, placerat porttitor, auctor ut, volutpat a, purus,
Etiam eu sapien id nulla malesuada scelerisque.
Maecenas rhoncus, nibh ut aliquam consequat, mi odio luctus sem, eu lobortis dolor neque nec lectus. }}}
<<accordion>>
text/plain
.txt .text .js .vbs .asp .cgi .pl
----
text/html
.htm .html .hta .htx .mht
----
text/comma-separated-values
.csv
----
text/javascript
.js
----
text/css
.css
----
text/xml
.xml .xsl .xslt
----
image/gif
.gif
----
image/jpeg
.jpg .jpe .jpeg
----
image/png
.png
----
image/bmp
.bmp
----
image/tiff
.tif .tiff
----
audio/basic
.au .snd
----
audio/wav
.wav
----
audio/x-pn-realaudio
.ra .rm .ram
----
audio/x-midi
.mid .midi
----
audio/mp3
.mp3
----
audio/m3u
.m3u
----
video/x-ms-asf
.asf
----
video/avi
.avi
----
video/mpeg
.mpg .mpeg
----
video/quicktime
.qt .mov .qtvr
----
application/pdf
.pdf
----
application/rtf
.rtf
----
application/postscript
.ai .eps .ps
----
application/wordperfect
.wpd
----
application/mswrite
.wri
----
application/msexcel
.xls .xls3 .xls4 .xls5 .xlw
----
application/msword
.doc
----
application/mspowerpoint
.ppt .pps
----
application/x-director
.swa
----
application/x-shockwave-flash
.swf
----
application/x-zip-compressed
.zip
----
application/x-gzip
.gz
----
application/x-rar-compressed
.rar
----
application/octet-stream
.com .exe .dll .ocx
----
application/java-archive
.jar
/***
|Name|AttachFilePlugin|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|AttachFilePluginFormatters, AttachFileMIMETypes|
|Description|Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage|
Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content.
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
!!!!!Documentation
>see [[AttachFilePluginInfo]]
!!!!!Inline interface (live)
>see [[AttachFile]] (shadow tiddler)
><<tiddler AttachFile>>
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
|please see [[AttachFilePluginInfo]] for additional revision details|
2005.07.20 [1.0.0] Initial Release
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePlugin= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};
// shadow tiddler
config.shadowTiddlers.AttachFile="<<attach inline>>";
// add 'attach' backstage task (insert before built-in 'importTask')
if (config.tasks) { // for TW2.2b or above
config.tasks.attachTask = {
text: "attach",
tooltip: "Attach a binary file as a tiddler",
content: "<<attach inline>>"
}
config.backstageTasks.splice(config.backstageTasks.indexOf("importTask"),0,"attachTask");
}
config.macros.attach = {
// // lingo
//{{{
label: "attach file",
tooltip: "Attach a file to this document",
linkTooltip: "Attachment: ",
typeList: "AttachFileMIMETypes",
titlePrompt: " enter tiddler title...",
MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",
localPrompt: " enter local path/filename...",
URLPrompt: " enter remote URL...",
tiddlerErr: "Please enter a tiddler title",
sourceErr: "Please enter a source path/filename",
storageErr: "Please select a storage method: embedded, local or remote",
MIMEErr: "Unrecognized file format. Please select a MIME type",
localErr: "Please enter a local path/filename",
URLErr: "Please enter a remote URL",
fileErr: "Invalid path/file or file not found",
tiddlerFormat: '!usage\n{{{%0}}}\n%0\n!notes\n%1\n!type\n%2\n!file\n%3\n!url\n%4\n!data\n%5\n',
//}}}
// // macro definition
//{{{
handler:
function(place,macroName,params) {
if (params && !params[0])
{ createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }
var id=params.shift();
this.createAttachPanel(place,id+"_attachPanel",params);
document.getElementById(id+"_attachPanel").style.position="static";
document.getElementById(id+"_attachPanel").style.display="block";
},
//}}}
//{{{
createAttachPanel:
function(place,panel_id,params) {
if (!panel_id || !panel_id.length) var panel_id="_attachPanel";
// remove existing panel (if any)
var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);
// set styles for this panel
setStylesheet(this.css,"attachPanel");
// create new panel
var title=""; if (params && params[0]) title=params.shift();
var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types
panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);
var html=this.html.replace(/%id%/g,panel_id);
html=html.replace(/%title%/g,title);
html=html.replace(/%disabled%/g,title.length?"disabled":"");
html=html.replace(/%IEdisabled%/g,config.browser.isIE?"disabled":"");
html=html.replace(/%types%/g,types);
panel.innerHTML=html;
if (config.browser.isGecko) { // FF3 FIXUP
document.getElementById("attachSource").style.display="none";
document.getElementById("attachFixPanel").style.display="block";
}
return panel;
},
//}}}
//{{{
toggleAttachPanel:
function (e) {
if (!e) var e = window.event;
var parent=resolveTarget(e).parentNode;
var panel = document.getElementById("_attachPanel");
if (panel==undefined || panel.parentNode!=parent)
panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");
var isOpen = panel.style.display=="block";
if(config.options.chkAnimate)
anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
else
panel.style.display = isOpen ? "none" : "block" ;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
},
//}}}
//{{{
formatListOptions:
function(text) {
if (!text || !text.trim().length) return "";
// get MIME list content from text
var parts=text.split("\n----\n");
var out="";
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var label=lines.shift(); // 1st line=display text
var value=lines.shift(); // 2nd line=item value
out +='<option value="%1">%0</option>'.format([label,value]);
}
return out;
},
//}}}
// // interface definition
//{{{
css:
".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\
background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em; text-align:left }\
.attachPanel form { display:inline;border:0;padding:0;margin:0; }\
.attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\
.attachPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
.attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\
.attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\
.attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\
.attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; \
-moz-border-radius:5px;-webkit-border-radius:5px; }\
.attachPanel .chk { width:auto;border:0; }\
.attachPanel .btn { width:auto; }\
.attachPanel .btn2 { width:49%; }\
",
//}}}
//{{{
html:
'<form>\
attach from source file\
<input type="file" id="attachSource" name="source" size="56"\
onChange="config.macros.attach.onChangeSource(this)">\
<div id="attachFixPanel" style="display:none"><!-- FF3 FIXUP -->\
<input type="text" id="attachFixSource" style="width:90%"\
title="Enter a path/file to attach"\
onChange="config.macros.attach.onChangeSource(this);">\
<input type="button" style="width:7%" value="..."\
title="Enter a path/file to attach"\
onClick="config.macros.attach.askForFilename(document.getElementById(\'attachFixSource\'));">\
</div><!--end FF3 FIXUP-->\
<div class="box">\
<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
embed data <input type=checkbox class=chk name="useData" %IEdisabled% \
onclick="if (!this.form.MIMEType.value.length)\
this.form.MIMEType.selectedIndex=this.checked?1:0; "> \
</td><td style="border:0">\
<select size=1 name="MIMEType" \
onchange="this.title=this.value; if (this.value==\'editlist\')\
{ this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\
<option value=""></option>\
%types%\
</select>\
</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
local link <input type=checkbox class=chk name="useLocal"\
onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\'\';"> \
</td><td style="border:0">\
<input type=text name="local" size=15 autocomplete=off value=""\
onchange="this.form.useLocal.checked=this.value.length" \
onkeyup="this.form.useLocal.checked=this.value.length" \
onfocus="if (!this.value.length) this.value=config.macros.attach.localPrompt; this.select()">\
</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
remote link <input type=checkbox class=chk name="useURL"\
onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\'\';\"> \
</td><td style="border:0">\
<input type=text name="URL" size=15 autocomplete=off value=""\
onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\
onchange="this.form.useURL.checked=this.value.length;"\
onkeyup="this.form.useURL.checked=this.value.length;">\
</td></tr></table>\
</div>\
<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;vertical-align:top;width:1%;white-space:nowrap">\
notes \
</td><td style="border:0" colspan=2>\
<textarea name="notes" style="width:98%;height:3.5em;margin-bottom:2px"></textarea>\
</td><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
attach as \
</td><td style="border:0" colspan=2>\
<input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\
onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\
onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\
</td></tr></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
add tags \
</td><td style="border:0">\
<input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\
</td><td style="width:40%;text-align:right;border:0">\
<input type=button class=btn2 value="attach"\
onclick="config.macros.attach.onClickAttach(this)"><!--\
--><input type=button class=btn2 value="close"\
onclick="var panel=document.getElementById(\'%id%\'); if (panel) panel.parentNode.removeChild(panel);">\
</td></tr></table>\
</form>',
//}}}
// // control processing
//{{{
onChangeSource:
function(here) {
var form=here.form;
var list=form.MIMEType;
var theFilename = here.value;
var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();
// if theFilename is in current document folder, remove path prefix and use relative reference
var h=document.location.href; folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
if (theFilename.substr(0,folder.length)==folder) theFilename='./'+theFilename.substr(folder.length);
else theFilename='file:///'+theFilename; // otherwise, use absolute reference
theFilename=theFilename.replace(/\\/g,"/"); // fixup: change \ to /
form.useLocal.checked = true;
form.local.value = theFilename;
form.useData.checked = !form.useData.disabled;
list.selectedIndex=1;
for (var i=0; i<list.options.length; i++) // find matching MIME type
if (list.options[i].value.indexOf(theExtension)!=-1) { list.selectedIndex = i; break; }
if (!form.tiddlertitle.disabled)
form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename
},
//}}}
//{{{
onClickAttach:
function (here) {
clearMessage();
// get input values
var form=here.form;
var src=form.source; if (config.browser.isGecko) src=document.getElementById("attachFixSource");
src=src.value!=src.defaultValue?src.value:"";
var when=(new Date()).formatString(config.macros.timeline.dateFormat);
var title=form.tiddlertitle.value;
var local = form.local.value!=form.local.defaultValue?form.local.value:"";
var url = form.URL.value!=form.URL.defaultValue?form.URL.value:"";
var notes = form.notes.value;
var tags = "attachment excludeMissing "+form.tags.value;
var useData=form.useData.checked;
var useLocal=form.useLocal.checked;
var useURL=form.useURL.checked;
var mimetype = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";
// validate checkboxes and get filename
if (useData) {
if (src.length) { if (!theLocation) var theLocation=src; }
else { alert(this.sourceErr); src.focus(); return false; }
}
if (useLocal) {
if (local.length) { if (!theLocation) var theLocation = local; }
else { alert(this.localErr); form.local.focus(); return false; }
}
if (useURL) {
if (url.length) { if (!theLocation) var theLocation = url; }
else { alert(this.URLErr); form.URL.focus(); return false; }
}
if (!(useData||useLocal||useURL))
{ form.useData.focus(); alert(this.storageErr); return false; }
if (!theLocation)
{ src.focus(); alert(this.sourceErr); return false; }
if (!title || !title.trim().length || title==this.titlePrompt)
{ form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }
// if not already selected, determine MIME type based on filename extension (if any)
if (useData && !mimetype.length && theLocation.lastIndexOf('.')!=-1) {
var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();
var theList=form.MIMEType;
for (var i=0; i<theList.options.length; i++)
if (theList.options[i].value.indexOf(theExt)!=-1)
{ var mimetype=theList.options[i].text; theList.selectedIndex=i; break; }
}
// attach the file
return this.createAttachmentTiddler(src, when, notes, tags, title,
useData, useLocal, useURL, local, url, mimetype);
},
getMIMEType:
function(src,def) {
var ext = src.substr(src.lastIndexOf('.')).toLowerCase();
var list=store.getTiddlerText(this.typeList);
if (!list || !list.trim().length) return def;
// get MIME list content from tiddler
var parts=list.split("\n----\n");
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var mime=lines.shift(); // 1st line=MIME type
var match=lines.shift(); // 2nd line=matching extensions
if (match.indexOf(ext)!=-1) return mime;
}
return def;
},
createAttachmentTiddler:
function (src, when, notes, tags, title, useData, useLocal, useURL, local, url, mimetype, noshow) {
if (useData) { // encode the data
if (!mimetype.length) {
alert(this.MIMEErr);
form.MIMEType.selectedIndex=1; form.MIMEType.focus();
return false;
}
var d = this.readFile(src); if (!d) { return false; }
displayMessage('encoding '+src);
var encoded = this.encodeBase64(d);
displayMessage('file size='+d.length+' bytes, encoded size='+encoded.length+' bytes');
}
var usage=(mimetype.substr(0,5)=="image"?'[img[%0]]':'[[%0|%0]]').format([title]);
var theText=this.tiddlerFormat.format([
usage, notes.length?notes:'//none//', mimetype,
useLocal?local.replace(/\\/g,'/'):'', useURL?url:'',
useData?('data:'+mimetype+';base64,'+encoded):'' ]);
store.saveTiddler(title,title,theText,config.options.txtUserName,new Date(),tags);
var panel=document.getElementById("attachPanel"); if (panel) panel.style.display="none";
if (!noshow) { story.displayTiddler(null,title); story.refreshTiddler(title,null,true); }
displayMessage('attached "'+title+'"');
return true;
},
//}}}
// // base64 conversion
//{{{
encodeBase64:
function (d) {
if (!d) return null;
// encode as base64
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var out="";
var chr1,chr2,chr3="";
var enc1,enc2,enc3,enc4="";
for (var count=0,i=0; i<d.length; ) {
chr1=d.charCodeAt(i++);
chr2=d.charCodeAt(i++);
chr3=d.charCodeAt(i++);
enc1=chr1 >> 2;
enc2=((chr1 & 3) << 4) | (chr2 >> 4);
enc3=((chr2 & 15) << 2) | (chr3 >> 6);
enc4=chr3 & 63;
if (isNaN(chr2)) enc3=enc4=64;
else if (isNaN(chr3)) enc4=64;
out+=keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);
chr1=chr2=chr3=enc1=enc2=enc3=enc4="";
}
return out;
},
decodeBase64: function(input) {
var out="";
var chr1,chr2,chr3;
var enc1,enc2,enc3,enc4;
var i = 0;
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
input=input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
do {
enc1=keyStr.indexOf(input.charAt(i++));
enc2=keyStr.indexOf(input.charAt(i++));
enc3=keyStr.indexOf(input.charAt(i++));
enc4=keyStr.indexOf(input.charAt(i++));
chr1=(enc1 << 2) | (enc2 >> 4);
chr2=((enc2 & 15) << 4) | (enc3 >> 2);
chr3=((enc3 & 3) << 6) | enc4;
out=out+String.fromCharCode(chr1);
if (enc3!=64) out=out+String.fromCharCode(chr2);
if (enc4!=64) out=out+String.fromCharCode(chr3);
} while (i<input.length);
return out;
},
//}}}
// // I/O functions
//{{{
readFile: // read local BINARY file data
function(filePath) {
if(!window.Components) { return null; }
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
catch(e) { alert("access denied: "+filePath); return null; }
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try { file.initWithPath(filePath); } catch(e) { alert("cannot read file - invalid path: "+filePath); return null; }
if (!file.exists()) { alert("cannot read file - not found: "+filePath); return null; }
var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
inputStream.init(file, 0x01, 00004, null);
var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
bInputStream.setInputStream(inputStream);
return(bInputStream.readBytes(inputStream.available()));
},
//}}}
//{{{
writeFile:
function(filepath,data) {
// TBD: decode base64 and write BINARY data to specified local path/filename
return(false);
},
//}}}
//{{{
askForFilename: // for FF3 fixup
function(target) {
var msg=config.messages.selectFile;
if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
// get local path for current document
var path=getLocalPath(document.location.href);
var p=path.lastIndexOf("/"); if (p==-1) p=path.lastIndexOf("\\"); // Unix or Windows
if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
var file=""
var result=window.mozAskForFilename(msg,path,file,true); // FF3 FIXUP ONLY
if (target && result.length) // set target field and trigger handling
{ target.value=result; target.onchange(); }
return result;
}
};
//}}}
//{{{
if (window.mozAskForFilename===undefined) { // also defined by CoreTweaks (for ticket #604)
window.mozAskForFilename=function(msg,path,file,mustExist) {
if(!window.Components) return false;
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel)
var result=picker.file.persistentDescriptor;
}
catch(ex) { displayMessage(ex.toString()); }
return result;
}
}
//}}}
/***
|Name|AttachFilePluginFormatters|
|Source|http://www.TiddlyTools.com/#AttachFilePluginFormatters|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1.3|
|Type|plugin|
|Requires||
|Overrides|'image' and 'prettyLink' formatters, TiddlyWiki.prototype.getRecursiveTiddlerText|
|Description|run-time library for displaying attachment tiddlers|
This plugin provides "stand-alone" processing for //rendering// attachment tiddlers created by [[AttachFilePlugin]]. Attachment tiddlers are tagged with<<tag attachment>>and contain binary file content (e.g., jpg, gif, pdf, mp3, etc.) that has been stored directly as base64 text-encoded data or can be loaded from external files stored on a local filesystem or remote web server.
NOTE: This plugin does not include the "control panel" and supporting functions needed to //create// new attachment tiddlers. Those features are provided by [[AttachFilePlugin]], which can be installed while building your document, and then safely omitted to reduce the overall file size when you publish your finished document (assuming you don't intend to create any additional attachment tiddlers in that document)
!!!!!Formatters
<<<
This plugin extends the behavior of the following TiddlyWiki core "wikify()" formatters:
* embedded images: {{{[img[tooltip|image]]}}}
* linked embedded images: {{{[img[tooltip|image][link]]}}}
* external/"pretty" links: {{{[[label|link]]}}}
''Please refer to AttachFilePlugin (source: http://www.TiddlyTools.com/#AttachFilePlugin) for additional information.''
<<<
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.29 [3.7.0] more code reduction: removed upload handling from AttachFilePlugin (saves ~7K!)
2007.10.28 [3.6.0] removed duplicate formatter code from AttachFilePlugin (saves ~10K!) and updated documentation accordingly. This plugin ([[AttachFilePluginFormatters]]) is now //''required''// in order to display attached images/binary files within tiddler content.
2006.05.20 [3.4.0] through 2007.03.01 [3.5.3] sync with AttachFilePlugin
2006.05.13 [3.2.0] created from AttachFilePlugin v3.2.0
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePluginFormatters= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};
//}}}
//{{{
if (config.macros.attach==undefined) config.macros.attach= { };
//}}}
//{{{
if (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {
var tiddler = store.getTiddler(title);
if (tiddler==undefined || tiddler.tags==undefined) return false;
return (tiddler.tags.indexOf("attachment")!=-1);
}
//}}}
//{{{
// test for local file existence - returns true/false without visible error display
if (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(f) {
if(window.Components) { // MOZ
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
catch(e) { return false; } // security access denied
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try { file.initWithPath(f); }
catch(e) { return false; } // invalid directory
return file.exists();
}
else { // IE
var fso = new ActiveXObject("Scripting.FileSystemObject");
return fso.FileExists(f);
}
}
//}}}
//{{{
if (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {
// extract embedded data, local and remote links (if any)
var text=store.getTiddlerText(title,'');
var embedded=store.getTiddlerText(title+'##data','').trim();
var locallink=store.getTiddlerText(title+'##file','').trim();
var remotelink=store.getTiddlerText(title+'##url','').trim();
// backward-compatibility for older attachments (pre 4.0.0)
var startmarker="---BEGIN_DATA---\n";
var endmarker="\n---END_DATA---";
var pos=0; var endpos=0;
if ((pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1)
embedded="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\n/g,'');
if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1)
locallink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));
if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1)
remotelink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));
// if there is a data: URI defined (not supported by IE)
if (embedded.length && !config.browser.isIE) return embedded;
// document is being served remotely... use remote URL (if any) (avoids security alert)
if (remotelink.length && document.location.protocol!="file:")
return remotelink;
// local link only... return link without checking file existence (avoids security alert)
if (locallink.length && !remotelink.length)
return locallink;
// local link, check for file exist... use local link if found
if (locallink.length) {
locallink=locallink.replace(/^\.[\/\\]/,''); // strip leading './' or '.\' (if any)
if (this.fileExists(getLocalPath(locallink))) return locallink;
// maybe local link is relative... add path from current document and try again
var pathPrefix=document.location.href; // get current document path and trim off filename
var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\\");
if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
if (this.fileExists(getLocalPath(pathPrefix+locallink))) return locallink;
}
// no embedded data, no local (or not found), fallback to remote URL (if any)
if (remotelink.length) return remotelink;
// attachment URL doesn't resolve, just return input as is
return title;
}
//}}}
//{{{
if (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {
if (this.initialized) return;
// find the formatter for "image" and replace the handler
for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link
{
var e = w.output;
if(lookaheadMatch[5])
{
var link = lookaheadMatch[5];
// ELS -------------
var external=config.formatterHelpers.isExternalLink(link);
if (external)
{
if (config.macros.attach.isAttachment(link))
{
e = createExternalLink(w.output,link);
e.href=config.macros.attach.getAttachment(link);
e.title = config.macros.attach.linkTooltip + link;
}
else
e = createExternalLink(w.output,link);
}
else
e = createTiddlyLink(w.output,link,false,null,w.isStatic);
// ELS -------------
addClass(e,"imageLink");
}
var img = createTiddlyElement(e,"img");
if(lookaheadMatch[1])
img.align = "left";
else if(lookaheadMatch[2])
img.align = "right";
if(lookaheadMatch[3])
img.title = lookaheadMatch[3];
img.src = lookaheadMatch[4];
// ELS -------------
if (config.macros.attach.isAttachment(lookaheadMatch[4]))
img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
// ELS -------------
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
//}}}
//{{{
// find the formatter for "prettyLink" and replace the handler
for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);
if (i<config.formatters.length) {
config.formatters[i].handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var e;
var text = lookaheadMatch[1];
if(lookaheadMatch[3]) {
// Pretty bracketted link
var link = lookaheadMatch[3];
if (config.macros.attach.isAttachment(link)) {
e = createExternalLink(w.output,link);
e.href=config.macros.attach.getAttachment(link);
e.title=config.macros.attach.linkTooltip+link;
}
else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))
? createExternalLink(w.output,link)
: createTiddlyLink(w.output,link,false,null,w.isStatic);
} else {
e = createTiddlyLink(w.output,text,false,null,w.isStatic);
}
createTiddlyText(e,text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
} // if "prettyLink" formatter found
this.initialized=true;
}
//}}}
//{{{
config.macros.attach.init_formatters(); // load time init
//}}}
//{{{
if (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {
TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;
TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {
return config.macros.attach.isAttachment(title)?
config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText.apply(this,arguments);
}
}
//}}}
Background: #fff
Foreground: #000
PrimaryPale: #ddeeaa
PrimaryLight: #ddeeaa
PrimaryMid: #666633
PrimaryDark: #014
SecondaryPale: #bbdd88
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #666633
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #aacc88
Error: #f88
⊕{{tuduSlider{<<slider chkcomment "comment" "Comment">>}}}
/***
|Name|CommentPlugin|
|Source|http://www.TiddlyTools.com/#CommentPlugin|
|Documentation|http://www.TiddlyTools.com/#CommentPluginInfo|
|Version|2.9.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|automatically insert formatted comments into tiddler content|
!!!!!Documentation
>see [[CommentPluginInfo]]
!!!!!Configuration
>see [[CommentPluginInfo]]
!!!!!Revisions
<<<
2010.11.30 2.9.4 use story.getTiddler()
2009.04.10 2.9.3 invoke autoSaveChanges() after adding a comment
| please see [[CommentPluginInfo]] for previous revision details |
2006.04.20 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.CommentPlugin= {major: 2, minor: 9, revision: 4, date: new Date(2010,11,30)};
config.macros.comment= {
marker: '/%'+'comment'+'%/',
fmt: "__''%subject%''__\n^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n",
datefmt: 'DDD, MMM DDth, YYYY at hh12:0mm:0ss am',
tags: '',
reverse: false,
handler: function(place,macroName,params,wikifier,paramstring,tiddler) {
var span=createTiddlyElement(place,'span');
var here=story.findContainingTiddler(place);
if (here) var tid=here.getAttribute('tiddler'); // containing tiddler title
span.setAttribute('here',tid);
var target=(params[0]&¶ms[0].length&¶ms[0]!='here')?params[0]:tid; // target title
span.setAttribute('target',target);
var overwrite=(params[1]&¶ms[1].toLowerCase()=='overwrite'); if (overwrite) params.shift();
span.setAttribute('overwrite',overwrite?'true':'false');
var reverse=(params[1]&¶ms[1].toLowerCase()=='reverse'); if (reverse) params.shift();
span.setAttribute('reverse',(reverse||this.reverse)?'true':'false');
var marker=this.marker;
if (params[1]&¶ms[1].substr(0,7)=='marker:') {
var marker='/%'+params[1].substr(7)+'%/';
params.shift();
}
span.setAttribute('marker',marker);
var tags=(params[1]&¶ms[1].length)?params[1]:this.tags; // target tags
span.setAttribute('tags',tags);
var fmt=(params[2]&¶ms[2].length)?params[2]:this.fmt; // output format
span.setAttribute('fmt',fmt.unescapeLineBreaks());
var datefmt=(params[3]&¶ms[3].length)?params[3]:this.datefmt; // date format
span.setAttribute('datefmt',datefmt.unescapeLineBreaks());
var html=this.html;
html=html.replace(/%nosubject%/g,(fmt.indexOf('%subject%')==-1)?'none':'block');
html=html.replace(/%nomessage%/g,(fmt.indexOf('%message%')==-1)?'none':'block');
var subjtxt=''; var msgtxt='';
html=html.replace(/%subjtxt%/g,subjtxt);
html=html.replace(/%msgtxt%/g,msgtxt);
span.innerHTML=html;
},
html: "<form style='display:inline;margin:0;padding:0;'>\
<div style='display:%nosubject%'>\
subject:<br>\
<input type='text' name='subject' title='enter subject text' style='width:100%' value='%subjtxt%'>\
</div>\
<div style='display:%nomessage%'>\
message:<br>\
<textarea name='message' rows='7' title='enter message text' \
style='width:100%'>%msgtxt%</textarea>\
</div>\
<center>\
<i>Please enter your information and then press</i>\
<input type='button' value='post' onclick='\
var s=this.form.subject; var m=this.form.message;\
if (\"%nosubject%\"!=\"none\" && !s.value.length)\
{ alert(\"Please enter a subject\"); s.focus(); return false; }\
if (\"%nomessage%\"!=\"none\" && !m.value.length)\
{ alert(\"Please enter a message\"); m.focus(); return false; }\
var here=this.form.parentNode.getAttribute(\"here\");\
var reverse=this.form.parentNode.getAttribute(\"reverse\")==\"true\";\
var target=this.form.parentNode.getAttribute(\"target\");\
var marker=this.form.parentNode.getAttribute(\"marker\");\
var tags=this.form.parentNode.getAttribute(\"tags\").readBracketedList();\
var fmt=this.form.parentNode.getAttribute(\"fmt\");\
var datefmt=this.form.parentNode.getAttribute(\"datefmt\");\
var overwrite=this.form.parentNode.getAttribute(\"overwrite\")==\"true\";\
config.macros.comment.addComment(here,reverse,target,tags,fmt,datefmt,\
s.value,m.value,overwrite,marker);'>\
</center>\
</form>",
addComment: function(here,reverse,target,newtags,fmt,datefmt,subject,message,overwrite,marker) {
var UTC=new Date().convertToYYYYMMDDHHMMSSMMM();
var rand=Math.random().toString();
var who=config.options.txtUserName;
var when=new Date().formatString(datefmt);
target=target.replace(/%tiddler%/g,here);
target=target.replace(/%UTC%/g,UTC);
target=target.replace(/%random%/g,rand);
target=target.replace(/%who%/g,who);
target=target.replace(/%when%/g,when);
target=target.replace(/%subject%/g,subject);
var t=store.getTiddler(target);
var text=t?t.text:'';
var modifier=t?t.modifier:config.options.txtUserName;
var modified=t?t.modified:new Date();
var tags=t?t.tags:[];
for(var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
var fields=t?t.fields:{};
var out=fmt;
out=out.replace(/%tiddler%/g,here);
out=out.replace(/%UTC%/g,UTC);
out=out.replace(/%when%/g,when);
out=out.replace(/%who%/g,who);
out=out.replace(/%subject%/g,subject);
out=out.replace(/%message%/g,message);
var pos=text.indexOf(marker);
if (pos==-1) pos=text.length; // no marker - insert at end
else if (reverse) pos+=marker.length; // reverse order by inserting AFTER marker
var newtxt=overwrite?out:(text.substr(0,pos)+out+text.substr(pos));
store.saveTiddler(target,target,newtxt,modifier,modified,tags,fields);
autoSaveChanges();
if (story.getTiddler(target))
story.refreshTiddler(target,DEFAULT_VIEW_TEMPLATE,true);
if (here!=target && story.getTiddler(here))
story.refreshTiddler(here,DEFAULT_VIEW_TEMPLATE,true);
}
};
//}}}
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto "namespace"
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be = Array();
var len = Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str = "";
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex = "0123456789ABCDEF";
var str = "";
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
add32 = function(a,b)
{
var lsw = (a&0xFFFF)+(b&0xFFFF);
var msw = (a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Add five 32-bit integers, wrapping at 32 bits
add32x5 = function(a,b,c,d,e)
{
var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Bitwise rotate left a 32-bit integer by 1 bit
rol32 = function(n)
{
return (n>>>31)|(n<<1);
};
var len = blen*8;
// Append padding so length in bits is 448 mod 512
x[len>>5] |= 0x80 << (24-len%32);
// Append length
x[((len+64>>9)<<4)+15] = len;
var w = Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j,t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
for(j = 0;j<16;j++) {
w[j] = x[i+j];
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=16;j<20;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=20;j<40;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=40;j<60;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=60;j<80;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
h0 = add32(h0,a);
h1 = add32(h1,b);
h2 = add32(h2,c);
h3 = add32(h3,d);
h4 = add32(h4,e);
}
return Array(h0,h1,h2,h3,h4);
};
}
//}}}
<div class="toolbar" macro="toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<div macro='hideWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'>[[EditToolbar]]<div class='editor' macro='edit text'></div></div>
<div macro='showWhen ((tiddler.tags.contains("Contacts"))||(tiddler.title=="New Contact"))'><div class='editor'>
<table width='100%'>
<tr><th>Name</th><td><span macro='edit ContactFirstName'></span><span macro='edit ContactLastName'></span></td><td rowspan='4' width='50%' macro='edit text'></td></tr>
<tr><th>Adress</th><td><span macro='edit ContactStreetNumber'></span><span macro='edit ContactStreetName'></span><span macro='edit ContactZipCode'></span><span macro='edit ContactCity'></span></td></tr>
<tr><th>Phone</th><td><span macro='edit ContactPhone'></span></td></tr>
<tr><th>Email</th><td><span macro='edit ContactMail'><span></td></tr>
</table>
</div></div>
<div macro='toolbar Format Greek Hebrew Indent Notes Color Highlighting Tables'></div>
/***
|Name|FileDropPlugin|
|Source|http://www.TiddlyTools.com/#FileDropPlugin|
|Version|2.0.0|
|Author|BradleyMeck and Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|FireFox or mozilla-compatible browser|
|Description|drag-and-drop files/directories to create tiddlers|
This plugin registers window event handlers for 'dragdrop' (FireFox 3.1-) and 'drop' (FireFox3.5+) events to automatically create tiddlers from files that are dragged and dropped into an open TiddlyWiki document. It supports extended handling for multiple files and/or directories, as well as optional handling for embedding binary files if [[AttachFilePlugin]], [[AttachFilePluginFormatters]] and [[AttachFileMIMETypes]] are installed.
!!!!!Configuration
<<<
<<option chkFileDropTrimFilename>> Omit file extensions from tiddler titles when creating new tiddlers
{{{usage: <<option chkFileDropTrimFilename>> }}}
<<option chkFileDropDisplay>> Automatically display newly created tiddlers
{{{usage: <<option chkFileDropDisplay>> }}}
Tag newly created tiddlers with: <<option txtFileDropTags>>
{{{usage: <<option txtFileDropTags>>}}}
__FileDrop+AttachFile configuration options:__
<<option chkFileDropAttachLocalLink>> Include reference to local path/filename
{{{usage: <<option chkFileDropAttachLocalLink>> }}}
<<option chkFileDropAttachEncodeData>> Include binary file data as encoded "base64" text
{{{usage: <<option chkFileDropAttachEncodeData>> }}}
...only if file is smaller than: <<option txtFileDropAttachDataLimit>> bytes
{{{usage: <<option txtFileDropAttachDataLimit>>}}}
//Note: if the plugin does not seem to work, open up the page 'about:config' (just type it in the address bar) and make sure ''signed.applets.codebase_principal_support'' is set to ''true''//
<<<
!!!!!Examples (custom handler functions)
<<<
Adds a single file with confirmation and prompting for title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
function(nsiFile) {
var msg='You have dropped the file:\n'
+nsiFile.path+'\n'
+'onto the page, it will be imported as a tiddler. Is that ok?'
if(confirm(msg)) {
var newDate = new Date();
var title = prompt('what would you like to name the tiddler?');
store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
}
return true;
});
}}}
Adds a single file without confirmation, using path/filename as tiddler title
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
function(nsiFile) {
var newDate = new Date();
store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
story.displayTiddler(null,nsiFile.path)
return true;
});
}}}
<<<
!!!!!Revisions
<<<
2009.08.19 2.0.0 ELS fixed event listener registration for FireFox 3.5+. Also, merged with FileDropPluginConfig, with code cleanup/reduction.
2008.08.11 1.5.1 added chkFileDropAttachLocalLink option to allow suppression of local path/file link
2007.01.01 0.9.9 extensions for AttachFilePlugin
2006.11.04 0.1.1 initial release by Bradley Meck
Old revision notes:
*Note: this version has been 'tweaked' by Eric Shulman (http://www.TiddlyTools.com) to add suspend/resume notification handling to improve performance when multiple files are dropped at once.
*Multiple File Dropping API updated, to end all capturing events after yours return a value that makes if(myFunctionsReturnValue) evaluate to true
*Added support for multiple file drop handlers
**Use the config.macros.fileDrop.addEventListener(@@color(green):String Flavor@@, @@color(green):Function handler(nsiFile){}@@, @@color(green):Boolean addToFront@@) function
***Standard Flavor is 'application/x-moz-file'
***addToFront gives your handler priority over all others at time of add
*Old plugin would disallow drops of text between applications because it didn't check if the transfer was a file.
<<<
!!!!!Code
***/
//{{{
version.extensions.FileDropPlugin={major:2, minor:0, revision:0, date: new Date(2009,8,19)};
config.macros.fileDrop = {
customDropHandlers: [],
addEventListener: function(paramflavor,func,inFront) {
var obj={}; obj.flavor=paramflavor; obj.handler=func;
if (!inFront) this.customDropHandlers.push(obj);
else this.customDropHandlers.shift(obj);
},
dragDropHandler: function(evt) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var dragService = Components.classes['@mozilla.org/widget/dragservice;1'].getService(Components.interfaces.nsIDragService);
var dragSession = dragService.getCurrentSession();
var transferObject = Components.classes['@mozilla.org/widget/transferable;1'].createInstance();
transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);
transferObject.addDataFlavor('application/x-moz-file');
var numItems = dragSession.numDropItems;
if (numItems>1) {
clearMessage();
displayMessage('Reading '+numItems+' files...');
store.suspendNotifications();
}
for (var i = 0; i < numItems; i++) {
dragSession.getData(transferObject, i);
var dataObj = {};
var dropSizeObj = {};
for(var ind=0; ind<config.macros.fileDrop.customDropHandlers.length; ind++) {
var item = config.macros.fileDrop.customDropHandlers[ind];
if(dragSession.isDataFlavorSupported(item.flavor)) {
transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);
var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);
var result = item.handler.call(item,droppedFile);
evt.stopPropagation();
evt.preventDefault();
if (result) break;
}
}
}
if (numItems>1) {
store.resumeNotifications();
store.notifyAll();
displayMessage(numItems+' files have been processed');
}
}
}
//}}}
/***
!!!!!window event handlers
***/
//{{{
if(!window.event) {
window.addEventListener('dragdrop', config.macros.fileDrop.dragDropHandler, true); // FireFox3.1-
window.addEventListener('drop', config.macros.fileDrop.dragDropHandler, true); // FireFox3.5+
}
//}}}
/***
!!!!!handler for files, directories and binary attachments (see [[AttachFilePlugin]])
<<<
* use just filename instead of whole path as tiddler title
* check for existing tiddler and prompt for new name
* handle folder drops (drops each file or creates a file list in a tiddler)
* use AttachFilePlugin if MIME type is not text/plain
* autotag created tiddlers (e.g., "temporary", "dropped", etc.)
* option to suppress automatic display of newly created tiddlers
* suspend/resume notifications when handling multiple files (performance improvement)
<<<
***/
//{{{
if (config.options.chkFileDropAttachEncodeData===undefined)
config.options.chkFileDropAttachEncodeData=true;
if (config.options.chkFileDropAttachLocalLink===undefined)
config.options.chkFileDropAttachLocalLink=true;
if (config.options.txtFileDropAttachDataLimit===undefined)
config.options.txtFileDropAttachDataLimit=32768;
if (config.options.txtFileDropTags===undefined)
config.options.txtFileDropTags="";
if (config.options.chkFileDropDisplay===undefined)
config.options.chkFileDropDisplay=true;
if (config.options.chkFileDropTrimFilename===undefined)
config.options.chkFileDropTrimFilename=false;
config.macros.fileDrop.addEventListener("application/x-moz-file",function(nsiFile) {
var header="Index of %0\n^^(as of %1)^^\n|!filename| !size | !modified |\n";
var item="|[[%0|%1]]| %2|%3|\n";
var footer="Total of %0 bytes in %1 files\n";
var now=new Date();
var files=[nsiFile];
if (nsiFile.isDirectory()) {
var folder=nsiFile.directoryEntries;
var files=[];
while (folder.hasMoreElements()) {
var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
if (f instanceof Components.interfaces.nsILocalFile && !f.isDirectory()) files.push(f);
}
var msg=nsiFile.path.replace(/\\/g,"/")+"\n\n";
msg+="contains "+files.length+" files... ";
msg+="select OK to attach all files or CANCEL to create a list...";
if (!confirm(msg)) { // create a list in a tiddler
var title=nsiFile.leafName; // tiddler name is last directory name in path
while (title && title.length && store.tiddlerExists(title)) {
if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
title=prompt("Please enter a different tiddler title for this file",nsiFile.path.replace(/\\/g,"/"));
}
if (!title || !title.length) return true; // aborted by user... we're done!
var text=header.format([nsiFile.path.replace(/\\/g,"/"),now.toLocaleString()]);
var total=0;
for (var i=0; i<files.length; i++) { var f=files[i];
var name=f.leafName;
if (config.options.chkFileDropTrimFilename)
{ var p=name.split("."); if (p.length>1) p.pop(); name=p.join("."); }
var path="file:///"+f.path.replace(/\\/g,"/");
var size=f.fileSize; total+=size;
var when=new Date(f.lastModifiedTime).formatString("YYYY.0MM.0DD 0hh:0mm:0ss");
text+=item.format([name,path,size,when]);
}
text+=footer.format([total,files.length]);
var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
store.saveTiddler(null,title,text,config.options.txtUserName,now,newtags);
if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
return true;
}
}
if (files.length>1) store.suspendNotifications();
for (i=0; i<files.length; i++) {
var file=files[i];
if (file.isDirectory()) continue; // skip over nested directories
var type="text/plain";
var title=file.leafName; // tiddler name is file name
if (config.options.chkFileDropTrimFilename)
{ var p=title.split("."); if (p.length>1) p.pop(); title=p.join("."); }
var path=file.path;
var size=file.fileSize;
while (title && title.length && store.tiddlerExists(title)) {
if (confirm(config.messages.overwriteWarning.format([title]))) break; // use existing title
title=prompt("Please enter a different tiddler title for this file",path.replace(/\\/g,"/"));
}
if (!title || !title.length) continue; // cancelled by user... skip this file
if (config.macros.attach) {
type=config.macros.attach.getMIMEType(file.leafName,"");
if (!type.length)
type=prompt("Unrecognized file type. Please enter a MIME type for this file","text/plain");
if (!type||!type.length) continue; // cancelled by user... skip this file
}
var newtags=config.options.txtFileDropTags?config.options.txtFileDropTags.readBracketedList():[];
if (type=="text/plain")
store.saveTiddler(null,title,loadFile(path),config.options.txtUserName,now,newtags);
else {
// only encode data if enabled and file is smaller than limit. Default is 32768 (32K) bytes.
var embed=config.options.chkFileDropAttachEncodeData
&& file.fileSize<config.options.txtFileDropAttachDataLimit;
newtags.push("attachment"); newtags.push("excludeMissing");
var localfile="";
if (config.options.chkFileDropAttachLocalLink) {
// if file is in current document folder,
// remove path prefix and use relative reference
var localfile=path;
var h=document.location.href;
folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
if (localfile.substr(0,folder.length)==folder)
localfile='./'+localfile.substr(folder.length);
}
config.macros.attach.createAttachmentTiddler(path,
now.formatString(config.macros.timeline.dateFormat),
"attached by FileDropPlugin", newtags,
title, embed, config.options.chkFileDropAttachLocalLink, false,
localfile, "", type,!config.options.chkFileDropDisplay);
}
if (config.options.chkFileDropDisplay) story.displayTiddler(null,title);
}
if (files.length>1) { store.resumeNotifications(); store.notifyAll(); }
return true;
})
//}}}
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].
!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features:
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen)
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features:
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs:
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features:
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================
// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {
if (!window.abego) window.abego = {};
version.extensions.ForEachTiddlerPlugin = {
major: 1, minor: 0, revision: 8,
date: new Date(2007,3,12),
source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};
// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
TiddlyWiki.prototype.forEachTiddler = function(callback) {
for(var t in this.tiddlers) {
callback.call(this,t,this.tiddlers[t]);
}
};
}
//============================================================================
// forEachTiddler Macro
//============================================================================
version.extensions.forEachTiddler = {
major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
config.macros.forEachTiddler = {
// Standard Properties
label: "forEachTiddler",
prompt: "Perform actions on a (sorted) selection of tiddlers",
// actions
actions: {
addToList: {},
write: {}
}
};
// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler
// ---------------------------------------------------------------------------
config.macros.forEachTiddler.getContainingTiddler = function(e) {
while(e && !hasClass(e,"tiddler"))
e = e.parentNode;
var title = e ? e.getAttribute("tiddler") : null;
return title ? store.getTiddler(title) : null;
};
config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);
if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the "in" clause
var tiddlyWikiPath = undefined;
if ((i < params.length) && params[i] == "in") {
i++;
if (i >= params.length) {
this.handleError(place, "TiddlyWiki path expected behind 'in'.");
return;
}
tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the where clause
var whereClause ="true";
if ((i < params.length) && params[i] == "where") {
i++;
whereClause = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the sort stuff
var sortClause = null;
var sortAscending = true;
if ((i < params.length) && params[i] == "sortBy") {
i++;
if (i >= params.length) {
this.handleError(place, "sortClause missing behind 'sortBy'.");
return;
}
sortClause = this.paramEncode(params[i]);
i++;
if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
sortAscending = params[i] == "ascending";
i++;
}
}
// Parse the script
var scriptText = null;
if ((i < params.length) && params[i] == "script") {
i++;
scriptText = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the action.
// When we are already at the end use the default action
var actionName = "addToList";
if (i < params.length) {
if (!config.macros.forEachTiddler.actions[params[i]]) {
this.handleError(place, "Unknown action '"+params[i]+"'.");
return;
} else {
actionName = params[i];
i++;
}
}
// Get the action parameter
// (the parsing is done inside the individual action implementation.)
var actionParameter = params.slice(i);
// --- Processing ------------------------------------------
try {
this.performMacro({
place: place,
inTiddler: tiddler,
whereClause: whereClause,
sortClause: sortClause,
sortAscending: sortAscending,
actionName: actionName,
actionParameter: actionParameter,
scriptText: scriptText,
tiddlyWikiPath: tiddlyWikiPath});
} catch (e) {
this.handleError(place, e);
}
};
// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {
var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);
var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
context["tiddlyWiki"] = tiddlyWiki;
// Get the tiddlers, as defined by the whereClause
var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
context["tiddlers"] = tiddlers;
// Sort the tiddlers, when sorting is required.
if (parameter.sortClause) {
this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
}
return {tiddlers: tiddlers, context: context};
};
// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
return this.getTiddlersAndContext(parameter).tiddlers;
};
// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional.
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
var tiddlersAndContext = this.getTiddlersAndContext(parameter);
// Perform the action
var actionName = parameter.actionName ? parameter.actionName : "addToList";
var action = config.macros.forEachTiddler.actions[actionName];
if (!action) {
this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
return;
}
var actionHandler = action.handler;
actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};
// ---------------------------------------------------------------------------
// The actions
// ---------------------------------------------------------------------------
// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
return;
}
// Perform the action.
var list = document.createElement("ul");
place.appendChild(list);
for (var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var listItem = document.createElement("li");
list.appendChild(listItem);
createTiddlyLink(listItem, tiddler.title, true);
}
};
abego.parseNamedParameter = function(name, parameter, i) {
var beginExpression = null;
if ((i < parameter.length) && parameter[i] == name) {
i++;
if (i >= parameter.length) {
throw "Missing text behind '%0'".format([name]);
}
return config.macros.forEachTiddler.paramEncode(parameter[i]);
}
return null;
}
// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
if (p >= parameter.length) {
this.handleError(place, "Missing expression behind 'write'.");
return;
}
var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
// Parse the "begin" option
var beginExpression = abego.parseNamedParameter("begin", parameter, p);
if (beginExpression !== null)
p += 2;
var endExpression = abego.parseNamedParameter("end", parameter, p);
if (endExpression !== null)
p += 2;
var noneExpression = abego.parseNamedParameter("none", parameter, p);
if (noneExpression !== null)
p += 2;
// Parse the "toFile" option
var filename = null;
var lineSeparator = undefined;
if ((p < parameter.length) && parameter[p] == "toFile") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
return;
}
filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
p++;
if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
return;
}
lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
}
}
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
return;
}
// Perform the action.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
var count = tiddlers.length;
var text = "";
if (count > 0 && beginExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
for (var i = 0; i < count; i++) {
var tiddler = tiddlers[i];
text += func(tiddler, context, count, i);
}
if (count > 0 && endExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);
if (count == 0 && noneExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
if (filename) {
if (lineSeparator !== undefined) {
lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
text = text.replace(/\n/mg,lineSeparator);
}
saveFile(filename, convertUnicodeToUTF8(text));
} else {
var wrapper = createTiddlyElement(place, "span");
wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
}
};
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
return {
place : placeParam,
whereClause : whereClauseParam,
sortClause : sortClauseParam,
sortAscending : sortAscendingParam,
script : scriptText,
actionName : actionNameParam,
actionParameter : actionParameterParam,
tiddlyWikiPath : tiddlyWikiPathParam,
inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
};
};
// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
if (!idPrefix) {
idPrefix = "store";
}
var lenPrefix = idPrefix.length;
// Read the content of the given file
var content = loadFile(this.getLocalPath(path));
if(content === null) {
throw "TiddlyWiki '"+path+"' not found.";
}
var tiddlyWiki = new TiddlyWiki();
// Starting with TW 2.2 there is a helper function to import the tiddlers
if (tiddlyWiki.importTiddlyWiki) {
if (!tiddlyWiki.importTiddlyWiki(content))
throw "File '"+path+"' is not a TiddlyWiki.";
tiddlyWiki.dirty = false;
return tiddlyWiki;
}
// The legacy code, for TW < 2.2
// Locate the storeArea div's
var posOpeningDiv = content.indexOf(startSaveArea);
var posClosingDiv = content.lastIndexOf(endSaveArea);
if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
throw "File '"+path+"' is not a TiddlyWiki.";
}
var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
// Create a "div" element that contains the storage text
var myStorageDiv = document.createElement("div");
myStorageDiv.innerHTML = storageText;
myStorageDiv.normalize();
// Create all tiddlers in a new TiddlyWiki
// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
var store = myStorageDiv.childNodes;
for(var t = 0; t < store.length; t++) {
var e = store[t];
var title = null;
if(e.getAttribute)
title = e.getAttribute("tiddler");
if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
title = e.id.substr(lenPrefix);
if(title && title !== "") {
var tiddler = tiddlyWiki.createTiddler(title);
tiddler.loadFromDiv(e,title);
}
}
tiddlyWiki.dirty = false;
return tiddlyWiki;
};
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
var script = context["script"];
var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
var fullText = (script ? script+";" : "")+functionText+";theFunction;";
return eval(fullText);
};
// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
var result = [];
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
tiddlyWiki.forEachTiddler(function(title,tiddler) {
if (func(tiddler, context, undefined, undefined)) {
result.push(tiddler);
}
});
return result;
};
// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
var message = "Extra parameter behind '"+actionName+"':";
for (var i = firstUnusedIndex; i < parameter.length; i++) {
message += " "+parameter[i];
}
this.handleError(place, message);
};
// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? -1
: +1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? +1
: -1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
// To avoid evaluating the sortClause whenever two items are compared
// we pre-calculate the sortValue for every item in the array and store it in a
// temporary property ("forEachTiddlerSortValue") of the tiddlers.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
var count = tiddlers.length;
var i;
for (i = 0; i < count; i++) {
var tiddler = tiddlers[i];
tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
}
// Do the sorting
tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);
// Delete the temporary property that holds the sortValue.
for (i = 0; i < tiddlers.length; i++) {
delete tiddlers[i].forEachTiddlerSortValue;
}
};
// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
displayMessage(message);
};
// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
var message ="<<"+macroName;
for (var i = 0; i < params.length; i++) {
message += " "+params[i];
}
message += ">>";
displayMessage(message);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};
// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
if (place) {
this.createErrorElement(place, exception);
} else {
throw exception;
}
};
// Internal.
//
// Encodes the given string.
//
// Replaces
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
var reGTGT = new RegExp("\\$\\)\\)","mg");
var reGT = new RegExp("\\$\\)","mg");
return s.replace(reGTGT, ">>").replace(reGT, ">");
};
// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
//
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
// Remove any location part of the URL
var hashPos = originalPath.indexOf("#");
if(hashPos != -1)
originalPath = originalPath.substr(0,hashPos);
// Convert to a native file format assuming
// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
var localPath;
if(originalPath.charAt(9) == ":") // pc local file
localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(7));
else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(5));
else // pc network file
localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
return localPath;
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
"forEachTiddler");
//============================================================================
// End of forEachTiddler Macro
//============================================================================
//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
var n = prefix.length;
return (this.length >= n) && (this.slice(0, n) == prefix);
};
//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
var n = suffix.length;
return (this.length >= n) && (this.right(n) == suffix);
};
//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
return this.indexOf(substring) >= 0;
};
//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) {
if (this[i] == item) {
return i;
}
}
return -1;
};
//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false.
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
return (this.indexOf(item) >= 0);
};
//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
for(var i = 0; i < items.length; i++) {
if (this.contains(items[i])) {
return true;
}
}
return false;
};
//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
//
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null]
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
for(var i = 0; i < items.length; i++) {
if (!this.contains(items[i])) {
return false;
}
}
return true;
};
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink,
displayMessage, endSaveArea, hasClass, loadFile, saveFile,
startSaveArea, store, wikify */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
!Format menu
|''bold''|@@highlight@@|
|//italic//|[[hyperlink]]|
|__underline__||
!Greek menu
|{{greek{κλητοι̂ς}}}|{{gkindent{{{gkindent{{{gkindent{κλητοι̂ς}}}}}}}}}|
|{{gkindent{κλητοι̂ς}}}|{{gkindent{{{gkindent{{{gkindent{{{gkindent{κλητοι̂ς}}}}}}}}}}}}|
|{{gkindent{{{gkindent{κλητοι̂ς}}}}}}|{{gkindent{{{gkindent{{{gkindent{{{gkindent{{{gkindent{κλητοι̂ς}}}}}}}}}}}}}}}|
!!Hebrew menu
{{hebrewNoAlign{וַיָּקָם}}}
{{hebrewRightAlign{וַיָּקָם}}}
{{hebAlignAndIndent{וַיָּקָם}}}
{{hebAlignAndIndent{{{hebAlignAndIndent{וַיָּקָם}}}}}}
{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{וַיָּקָם}}}}}}}}}
{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{וַיָּקָם}}}}}}}}}}}}
{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{{{hebAlignAndIndent{וַיָּקָם}}}}}}}}}}}}}}}
!Indent menu
{{engindent{Text}}}
{{engindent{{{engindent{Text}}}}}}
{{engindent{{{engindent{{{engindent{Text}}}}}}}}}
{{engindent{{{engindent{{{engindent{{{engindent{Text}}}}}}}}}}}}
{{engindent{{{engindent{{{engindent{{{engindent{{{engindent{Text}}}}}}}}}}}}}}}
!Notes menu
((syntax(add note here))) • ((translation(add note here))) • ((text(add note here))) • ((gram(add note here))) ((Popup: your text here(your popup text here)))
!Color menu
{{red{Red}}} {{blue{Blue}}} {{green{Green}}} {{gold{Gold}}} {{gray{Gray}}} {{magenta{Magenta}}} {{purple{Purple}}} {{teal{Teal}}} {{burgundy{Burgundy}}}
!Highlighting menu
@@bgcolor(#ff6666):Red@@ @@bgcolor(#ccccff):Blue@@ @@Yellow@@ @@bgcolor(#99ff99):Green@@ @@bgcolor(#cc9966):Brown@@ @@bgcolor(#cccc99):Gray@@ @@bgcolor(#ff9933):Orange@@
!Tables menu
Invisible table: {{invisiblecomm{
|!Invisible table header|!Invisible table header|!invisible table header|
|data|data|data|
|data|data|data|
|data|data|data|
}}}
Sortable table:
|sortable|k
|Header1|Header2|Header3|h
|Aa|B3|data7|
|Ab|B2|data2|
|Ac|B1|data8|
Standard table:
|!Header|!Header|!Header|
|data|data|data|
|data|data|data|
|data|data|data|
Table cell colors:
|!Below is a light gray cell|!Below is a dark gray cell|!Below are regular cells|
|bgcolor(#eeeeee):text here|||
||bgcolor(#cccccc):text there||
|||text anywhere|
/***
|Name|FramedLinksPlugin|
|Source|http://www.TiddlyTools.com/#FramedLinksPlugin|
|Version|1.1.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|clicking an external link opens an IFRAME following the link instead of opening a new tab/window|
This plugin causes clicks on external links to be rendered as inline frames (~IFRAMEs) instead of opening new browser tabs/windows.
!!!!!Usage
<<<
Use standard TiddlyWiki external link syntax into your tiddler content. If {{{chkFramedLinks}}} is enabled or the tiddler is tagged with 'framedLinks' (see Configuration), then whenever you click the external link an IFRAME will be dynamically added to the content. Clicking on the link again removes the IFRAME. Hold down any modifier (shift, control, or alt) while clicking a link ''temporarily'' bypasses the IFRAME handling and use the standard link handling behavior.
<<<
!!!!!Configuration
<<<
<<option chkFramedLinks>> display inline frames for all external links
{{{<<option chkFramedLinks>>}}}
<<option chkFramedLinksTag>> display inline frames for external links in tiddlers tagged with: <<option txtFramedLinksTag>>
{{{<<option chkFramedLinksTag>> <<option txtFramedLinksTag>>}}}
IFRAME size (CSS units: %, em, px, cm, in) - width: <<option txtFrameWidth>> height: <<option txtFrameHeight>>
{{{<<option txtFrameWidth>> <<option txtFrameHeight>>}}}
<<<
!!!!!Examples
<<<
Try these links:
*http://www.TiddlyWiki.com
*http://www.TiddlyTools.com
*http://groups.google.com/group/TiddlyWiki/topics
<<<
!!!!!Revisions
<<<
2008.11.14 [1.1.1] fixed handling for external links embedded in //shadow// tiddlers
2008.09.13 [1.1.0] added support to selectively enable embedded IFRAMEs if the containing tiddler is tagged with 'framedLinks'
2007.11.29 [1.0.5] added slider animation and improved CSS handling for IFRAME height/width to maximize display area
2007.11.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.FramedLinksPlugin= {major: 1, minor: 1, revision: 1, date: new Date(2008,11,14)};
var co=config.options; // abbreviation
if (co.chkFramedLinks==undefined) co.chkFramedLinks=false;
if (co.chkFramedLinksTag==undefined) co.chkFramedLinksTag=true;
if (co.txtFramedLinksTag==undefined) co.txtFramedLinksTag="framedLinks";
if (co.txtFrameWidth==undefined) co.txtFrameWidth="100%";
if (co.txtFrameHeight==undefined) co.txtFrameHeight="80%";
window.framedLinks_createExternalLink=createExternalLink;
window.createExternalLink=function(place,url)
{
var link=this.framedLinks_createExternalLink.apply(this,arguments);
link.onclick=function(ev) { var e=ev?ev:window.event;
var co=config.options; // abbreviation
var here=story.findContainingTiddler(this);
if (here) var tid=store.getTiddler(here.getAttribute("tiddler"));
var enabled=co.chkFramedLinks || co.chkFramedLinksTag && tid && tid.isTagged(co.txtFramedLinksTag);
if (!enabled || e.ctrlKey || e.shiftKey || e.altKey) return; // BYPASS
var p=this.parentNode;
var f=this.nextSibling?this.nextSibling.firstChild:null; // get the IFRAME... maybe...
var w=co.txtFrameWidth; if (!w || !w.length) w="100%";
var h=co.txtFrameHeight; if (!h || !h.length) h="80%";
if (h.indexOf("%")) h=(findWindowHeight()*h.replace(/%/,"")/100)+"px"; // calc height as % of window
var showing=f && f.nodeName.toUpperCase()=="IFRAME"; // does IFRAME really exist?
var stretchCell=p.nodeName.toUpperCase()=="TD" && w.indexOf("%")!=-1 && w.replace(/%/,"")>=100;
if (!showing) { // create an iframe
link.style.display="block"; // force IFRAME onto line following link
if (stretchCell) { p.setAttribute("savedWidth",p.style.width); p.style.width="100%"; } // adjust TD so IFRAME stretches
var wrapper=createTiddlyElement(null,"span"); // wrapper for slider animation
wrapper.setAttribute("url",this.href); // for async loading of frame after animation completes
var f=createTiddlyElement(wrapper,"iframe"); // create IFRAME
f.style.backgroundColor="#fff"; f.style.width=w; f.style.height=h;
p.insertBefore(wrapper,this.nextSibling);
function loadURL(wrapper) { var f=wrapper.firstChild; var url=wrapper.getAttribute("url");
var d=f.contentDocument?f.contentDocument:(f.contentWindow?f.contentWindow.document:f.document);
d.open(); d.writeln("<html>connecting to "+url+"</html>"); d.close();
try { f.src=url; } // if the iframe can't handle the href
catch(e) { alert(e.description?e.description:e.toString()); } // ... then report the error
window.scrollTo(0,ensureVisible(wrapper));
}
if (!co.chkAnimate) loadURL(wrapper);
else {
var morph=new Slider(wrapper,true);
morph.callback=loadURL;
morph.properties.push({style: 'width', start: 0, end: 100, template: '%0%'});
anim.startAnimating(morph);
}
} else { // remove iframe
link.style.display="inline"; // restore link style
if (stretchCell) p.style.width=p.getAttribute("savedWidth"); // restore previous width of TD
if (!co.chkAnimate) p.removeChild(f.parentNode);
else {
var morph=new Slider(f.parentNode,false,false,"all");
morph.properties.push({style: 'width', start: 100, end: 0, template: '%0%'});
anim.startAnimating(morph);
}
}
e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); return false;
}
return link;
}
//}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 0, date: new Date(2009,1,5)};
// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
if (!this.lookaheadRegExp) // fixup for TW2.0.x
this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var html=lookaheadMatch[1];
// if <nowiki> is present, just let browser handle it!
if (html.indexOf('<nowiki>')!=-1)
createTiddlyElement(w.output,"span").innerHTML=html;
else {
// if <hide linebreaks> is present, suppress wiki-style literal handling of newlines
if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
// remove all \r's added by IE textarea and mask newlines and macro brackets
html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
// create span, let browser parse HTML
var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
// then re-render text nodes as wiki-formatted content
wikifyTextNodes(e,w);
}
w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
}
}
}
// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
switch (theNode.nodeName.toLowerCase()) {
case 'style': case 'option': case 'select':
theNode.innerHTML=unmask(theNode.innerHTML);
break;
case 'textarea':
theNode.value=unmask(theNode.value);
break;
case '#text':
var txt=unmask(theNode.nodeValue);
var newNode=createTiddlyElement(null,"span");
theNode.parentNode.replaceChild(newNode,theNode);
wikify(txt,newNode,highlightHack,w.tiddler);
break;
default:
for (var i=0;i<theNode.childNodes.length;i++)
wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
break;
}
}
//}}}
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place);
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place);
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place);
}}
});
//}}}
/***
|''Name:''|HistoryPlugin|
|''Description:''|Limits to only one tiddler open. Manages an history stack and provides macro to navigate in this history (<<history>><<back>><<forward>>).|
|''Version:''|1.0.0|
|''Date:''|2008-03-23|
|''Source:''|http://tiddlywiki.bidix.info/#HistoryPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.3.0|
***/
//{{{
Story.prototype.tiddlerHistory = [];
Story.prototype.historyCurrentPos = -1;
Story.prototype.currentTiddler = null;
Story.prototype.maxPos = 11;
Story.prototype.old_history_displayTiddler = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
title = ((typeof title === "string") ? title : title.title);
//SinglePageMode
if (this.currentTiddler) this.closeTiddler(this.currentTiddler);
if (template == 2) {
//switch to Edit mode : don't manage
story.old_history_displayTiddler(null,title,template,animate,slowly);
return;
}
// if same tiddler no change
if (this.tiddlerHistory[this.historyCurrentPos] == title) {
this.currentTiddler = title;
story.old_history_displayTiddler(null,title,template,animate,slowly);
return;
}
if (this.historyCurrentPos == this.tiddlerHistory.length -1) {
// bottom of stack
this.tiddlerHistory.push(title);
if (this.tiddlerHistory.length > 11) {
this.tiddlerHistory.shift();
} else {
this.historyCurrentPos += 1;
}
} else {
// middle of stack
this.historyCurrentPos += 1;
if (this.tiddlerHistory[this.historyCurrentPos] != title) {
// path change => cut history
this.tiddlerHistory[this.historyCurrentPos] = title;
var a = [];
for(var i = 0; i <= this.historyCurrentPos;i++) {
a[i] = this.tiddlerHistory[i];
}
this.tiddlerHistory = a;
}
}
this.currentTiddler = title;
story.old_history_displayTiddler(null,title,template,animate,true);
scrollTo(0, 1);
}
Story.prototype.old_history_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function(title,animate,slowly)
{
this.currentTiddler = null;
story.old_history_closeTiddler.apply(this,arguments);
}
config.macros.history = {};
config.macros.history.action = function(event) {
var popup = Popup.create(this);
if(popup)
{
if (!story.tiddlerHistory.length)
createTiddlyText(popup,"No history");
else
{
var c = story.tiddlerHistory.length;
for (i=0; i<c;i++ )
{
var elmt = createTiddlyElement(popup,"li");
var btn = createTiddlyButton(elmt,story.tiddlerHistory[i],story.tiddlerHistory[i],config.macros.history.onClick);
btn.setAttribute("historyPos",i);
}
}
}
Popup.show(popup,false);
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
config.macros.history.handler = function(place,macroName,params)
{
createTiddlyButton(place, 'history', 'history', config.macros.history.action);
}
config.macros.history.onClick = function(ev)
{
var e = ev ? ev : window.event;
var historyPos = this.getAttribute("historyPos");
story.historyCurrentPos = historyPos -1;
story.displayTiddler(null,story.tiddlerHistory[historyPos]);
return false;
};
config.macros.back = {};
config.macros.back.action = function() {
if (story.historyCurrentPos > 0) {
if (story.currentTiddler) story.closeTiddler(story.currentTiddler);
story.historyCurrentPos = story.historyCurrentPos -2;
story.displayTiddler(null,story.tiddlerHistory[story.historyCurrentPos+1]);
} else {
//if (story.currentTiddler) story.old_history_displayTiddler(null,story.currentTiddler);
};
return false;
}
config.macros.back.handler = function(place,macroName,params)
{
createTiddlyButton(place, '<<', 'back', config.macros.back.action,"backButton");
}
config.macros.forward = {};
config.macros.forward.action = function() {
if (story.historyCurrentPos < story.tiddlerHistory.length -1) {
if (story.currentTiddler) story.closeTiddler(story.currentTiddler);
//story.historyCurrentPos = story.historyCurrentPos;
story.displayTiddler(null,story.tiddlerHistory[story.historyCurrentPos+1]);
} else {
//if (story.currentTiddler) story.old_history_displayTiddler(null,story.currentTiddler);
}
return false;
}
config.macros.forward.handler = function(place,macroName,params)
{
createTiddlyButton(place, '>>', 'forward', config.macros.forward.action, "ibutton");
}
//}}}
On 1. oktober 2009 10:59:28, MM imported 32 tiddlers from
[[http://www.giffmex.org/webviewtw.html|http://www.giffmex.org/webviewtw.html]]:
<<<
#[[ColorPalette]] - added
#[[CryptoFunctionsPlugin]] - added
#[[EditTemplate]] - added
#[[EditToolbar]] - added
#[[ForEachTiddlerPlugin]] - added
#[[Formatting cheatsheet]] - added
#[[HideWhenPlugin]] - added
#[[HistoryPlugin]] - added
#[[InlineJavascriptPlugin]] - added
#[[Instructions]] - added
#[[MainMenu]] - added
#[[Override SearchOptionsPlugin options]] - added
#[[PageTemplate]] - added
#[[SearchOptions plugin tweaks]] - added
#[[SearchOptionsPlugin]] - added
#[[SearchResults]] - added
#[[SelectPaletteMacro]] - added
#[[SideBarOptions]] - added
#[[SideBarTabs]] - added
#[[SinglePageModePlugin]] - added
#[[StyleSheet]] - added
#[[TaggedTemplateTweak]] - added
#[[ToggleRightSidebar]] - added
#[[Toolbox]] - added
#[[ViewTemplate]] - added
#[[Welcome to the Webview TiddlyWiki]] - added
#[[bluepalette]] - added
#[[bubblegumpalette]] - added
#[[graypalette]] - added
#[[greenishgraypalette]] - added
#[[purplepalette]] - added
#[[z_configOptions]] - added
<<<
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 9, revision: 2, date: new Date(2008,3,3)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
handler: function(w) {
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var src=lookaheadMatch[1];
var label=lookaheadMatch[2];
var tip=lookaheadMatch[3];
var key=lookaheadMatch[4];
var show=lookaheadMatch[5];
var code=lookaheadMatch[6];
if (src) { // load a script library
// make script tag, set src, add to body to execute, then remove for cleanup
var script = document.createElement("script"); script.src = src;
document.body.appendChild(script); document.body.removeChild(script);
}
if (code) { // there is script code
if (show) // show inline script code in tiddler output
wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
if (label) { // create a link to an 'onclick' script
// add a link, define click handler, save code in link (pass 'place'), set link attributes
var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
link.code="function _out(place){"+fixup+"\n};_out(this);"
link.tiddler=w.tiddler;
link.onclick=function(){
this.bufferedHTML="";
try{ var r=eval(this.code);
if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
if(this.bufferedHTML.length)
s.innerHTML=this.bufferedHTML;
if((typeof(r)==="string")&&r.length) {
wikify(r,s,null,this.tiddler);
return false;
} else return r!==undefined?r:false;
} catch(e){alert(e.description||e.toString());return false;}
};
link.setAttribute("title",tip||"");
var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
link.setAttribute("href",URIcode);
link.style.cursor="pointer";
if (key) link.accessKey=key.substr(0,1); // single character only
}
else { // run inline script code
var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
var code="function _out(place){"+fixup+"\n};_out(w.output);"
try { var out=eval(code); } catch(e) { out=e.description?e.description:e.toString(); }
if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
}
}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
} )
//}}}
// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
if(limit > 0) text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//}}}
!Basic instructions
#Download the file to your hard drive by [[right-clicking and saving the link / target as...|webviewtw.html]] to the filename and location of your choice. Close this page and open your new file.
#Replace the title in the upper left by editing MainMenu.
#Add topics to MainMenu. Click on those topics to create the tiddlers for those topics. To your uninitiated web viewers they will appear to be separate webpages, but you and I know better!
#Edit DefaultTiddlers to include the names of the tiddlers that you want to appear when the ~TiddlyWiki is opened.
#If you want different colorpalettes than the ones provided, check [[here|http://www.giffmex.org/webviewtwexample.html#MoreColorPalettes!]] for more. Just import them from that file to this file.
#If you want to temporarily suspend the single-page-only feature, I recommend the toggle singlepage mode bookmarklet from ~TiddlyTools [[(link here)|http://www.tiddlytools.com/#InstantBookmarklets.]]
#Upload to your site using the UploadPlugin. [[Instructions here|http://www.giffmex.org/twfortherestofus.html#%5B%5BSimple%20instructions%20for%20BidiX's%20UploadPlugin%5D%5D]]
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
{{menubox3{<<tiddler SiteTitle>>}}}{{menubox2{<<tiddler SiteSubtitle>>}}}
[[DownLoad this document|http://twee-twine-doc.tiddlyspot.com/download]]
{{tuduSlider{<<slider chkToolbox Toolbox 'Toolbox »'>>}}}
* [[]]
* [[Basics|Section1]]
**{{myclass{
<<tiddler Section1>>}}}
* [[Twine Reference|Section2]]
**{{myclass{
<<tiddler Section2>>}}}
* [[twee Reference|Section3]]
**{{myclass{
<<tiddler Section3>>}}}
* [[Adding Code To Your Stories|Section4]]
**{{myclass{
<<tiddler Section4>>}}}
* [[Customizing Your Stories|Section5]]
**{{myclass{
<<tiddler Section5>>}}}
* [[Other Resources|Section6]]
**{{myclass{
<<tiddler Section6>>}}}
<<accordion>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
//{{{
config.options.chkSearchTitles=true;
config.options.chkSearchText=true;
config.options.chkSearchTags=true;
config.options.chkSearchFields=true;
config.options.chkSearchTitlesFirst=false;
config.options.chkSearchList=true;
config.options.chkSearchByDate=false;
config.options.chkSearchIncremental=true;
config.options.chkSearchShadows=false;
//}}}
<!--{{{-->
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
/***
***/
//{{{
config.commands.refresh = {
text: 'genopfrisk',
tooltip: 'genopfrisk denne tiddler',
handler: function(e,src,title) {
clearMessage();
story.refreshTiddler(title,false,true); // force=true
return false;
}
};
//}}}
//{{{
window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
//}}}
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|
Extend core search function with additional user-configurable options including generating a ''list of matching tiddlers'' instead of immediately displaying all matches.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental (key-by-key) searching
<<<
!!!!!Revisions
<<<
2007.02.17 [2.6.1] added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 [1.0.0] Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
if (config.options.chkSearchTitles===undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText===undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags===undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields===undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst===undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList===undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate===undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental===undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows===undefined) config.options.chkSearchShadows=false;
if (config.optionsDesc) {
config.optionsDesc.chkSearchTitles="Search in tiddler titles";
config.optionsDesc.chkSearchText="Search in tiddler text";
config.optionsDesc.chkSearchTags="Search in tiddler tags";
config.optionsDesc.chkSearchFields="Search in tiddler data fields";
config.optionsDesc.chkSearchShadows="Search in shadow tiddlers";
config.optionsDesc.chkSearchTitlesFirst="Search results show title matches first";
config.optionsDesc.chkSearchList="Search results show list of matching tiddlers";
config.optionsDesc.chkSearchByDate="Search results sorted by modification date ";
config.optionsDesc.chkSearchIncremental="Incremental searching";
} else {
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles"
+"\n<<option chkSearchText>> Search in tiddler text"
+"\n<<option chkSearchTags>> Search in tiddler tags"
+"\n<<option chkSearchFields>> Search in tiddler data fields"
+"\n<<option chkSearchShadows>> Search in shadow tiddlers"
+"\n<<option chkSearchTitlesFirst>> Search results show title matches first"
+"\n<<option chkSearchList>> Search results show list of matching tiddlers"
+"\n<<option chkSearchByDate>> Search results sorted by modification date"
+"\n<<option chkSearchIncremental>> Incremental searching";
}
if (config.macros.search.reportTitle==undefined)
config.macros.search.reportTitle="SearchResults";
config.macros.search.onKeyPress = function(e)
{
if(!e) var e = window.event;
switch(e.keyCode)
{
case 13: // Ctrl-Enter
case 10: // Ctrl-Enter on IE PC
config.macros.search.doSearch(this);
break;
case 27: // Escape
this.value = "";
clearMessage();
break;
}
if (config.options.chkSearchIncremental) {
if(this.value.length > 2)
{
if(this.value != this.getAttribute("lastSearchText"))
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
var txt = this;
config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
}
}
else
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
}
}
}
//}}}
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
var q = useRegExp ? "/" : "'";
clearMessage();
if (!matches.length) {
if (config.options.chkSearchList) discardSearchResults();
displayMessage(config.macros.search.failureMsg.format([q+text+q]));
} else {
if (config.options.chkSearchList)
reportSearchResults(text,matches);
else {
var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
this.closeAllTiddlers(); story.displayTiddlers(null,titles);
displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
}
}
highlightHack = null;
}
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
var candidates = this.reverseLookup("tags",excludeTag,false,sortField);
// scan for matching titles first...
var results = [];
if (config.options.chkSearchTitles) {
for(var t=0; t<candidates.length; t++)
if(candidates[t].title.search(searchRegExp)!=-1)
results.push(candidates[t]);
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
}
// then scan for matching text, tags, or field data
for(var t=0; t<candidates.length; t++) {
if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
store.forEachField(candidates[t],
function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },
true); // extended fields only
}
// then check for matching text in shadows
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
// if not 'titles first', or sorting by modification date, re-sort results to so titles, text, tag and field matches are mixed together
if(!sortField) sortField = "title";
var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);
return results;
}
// REPORT GENERATOR
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// summary: nn tiddlers found matching '...', options used
body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
body+="^^//searched in:// ";
body+=(config.options.chkSearchTitles?"''titles'' ":"");
body+=(config.options.chkSearchText?"''text'' ":"");
body+=(config.options.chkSearchTags?"''tags'' ":"");
body+=(config.options.chkSearchFields?"''fields'' ":"");
body+=(config.options.chkSearchShadows?"''shadows'' ":"");
if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
body+=" //with options:// ";
body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
}
body+="^^";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// open all matches button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.displayTiddlers(null,["
for(var t=0;t<matches.length;t++)
body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
body+="],1);\" ";
body+="accesskey=\"O\" ";
body+="value=\"open all matching tiddlers\"></html> ";
// discard search results button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
body+="value=\"discard "+title+"\"></html>";
// search again
body+="\n\n----\n";
body+="<<search \""+text+"\">>\n";
body+="<<option chkSearchTitles>>titles ";
body+="<<option chkSearchText>>text ";
body+="<<option chkSearchTags>>tags";
body+="<<option chkSearchFields>>fields";
body+="<<option chkSearchShadows>>shadows";
body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
body+="<<option chkRegExpSearch>>text patterns";
body+="<<option chkSearchByDate>>sort by date";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
if (!window.discardSearchResults) window.discardSearchResults=function()
{
// remove the tiddler
story.closeTiddler(config.macros.search.reportTitle);
store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
<<<
# [[TspotSetupPlugin]]
# [[UploadLog]]
<<<
<<forEachTiddler
where
'tiddler.tags.contains("Section1")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("Section2")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("Section3")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("Section4")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("Section5")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("Section6")'
sortBy 'tiddler.title'
write
'"[["+tiddler.title+"]]"'
>>
/***
Quick and dirtly palette switcher for 2.1.x
<<selectPalette>>
WARNING this will overwrite your ColorPalette tiddler.
***/
//{{{
merge(config.macros,{
setPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var paletteName = params[0] ? params[0] : tiddler.title;
createTiddlyButton(place,"apply","Apply this palette",function(e) {
config.macros.selectPalette.updatePalette(tiddler.title);
return false;
});
}
},
selectPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());
},
getPalettes: function() {
var result = [
{caption:"-select palette-", name:""},
{caption:"(Default)", name:"(default)"}
];
var tagged = store.getTaggedTiddlers("palette","title");
for(var t=0; t<tagged.length; t++)
result.push({caption:tagged[t].title, name:tagged[t].title});
return result;
},
onPaletteChange: function(e) {
config.macros.selectPalette.updatePalette(this.value);
return true;
},
updatePalette: function(title) {
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
this.refreshPalette();
if(config.options.chkAutoSave)
saveChanges(true);
}
},
refreshPalette: function() {
config.macros.refreshDisplay.onClick();
}
}
});
//}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>>[[Formatting cheatsheet]]<<selectPalette>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.8.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePageKeepFoldedTiddlers>> Don't auto-close folded tiddlers
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)
Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.03.14 [2.8.2] in displayTiddler(), if editing specified tiddler, just move it to top/bottom of story *without* re-rendering (prevents discard of partial edits).
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release. Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageMode= {major: 2, minor: 8, revision: 2, date: new Date(2008,3,14)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
config.options.chkSinglePageMode=eval(v);
if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
config.lastURL = window.location.hash;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined) config.options.chkSinglePageKeepFoldedTiddlers=true;
if (config.options.chkSinglePagePermalink==undefined) config.options.chkSinglePagePermalink=true;
if (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined) config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined) config.options.chkSinglePageAutoScroll=true;
if (config.optionsDesc) {
config.optionsDesc.chkSinglePageMode="Display one tiddler at a time";
config.optionsDesc.chkSinglePageKeepFoldedTiddlers="Don't auto-close folded tiddlers";
config.optionsDesc.chkSinglePagePermalink="Automatically permalink current tiddler";
config.optionsDesc.chkSinglePageAutoScroll="Automatically scroll tiddler into view (if needed)";
config.optionsDesc.chkTopOfPageMode="Always open tiddlers at the top of the page";
config.optionsDesc.chkBottomOfPageMode="Always open tiddlers at the bottom of the page";
} else {
config.shadowTiddlers.AdvancedOptions += "\
\n<<option chkSinglePageMode>> Display one tiddler at a time \
\n<<option chkSinglePageKeepFoldedTiddlers>> Don't auto-close folded tiddlers \
\n<<option chkSinglePagePermalink>> Automatically permalink current tiddler \
\n<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed) \
\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page \
\n<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page";
}
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
if (!config.options.chkSinglePageMode)
{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
if (config.lastURL == window.location.hash) return; // no change in hash
var tids=convertUTF8ToUnicode(decodeURIComponent(window.location.hash.substr(1))).readBracketedList();
if (tids.length==1) // permalink (single tiddler in URL)
story.displayTiddler(null,tids[0]);
else { // restore permaview or default view
config.lastURL = window.location.hash;
if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
story.closeAllTiddlers();
story.displayTiddlers(null,tids);
}
}
if (Story.prototype.SPM_coreDisplayTiddler==undefined)
Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
var opt=config.options;
if (opt.chkSinglePageMode) {
// close all tiddlers except current tiddler, tiddlers being edited, and tiddlers that are folded (optional)
story.forEachTiddler(function(tid,elem) {
if ( tid==title
|| elem.getAttribute("dirty")=="true"
|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
return;
story.closeTiddler(tid);
});
}
else if (opt.chkTopOfPageMode)
arguments[0]=null;
else if (opt.chkBottomOfPageMode)
arguments[0]="bottom";
if (opt.chkSinglePageMode && opt.chkSinglePagePermalink && !config.browser.isSafari) {
window.location.hash = encodeURIComponent(convertUnicodeToUTF8(String.encodeTiddlyLink(title)));
config.lastURL = window.location.hash;
document.title = wikifyPlain("SiteTitle") + " - " + title;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already display
if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
var isTopTiddler=(tiddlerElem.previousSibling==null);
if (!isTopTiddler && (opt.chkSinglePageMode || opt.chkTopOfPageMode))
tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
else if (opt.chkBottomOfPageMode)
tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
} else
this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
var tiddlerElem=document.getElementById(story.idPrefix+title);
if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
var yPos=ensureVisible(tiddlerElem); // scroll to top of tiddler
var isTopTiddler=(tiddlerElem.previousSibling==null);
if (opt.chkSinglePageMode||opt.chkTopOfPageMode||isTopTiddler)
yPos=0; // scroll to top of page instead of top of tiddler
if (opt.chkAnimate) // defer scroll until 200ms after animation completes
setTimeout("window.scrollTo(0,"+yPos+")",config.animDuration+200);
else
window.scrollTo(0,yPos); // scroll immediately
}
}
if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
// suspend single-page mode (and/or top/bottom display options) when showing multiple tiddlers
var opt=config.options;
var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
this.SPM_coreDisplayTiddlers.apply(this,arguments);
opt.chkBottomOfPageMode=saveBPM;
opt.chkTopOfPageMode=saveTPM;
opt.chkSinglePageMode=saveSPM;
}
//}}}
/*{{{*/
/*FONT ADJUSTMENTS*/
body {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu .tiddlyLinkExisting, #mainMenu .tiddlyLinkNonExisting {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu {font-family: Trebuchet MS; font-size: 10pt;}
#mainMenu h1 {font-size: 10pt;}
#mainMenu th {background-color:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::SecondaryDark]];}
#mainMenu table {border:none;}
#mainMenu tr {background-color:white;}
#mainMenu {background-color:[[ColorPalette::PrimaryLight]];}
#mainMenu a:hover
.viewer {line-height: 1.7em;}
/*WIDEN MAINMENU*/
#mainMenu {width: 14.5em;}
#mainMenu {text-align: left;}
#displayArea {margin: 0em 17em 0em 17em;}
.teeny {font-size: 9pt; text-align: center;}
/*TABLE HEADER*/
.viewer th {color: #000; background-color: #eeeeee;}
/*TIDDLER TOPMARGIN AND BUTTON BORDER*/
a.button{border: 0;}
.viewer { margin-top: 1em; }
/*UNORDERED and ORDERED LISTS TWEAK*/
.viewer li {padding-top: 0.5em; padding-bottom: 0.5em;}
/*LINELESS BLOCKQUOTES*/
.viewer blockquote {border-left: 0px; margin-top:0em; margin-bottom:0em; }
/*HEADLINE COLOR, etc*/
h1,h2,h3,h4,h5 { color: #000; background: none; font-family: Trebuchet MS;}
/*TuDuSlider*/
.tuduSlider .button{font-family: Trebuchet MS; font-weight: bold; font-size: 10pt; color: black;}
/* GIFFMEX TWEAKS TO STYLESHEETPRINT (so that nothing but tiddler title and text are printed) */
@media print {#mainMenu {display: none ! important;}}
@media print {#topMenu {display: none ! important;}}
@media print {#sidebar {display: none ! important;}}
@media print {#messageArea {display: none ! important;}}
@media print {#toolbar {display: none ! important;}}
@media print {.header {display: none ! important;}}
@media print {.tiddler .subtitle {display: none ! important;}}
@media print {.tiddler .toolbar {display; none ! important; }}
@media print {.tiddler .tagging {display; none ! important; }}
@media print {.tiddler .tagged {display; none ! important; }}
@media print {#displayArea {margin: 1em 1em 0em 1em;}}
@media print {.pageBreak {page-break-before: always;}}
/*CSS FOR BIBLE FORMATTING*/
.engindent {margin-left: 2em; display:block;}
.gkindent {font-family: Gentium; font-size: 16pt; margin-left: 2em; display:block;}
.greek {font-family: Gentium; font-size: 16pt;}
.hebrewNoAlign{font-family: Gentium; font-size: 20pt;}
.hebrewRightAlign{text-align:right; font-family: Gentium; font-size: 20pt; display:block;}
.hebAlignAndIndent{text-align:right; font-family: Gentium; font-size: 20pt; margin-right: 2em; display:block;}
.red {color: #ff3300; font-weight: bold;}
.blue {color: #0000cc; font-weight: bold;}
.green {color: #22bb00; font-weight: bold;}
.gold {color: #bbaa55; font-weight: bold;}
.purple {color: #9922ff; font-weight: bold;}
.gray {color: #777777; font-weight: bold;}
.magenta{color: #cc0066; font-weight: bold;}
.teal {color: #008888; font-weight: bold;}
.burgundy {color: #990000; font-weight: bold;}
.orange {color: #ff8866; font-weight: bold;}
/*INVISIBLE TABLE*/
.viewer .invisiblecomm table {border-color: white;}
.viewer .invisiblecomm table td { font-size: 1em; font-family: Verdana; border-color: white; padding: 10px 20px 10px 0px; text-align: left; vertical-align: top; padding-bottom: 20px;}
.viewer .invisiblecomm table th {color:[[ColorPalette::PrimaryMid]]; background-color: white; border-color: white; font-family: Verdana; font-size: 1.2em; font-weight: bold; padding: 10px 20px 10px 0px; text-align: left; vertical-align: top;}
.viewer .invisiblecomm table tr.leftColumn { background-color: #bbbbbb; }
/*OTHER TABLES*/
.menubox { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:[[ColorPalette::TertiaryDark]]; color:#000; }
.menubox2 { display:block; padding: .25em; border:none; margin: 0; background:[[ColorPalette::TertiaryDark]]; [[ColorPalette::SecondaryDark]]; text-align: center; font-size: 1.6em;}
.menubox3 { display:block; padding:.25em; border:none; margin: 0; background:[[ColorPalette::TertiaryDark]]; [[ColorPalette::SecondaryDark]]; text-align: center; font-size: 2.5em;}
.viewer th {background-color:[[ColorPalette::SecondaryPale]]; [[ColorPalette::SecondaryDark]]}
.tableindex table, .tableindex td, .tableindex tr { font-size: 1em; border: solid white; background-color:[[ColorPalette::SecondaryPale]]; [[ColorPalette::SecondaryDark]]}
/*}}}*/
/*{{{*/
ul.accordion, ul.accordion li, ul.accordion li ul {margin:0; padding:0; list-style-type:none;text-align:left;}
ul.accordion li ul {display:none;}
ul.accordion li.accordion-active ul {display:block;}
ul.accordion li.accordion-active a {cursor:default;}
ul.accordion li.accordion-active ul li a {cursor:pointer;}
ul.accordion li.accordion-active ul li a:hover {background: url([[youarehere.png]]) left no-repeat; border: 1px solid transparent;}
ul.accordion a {display:block; padding:0.2em;}
ul.accordion li a.tiddlyLink, ul.accordion li a.tiddlyLinkNonExisting, ul.accordion li a {font-weight:bold;}
ul.accordion li a {padding:0.2em 1.5em;background: url([[book.png]]) left no-repeat;;background-position:5px left;}
ul.accordion li li {background:none;}
ul.accordion li ul li {display:inline-block;overflow:hidden;}
ul.accordion li.accordion-active ul li {background:[[ColorPalette::PrimaryLight]];color:[[ColorPalette::Background]]; padding:0em;}
ul.accordion li.accordion-active ul li div {padding:1.2em 0.2em;background: url([[bookopen.png]]) left no-repeat; background-position:top center;}
ul.accordion li.accordion-active ul a {background:#eff3fa; color:#000; padding:0.5em 0.5em 0.5em 1.0em;border:none;}
ul.accordion li.accordion-active a, ul.accordion li a:hover {background:[[ColorPalette::PrimaryMid]];color:[[ColorPalette::Background]];}
/*}}}*/
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2008.01.22 [*.*.*] plugin size reduction - documentation moved to [[TaggedTemplateTweakInfo]]
2007.06.23 [1.1.0] re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,23)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get default template from core
var template=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
// if the tiddler to be rendered doesn't exist yet, just return core result
var tiddler=store.getTiddler(title); if (!tiddler) return template;
// look for template whose prefix matches a tag on this tiddler
for (t=0; t<tiddler.tags.length; t++) {
var tag=tiddler.tags[t];
if (store.tiddlerExists(tag+template)) { template=tag+template; break; }
// try capitalized tag (to match WikiWord template titles)
var cap=tag.substr(0,1).toUpperCase()+tag.substr(1);
if (store.tiddlerExists(cap+template)) { template=cap+template; break; }
}
return template;
}
//}}}
Type the text for 'New Tiddler'
/%
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide right sidebar (SideBarOptions)|
Usage: <<tiddler ToggleRightSidebar>>
Config settings:
config.options.txtToggleRightSideBarLabelShow (◄)
config.options.txtToggleRightSideBarLabelHide (►)
config.options.txtToggleRightSideBarTipShow ("show right sidebar")
config.options.txtToggleRightSideBarTipHide ("hide right sidebar")
%/<script label="show/hide right sidebar">
var sb=document.getElementById('sidebar'); if (!sb) return;
var show=sb.style.display=='none';
if (!show) { sb.style.display='none'; var margin='1em'; }
else { sb.style.display='block'; var margin=config.options.txtDisplayAreaRightMargin||''; }
if (typeof(place)!='undefined') {
place.innerHTML=show?
config.options.txtToggleRightSideBarLabelHide:config.options.txtToggleRightSideBarLabelShow;
place.title=show?
config.options.txtToggleRightSideBarTipHide:config.options.txtToggleRightSideBarTipShow;
}
document.getElementById('displayArea').style.marginRight=margin;
config.options.chkShowRightSidebar=show;
saveOptionCookie('chkShowRightSidebar');
var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
return false;
</script><script>
if (config.options.chkShowRightSidebar==undefined)
config.options.chkShowRightSidebar=true;
if (!config.options.txtDisplayAreaRightMargin||!config.options.txtDisplayAreaRightMargin.length)
config.options.txtDisplayAreaRightMargin="18em";
if (config.options.txtToggleRightSideBarLabelShow==undefined)
config.options.txtToggleRightSideBarLabelShow=config.browser.isSafari?"◀":"◄";
if (config.options.txtToggleRightSideBarLabelHide==undefined)
config.options.txtToggleRightSideBarLabelHide="►";
if (config.options.txtToggleRightSideBarTipShow==undefined)
config.options.txtToggleRightSideBarTipShow="show right sidebar";
if (config.options.txtToggleRightSideBarTipHide==undefined)
config.options.txtToggleRightSideBarTipHide="hide right sidebar";
var show=config.options.chkShowRightSidebar;
document.getElementById('sidebar').style.display=show?"block":"none";
document.getElementById('displayArea').style.marginRight=show?
config.options.txtDisplayAreaRightMargin:"1em";
place.lastChild.innerHTML=show?
config.options.txtToggleRightSideBarLabelHide:config.options.txtToggleRightSideBarLabelShow;
place.lastChild.title=show?
config.options.txtToggleRightSideBarTipHide:config.options.txtToggleRightSideBarTipShow;
place.lastChild.style.fontWeight="normal";
</script>
|>|>|>|>|>|>| !<<back>> <<history>> <<forward>> |
|>|>|>|>|>|>| <<search>> |
|>|!Sidebar:|>|>|>|>| !<<tiddler ToggleRightSidebar>> |
|>|>|>|>|>|>|! <<slider chkKommentarer Kommentarer 'Comments »'>>|
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'twee-twine-doc';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'WelcomeToTiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n")
});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 25/01/2011 19:29:02 | YourName | [[chapBookClone2.html|file:///mnt/home/Dropbox/Dropbox/Public/ChapBookClone/chapBookClone2.html#TspotControls]] | [[store.cgi|http://twee-twine-doc.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/http://twee-twine-doc.tiddlyspot.com/index.html]] | backup | failed |
| 25/01/2011 19:29:55 | YourName | [[chapBookClone2.html|file:///mnt/home/Dropbox/Dropbox/Public/ChapBookClone/chapBookClone2.html#TspotControls]] | [[store.cgi|http://twee-twine-doc.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/index.html]] | backup |
| 25/01/2011 19:33:14 | YourName | [[/|http://twee-twine-doc.tiddlyspot.com/#MainMenu]] | [[store.php|http://twee-twine-doc.tiddlyspot.com/store.php]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/index.html]] | backup |
| 25/01/2011 19:33:39 | YourName | [[/|http://twee-twine-doc.tiddlyspot.com/#MainMenu]] | [[store.cgi|http://twee-twine-doc.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/index.html]] | backup |
| 25/01/2011 19:39:16 | YourName | [[/|http://twee-twine-doc.tiddlyspot.com/#TspotControls]] | [[store.cgi|http://twee-twine-doc.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/index.html]] | . |
| 25/01/2011 19:51:50 | YourName | [[/|http://twee-twine-doc.tiddlyspot.com/]] | [[store.cgi|http://twee-twine-doc.tiddlyspot.com/store.cgi]] | . | [[index.html | http://twee-twine-doc.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 3,
date: new Date("Feb 24, 2008"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar refresh closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>
<div class='tagClear'></div>
<div class macro='tiddler Comment'></div>
<!--}}}-->
This is an online reference for writing hypertext stories with either the GUI application Twine, or the command-line version, //twee//. To start reading, click a book on the left to open it, then choose a section. If you're just getting started, the ''Basics'' section is the best place to start.
__''Comments in general''__
^^posted by YourName on Tuesday, January 25th, 2011 at 7:37:47 pm^^
<<<
I have added a commentbox, (<<tiddler Comment>>) which will appear at the bottom of all tiddlers.
You can use it when you have a local copy of this document and want to record your private comments.
It doesn't work online - unless you save the document back to a server..
<<<
This is just a modest adaptation of ~TiddlyWiki for use as a webpage. I created it for my own use, but thought others might like an empty template of it. To see a working example of the Webview ~TiddlyWiki, [[see here|http://www.giffmex.org/webviewtwexample.html]]. ''Features of WebviewTW:''
*I have reduced as much clutter as possible, so as not to confuse first time visitors to your site: the header is gone, the sidebar hidden, and Tiddler elements such as author, date created, tagged and tagging have been removed. The mainmenu has a toolbox, which itself can be gutted if desired, when you are ready to upload.
*Only one tiddler opens at a time.
*There is a way to create a series of tiddlers linked in a colorful subtopic menu above the tiddler titles (the three squares above are an example of a subtopic menu and include the instructions necessary to create one). These are good just as subtopic menus, but are also meant for slideshows and linear tutorials and lessons. The idea is similar to the [[PresentationPlugin|http://lewcid.googlepages.com/presentation_empty_full.html#Documentation]], but this setup operates in a different way.
*Saving options have been set to ~SaveBackup:unchecked, and Animations:disabled, and the sidebar is hidden by default. (See [[z_configOptions]] to change these)
*In edit mode there are a number of easyEdit menus. See [[Formatting cheatsheet]] for details. There are also several color palettes to choose from (found in the Sidebar).
*The UploadPlugin and SplashScreenPlugin are installed. For directions for the UploadPlugin, see [[this external link|http://www.giffmex.org/twfortherestofus.html#%5B%5BSimple%20instructions%20for%20BidiX's%20UploadPlugin%5D%5D]]. My apologies to Alan Hecht, the creator of the ~WebViewPlugin - there is no relation between this adaptation and that plugin, which is not used here.
Background: #fff
Foreground: #000
PrimaryPale: #ccccff
PrimaryLight: #ccccff
PrimaryMid: #333366
PrimaryDark: #014
SecondaryPale: #bbbbff
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #333366
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #9999cc
Error: #f88
!usage
{{{[img[book.png]]}}}
[img[book.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/book.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/book.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHjSURBVDjLdZO/alVBEMZ/5+TemxAbFUUskqAoSOJNp4KC4AsoPoGFIHY+gA+jiJXaKIiChbETtBYLUbSMRf6Aydndmfks9kRjvHdhGVh2fvN9uzONJK7fe7Ai6algA3FZCAmQqEF/dnihpK1v7x7dPw0woF64Izg3Xl5s1n9uIe0lQYUFCtjc+sVuEqHBKfpVAXB1vLzQXFtdYPHkGFUCoahVo1Y/fnie+bkBV27c5R8A0pHxyhKvPn5hY2MHRQAQeyokFGJze4cuZfav3gLNYDTg7Pklzpw4ijtIQYRwFx6BhdjtCk+erU0CCPfg+/o2o3ZI13WUlLGo58YMg+GIY4dmCWkCAAgPzAspJW5ePFPlV3VI4uHbz5S5IQfy/yooHngxzFser30iFcNcuAVGw3A0Ilt91IkAsyCXQg5QO0szHEIrogkiguwN2acCoJhjnZGKYx4Ujz5WOA2YD1BMU+BBSYVUvNpxkXuIuWgbsOxTHrG3UHIFWIhsgXtQQpTizNBS5jXZQkhkcywZqQQlAjdRwiml7wU5xWLaL1AvZa8WIjALzIRZ7YVWDW5CiIj48Z8F2pYLl1ZR0+AuzEX0UX035mxIkLq0dhDw5vXL97fr5O3rfwQHJhPx4uuH57f2AL8BfPrVlrs6xwsAAAAASUVORK5CYII=
!usage
{{{[img[bookopen.png]]}}}
[img[bookopen.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/bookopen.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/bookopen.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIASURBVDjLpVPPaxNREJ6Vt01caH4oWk1T0ZKlGIo9RG+BUsEK4kEP/Q8qPXnpqRdPBf8A8Wahhx7FQ0GF9FJ6UksqwfTSBDGyB5HkkphC9tfb7jfbtyQQTx142byZ75v5ZnZWC4KALmICPy+2DkvKIX2f/POz83LxCL7nrz+WPNcll49DrhM9v7xdO9JW330DuXrrqkFSgig5iR2Cfv3t3gNxOnv5BwU+eZ5HuON5/PMPJZKJ+yKQfpW0S7TxdC6WJaWkyvff1LDaFRAeLZj05MHsiPTS6hua0PUqtwC5sHq9zv9RYWl+nu5cETcnJ1M0M5WlWq3GsX6/T+VymRzHDluZiGYAAsw0TQahV8uyyGq1qFgskm0bHIO/1+sx1rFtchJhArwEyIQ1Gg2WD2A6nWawHQJVDIWgIJfLhQowTIeE9D0mKAU8qPC0220afsWFQoH93W6X7yCDJ+DEBeBmsxnPIJVKxWQVUwry+XyUwBlKMKwA8jqdDhOVCqVAzQDVvXAXhOdGBFgymYwrGoZBmUyGjxCCdF0fSahaFdgoTHRxfTveMCXvWfkuE3Y+f40qhgT/nMitupzApdvT18bu+YeDQwY9Xl4aG9/d/URiMBhQq/dvZMeVghtT17lSZW9/rAKsvPa/r9Fc2dw+Pe0/xI6kM9mT5vtXy+Nw2kU/5zOGRpvuMIu0YAAAAABJRU5ErkJggg==
Background: #fff
Foreground: #000
PrimaryPale: #ffccff
PrimaryLight: #ffccff
PrimaryMid: #ff0066
PrimaryDark: #014
SecondaryPale: #ffcccc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #ff0066
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #ff99cc
Error: #f88
!usage
{{{[img[caution.png]]}}}
[img[caution.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/caution.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/caution.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABSZJREFUWIXll1toVEcYgL+Zc87u2Yu7MYmrWRuTJuvdiMuqiJd4yYKXgMQKVkSjFR80kFIVJfWCWlvpg4h98sXGWGof8iKNICYSo6JgkCBEJRG8ImYThNrNxmaTeM7pQ5IlJkabi0/9YZhhZv7///4z/8zPgf+7KCNRLgdlJijXwRyuDTlcxV9hbzv8nQmxMjg+XDtiOEplkG9PSfkztGmTgmFQd+FCVzwa3fYN/PHZAcpBaReicW5xcbb64IEQqko8Lc26d/58cxS+/BY6hmJvyEfQBoUpwWCmW1FErKaGWHU13uRk4QkEUtxQNFR7QwIoB4eiKD9PWbVKbb10CZmaCqmpxCormRYO26QQx85B0mcD+AeK0xYvHqu1tNDx+DH6gQM4jh0j3tCA3tGBLyfHLuD7zwJwAcYqun44sHy51nr5MsqsWWj5+djCYdS5c4ldvUr24sU2qarflUL6qAN0wqH0vDy7+fAhXZEI+v79CNmt7igpofPVK5SmJvyhkJBwYlQBSiHd7vUWZ86bp8WqqtCWLkVbuBAhBEIItGAQ2+rVxG7cICMY1KTDsekc5IwagIQTmStXis47dzBiMfR9+xCi+wb39s79+zFiMczGRjLmzTMlnBoVgLMwyzF+/Cb/lClq2/Xr2AoKUKdPxzAMWltbiUajmKaJkpGBY8sW3tbW4g8EVNXrXVEKK0YMoMKp7Px8K15Tg2VZOHbvBiASiRAMBgkGg0QiEYQQOIuLsRSFrnv3yJo/HxVOW5947D4KUAa57qysvNSUFOVtbS32rVuRfj9CCFwuV2Kfy+VCCIFMScFVVET7/fukJidLm883rQy+HhaABUII8cvUNWt4W1WFcLvRd+5MnHl/AOjOB+eOHchx44jX1ZEdCqkSTpaDbcgA5+GrpNmzc9ymKdvr67Hv2oVMSko4cjgcKIqCoijoup64EdLpxLV3Lx1PnuCVUrgmTfK9hV1DAjgKqlSUk1PCYdl25QrS70cvLEw4SWS+04nT6XxvXgiBc8MGtKlTaa+rIysnR1Ok/OF38PxngAzY4VuwYKL99WvR8fQpjj17kLqeiL6393g8eDyeAWBSVfEcOkRXczOOaBRvVpZuDPJEDwD4DVyKrv+UlZurxSorUWfMQC8oGOBcCDHgC/Rdc4TD2BctIl5fT+bkyTahaXvOw8RPApiwd2Ju7hjZ2EhXSwvOkhKQcoADgIqKCioqKgYcQW9LOnIEIxZDbWpiXCCABT9+FKAUxtm83pKMUEiLVVejLVqEtmTJB50LIdi2bRuFPbnRd7232efMwbVuHR2PHjHR77dJXS8sg5mDAihweFJenmrevYvR1oazpGTQ6IQQaJqG7ClI/dd655IOHsSyLMSLF6QFAib9nugEQClk2Xy+orTsbK3t1i3sa9ei5eQMGr0QgvLyci5evDiocyEEtsxMPNu30/nsGRO8XlVzu8NlkNvrV+0T/fHMZcusrtu3MeNx9PXrobUVq8cYQrw3TrRub1h9+v573Bs3Ej1zBvP5c/zp6dbLhoaTwPy+ANKCfF92thq7dg2A6JYt/fNlxGK8eUNSerryHEJHQT8K8V4A5ztojty8OeaLzZul1DSwLCzDANPEMozusWFgmWZ33288YK3/nGlixuM0v3xpWfDX0Z4i1VupXEWwIgRnJfhGPfQ+YsLr+7DzNFwCuvqWyiRg7DSYoIBu9smPkYqEd4AwIN4ITUAL0A4Da7UC6ICdEfy2fUBMoAvo7GnWKNoemfwLcAuinuFNL7QAAAAASUVORK5CYII=
!usage
{{{[img[comments.png]]}}}
[img[comments.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/comments.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/comments.png
!data
data:image/png;base64,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
!usage
{{{[img[cyoawarning.png]]}}}
[img[cyoawarning.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/cyoawarning.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/cyoawarning.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAEsCAYAAAC7TcrxAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9cMHAQ5GXE2DrcAACAASURBVHja7H13fJRVuv933nf6TGYmyWQmPZBOCCWEEiAJSGgKi6CCNAsi9+cKuldcdYt7Xd3rqqwrouvq3V0VUVG69N5DIAUSII2EFNImvU0v73t+f8Q5myEBwdV7d+99v3zy+TAz75zynOc852nnGREhhOAO0NHRgZycHNTU1EChUMDj8UAkEkHEMOA5DgzDgBACsUQCnucQGREJg8GAiIgI6PV6iEQiAEBzczOys7PR1NQEuVwOjuPoZx6PBzK5HGKWhcPpAAjgcrsR4O+PtLQ0BAYGYv/+/bBarfB4PAAAmUwGfZAekyZNgtFgBACUlpbibPZZEJ6A53nwPA+xWIzJ6ekYnpREx1pQUICLFy/C7XZDrVbD6XQiKysLsbGxdExe2Gw2vPfee8jOzkZqaipeeOEFqNXqQWnF8zwqKipw5swZ8DwPjuPAsiwAgGEY2Gw2aDQaOBwOSKVShIeHQ6vVIjo6GgaDwafv7OxsVFRUwGaz9bUhAjxuD+QKBZwOBxiGAcMwkEql4DgOFosF8fHxyMrKglwux78i2tvbceDAAWzbtg1Xr15FZ2cn3n33XTzxxBN39N19+/bB6XSC4zhKc71ej+nTp0On04EQgoaGBuzcuRMsy4LjOEilUsjkcqRNmICEhASwLAue53H58mVcvXoVHM+jvb0N/v7+yJqWhaFDhw7o22w2Y/369Th//jwmTJiA53/+c/jdgkecTieOnziO8rJyaHU6uJxOyOVydHd3Q6fTwWw2Q6lUwul0IiAgAIGBgQgNDUV4eDh0Oh1tx+PxoLCoEHm5eeB5HkqlEg6HA2PHjsXIkSOhUCgG9E0IQVFREXJzc8ETHizDQqvVYvqMGSgtKcHVq1fh8Xig0WhgsVggk8kwZcoUhIWF4dChQ2hrawMhBDKZDGKxGBMmTEBiYuKg87RYLDh16hQaGhvhdDrhp1ZjePJwTBg/YdDnzWYzysvLUVxSjMJLhWhoaKBjiYqKQmpqKhISEhAZGQk/Pz+f79bU1OD555/HwYMHodFosGzZMrz99ttgGObOmY/cIbKzs0lycjKRSCREKpUSiURC5HI5kUgkRCaT0T/v+3q9nsTFxZFly5aR7OxswnEcIYSQXbt2kZCQEPq8WCym3/G2621TKpUSmUxG5HI5WbNmDdm1axcxGAxErVYTlmXpZykpKSQvL4+Odd26dUSj0dD2ZTIZUavV5O233yZut5sQQojH4yEvvfQS0Wg0tG+dTkf+9re/0bH2x46dO4larSYMwxCj0Ui2b99OeJ4flFYul4u8+eabRCqV0ra9c+s/L+9rnU5Hhg4dSuYvWEC+/PJLYrVaCSGE8DxPli5dStRqNf2Od85yuZy25V0TpVJJJBIJMRgMZPfu3eRfFadPnyYJCQlEJBIRAEQul5P33nvvlvTuj5MnTxKj0Uhp4/0bPnw4KSgoIIQQwnEc+fjjj4lcLidKpZLSVaFQkHV/WEdsdhvlkbVr1xKdTkfp7+fnRzZu3DigX47jyPbt20loaCgRiUREo9GQb7755pbjNJlMZOrUqZRH+u8n79p6/y+Xy0lgYCAZMWIEWbFiBcnLz6ft2O128uSTTxKFQkGUSiXlt2HDhpHNmzcTm802oG+3203WrFlDVCoVpUFycjLJy88nDz/8MB2Hd2xyuZy8+uqrpLCwkCQlJdGxSSQSolQqycyZM0lJScmg86ysrCSTJ0+mY1MqlWTVqlUD1pLjOJKTk0PWrFlDYmJiiFKpJFKplKjVauLn50cUCgWRSqXEz8+PjBgxgjz77LOksLDQZ6+eOXOG+Pn5EQAEAAkLCyNmi/mueO+OBaLNZiNbtmwhGo2GiEQiIhKJiEqlIvPnzyfr168nH330EdmwYQN55plnyPjx44lEIiEikYiwLEtSUlLI+QvnCSGEWK1W8s477xCDwUAHLpfLyUsvvUQ++OADsnHjRvLJJ5+Q999/n7z00kskPT2dKBQKMn78eFJWVkbWrl1LZDIZ/W5QUBDZuHEjFSKEEFJbW0uWLl1KpFIpYRiGiEQismjRIlJXV+czp8bGRvLBBx8Qf39/wjAMmTdvHunu6R4w9+bmZjJnzhzap0gkInPnziVNTU23ZfhFixbRsYpEImIwGMhTTz1F1q9fT97/0/vkl7/8JcnKyiI6nY6IRCLCMAwJCgoir732Gm2ntLSULFq0iLAsS59JSUkhv/jFL8inn35KNm3aRDZt2kTefvtt8thjj5H4+HjCsix5Z/07/7IC0eFwkL379hF/f38iEomITCYjGzZsuKPvWqwW8swzzxCWZel6aTQa8tlnnxGn00mf6+rqIg8+9CARi8V0fZYuXUpMJpPPZm1qaiIbNmwgYWFhRCaTkYULF5LGxsYB/TY0NJCsrCzCMAxtb86cOaTxFjzicrlIdnY2SUtLo+MUi8UkJSWFvPjii+TDDz8kGzZsII8//jgZMWIEkclkdD9NnDiR5OXl0XHW19eTV155hej1esojIpGIxMbGkp07dw7af1VVFVm5ciWRy+Vk5MiRZNeuXcTlcpFr166RjIwMnzE9++yzpKurizidTnLp0iWyePFiIpFI6DzFYjHJysoi165dG3SeZ8+eJePGjSMsy5LHH3+cVNdU+66ZxUJeffVVMnToUCpkp0ydSt5//31SUlJC6urqSFlZGdmyZQuZNm0aUalURCqVkoyMDHLjxg2fw1Aul/vIhsGUmx9EIHoxdOhQ2mFycjIpLS0d8ExxcTGZOnUqZQ6WZclLv3iJfn758mWSmJhI2xk2bBhxuVyD9ldXV0fWrl1LVq5cSVpbW8mpU6dIVFQUFcrx8fGkvr5+wPd2795NAgMD6aL98Y9/HLR9q9VKUlJSiFKpHFSrcrvd5G9/+xsJCAgggYGBdANptVqybdu229Lqq6++InK5nI71//2//zfgZGxrayO//OUviVKppPRISEgg7e3t9BmvtgmASCQSsm7dOp/N3R+HDx8mc+fOJZs2bSL/yrBarVTbkslk5N13373j7168eJEEBwf7aAo9PT0Dntu1axfx9/enz3388ceDtnejro6kp6eTwMBAsnXr1kE11Y0bNxKFQuHTr7+/P/nyyy9vq9kuWbKEPh8YGEi++OILasV4tdSLFy+SWbNm0eckEgl59tlnfbS/kpISMnbcWKpVe/+GDx9OysvLB+37yy+/JCqViqxatYr09vbS91944QW6b1iWJYcOHfL53ubNm4lOp/NRECQSCXn00UcH1UgJIWTx4sVEJpORL7/80uf9jo4O8tvf/pYolUrCMAy1Bpubmwe0wfM8uX79Olm+fDlhWZZotVpSXFxMP79w4QJVtEQiERkyZMhd8x3zj/h6FAoFJBLJgPcTEhIwbdo0sCwLkUgEnudRU11DfToikcjHrlepVIO2AwARERF49dVX8cYbbyAgIACRkZEICgqivhC73Y6WlpYB39Pr9ZDJZPS5trY2WCyWAc+JRCJ4PB4EBwcjISFhwOfd3d3Yvn07XC4XVq5cCYPBQH0dX3zxBaxW6y3p4+fnB5Zl8e3Bg/Dw8AG+Sb1ejyVLliC+X99tbW24dOmSj0+y/3h1Oh2kUumgfU6bNg3/9V//hQULFuBfGSKRCBqNhtKuPw2+CwaDAUOGDKG0djqdaGtrG/Cc0WiESqWir2trawdtj/N44PZ4EBISgpEjRw5YQ5fLhU8++QQsy2L16tXUt9XT04O9e/eiq6vrdi4r+n+ZTIaQkBCIxWL6HsuySElJwcMPP0x9wh6PB7m5ubDb7fQ5iUQClmEhlUqh0+no/iorK8Orr76K+oaGAX2rVCqwLAuJROKzH2/lG795zGq1mj7r8Xiwe/dubNmyhe7z/mBZFmKx2GefcxyHXbt24f3336dz+clPfoJXXnkFRqNxUJ6IiYnB7373OyQlJQ1YB4VCQf2rhBCEhYXdNd/dtUDsP9mbB9T/maamJvA8T4nn7+9Pie4NBHhxO6HiJXxQUBBYloXRaER0dDTt32azob6+flCndf9NVFNTA4YdON0bdTfQ09ODuLg4aLXaAZ8fP34cOTk5yMrKwgsvvICsrCwwDAOe53Hy5ElcuHDhluN2upw+DK9UKgd9LlCvh6afg5gQArfbPeim+S6IxWKEhoZ+J1P/s4MQAofDQdfZG5S6E6j91IiOjqZ0s1gsaG1tHfCcx+OBy+Wir3Nzc28ZqOnq7EREZASGDB0y4PNdu3ahqKgIM2fOxPLlyzF16lQalDl+/DgKLhbccqz953WreYpEIkRGRtLPCCEDhI53rwUHB2PZsmUIDAyk7+/Zswdfbd7sM1evwCaEoNds9uE3t9sNkUgEQkhf4PSmfe6la2ZmJh555BFIJJK+dnp78eabb+LEiRODBhpvPtiqqqrwyiuvoLOzE4QQxMbGYu3atdDr9bekF8/ziIyMxJo1awYEjbQ6rY/SkZSU9OMLxP6n161QVFSEY8eO0dc6nQ7jJ0y4pQC9kza9kMvlGDZsGNUcHA4HTCbTAA3ixo0bPoK2oqIC9XUDBWdNdQ2sViuSkpKg0Wh8PnO73fjqq6/gcrnw4IMPQq/vi2Z7NU+LxYL9+/fTiPdATsaASPVguFFbi4aGBsrwOp0OycnJA+jjpd9gJ/APAafTiYqKChw5cgTbt2/H559/jlOnTqGiouK22QcHDx7EkSNHqACrra3F4cOHsXXrVhw+fBiNTU237ddqs+LSpUs4fPgwjSzb7fa74ov+0PhpkJCY4KMhlpeXD3iusbERZrOZvq6urkZvb++A51pbW9HR0YGoyCjIpLIBFsSBAwfAsiymT5+O4OBgzJk7h2qeHR0d2L5t+203+M3CbzAFo6CgAE6nk/JDSkqKTxaBV8FQKpV45JFH8NBDD1F+slqt+Oijj3Dq1Cmfdr2CTHqThugVhrc7jAkh0Ol0eP7556m2RghBVVUVXn/9dXTepBV7Bat3fjzPY/ee3TCZTH3ZKWIx0tPTv1OIeZWppUuX4sMPP/TRAlVKFfz9/enrkJCQu+adu+a4/gvIcZzP6+7ubpw9exZvvfUWqqqqKNFWrlyJBfPn+xCzP6E5jqOnEs/zYBgGDocDxcXFqKysxOLFi6mqzTAMRo8eTbU0p9OJkpISWK1Waqq4XC5UV1fTDerdpMXFxT5msdvtxtWrV0EIwbBhwwZocHl5eSgoKMDw4cMxbtw4AMDs2bPxwQcfoLi4GDzPU4HxXQspEokGpAk4nU6UlZfhrbfewo0bNyASiRAcHIyf/exniIiIuKWp4na74XK5KBMTQtDZ2YkTJ04gLCwMmZmZd7WmHo8HR44cwR/+8Adcu3YNdrsdcrkcHo8HPM/DaDRi3rx5WLlyJU1JcjgcWL9+Pfbs2YPS0lIolUqsX78edXV12Lp1K65fvw6XywW5XI6oqCgsXLgQL774oo+Qs1qtOHnyJP7yl78gNzcXLpeLugQiIiLQ0dHxvQQiwzCICI+ASqWCxWIBIQQ5OTlYsWKFz3OXLl3y4RGTyYT8/HxkZWX58GZlZSXMZjMmp08e0FdhYSFOnjyJ6OhozJg5A3K5HNPumYZhw4YhL68vFebIkSMoLS39XhqLzWbDnj178Omnn8Lj8YBhGIwfPx4rVqwYkFLj1UplMhlefvllFBUVIS8vDxzHoba2Fm+++SYiIiMwLHHYD3aIxsTE4K233sJjjz2GlpYWeDwenD17FhvefRcvvvgiPRgIIfB4PFR5aGlpwb69+6j80Gq1mDVr1oA9cjur8WZ6yuVyGAwGui/CI8L/ewUiz/Po6e3FpcJClJWW4uChQzh18iRMJhNkMhliYmLw1FNPYcGCBT6S+2Y1vLGxEb/45S/AiBhwHAexWIyOjg5cuHABvb29mPuTufDX/f37w5OHQ6vVoqurCxzHoby8HL29vZSY3d3dVGB5BWdPTw8qKirg8XjoprTZbCgvL4darR7gP3Q4HDh48CB6enqwbNkyREZGAgAiIyPxwAMP4Nq1a3C73bh27RqOHz9Oc9duZwKazWZwHAeTyYTCwkJcvHgRe/fuxeXLlyEWizFs2DA8++yzePjhh33oczPNd+3ahZqaGojFYmo+Xbt2DXl5eViyZMldC8SOjg787ne/Q35+Pvz8/DB37lzMnDkTnZ2d2LZtG/Ly8vDee++htLQUX3/9NZRKJTweDyoqKnDlyhXY7XbYbDasW7cOvb29SE5ORlpaGq5evYqcnBwUFRXBZDIhIyMD6enpdG6ff/453nzzTdTX1yM6Ohrz589HZGQkampqcOBb2n9fRMdEw9/fn/qNq6urYbPZfA69kydPUv7wWhvZ2dmYMmUK5RGn04kLFy705dvdlDvH8zy2bduGpqYmPPHEE4ge2ufKGTp0KDIyM1BQUACO49DS0oKjR49i2LBht7SS6H7q6UFvby8aGhtRXlaGEydOYM+ePWhsbIS/vz+SkpLw2muvIS0tbUBbXj6x2+0wGo148cUXsXbtWtTU1EAkEiEnJweffPwJXnnllR/UpTJp0iSsWLECGzZsgN1uB8/z+PTTTzFs2DA89NBDPhaOd8x1dXWoq6v7u9soMBAJCQm3pc93QSqVIiAggOblGoIMP75A7O/Mr6qqwuqnn0ZXVxd6enrgcrmoENJqtRg1ahRGjBwJPz8/6o8Y1GSyWrHx040+fguO42Cz2aBSqQaYFVGRUYiLi0N+fj4IIaipqUFnZydVnzs6OlBZWQmtVguZTEZN6nPnzuHf/u3fqH+ltbUVpWWl0Ov1SElJ8emjvqEeR48ehZ+fH37yk5/QjcQwDObPn4+PP/4YjY2NsNls2LZtG1asWPGdTLZlyxZcuHABJpMJjY2N6O7uppremDFj8LeP/4a42LgBASaO46h2yHEc8vLycOXKFZ8Dxul0wmq1+piAd+NzG5M6BlKpFIsWLcLixYsREBAAnucxevRoPP300ygrK8PBgwexf/9+LFy4EEqlEr/61a9QU1OD06dPg+M4VFRU4Pnnn8fTTz8NjUaD6upqPPXUU8jOzkZ7ezu+/vprjBo1Cn5+fsjLy8O7776LGzduQK1W47XXXsP9998PpVIJu92O+Ph4rF271idwcFeaS3QMIiIiqH/ZZDLhxo0bGDZsGLUiSkpKEBISArvdjo6ODvA8j9zcXJhMJqqhWywWFBQUICIiAqGhoT599Pb2Yu/evZDL5Xj44YepZiIWi7HwoYX4fNPnaGlpgdPpxJkzZ7B8+XLKe4Ohq6sL69atw/r169HS0oK2tja0t7eDEAKVSoXVq1fjySefRFRU1KDClPv2goRGowHLspg1axaefPJJ/O53v4PT6YTT6cSWLVswevRoLF269B/28fbX1tY8swZ5eXnUf9jU1IQ/vvMOJk6ciKioqL6gz7eBFa+G2N+l5e/vP+i8vIfZtWvX4HA46OHlbS8mJgYJCQlgGAYSiQQBAQFgWRYqlcongf2/JahCCIFarca9996LtWvXYteuXdi6dStWrFgBjuPw9ddf4/5vTa3+Dmvv7REq4KKikJOTg0uXLuHcuXPIzc3F4cOHsXbtWkydOhWchxvgcxw7dixdlObmZly9epV+fvHiRdTU1GDMmDGYM2cOXYTz58+jtLSUPldZWYnysnJER0cPUNVzc3NRXFyMmJgYSCQS1NTU4Pr166irqwPHcUhJSaECvqCgAJcvX/5O2lVXV6O+vp76Ir0+II7j0NzcDBFEt4y2e/uSSCR44YUXkJOTg4sXLyI3NxeFhYXYvHkzHnzwQR/f451CpVThgz99gNOnT2P16tXQ6XTo7u5GV1cXoqKiEBkZSW/37NmzB4QQMAyDuLg4hISE0JM/Li4OTz31FIxGIxQKBYYPH061VZ7nUV1dDbPZDLPZjI0bN6KqqgoikQjp6elYsmQJPXQUCgUWLVp0W+HxXQgNDcXIkSN9zOH+a7Rnzx44nU5MnToVaWlplJ8vX76Ma9eu+ZjEjY2NmDR5MmQ33fzxaoejR4+G51vTuq6uDjU1NfD390dsbCxtNz8/3ydzYDC4XC6Ul5fDYrEgKSkJMTExPn7Q+vp6n6j4YAEanuepWapQKLB69WrMnDmTZnzU19fj97//PcrKyn5Q/3NoSChee+01DBkyhK73xYICvPnmmzCbzdRN5t2zXneMj9XIDK4wvf7661i0aBGWLVuGpUuXYunSpXjwwQexYMECPP7449S14s1MEIvFUKvVgwZJf1STeejQofj973+PlJQUGmgAgLS0NMTFxeGNN95AV1cXdu7ciZaWFnz99df0lL053eBmkzUmJgZJSUno6uqiaTb9fUSTJk3CX/7yF3g8HtjtduTk5NBT79SpU7DZbJg5cyY0Gg02b94Mj8eDrq4unD59GhkZGeB5HkWXi2CxWDBx4sQB8/xq81ew2WyoqKjA6tWrKbNJJBI4HA40NTXROTgcDmzduhWTJ0++Le2WLVuGZ599Fnq9HoQQPP/88/j666+pj/ODDz7An/70p+8MOoWEhCA+Pt7nvbCwMIwbN+6W6Th3imsVFdi/bx8KCwvR1tZGXQ3ek7m9ox0cz0HMin2ipDzPw2Aw0LQkL4KDg+mmNplM6Orqgt1up+YkIQT33nvvoMGzu4ksD+ZHTE1NpVaHxWLBlStXMH/+fEilUpw9exYymQxjUsdAIpbg8OHD8Hg8aG1tRVlZGaZNmwaGYWggYvTo0WD6WTi9vb04ceIEeJ7HtWvXsHLlSvDfXgHkOA4cx+HGjRv0IGlubsahQ4cwffp0H0upfzAjICAAv/nNbzB79mwYDAY0NjZi1qxZaGpqgsfjwf79+3HPPffgscceG3S+XqHA8X9XILRaLZ5//nlUV1ejuLgYAFBeXo7333+fmt13k8Vwu+BPamoqnli5Em//4Q8wm83geR47d+7ExIkTBwQeZTKZD6/a7Xb0dPdAqxkoxJ5++mmMHTsWbW1tKCoqwokTJ6g7xWq1QiqT+hyEMpkMfn5+3+vq6l1riP2JJ5fLERQU5CMMvVHSFStWYNKkSTRQkpubi08//fSWzHsrx2lERMSgxI+Ni0VYeBgd0/Hjx8FxHBwOB06cOAGFQoGsrCyMTkmhpjQhBCdPnkR7ezusVit2bN+BwMBAzJgxw6ft2hu1uHDhAtRqNQIDA+F2u+FwOOByuWCxWOB2u6HX631yns6fPw+TyXQTsW4ac2wskpOTERwcjJCQEPz0pz+ld0C92te+ffsGuAj6M9OtcvJEIhGMRqOPr/ZutP6ioiIsXrwYE9PS8B//8R84ceIE5HI5Jk+ejCFDhtB1l4h9I5LeDQ8A7Lc+zZu1Fq8bRCqVgmVZdHR0oL6+nj4bExNzV3xxp5g4cSICAgLoHHNyctDd3Y3q6mrk5uYiMDAQycnJSM9Ip3lvHo8He/bsgdVqRVtbG7Kzs2EwGDA2NdUniFVcXIyioiL4+fkhKCgITocDHo8HNpuN8orRaKSZC263G8ePHx/gF+2/ljKZDCNHjUR8fDx0Oh2GDx+OZ555hmrOXV1dePvtt9Hd3T2oouJt6+b9kpGRgRdffBFBQUFUAG7ZsgUfffQRDdR8H6F4M2QyGf5t1SqsXLnSJ2Vp3bp1KCgo8PEhJiUl+Sg6LS0tKCkpGbTd1NRUPPXUU3j55ZfxzjvvYNSoUX/PKNBoIJVIfQ4VpVIJf3//Qe9x/6gC8eZocX/o9Xqk9mMil8uF2tpan+Ts75N248WQIUMwfPhw2k5jYyNqamqQl5eH5uZmDBs2DAaDAcnDh/tcPC8rK8PFixdRXFyM8vJyxMfHUzXfi93f7IbZbMaMmTPx6aefYtu2bdixYwf92759O7Zv344FCxbQ/mtra5Gfn39bgXgzrdLS0rB48WJKo6amJnzxxRcDNs3NmtI/4ngeDFeuXMGaNWuwfft29PT0YMyYMXjvvfewceNGrFu3DhkZGb7C+XvsHa9QZFgGZrOZppD8GPPpb8F4fcOEEJSVlaG+vh4VFRWora3F0KFDERsTi4jwiAEukMrKSpw/fx6VlZVITk5GXFycDw3yC/LR2NiImbNmYfPmzZQntm/fTvnk66+/xsOLH6brd+3aNWRnZ9/ysOvL1PKlxbLly6hiwXEcysrKsHXr1kHpe6u9KBKJsGDBAtx77730gOrq6sKlS5dodscPtQYGgwHPPfccoqKiqPAtKytDTU2NzxgjIyNplFgkEqG3txdXrlwZkCvZfw4Mw8Df398nPU6tVvsIvqCgIGi1WkRERAxIo/tRBGJ/wt2OiIQQyOVyn2f6V3zpf/rfyS0El8vlQ6wgfRDSJqRRn5vT6aQMSQjBjBkzoNfroVKpMHnyZNp3R0cHzp07h927d4PjONxzzz0+qnVPTw+ys7Mhl8tx7+zZGDduHOLj4xEbG4vY2FjExcUhISEBiYmJeGjhQvrdrq4uHD16FJZ+juKbGfRmekkkEjzyyCPU0c9xHI4fP468vLzb0vxWfsb+/dpstjs69a1WKzZt2oT8/HxwHAeNRoN169Zh/vz5VAPunz/JMMz32jzeaDghBFqd1sdn2/QdeYr/iMYyffp0ymsdHR04efIkDhw4gK6uLkyfPh2RkZHQ6XSYOXMm3VjeGyanT59Gb28v0tLSfJKFe3t7cfDAQdjtdsz7yU8wevRoxMXFUR7x8klycjIyMzJpsM3hcGDv3r0+/H6zgnHzXggNCcXixYvp5uY4Dlu2bkVjY+OAQ/N2Lga1Wo3f/OY3mDx5MlVA+gdBf8hDKTw8HP/xH/+B4OBgur89Ho+PQGRZFsuWLaPuI4fDge3bt6P2Ru1t23a73XC73XRNb/ZFRkVF4be//S2efPLJ7+VD/Ic1xFvBZDLh3LlzVCOUSqWIiIjwucrWX9jdDt3d3di0aRN2795NJ88wDLKmZ1FGdbvd2LhxI7755hsYjUZkZWVRU/6BBx6gZrPL5cLOnTuxZcsWGAwGZGVl+QiYhyu67QAAIABJREFU0tJSXLlyBQaDASNHjryt2ZY2YQJ1nHs8Hpw8eRINg9yaGSwg5UVERATN9mcYBh0dHdQ3eqsDo/+tgsH6uFp8FX/84x9R31D/nevZ29uLsrIy2ua4ceOQlpZG5+11F/TfeP1f39VhyojAiBgE+AfQzQIABw4cgNvjHiCobzfPOwHLshg7diw1hzmOw7Zt27Bz504wDINly5ZRQTJp0iQaWSaE4KuvvsK+ffug1Wpx7333+QiM7u5uZGdnQyqVYs6cObcdQ3p6uk9OaX5+PmpqagZ1CwwmEBmGwbx583zMxEsXL+LQoUN3naAfHR2NX//61wgPD8ePjQULFmDlypW3NVunT5+OBx54ABKJBDzPo7CwEO+88w7MlltnSjQ2NqKxsZHSqb293edqpMPhwLBhwxAREfG9LjDclUDked6HMex2Ow2Fe/84jkNpWSn+8z//E2fPnqURydDQUCxcuJAyZv/BejwemuR9c1s9PT348MMP8corr2D37t0+gmJMyhgaqvdmyTc1NSElJQXjx4+nY42JicGoUaPo64qKCtTX1yM1NdWH0by+tMbGRhgMhtteIQL67oL2T9e5fv06rly54pMi01/wOxyOAYeIWCxGWloaQkJCaOCisLAQ1dXVg7bjzVXznoz9acVxHAoLC/Hyr1/GRx99hLzcvO+OqonFkCvkVPu02+2w2+0+roj+UVee528ZDRzskOz/mhH1aSLefDqvpnLmzBmUlpb9PQLJeXD58mWf+8ff18cVFx+PYd/epBCJRLTdlJQUegUUAJKTk30Sfa9fv47q6mqkpKRgRL/IPSEEubm5sNlsCAoKoj7K20W7+7tsbty40VeHsN+11pu16MHcT97AH8P0uRwOHDjg40t0u919Whhufe+bYRhkZmZi0aJFPv5Qr6Z4K1rf3F7/iPGt1kWr1eJnP/uZT6T/ZstQJpPhueeew6xZs2jQcueOnfjow4/Q2to6QPlyuVz45ptvfO6c91em2tvb8cYbb2DZsmVYtWoVzp8//718O3eEtrY28vrrrxOtVutT9mfYsGFk7dq15KWXXiIrVqwgKSkptEQYACKVSsnYsWPJzl07Cc/zpK2tjTzzzDNEpVLRZ8RiMZk3bx556aWXyAsvvEBWrVpFFi9ZTKZMmUKCg4OJWCwmDMOQJ554gtjtdp9xbdmyxaccmEwmI5cuXRpQYeTwkcM+JcdkMplPvTqn00m2bt1KIiMjCQASHhFONmzYMKC/m6uqpKSk+FQYiYuLI3v27CFFRUVk8uTJtBQTvq0OtGfPHuJwOHxKH7399tskICCA0pVhGDJmzBiya9cucvDgQZKRkeFTVmrIkCFk2fJl5PnnnycvvvgiWbVqFZk7dy5JSUkhfn5+RCQSEb1eTw4cOPCd6+rhPOTDDz8kGo2G0uXnP/85ycvLIzk5OWT58uV0bADIkCFDyPbt24nNZiN5eXlk3LhxdFyxsbHk4MGDtHJRQ0MDuffee2m1H6PRSP70pz8Rj8dDCgoKyJgxYyhtEhMTyTvvvEN2795Nfv3yr0loaCjlI5Zlb1tz73ZwuVzkk08+8SkLZTQaB61UdOjQIRIQEEDXwM/Pz+c5i8VCvvzySxIREUErHn3xxRfEYrEM2jfHceTkyZOUR7x/MTEx5LPPPiMff/wxiYuLo+NSKBRk8eLFAypIlZWVkUcffdSnio1EIiGLFy8mVVVV5MzZM+TJJ58kfn5+RK1Wk0WLFpHc3Nxb0qSnp4csWLCAMAxDGIah1W4cDgc5efIkCQ0N9Sn/lZWVRSoqKkhvby/ZuWsnmTZtGmFZlsTGxpI/vP02aW1tvWVfeXl5JDk5mVay+eqrrwYtr/fv//7vxGg0UtonJiaS3/72t2THjh1k3/595L/+8l9k/vz5RCwW09KDmZmZZO/evbSd48eP07KDIpGIpKen3zW/3LFAPH/+PC0Q6+1QKpXSOn1isZiIxWLCsiyRSqVEq9WS0aNHk9dee43k5eURl8tFeJ4ne/fupULOK+i87fWv+ed9n2VZIpFISGho6KDErK2tJRMnTiQsyxK5XE7mzZvnUxuREr2lhTz88MO0z6lTp5LOzk76eXt7O5k7dy5hWZbOY/z48YPWvvPi+eefpwU5vWOVyWRk6dKl5Omnn6ZFNCUSCW3zwQcfJA0NDT5lm4YPH04kEglhWZbO3Vvvbf78+bSAqZc2Xtr132Te/lmWJSqVikyePJm0tbXd0dqaTCayes1qYjQaaf3AxMREkpKSQqZNm0aefvppotVqCcMwhGVZMnv2bFJdXU2ee+45WqzXO+aVK1eSrq4uQgghf/7zn0lAQAD9nkQiIcnJybQU186dO8mECRNo3Uq1Wk0CAgJIWFgYWb58OVmxYgWRyWSEYRii0WjIG2+88b1KiZlMJpKamkoP6EceeWTQknHt7e1k9uzZdC3mzp3rU2/PK+C9tBeLxSQ9PZ1UVlbesq7jyy+/TBQKBS246qXF1KlTyYQJEyjdvPtJoVCQ999/36edd999l6jVap+9x7IsCQgIIG+88QZZsWIF5S8vHX/27z+7JT14nidHjhwhiYmJtJSYxWIhra2tZMmSJT685S1i/NZbb5GLFy+SqKgoOg6GYUhISAg5euzYbWtbfvDBB8RgMBCtVnvL+oytra1k+/bt5LHHHiPBwcGEYRgik8mIRqMhWq2WqFQqwrIsCQwMJNOnTycffvghKSkp8SmVlp+fT6Kjo+l3V69efde8IrrTnxCw2+2oq6uD1WaDx+2mWee810n6beheJBJBLpdDqVRCqVRCrVYPyDeqqKiAWCyG2WyGQqHoMxNEIrAMA6VSSU03hmEgk8nQ2dkJnU6HqKioASk+3jLve/fuhUqlwvz58xEdHT1ohY7r169j//79sNlsWLp0qU90med5XL9+HQzD0L79/PwQFhZ2S2d1V1cXqquroVQqYbVaIWIYEJ6n/Tc2NcJmtUGhUMDtdtOrRUajkbbpLajAEx42qw0ymazvJwfEYhgNBkgkkr6kbZEIVqsVYrEYOp0OHo8Hbre7zyXBMhBBRO92K1VKGIK+2+S/2WdXWlqK06dPo7y8HAaDAffccw9SU1Mhk8loQro3rcpoNKKtrQ3NLS1gRCIolAp43B6aKsUwTF+VmbZWeNwe9JrNkMtkYBiGXnPkOA6dXZ0oKS7BmTNn0N3dTftNSkqCx+NBc0szeK7PvAwJCfneydoFBQXYsWMH9Ho9li1bBqPROCiPVFZWYu/evWAYBtOmTcOIESOomedNoO/q6kJHRwf8/f0REBiAYGPwoJkS3p8q6OzspJVsGIaB2+1GcHAwHA4HOjs7IRaL6c9KuN1uREZG+gQEmpub0dvbi56eHqhUKhAQEL7PhIyLi4PD4UBjYyPEYjHsDgdYhkFERMSA/N2bo9tHjx7F2bNnsWDBAnrRobOzk96r78/3MTExkEqlqKuvg8VigUQsgVgshsPhQHx8/G19hb29vTSJfcnSJYiNib2lu8Vut6OtrQ3Xr1/H1atXadWskNAQJCYmYsSIEdBqtFCr1QP2pcfjwaVLl7Bnzx5ERUXh/vvvH5AX+51+bvJDJCAJECBAwP8CMAIJBNx1+gzPCYQQ8L8SgoYoQICAuzoQvb/UJwhEAQIECBBMZgECBAgQBKIAAQIECAJRgAABAgSBKECAAAH/RyG2Wq19vzQmAniOH7T4ggABAgT8bwattn3kyBH84he/QEdHB8RiMTweD636K0CAAAH/F8CyLJYuXQpRdXU1uXDhAi215Ha7/36dToAAAQL+D4Dn+b5f/eN5nnhVRgC3/XU8AQIECPjfCK+LUEjMFiBAgIBvIUSZBQgQIEAQiAIECBAgCEQBAgQIEASiAAECBAgCUYAAAQIEgShAgAABgkAUIECAAEEgChAgQIAgEAUIECBAEIgCBAgQIAhEAQIECBAEogABAgQIAlGAAAECBIEoQIAAAYJAFCBAgABBIAoQIECAIBAFCBAgQBCIAgQIECAIRAECBAgQBKIAAQIECAJRgAABAgSBKECAAAGCQBTwPwBCCHjCC4T4H6S/8Cu/gkD8weF2u8HzPDiOg9vthsPhGJTxeJ7/QRjQ5XL94HPgef6/bRN6hSDHc3A6nZQmHo8HFosFbW1tdEyNjY3o7Oz8p9m4Ho8Hzc3N//Aa/DPMh+M5uDk3OI67a165Hb8IgvbHwz/1D9XzPI/6+npcuXIFer0ehBBUVVVBJpdh6JCh4DgO/v7+kMvluFF3A+PGjoNCoRi0HYa5M9nf2dmJk6dOYsb0GdBoND/IPOx2O8rLyyGVSpGUlASRSPSj0ayzqxN5uXkYMWIEgoODwbIs/aykpATnzp2D3W7HqlWrUFxcjG+++QbR0dFYvHgx1Gr1/+h6WywWHDt+DBcLLuKee+7BtGnT/iGB+GPQmeM4VFdXw+VyIT4+HhKJ5Acbx/Xr19Hc3IzRo0f/oGtx6dIluN1ujBkz5jvH+38d4n/mwdlsNpw7dw45OTmIioqC2+3Grl27EBYWhsTERNy4cQNKpRLjx4/HuXPnEBYahpiYGJ82uru7cenSJSQlJSE4OPg7mff69ev48wd/RkhwCCZNmvSdp/SdCFqr1YqtW7dCJBLhV7/61S2ZnRCC7u5udHZ2IjIyEhKJhG4oD+cBI2K+s7+6G3VYt24d1qxZg9TUVFRUViIjPR1yuRz79u2DzWZDZmYmGIbBnj17oFarMXLkSMhksh99PZ1OJ1rb2hAYEAClUjng89raWuzftx+TJ09GWHj4P3bS/4DCkCc8zBYzNGoNes1mfPHFF+jq6sKvf/1rGI3G7z2O/sKSEIL8ggJs27oV69atQ2xs7A82/s2bN8NkMuGDDz6ATqcTpN6/qsnMsiz0ej2SkpIwdepUPLx4MQICAjB9+nSsXr0azzzzDKZNmwa1Wg2z2QypVDpAM7x06RJOnDgBm832nWaGSCSCWCxGR0cHbDbbLU06h8MB8u2/OzXB29vb0dHRcdsN4vF4kJubi40bN6Knp8fXDL5Dd4CIEcFut4MQgtKyUmzftg0dHR0AgPz8fERGRSIzMxOdnZ2orq7G/fffj3Hjxv23aA5WqxWnT52CzT44bdva2tDU1IQZM2YgPi7uzjRBEHA896OOu7fXjAvnL6C3txf+Oh0UCgW6urru2hT+LmEZbDSioaHhlrz3faHX62G32//b3DaChvgjQaFQYNq0acjMzIREIkF1dTUIIRgxYgTCw8MRFhaGsWPH4tixYxCLxWhtbQXHcZDJZFCr1VCpVEgclgi9Xo+IyAjY7Xb09PTA6XSCYRjIFXIE6YN8GFMsFiMgIAChoaFobWtFZ0eftqZQKEAIgdVqpT5MqVQKpVIJiUQChmHA8TxampthsVggk8mg0+mgVquhVCqh1WpBCIFCoYDD4UBVVRWCg4MRGBjo0/eIESOQlJQEf39/cByH9o52OOwOEEIQEhLiYwJ74XA4YDabYbFYYO41IyAgAIGBgUhISECAf9//zWYzent70WxqRkdHB6qqqmC1WmGz2eBwOKBQKPo0uNZWiEQiSKVS6HQ6sCyLmpoahISEwGq1oqOjA3FxcXC5XGhtbQXLsmDFLPz9/SFm+9ZAoVDA4/GgtbUVdrsdycnJkEqlKC0txZ49exATEwMmgYFOp6Mar9lsxuXLl9Hb2wuTyYSgoCC0trZCKpXSAy8gIABisRgejwdtbW3UFWIwGMCDp+vS2dmJzq4uRISHQ6VSobW1FV1dXQgMDERQUNCgwp8QArPZDLvdDrfbDZVaBT+1HzweD86ePYsD+/dDpVRhzJgxEIvFcLvdMJvNaGpqQnt7O9RqNaKiosCyLDweD1wuF7p7uuFxe6DX66FUKtHW1gaFQgGZTIaWlhYEBQVRzdxLc5FIBLfbDavVit7eXkilUvj7+4NhGPB83xxra2uh89dBr9dDKpH6HKjt7e2w2WxQKBQwGo1gGAZJSUkoLS2Fy+UCx3Gw2WxgWRZisRidnZ1obmmBVqOB0WiEXC6/Y/eSIBD/JwYoFkMsFlMT2ul0QqfTQSQS0b+qqio0Njbiq6++gkKhgMViQXR0NJYsWYKiwiJcuHABzz77LAghyM7ORmFhISwWC+655x7MnTvXZ4M4nU44nU4cPnwYarUa+fn5iIuLw6JFi2A0GnH58mVcuXIFTU1N4HkeI0aMwPQZ0+Gv80dxSQnO5+SgsbERfn5+0Ol0mD17NsLCwhAcHAyzxQy7w45Tp05j29atWLZ8GaZnTacC2eF0Iuf8edTW1ODJJ59Ed083jh45iht1dbBaLFi8eDHS0tIGaF0nT55EaVkZrBYL3G53n4Zrt+NsdjZKiouh1+tRWlaGpqYmnDlzBqmpqSgpKUFpaSl27toJAIiLi0NuXi7OnD4DlUoFi8WCOXPmICQkBK+//jrS0tJQX1+P1tZW/PznP8eVK1dw+PBhSKVSeDwe3HvvvRg1ehTe/sPb0Gg0CAkJQWVlJWpqarBmzRqMGDECO3bsQE5ODpKTk+H2uDFp4iS6+RobG1FWVob6+nra7meffQb/AP8+2hYX49HHHoVWo8WNGzdw6NAhSCQSaDQazP3JXOgD9fjrX/8KqVQKjuNQV1cHnU6H1NRUdHd3o6SkBGKxGEuXLUPahAkDTNbOzk7k5uaiuroa9fX10Gq1mDp1KgIDA1FWWorLV65Aq9VC7aeGy+VCWVkZ/vznP/dp5DY7oqKisGzZMkRERKCkpARnz55Fe3s7GIaBXq/H7NmzcejQIXR2diItLQ1Hjx7F7NmzMWXqFDCiPhr4+fmB4zgcO3YMlZWVKCkpgVqtxgMPPIChQ4eisLAQx44dQ2dnJ1QqFZKTkzFhwgQEBwejoaEBJSUlOHXqFMxmM6KjozFt2jSMHDkSISEhIITA4/Hgxo0b2LhxI8LCwjB8+HAcOHgAHe0d8PPzQ2ZmJqZMmQKtViuYzP8KMDU3g2EYiCViHye32+NBUFAQ5syZg9TUVGg0GpSXl8Nms6GhoQGnTp2C3eHA/v370dHRgQcffBALFy5EfHz8gD7cHje6u7vhdDoRHx+PxYsXo6ioCJcvX0ZOTg6OHj2KuLg4LF++HLNmzUJOTg4O7D+AlpYWfL5pE/z8/DB79mzMnDUTBQUF+HrL17Db7WAYBjqtDp0dnbhw/jzGjh2LyIhIH+2U8Dyqrl/H7t27UVlZiYMHDoLjOEzPysJ9992HgMCAAQ7+06dP48CBAwgLC0VWVhZSUlIQHh4Oo9EIU1MT9u/fD0IIEr4NAGRkZCAmJgajR4+G0WjE0KFDIZPJsHPXTpzPOY/MzExMmjQJ7e3tOH3mNCRSCSwWCw4fPozAwEBMmTIFpaWl2LFjBzIyMjBv3jzI5XJs2bIFLqcLer0excXFiIqKwsKFC5GRkYF9+/ahra0N8QkJMBqNSElJQfTQaB9tV6PVICoqCiEhIUgZkwJ9UJ9W9fmmz3H+/HmkpKSgq6sLr7/+Onp7e/HEE09g4cKFaG9vxxeffwGHw4HS0lLk5ORg0qRJWL58Oa5du4bNmzcjKSkJTzzxBEQiEfbs3g2n0+ljsrpcLuzYsQP5+fnIzMzEI488gsjISBw5cgROlxOTJk2CXCbD8OHDERHeZ2mo/dQYNXoU7p19L8aNG4fy8nJcvnwZZrMZx44fg7+/Px5++GFMmDABu3fvRl5eHtRqNc6ePYvz589j1KhRCA0NhQh/X3+pTEoDiQEBAZg6dSry8/Px8Scfo6GhAe+//z4qKirw+OOPY+rUqaiqqsLvf/97mEwm/PnPf8a5c+cwY8YMrF69GmKxGO+88w6uXr0KhmHQ3t4OjuPQ1NSExsZG6HQ6NDQ0wG6z49FHH8XixYv7NHfm/3Ym3r/M7J1OJ+pu3ADLsvRE9QoFc28vwsPDcc8992DevHlIT0+HyWSCw+lAWHhYnwnybbrJ5cuXYTKZIJFIaOCiv8+xsaERHMdh6dKlSE9Px/jx4xEWFoa8vDx88sknYMViZGZmIikpCenp6TAYDDh27BguFV5CY2MjkpKSkJmZidQxqYiJicHpU6cpE9Y31OPDDz9EQ0MDFi5ciISEBJ85yuVyDBkyBAEBAWAYBs0tzSgqKkJtbS0cTic4jh/gm7x69So0Gg3uv/9+ZGZmYsyYMTAajVCrVIiJiYFMJoOfRoOYmBgEBwdj/PjxiI6ORlx8PAIDA5E5ZQosFgs+2/gZVCoVhg8fDqPRCD8/PxiCDDAajFTDeOihhzBz5kycy8mBSqVCRkYGEhMT6TrodDqMHDUScXFxyMjIQGZmJh588EE0NDTA6XRi/LhxGDJkCKZNm4bw8HAqkDweD4KNwRg5ahQiIiMxftx4hASHICEhARaLBRkZGVi5ciW0Gi1cLhdGjBiBUaNGYcKECXj88cdRVVWFoqIiTJw4kWo5aWlpSByWCIPBgPHjx2PMmDEYMWIEqqqq0Nra6uOPbW9vx9atWzFhwgTqsrjvvvvQ3d2NI4ePQKPRQC6XIygoCIGBgZDJZAgODkZWVhamT5+O9PR0tLS0QCKR4OzZs8jLzUNCQgKkUik6OzvBcRw0Gg2mTJkCqVQKjUaDBx54AAkJCT4Hotd1MXv2bIwYMQLp6elISUnByRMnkZ2dje7ubqxatQrDhw/H1KlTkZWVhfLychw7dgxXr17FpMmTMXPmTIwcORKPPvootFotvvnmGzAMA4fDgT/96U/YunUrRowYgXnz5kGr06KtrQ0nT55EXV0dNBrNoMEuwWT+JwLHc2AZFi63C729vWAYBiqVykcgNjc3Uwc3wzCAqC+wIJFIIIIIISEhUKlUGD9+PJqbm/HRRx9BoVBg+fLlmDt3ro+mwnEcwsLCYDQawbJsX4TX44HNZkNTUxPmz58PuVxONQy5XI6uri4UFBSAYRhERUXRtqKioiAWi+F0OnH9+nX4+fmBJzwIT9DU1DQgQskwDJRKJVQqFUJCQjBr5iysX78eGzZsgFarxcqVKxEbE+MjxLu6ujBq1Cgo5Ao6fqvVCplMBo/Hg8DAQCgVCnA8B4/HA7PZDLfbDbvd3scALIva2lpYrVa0tbXhs88+owGomTNn0oDO0KFDodFoUFtbi4pr1xAaGoqjR4+irLwcDQ0NWLZsGbQ6LSxmCzieR0BAnzYrk8ng7+8PlmVhtVphsVgGBBO8LhGP2w3PtzmnIpEIGo0GKpUKEydOBMuysNvtkMlkPsGz0NBQ8DyPzs5OuFwu6s8Vi8UwGoxw2B3Ub2u320FA4B/g7zMGl9tFx+p1wyiVShgMBlyvuo7x3eNhs9kgEolACIHBYOjLjeV4sCxLMxs8Hg+Ki4vR0NCAHTt2wOVyobOzEzNmzMC4ceOgVqshkUgwdOhQSCQSyrNe/uvt6YVer4fT6URISAgAICIiAkqlEoVFhZDJZDAYDH8PwoQEI8gQhGsV12Cz2RBsNNJ5+fn5ITIyEpWVlX2Hop8furq60NHRAbfbjStXriA2JhbJyckoKipCQUEB2trasGTJkh8s3UwQiD8CPG4PWBkLu82O9vZ2hISEUIHkZUKvD4xGpxkGoWGhEIlEqKmp6dskLIuRI0ciNjYWNTU1OH36NHJzczF58mTo9Xoq4EJCQ5CamgqHwwGRSNQXqDCbkZiYiNraWp+xmc1mXLlyBYGBgYgeGo2y0jKYTCbo9Xq4XC6UlJYgKioKKrUKSpUSo0aNwqxZs7Bnzx58+eWXMBqNCA4OhtPphEwmA8/zMJvNkMvlUPupERkVidd+9zuIAKx/dz2uXL2K++67j46XYRiwLIvSslL09PZApVSBJ33CSyQS0aiiw+FAZ2fn32nGcTCZTHA6nZDL5EhOToZIJALDMIiLi0NERASihkQhwD8AEomE0t27UUNDQ+F0OhEdHY3ExETEx8eDJzw8bg84joPL6YTVZoVKqYLH44HT6YTVaqUC2WQyDUiPAkADFVarlVoFDocDom/NOKlUCkIIent76dzMZjO0Wi3Cw8PR0tICi9VKfYMhISFobm6mEXqe58GIGEjEvkEVrUaL2NhYdHV1welyQiaVweVywWQyQS6TQ61Wg2VZ9Pb2AgDCw8MhZsU0GiwSiRAYGAiO46BUKqHT6WA0GjF+/HiER0RAqVBALpeDJzx0Oh1UKhWld39NNTIyEv7+/qivr6fvK5RKBAYGYljiMFwrv4a2tra/p+QQgGVYEEKg0WhgMplooMlqtaK9vR0GgwFisRgajQZz5szBqFGjsH//fmz6/HM899xz+OlPfwqe51FaWooNGzYgLCwM9957L6xWK6RSqc9eE0zmfwJ4tYHS0lJcvHgRAGgaicfjQeX1SjQ1Nfn4PvLz81FZUYmC/AKUlZXBbDajtqYGH374IQoKCqD4lkFDQkJ8tA2RSIQgfRAcDgd27NyJ06dP48SJE/D398e0rGmYPn06Ll68iLz8PNTU1GDTpk3o7u6mvjJ/f38cPHgQpaWlOHL0KDraOzBz5ky0t7WjtqYWDocD8fHxSEhIwNmzZ7Ft2zYqqEQiEZxOJ2pra1FbW4tTJ0/h0MFDaGluhlwuB8uwUCmVPgwqkUiQmJiI/Lx8/GHdH/DNN99g+/YdKC4uRnV1NS5eugSTyYSOjg6Ul5fDbDajsakJTocD1VVV6OnpQWtrK0JCQhAVFYWWlhbIZDKa/1lcXIyOjg4alGhuboZarcbMmTMhEonQ0tKCwMBA5OXlYcvXW2BqNuHatWuora1FfV09AKC6uhoVFRXIzs6mmt+uXbvQ1tbmIwycTicaGxthNpvR3t4OnufR3NwMkUiEimvXAAAxMTHQaDQ4evQozp07h3PnzuGvf/0rIiMjkZKSgrq6OpiammC329HW1obCwkJUVvbxh9PphMlkQnNzM0pKS3xSUPz8/HDfnDk4fvw4jhw+gorKShw4cAAmkwlTp05FQEAA1Go1Kiu6xoogAAAgAElEQVQrUVhUiOrqap9Dpry8HHV1dSguKUFwcDCGDu27NCCRSFB1/Tq++OILnD9/HnU36lBXV4cLFy4M8GMCgMFgwOjRo3HmzBncqKtDWVkZzpw+jYyMDMyePRsjR47Ejh07UF5ejoKCApzNPgt/f3/M+8k8zJ49G8ePH0dhYSEaGhrw6caNqKmpweTJk1FfX4/e3l6Ul5cjMjISqWPHovjq1f/P3ptHx1ld+dpPzYOGqlKV5lmyZcmaLAnLBo/BBDDGTMZhMnTc8U2a5Atpkvvd7rU6NzfJd7tvk07CJQmdJtBATGww2MEzxqM8y5Ms27LmeSqVpFKpqlTz9P1RrjcWHjDppuOQ91krawW5qt7pnN+79z777M2/vvoqu3fvpq+vD+sV195oNDI1NcWGDRs419DwF2chyn74wx/+8HY/SYlEwuDgICMjI5SWlVJdVU1iYiKhUAir1YrNZqO8vFyIybW2thIIBLjzzjtRKBSkpUXjU2Pj4zQ2NjIwMEB+fj4PPvQgBv1090kqldJ/ZVVXp9MhkUqpKC+PLgQUFGA2m+nq7OLcuXNMTU2xevVqli1bhsFgYMaMGVitVtra2nA4HFRVVXH33XcLrtPcuXPJL8gnLS2Nrq4ukpOTqampmWYxxFy/0rIyppxOzp07x4ULF0jUJfLEE09EA/FXzlcikaDX65m0T2IZsaBUKpHJZcRp45g5cya2iQnS09NZvHgxtkkbbpebO2qisc2JiQmCwSDl5eXk5uZSWFhIIBCgoaGBvr4+ZFIZtbW1BAIBJiYmSEpKYuGihZhMJsHl+/jjj2lubsZqtVJRUcGsWbNoaWlBrdGwaNEi9DodZrOZsbExklNSWLBwIVqNBplMRmZmJklJScK1hMNhenp6SEhIYP78+RiNRsbHx7HZbMyaNYvS0lI0Gg2FhYUolUo++ugj6urqSExM5JlnnsFoNDJxJbUmFtdsaWkBYPHixWg0Gnr7ejEmG6mpqsFkMk27j9lZWYyPj9Pe3s6lixfp7u6muLiYlStXotPp8Hq9TE1NYdAbCIfD2Gw2SktLyc/Px2KxMDIyQu3cudTW1pKUlMSFCxc4fPgwrW1tSIB7770XhUJBa2sr2dnZ1NTUCKGCq0MHBQUFSCQSLl++zPnz5zEajaxYsYLc3FxhZ8yBAwdobGxEqVCycuVKKioqoucxOsrw8HB0Mcjr5YEVK1iyeDFutxuHw4Fer2fOnDmYjEYGBwdJTUtDKpVy4sQJ5HI5paWlzJ8/H7lcTtPlJlJTU8jJzvmLEsTbeuveJ7FNTqK6kvt3df5YMBgkEokI1l44HCYQDKBUKAmFQ4TDYeQyOS6XC5fLhUQiISkp6br5aMFgkMnJSQD0ej1yuXxaeoY/4Mc+aSccDqPT6a5xKcLhMFOuKdQqNRKJ5IYJzzGXPJZ7dvVCidvtRqfTCQNZoVCg0+lu+FvBYFCIr+p0OsFdDgQCRCIR1Go1DocDt9uNXq9HrVbj8XoZtVjQ6/VCmkXMtZVKpcTHxwsT1uv1Eg6H0Wg003ZW2Gy26IprfDwJCQlC8H7SbifJYBCeh8/nE9zJmGssk8mmWfWx5+j3+4UYsc1mo7+/H51OR15e3rRrtlgseDwejEYjCQkJwr0PhULI5XIh3BG7ZplMhtfrRalSXuMyx47vcrnwXMllDAWD6HQ6YStoKBTC6/Wi1WpxOBx0dXWRkZEh7H7yer1Ciljs+sxmMzK5nPi4OGF30pRrCp/XN+1lcL2x4fF48Pv9JCQkCPctEong9/v/8Dy0GtQq9bSxZ7fbcbvdJCQkTIsFxqzzq48Zy2sMhUIolcppu5Wu93lREP+M+bz2sn6R7k84HL5uovfnid/vv2ZH0c2e3WfZh/5fee+CwaAgvJ/1u590lUVEQRT5CyUmJDcjFA4hlUhF0RARBVFERETkT4VYIFZEREREFEQRERERURBFREREREEUEREREQVRRERERBREEREREVEQRURERERBFBEREREFUUREREQURBERERFREEVEREREQRQRERERBVFEREREFEQRERERURBFREREREH8S+TqxkciIiKiIP5FE4lEEOv1ioj86bgtK2ZHIhE8Hg9TU1Po9fprenAEg8Fo4yi5/LbrtwHg9riZck5hMplueH6xpkY2mw2dXkdCfMK0Bk7BYFDouxwjFApFG6Rf6YUSu/6r+4/Evnd1mf7wlWMFrjQtulGzqutZrD6fD4VCcU3Z/2AwKBzrRj1SwuEwE7YJ4rRxQsOi2Hl/8reu14Q+1jQq1pHQ7/cLPVakUqnQSOuT3/siEmvUpVKp/sv74PxnEAgEsNvtxMXFoVarb9v2ELdlG1KLxcKOnTs4dfo0ebm507qHeTwePtqzh4aGBjIyMoQObbcLoVCIE8dPsH//fkpLS6d1Mpsmmm43O3fupKWlBZ1Oh9FoFMRzfHycbdu2MTQ0RGZWFkqFgr6+PhoaGjh37hwNDQ00NTXhcrnQaDTExcXh9/s5c+YM+/fvxzk1RWZGhjBx7A47586dY8/He9Al6khNTb2laxkdG+Wtt94iLS2NpKSkaZPz8OHDbNu2DZfbzYzCwusOcJfLxfbt26mvr6e7u5vBwUHa2tsIh8PExcWhUChwu93s37+f999/H4g2a4/9lsViYffu3bjcbtQaNXv37mXfvn20tLTQ3d3NmTNnOHjwIDabjdzcXEEobyUsEQqFkEqlBEPB/5LucqFQKGqB/JHH2blrJ9u2bSMrK2vas7gewWBQeJH9V477cCRMJBIhEAggkUqQSqSCx7Nr1y7Wr19PKBSisLDwthX12868CofDDA4OsmvnLjZu2EBPT8+0f29qauInL73E1q1bhXahn4eF+h8ZGOfPn+fo0aMEAoGbvjEPHjzItm3brpnITU1N/OpXv2Lnzp1MTU0xODjIhg0bOHToEGq1mvl3zsdut/Pzn/+ct99+G4fDgd3h4Pe//z2//OUvOXnyJB6vZ5rFardPcmD/AUZHR2/5Wo4dPca7777Lvn37pv19cnKS3bt38+tf/5r6kydxuVzXfNfr9dLY2Eh9fT2jo6OkpqaSmJjIqfpT/PKXv+Ttt99mampK+K3f/OY3bPn9FsxmsyAcdrudjRs3snXrhwwODlJXV8eePXvo6uoS2rf29PRQX1+P3W6/5ecTDAYFYZJKpPCfoIWBQIAzZ88yPj7+uYzJSdskO3bsoKur66afs1qteL3eP4nn5HQ4sdls+Py+P7igV1riNjQ0oFKpKC0tva0tXPltp9BSKeXl5Sxbtoz29naGh4eFtpSBQICmpiYAnn76abKysm4Yh4u51DFupf3lpwn1rQyyWO9cp9NJMBi84efi4uKYO3cuGzduxO12C26w3+/HbrdTXl7Of/tv/w2tRsMv33iDwcFB/uEf/oHMzEwAykrLKCoq4h//8R+RSCQ89dRTFBQUIJfLmXvHHSTEJwjHMhqMVM2pQiqVotVqb6lFq8Vi4ciRI5SVlbF161ZWr16N0WgEIDU1lcrKSrZt20ZNTc00Kz0cDjM8PEx7ezu//vWvWblyJc8995zw77W1tbz66qu8+eabzJg5gy8t/RL3338/586do7Ojk3/4h3/g+9//PkVFRWRlZTFr1iySk1OorqqmcW4jCQkJPP/88+Tm5gLw8MMP4w8ESE1NvenzCYfDuD1uAv4A8fHxyGQyQqEQkUgEuVQuiNr1whRIQCa9+SS22+38+xtvMG/ePJ599tlpYy8UCgm9j/9YHnzwQQ4fPozL7RbCCJFI5BpxMRgMhCPRPuSfHLs3aj0b+3s4HP6jrMrYeDIYDAQCgWvas8b6RRuNRgpv4E2IFuJNUKlULFmyhLS0NBoaGgQ3p7+/n1OnTvHoo4+yfPlyQqEQ/QP9WK1W4TPhcJie3l6aW5oFQQoEAgwODhIMBT/12C6Xi8vNzUxMTAhuTjAYZGBgQGjsPTw8fI315/F66OzspKGhAbvdLlhEN0KhUPClL30Jg8HA5s2bsVqtALS3t3P48GEeW/UYJbNL2LZtG3v37uXOO+8UxDDGggULqKqqYu/evQwNDaHVatFoNKSkpEwTB5VKRV5eHklJSRiSkj51NTsUDnHw0EGSk5P59ne+jUqlYtOmTXg8f7A64+PjUSqVpKenTxvgkUgErVbL4cOHGR4eprKyctpva7VaHnroIbKzs9m9azfhcJj09HTy8vO4e9ndTLlc1NXV4fF4hMkru3ItkTA4nM5pkzYlJYWszMxPfVlFIhEmbZMMDQ3hnHJG40VXxTP9fj8dnR3Cc4hEItjtdoaHh/FeaV5/M/R6PS+88ALL7lmGXC4Xxo/T6WRsbEx4UcfG1K1anQMDA1Hry+nE7XaTkZ7OhM2G2WzG9gkPKRQKMTY2xpRz6pq/BYNB/H4/w8PDwryYmJhgYGCAgcEBxq3jeL1eYVw7nU76+/sZHx+/peyHCNHrm5qaoru7G7fbPe06/H4/VquVwcHB23rhUH67nlh+fj4rV65k586dHDlyhJkzZ7Jz504MBgNr1qyhtbWVXbt2CW/esbExHnzwQe666y7279tHf38/3/nOd0hJScEf8HP+/Hni4+NJSUm5oatx9OhR6uvrCQQCBAIB8vLyWLduHW63m9dffx2lUolUKsVut+N2u6mqquK5557j9OnTfPTRR9hsNrRaLd3d3RgMhhvGD2MUFBRw//LlvP6b31BUVMSCBQvYunUrcrmcmuoaVCoVBw8eJBAI8OUvf/ma7+t0OkpKSjhx4gRut5vR0VE0Gg3x8fHXPZ5Go0Euk33qG3psdIxT9adYsWIFleWVLF68mG3btrF06VJKSkqQSCTTBvy0oLRMRmJiIhcuXiDJmHRdKz49PZ2ysjLOnDmD3W7HbreTnJzCM8+sISU5hU2bNpGQkMCSJUsYHx9Hp9NFY1ShEJebmmhsbMTr9dLa2opUKmXp0qXCs7meENpsNhovXODE8ePYbDYSExNZtmwZ5eXlbNiwgebmZmbOnMnFixcpLStjzZo1nDxxgo7ODiasEyQmJlJQUMCKFStuGLO22+288847pKSksGrVKt577z0CgQBKpZLh4WHC4TCJiYl897vfxWAw3FQE6+rqOHvuHMNDQ7hcLgoKCnjiiSeQyWQcOHCAM2fOYDab0el0LF++nJKSEvbu3cupU6eEOHtmZiaPr34ctUrNT3/6U7KzswFoa2vjr//6r4mPj+fDDz/Ebrcjl8tRqVQ8+eSTZGZmsnnzZi5fvozVaiUtLQ25XM7jjz/OzJkzb3iPPW4PGzZsoLW1FbVajVKpJCsri/vuv4/x8XEuXLiA1+tlxowZrFu37lPnhmghfgKlUskDDzxASkoKv/rVr/j3N/8d84iZRx55hEAgwIEDB8jLy+PJJ5/kkUceIT4+njfeeAOz2Uxvby/Dw8OCJRAKhjh79uxN42cqlYrc3Fy+8pWv8M1vfpOysjJhYWPSPkldXR3nz5+ntLSUr371q8yYMYMPP/yQ7u5uTpw4QSAQ4Jk1z/Ctb32LwsLCW3rgUqmU5fffz9y5c/nNb37DT/7lJ3R2dvLMM89gMBiQIIkKgl6HRqO55vsSiQSlUonH48HhcDA+Pk5KSgoJCQk3PKbD6fjU82ppbSUUClFUVATA8geW09nZyf6DB6dZzRqN5rrxoEgkwvDQMMnJydc9b4VCgVKpxGKxMDIyQjAYJD09nWSTiYcffpicnBw2bdpEb2+vYFnF3P3u7m6279jOe++9x6ZNm9i9ezcDAwM3tLxibmVWVhaPPfYYf/u3f0tubi4/+9nPsFqtJCcnU1dXx6VLl6isrCQtNZVDBw+yfft2Ksor+Ju/+RtSU1N5//33aW9vv+lCRnt7O/39/chkMtweD1u2bMFoNLJu3Trmz5/P8ePHqa+vv2l8s7+/ny1btpCXl8s3v/lNli5disPhIBKJ4PP7GRgYYOnSpaxZs4aBgQHWr1+Py+WioqKChx56iK+t+xr3338/9fX1bP1wK263G7PZzMcff4zL5eLee+/FYDCwfv16wuEw69atY+XKldFFr6FBQqEQmzdvxu/3s27dOlatWkV9fT0NDQ34/f7rnvfU1BRNl5s4deoUtbW1rF27liVLltBwvoHfvv1bjEYTtbW1ZGRkMLe29posA9FCvEWys7NZu3YtL774Ikajke9+97ukpaXx2muv0dnZyVe/+lWSk5OJRCIsWrSII0eOMDo6ikQiIT4+Hr1eD8DAwACtra03DbxrtVpmzJjB/v37uXjxIiMjIwwMDODz+SguLiYhIYHFixdz9913k5iYyPj4ODt27KCjo4Ompia+/e1vU11TTcAfEKyIW4mVZGRk8NWvfpVvfvObtLS08oP/+T8pLS1FoVAIsR21Sn3Dya5QKITjRSIR4uLjbygOExMTN13oiU3Kf/3XfyUSDrNlyxZcLhdarRan08nePXv42tq1yOVytFotarX6hsKvUqlITEi87j0IBoMEgkGUSiVKpTIaz7vi0iUlJfG1r32NH//4x2zcuJH4+HjUajWhUAidTkdubi5PPfkUZWVlOJ1OpFIpqampN4x9SaVSdDodCoWCCxcucPz4cTo7O+ns7KSlpYVly5bx1ltvkZ2dzTPPPIPb7eall14iLy+PBQsWCKk9fr9fiKFeD51eR2VlJR0dHRgMBiorK2lva2Px4sUUFhaSmJjIBx98QFtbG/fee+/1XyRE6OruYnBwkHu/HBWuvLw87r//fsLhMJM2G4UFBZTMLkEmlXH33Xfz3nvvYbfbhdDFgYMH6OvtY2pqivPnz/Poo49SUVlBa2sbTz31FDk5Ofh8Pi5dusT3vvc9CgoKyMnJITU1lSOHjxAOhXE6nTz62GPMnj2b06dPY7Vab2iBxzhVfwqtVsvDDz+MTCajoKCACBFe+ueXePiRh6mtrcVisZCVmSkuqvyxyGQy8vLycDqdGAwG8vPzmbRPcq7hHHqdnuTkZCH3Lj09HYVCQTAYxGazRa0KSfQB1tfXY7PZbhrU7uzs5OWXX0YikZCRkUFpaSkXL14kLi4OuVyOTCYjLT0NnU4XFapIGJVKxenTp3G73RiSkpBJZXiCHvr6+khPT7/la0xLS0Ov1xMXF8cdd9wxPUaWmkJfbx9utxudTjdtcScW5yoqKqK4uJiT9ScZGxu7JuYVCoXweDyo1WqMScabD+xTpxi1WHjk0UconV2K0+nEZDIxb948zpw5g3XCSlxcHD6f74bpKlKplFmzZtHb28uEbYJURTTNJ2YZBAIB/FdeNMkpyfT09EzLoayurub555/npZdeYmpqijXPrhG+63a7iY+Px2g0YjQabymZfWpqik2bNnHkyBFqamr40pe+RFNTE4ODg8TFxREKhfD7/Wi1WiF8kp+fz8cff8zu3buRSqV873vfE9zO6z9HOSaTicYLjfiDfuLitKhUKrRarWDJy+XyabHRawQxHME+acfj8eByu9FoNEJceHx8HKlUGl20uLJgYjKZGBwc5OLFi/T39/PBBx+QkJBAUVERExMTtLS0MDk5iUFvIBgIoNVqhYyGuLg4kpKSBLdeo9Vwqv4UMpkMh8PBgf37udDYyNTUFN94/hssXrz4hvNHIpFgNpuFl2dsbM6pnMP4+DhnTp+hqKhIWHG+nbntd6rEBMCUbEIul6NWqdEl6vB4PNjtdiRSiRBDNBgM6HQ6JBIJo6OjOJ1Rl3lwcBCJRIJarb7hMdra2nA4HDz88MM89dRTLF68mPT0dCJEsFqtuN1upBKpsBo3NjY2Lf4YuSq/zeFwIJfLhUn+aWi1WhISEjAajej1+mnB96qqKnw+HxcuXLjmt9ra2mhra6OyspL8/HxMRhOdHR20tbVNG3iBQIBz586h0+vR6XQ3vddHjx4lJSWFlQ+uZNmyZTz88MMsWrSIJ596EpVKxeWmy8J1KlVKJNLpgujxeAgGg8ydOxer1cqZM2fw+XzTPnO5uZnh4WEWLVqEMcmI1+vFHwgguSLUKpWKZcuWUVhYSH9/P64pF6HwH+7r1Ys7EomEYChIKHzjxYqWlhaOHj3KypUrWbNmDWVlZWi1WiHBPxwOC0IVc8/PnDmD1Wrl0cceY926ddx11103tfgj4TAKpZJQMEQkFCESjjAxMcHk5GRUtIEIYLPZbuh6SiQSgsEgDocDy8jItOPJZLJrLNTk5GQ8Hg9xcXFs2rSJCdsE3/rWt1izZg2zZs3C6/VidzrxeDxMTk5is9mEF5bBYKCjowOPxxNdBQ+GMBgMmEwmRkdHGRsbw+VykZOTwyMPPUJycvINr10ikQj3c9w6fo1HIpfLsdlsUc/gUzwU0UL8FDEcHx8nPj4erSaaLhILiO/evZvTZ05TUV6Bx+Ph0qVLLF26lIKCAqqrq9myZQv9/f1IpVLcbjdut1sQyOsFskdHRwULxeFwsOn9TVy6dImGcw3MmjULk8mESqUiHAnjcXsYGhxCJpMxb948mpub2bp1K48++igutyuazkFEGCxOp/Omcb1gMBhNUvZ4GBoeJjUlRdjV8fBDD9PR3sFvf/tbQWiCwSCjo6O8/PLLSKVSVq1ahUqlYuHChWzZsoXNmzeTkpJCRkYGUqmUgYEBjh49yuJFi26Y1BuJRLBYLLS3t5OYmDhtR0QkEqGstIySkhJ27txJZWUlbrcbmVSGediMQW8gFAoxPDxMfX09eflRN6+hoYHX/u01kk3JFBcXM2mfpLe3lzf//U00Gg1Lly4VXNJwKIT/KuHUarX81Vf/iqampmjKlT86kYxGIyMjI1gsFnw+HxaLhf0HDpBsMrF27dprLK9wOIzH68Hr8zI+Pk5XVxcjlpHoarPTidfrxWAw4Ha78fl8xMXFMXv2bDZu3Mh9991HZUWFkChfU1NDfn7+jV9sGg2BQACLxSK8kGKCKJfJMCYl4Xa78Xq9112ckclk5OTmkJ6ezunTp1Gr1Wg0GiwWCyaTifj4eBwOh2AkhEIhEhIS8Pv9BINBIuHoDq+uri46Ozuju0MmbaSlpeH1ehkYGGDWrFnIZDKqqquoq6sDSTSme+nSJR566CFqamqYM2cOer2ee++9F71eT2dnJ3q9nszMzGlGRcw6VygUzJ07F7PZzKb3NvHQQw8hk8s4fPgwM2fOpLy8nOPHj+P2eBgbGyMvL0/cqfLH4HQ6OXzkCN3d3eTm5lJTU4NCoSAtLY3+/n7q6+s5deoUly5dQiaXs3r1akwmE+Pj45w7d47e3l7Gxsaw2Wy4XC5qa2uv+zCkUik+n48zZ86wZ88e2tvbBVcq5spevHiRoqIicnNzhYWUYDBIcXEx5eXlbN26lQMHDtA/0E9cXBw52TnMnz9fyGu72Ra+9vZ2Dhw4QCAQIMlgIDMrU1gp1ul0ZGVlYbfb6erq4syZM9TV1XHy5EkqKytZ9fgqiouLkclkpKSkEAqHaWlu5uTJk5w7d46mpiasViuFhYWC23O9oHYwGOTUqVMcPXoUk8lERUUFJpNp2q6Rzs5Ourq6kMlkdHR20NPTg8PpoOlSE4cPH2bz5s10d3eTkpzC3XffTW5uLm63mwsXLnD69OnoSmj9KcrLy3nuueeYOXMmLpeLbdu20dHRQXl5uRALk0gkqFVqbJM2Zs2aRUVFBa2trRw4cICRkRG6urrYs2cPe/fupbGxEY1Gw8KFC69x6yQSiZD+tG/vPg7V1aFSKlGpVPh8PlwuFy0tLQAsWbIEg8GAVqtlYmKC7p5uDh48yMDAAHFxcRQUFAhx6Wvis7YJ6urqcDgcGI1GTp06xfDwMFlZWRQVFRG5kjbm9/spLS0lISHhGvGOnavdbufQoUMcPnyYrq4uIWzR1t6G3W7ngQceQCqVcuLECbq7u6Mvw0UL8Xq8HD5yhI4riz8ajQaVUsXo6CjNzc2kp6dTUVGBQqEgPT2dEYuF3p5e5DI5DoeDpKQkMjMzmTt3bnQufLyH48eO09HZQe3cWpKSkqaN49hzksvlZGdnk5CQwP79++nu7qa+vp6RkREeffRRampqOH36NK0tLeQXFFB8RZRvR27Lvcwx3G43l5ou4fP6iI+Pp6KiArlcLqRSdHd3EwqH8Hq85OblkpebB0RzCUdHRzGbzWRmZgr5VUlJSRiNxmsWAiKRCF6vl3HrOK4pFyq1CoVCgQQJoVAIhUKBy+XCaDQSFxdHIBDA6XQSDoeJj49HoVAwMDiAz+tDr9dH92pKJZiMplu6TqvVysjICFqtNhrbMSZdk1g7OTkZzWcjQsAfQKfTkZSUJMSFYrhcLsFVczqdQqwttof0Ros94XBYuGcZGRno9fpp98nr9TI5OYnP50Or1QrWWUw0/X6/YDEkJydHE4SvJORO2CZwu9zChNfpdNOSo3t6elCpVCQlJU2znEKhEAODg0glEnJycnA4HPT39wuJ0rF91BKJhLi4uGnbH683lkZGRoBoDmUoFMLr9ZKQkIDL5SISiZCZmYlCoSAUCjE6OkpfXx9qtZqEhARS01KJj4u/abrM5OQkgSuxuphlGIt3xlJz/H4/iYmJN9zPG46EMZvNOB1OHA4HPp+P3Lw8VCoVHrcbuVxORkYGEokEi8WC3+9HrVaj0+mEvfGxBSiHw0F8fDzhcBiHwyE8F5lMhtVqZdI+iV6vJxyKhkr27t1Lbm4uL774Ik6nk77+PqacUxQUFJCRkfGpq8OxVKhIJCKMn6SkJJRKJX19fYRCIYwmE/orYS1REEVERG7Krewi+o/8dmwP9/sfvE9XZxcPPvggU1NTHDp0iJ6eHmruuIOnnnzyprmSX2Tk4hAUEbmNLJTP0XKKubdRyzWBnp4e3njjDSQSCS63mwceeIAlS5bcdOHtC3///xwtxFAo9GdZAklE5HayRK9eVY8J8e28z1gUxD+BWyFyaxPp6kkkIvJF4c+yYnYswdPhcNxSnt9nwe1209Pbe9vnS/2pCAaDdEPgGrIAACAASURBVHV3MTA4IN4MEVEQbwf8fj8dHR3CXuNbtWxu5TOWUQs7d+5gcHDwP/R7n6WqyZ9DiCLmXnm9XhrONbB///5P/Y64XiciCuJ/xUlLpbS2tfHBBx8I5ZpuxaqM4fP7hLJKn/yM3+fncN3h6/77jX7vj/n3/2p6enrYvn27sFvhs+DxeOjs6mRkZIRIJMLo6CgnT5y85nPhcBi3283p06e5fPnyf+h8rxbgG+3sEBERBZHontjYbo4bbce72UQ7dPAQJ06cECyYqyv86vV6FAoFMpnsP2ThXL3f+LOKwK1abbdqhfr9fk6cOMH7779Pd3f3Zw4H+AN+Pnj/A2w2GyqViuLiYvx+P4Fg4JprHhkZ4a233mL37t03LBH2aZZ3LDWkq6uLd955B7fbLfRdEa1Okc9VW263E3I6nSiv7CTw+/1Cya5YRZPYhHA4HPT1Rat6XE9YYoLk8/lAAiplNMk4EAhwvrGR+Lg43G43cXFxSK6qIT81NSVsC/N4PMhksusmcscq51y9cyEUDiGVSPF6vdhsNlJSU4RKy+FwWMjsv7qqcDAYnLZFLhAIoFAohPP3+/1YLBaSk5MF8ff5fESITEvejn3/6kZVsf8vl8tZsGABer2ekpIS4R7HdsP4/X4kEskNK8aMWkY5ePAgc+bMISMzk9HRUSwWCw6Hg7i4OKSSPzSaSk1N5dnnnsWgN1xT+ivWPOt6x4kJXqxxls/no6Ozk+PHj7Nw0SJyc3OEl9SnWd+xPeQRIsJz/2QoQ8xSELntBdHv97Nx40aKZhVx1513YbVaeeeddzAYDDz55JNotVoOHDiAUqWK9m7w+diyZQsHDx5EJpNRXV1NTU0NcrmcCxcu0HC+gebLzcTHx/PVtV8lNyeXDzZ/wM4dO8jIyCA5OZlly5YJG9dj5e/tdjv1p+o5f/48/oCflOQUvnzvl8nOymZgYICNGzfS29tLVlYWBQUF3HHHHaSmprLp/U0MDw0ze/Zstm/fTlV1FaWzSykpKcHv9/P6669TWFiITqfj4MGDZGdn88ADD1BaWopcLmdoaAiLxcLZs2fp6+sjOzubRx99lBMnTkSrscTFYb5S8Tg7O5tly5aRmJjIuXPnOHbiGL3dvZSWlvLlL3+ZzMxMQaQ8Hg8NDQ309fWxYMECTp48ycTEBDNmzuRyUxPNzc2UlZVRUVHBnDlzpu1IsFgsHDt2jObmZrZs2RKtdTg8jMVi4eCBg3R1dWGxWJg/fz4PPPAAExMTfLT7I/Lz84WKN0eOHKHhfAPJpmRWrFhBcXHxNMt+YmKC7du309HRwejoKI8//jgKhYK33nyTkydPEgqHWbVqFUVXirjaHXY8Hi9SiYSlS5dSWFjImTNnOHfuHCUlJfT29tLZ2Ynb7aampobHH38cg8GAw+Fg48aN+Hw+1qxZc9NyXiKiy/wnZ3x8nLq6OkbMI8jlckKhEG1tbQwODqJUKgkGg5w5cwa3yyVYaIWFhSxatIi0tDT+5V/+hSNHjmC326OTdN58/uZv/gapVMq3/59vc/78eVJTUlEqlVRUVAh7Sq9mamqKSCSCRq2hqqqK2SWzOXDgAJve2wREq5Xo9Xq+853vsPRLS9m8eTN79+2Ltty0TvD+++9jNpt5+umnkUllvPzyyxw/cQKz2cyRI0d49913aWtrY/ny5UxMTPB3f/d3nDx5ErPZzPe//32am5tZvHgxtbW17N27lxMnTtDb28t7773H8NAQhTMKKZpVxDvvvENdXR1Op5ONGzeSmpLKs88+i1arpaOjY5q7KpPJaG9vZ/v27QwNDWE2m3nllVfYsX07+fn53H///bS1tbFr165rGnfFahDm5ORQXV3N7Nmzo8Vrr1TNLisvIyUlhXfeeYeLFy8ikUjo6Oykvr4eh8PBL37xC4KhIKtXr0atUVN3uI5J++Q0a+7o0aP09vayaNEi5syJlowqLCykvLwctVrNfffey5zKStrb2zlz5gw52Tncd999JBmT+PDDDzl9+jQ2m4133nmHnTt3IpfLyc/Px+fzcbn5smANyuVyBgYG6O7u/k/PThARLcT/fCQSHA6H0AMiHA4zNTWFy+USSjS53W4yMjLoH+inuLiYu+66i8IZhWjjtDgcDkZGRgTLz+VyMXSlJ0ZfXx8Wi4X8/HySk5NZsnQppaWl1+x9DVypBL148WLmzJmDz+fj5MmTtLS0IJFIKC4uFuJ3ToeTqakperq70Wq1FBcXk5iYSG1tLfPmzaOkpIT9+/dzuamJ6qoq4uPjyczMZPXq1cyaNYv8/HxeeOEFzp49i8vlQiaLFv1MT09nwjaBVColJycHgKNHj1JdU82d8+9kwjbBG6+/QXd3N7W1tXR2dlJUVER2djZFRUUoFArUarXgXqrVambMmMGePXuQSqXMnj0bl8vFnDlz+NKXvkQ4Eqa5uZm+vr5rXG61Ws3MoplkZGRQUlJCZmZmtPhrYiJLly4lOzubGYUzOH/+PI2NjVTOqSQrK5O+3j4mbBOYzWaKZhWRm5OLWqUmKSmJlOSUaS5sT08PPT09PProo8yZM4dIJEJaWholJSVCKwG1Wk1jYyNPPvkkVVVVyOVykk0mflT/I3bt2sVXvvIVITyycuVKIewQq2YeHV4SNBoNBoPhpv1uREQL8bYgNTWF1NRULly4gN1up7u7m7GxMex2ezTdo6EBrVZLcnIyDruD1NRUdDodGrUGIgidv3p7e/m3f/s3XnrpJd568038fr/wP9+VmJxapbpGDKMN0SXChnmZTCaUp9JoNHiulIX/2c9+xocffkhHR4dQJCDWBS0YDApFBmJVuNva2oT6iXPnziUnJxoPmzFjBunp6bS1t3Hg4AG0Wi02m40dO3bw+m9ep7S0lHnz5uF2uzGZTGRmRJtMSZAIhRMikQj5+fm8+uqrrFmzho8++kjo+Hd1e9CYCGi1WgxJSej1etLT06NN7a9UOxkdHZ0mHjF8Xh9Op5NAICDUe5TJZEIv5Ni1j4yMoJAr0Ov0yOVyTEYT8+fP57dv/5Y1a9awf//+a1bvFQoFCxctpLW1lccff5yf/OQnXLp0SYhrarVa4uPjGRsb4+zZs2RlZQkuvclkwmAwcP78eaFgRGZWpvD3wsJCuru7hWo2k5OTTE1NUVVVdd3WBiIit5WFKJPKKCkpob6+nomJCT7++GOysrKESi9NTU1UVlZiMBiE0v6xTejhSLTtaFpaGocOHeL8+fP87d/+LVlZWfT29nLu3Dni4+MFy+d6gX2JRIJcJhcaJUG0m57f7yc7O5u+vj4+/PBDFixYwKpVq9DpdFy8eDEawL+yIBKzQCDaatRkMtHT04PiyiJGdna2UNFlamoKp9NJUlISgwODWCwW9u3bh16v55FHHqGiokKIsSUkJAjll+RyOYmJiWg0GlJTU/ne977HwoUL2b9/P6+//jraOC0rHpjeECkpKQm5XI7f7xcqaH+yW97NFiukUilKlUpYsLg6zqjVanG5XEilUlQqFcnJycjkciRSKWvWrGHevHkcOnSIDz/8kF27drF3795pMcSKigp+9atfcebMGerr69mwYQNFRUXRgsBqNaFwNA/S7/dfU3FZqVKCBKGqucflIRAMoNVoKSsrIyEhgfaODu5asICRkRFCoRAzZ84UZ77I7W8hRq3EVCYmJti4cSOhUIivf+PryOVyXnnlFcLhMLW1tYTDYfr7o3UHNRoNkUgEpyNa7DMYDNLQ0EBCQgL5+fkYDAYuXbokiELMlZqamromjhQrX5VyJaUHEHqkpKWl0d7eTl9fH/fccw8qlYpjx45x+fJlVCqV0IIxLy8PmUyG0+lkcHCQ7u5uSktLmZycJBgMCuXqYxVGZDIZX/nKV1iyZAnl5eUsWbKE1atXs3DhQtra2uju6RbSUGKtAaQyKRqNBp1OR09PD1arlXvvvZef//znVFVVMTxsntaMPRQK4ZyaQi6X43a7mXI6SU5OFl4KsWvOyMi45kXh9Xrp7+9ndHSUjvZ2QqEQhiQD6enp0yphJyQkkGRMIhgKMTk5iUQiYdJmo7W1lby8PF544QXWrl2LVqudllfo9/u50HiBhMQE1q5dy9///d/jcDhobm4Wakn6fdHPzyqeRUNDA2NjY/j9foaGhmhtaeWuO+9Cr4+2lEhLS0OpUAoW5N13382B/ft5f9Mmtm7dGr3OzAyCwSCNjY309fd9oZLoRb5IMcQriyQpKSn09/fz1FNPUVtby9l5Z9m3bx+rVq3CZDJx8uRJenp6SElJwe12o42LFvSMRCKYzWbUajV9fX2sX78enU7HiRMnogsBUimyK/0kDhw4QHp6+rTG2cFgkP7+fqH6c1ZWFh0dHfT19ZGWliYUD33ttdcoKCgQYp0ulwuHw4HTGa1hd/z4cUZHR7l06RI+n4+nn34an8+H3++nra1NSOk5fvw4M2bMYNGiRSQnJ3Pu3Dl+//vfk5OTQ2trKxqNBrVGTVd3F5O2SexXatp1dnZGC7GmpHDs2DFOnjxJdXU1MpmMiYkJMtLTp6WVTE5OUn/yJFarlY7OTnq6uxkaGqKzs5O5c+fidDoxm83Cy+Vq/H6/4Co3NDRQXl5OT3cPExMTNDY2MmfOHCFPcHx8nLbWVrq7uyES4ezZs2zbto3q6mpycnIwj5hZsWLFNHd1cnKSPR9/jFKhIC8/D+u4lczMTGbOnMnIyAhKpZL33nuP4uJiFi5cyPbt22lubiYzM5OmpiZkMhkrV67E5XIJFmTsGlQqFStWrKC9vZ0f/ehHyOVy/r///b+Ry+T0D/Tz6quvsnjxYp588kkxDUck6qXebhWzTSYTJpOJ1NRU7r//frQaLQmJCSSbogslarUau91OQkICFRUVzJw5E4VCgd1uJzs7m6qqKhYsWIBSqaSnp4e09HRqqqvJysrCZDIJLULD4TCzZs26JvXC7XZjSjFRXFyM3qAnHImQlZVFSUkJ1TXVzJs3j9HR0StVihfxwPLl5OXlkZWVRWtrK729vZSXlzM0NIRSpWTNmjVUVFRgt9vZvXs3lZWVgttXUlLCE088gcFgwGg0Ultbi1ar5eLFi2RnZ/PYqlWkp2dAJEJJSQmzioqIj49namoKj8dDWVkZCxYuIDMzk+HhYUZHR1m2bBkLFy4Umv3EhN5qtaLX66msqEClUmEwGCgrK6OgoCDaL+ZKY6jCwsJp4qBQKEhNS0OhUDBz5kyys7ORSqUUFBQwu3Q2RqMRu91OMBQiP7+AwsJC9Ho9paWlzJkzh5kzZzIwMMDQ0BBVNdXcf//yaUVt1Wo1FRUVaDQaOto7UKlUrFq1ipkzZ5KQkIDJZEKv11NYWEhlZSVFs4qwO+w0X24mIyODdevWCYniKSkpzJo1i+TkZKFwrNFkoqamBsuoBa1Gy1+vXUtiYiJTVxoilZeXk5qaKhaqEImGzW7HajexZjQxS8I55WRycpL0tPRPrdobi+XFEnwjkQg+n0/4vc+rJ6zdbufnL7/M8NAQr/ziFbSaaOtOjUZDOBxmy++38Ktf/oq///u/Z+XKlX/UPQmHw9ftfBYOhwX39UaLBbGV8VhCeCw5W61WC02zYnHJW+XquGMswfx6ieGx43/WCjmRSESoZn2znjSxe/DJRbJgMEhfXx/Nzc00NTWxaNEi5s6dKyTa+3y+27ZhuojoMv/hpOTyacIVp41DrVLfklsTa/l49X+r1erPvMXvs+L1evH7fNHGQGqNEFcDGLGM0NnRiW3ShtVq/aPqOd6sL4tUKv1UIZPJZNOOeXXaiVQqRa/Xf+aXxdXi9snvflL4/liX9FYF65r0qUCAixcvsn79eqRSKV9b9zWKZhZNGxs32pkjIgribU2sl+ztjE6nY+XKlde1ghLiE1jx4Apml86muqr6jxKHG/VA/s/idrSUbrad8FPHjCy6IDO7tJTZJSXMLpl9zRi63ceUiOgy/1kjFq69vQhHIrjdLtQq9ecWKhERBVFERETkC4noM4iIiIiIgigiIiIiCqKIiIiIKIgiIiIioiCKiIiIiIIoIiIiIgqiiIiIiCiIIiIiIqIgioiIiIiCKCIiIiIKooiIiIgoiCIiIiKiIIqIiIiIgigiIiIiCqKIiIiIKIhXE4lErunHKyIiIvIXKYgSiUQs9y4i8gUjHA7j8XhEQfyPWIpfZAKBwBfaEg6Hw0JHRRGRQDBAMBi8rea1/HaYJFarFY/Xi9frxWG3o1AokMvlOBwOEnWJJCYkIpPJ6OjoIC8vj9zc3C/c4IhEIjQ2NpKQmMDMGTO/cI3TI5EIIyMjdHR0UFZehjHJ+IV7hj6fj5MnT6LT6ygtLUWpUH6uhsGfc/+eSCSCxWJhyjkl9Er/ixbE2JvBPGLmF6/8gu7ubqqrq+np6eHIkSOUl5ejUqloa2ujtLSUuXPn8rvf/Y7nn3+etWvXfuEm09TUFL///e+JEOF//L//g6SkpC+c9VtXV8eGDRv46U9/SpIh6TNPaK/Xi0KhuG1fFnaHnd/97neo1Wr+1//6XyQnJ38uQtJ0+TJ5ubmf2qv6dsblcnFg/wG6u7v57ne/KwqiVColEAiQEJ/AHXfcweOPP87s0tls/XArJ0+eZPGSJSy7+27a29ux2WyYzWZ8Ph9paWmf+5vrT/HmVSqVTE5O4nQ6CQaDf7Lz/Lx+V6lUkp+fj9Pp/NQe0tcVQ5+Xw4cPk5OTQ0lJyW05yU1GEzqdjlAohFar/VyO4fF4eHfjRp555hlmz579Z2slxsXFEQwGaWlpua1CKH9SQVSpVKhUKr7yla8IfYd9Ph9KpZLysjLKysooLi4GYNeuXVy6dImysjLB1b7eQkssTiWVRvvyRiIRIkQIBUNCz+RPWhjhcJhwOIxMJrvhAAuFQ4RDYeRy+WcahDc6z0+KkEqlAknU7Yp9PhwOEwgEkMlkQhvNSCRCIBBAoVAQiUQIBoNIJJLrttkMh8P4fD5CoRAajWbadYdCISKRyLSe17H7IJVK8QcCqJRKJBIJfr8/Oljk8s+8uBUKh5BJZYIoxu6fRCIhEAgIz2naeUfCEJneN1kqkaLT6a6xiq4OzMfFxU27p8FgECQgl01/Zp/V5QyHw/j9fuG8ZTLZNeccDAaF8WOz2fB4PGi1WuEex44bu7+fPHZszMaei1KpJBgMEgqFUF55DgBDQ0OcPXuW5cuXR8d2JEIoFBL6V189Pm52fcL9gWt6X8d+89P6oX/yPsbOJ3bPrl4Mvd65GI1GwuEwXq9XFMRPimOMoaEhtFoteXl50xqV+/1+JiYmuHz5Mo2NjUgkEkrLSsnNyUUqlRIOh2nvaKe9vZ3BgUEyMjOonVtLYmIizS3NjI2ORd/e4RC5OblkZmYyMjJCV1cXo6OjxMfHU1lZSWZm5rRz8wf8dHV20drWSsAfYHbpbEqKS5DJZPT396NWqwkGgwwPD6PT6cjLy8M55aS7qxuz2YxEIqGsrIy8vLxrBpPL5YpawHYbBp2BKeeUMKmbmpoYGBjAYrGQnp7OHXfcgdFopK+vj/b2dtLS0rDZbPT29mI0Gpk7dy6pqalEIhHGrVa6u7sZHBjAbDYTiUSoqamhsrIStVpNf38/jRcacbvcZGdnU1VVJYQnEhMTsdvtdHZ1UjyrGK1Wy7lz5/D5/eTn5TF79mx0Ot1NxT8YCmIeNtPZ2Ulvby93zJ3LrKIivF4vgUCAvr4++vr66OjooKCggNraWuG63W43Z8+exWw2k52dTVFREUajEa/Xi1wuFwQxEokwaZ+kt6eXs2fPIlcoeGjlSoxGI4FA4A/jRCqhvKyc0tJSFAoFQ0NDdHd34/P5SE1NJS8v74bXE7umjo4Ozp8/z5RrCrVaTdWcKkpLS4VQQGdnJ01NTaSkpDA6Ohr9ezDI+fPnUSqVzJo1C6lUSkdnB4ODgxQWFJKQkMDExAQWiwW3241UKmXGjBlMTEwwOTlJeno6bW1tDA4NUlZaRnV1NVKplLb2Nvx+Py6Xi56eHkZHRwmHw1RXV6PRaJiwTVB/sp7q6moUCgU9PT3k5eXR09MDQElJCfHx8bR3dHDqVD2RSIQ777yTgoICbBM2WlpamJycRC6XU1hYSGFh4bSXrdPppK+vj5GREcLhMLm5uWRnZwPQ29eH0+FALpfT3d1NIBCgtLSUoqIiNBoNoVCIwaEhWpqbUSgUdHZ2YrPZ8Pl8t40gyn74wx/+8HYypTdv3ozNZuOJJ56YZg10dnayb98+XC4XbrebCxcvcPHCRRISEkhPT+fIkSP88he/xDxipqO9gyOHjxAMBnF73Lz885e5cOECHR0dnKo/hdVqxWQy8e5773Lh4gXGx8Y5cOAAVquVefPmTRPo06dPs2HDBoaHhhmxjNB4vhGZTIbBYGDDhg28/fbbtLW1cerUKSwWCxkZGby78V2am5txuVwcP36cgYEBqqqqUCqVfwgoj1p46623OHr0KKFQiIH+AY4dO0ZhYSFz585l+/bt9Pb1YnfYOXTwEA6Hg9LSUo4dO8avf/1rLBYLLpeL/oF+jh45SkNDA3PmzMFut/Ovr77KxYsXsVqtNDU1sW3bNoxGI1nZWXR3d7Np0yYsoxZ6enrY/dFHJCYm4vP5eOmll+ju6WZsdEy4f4cOHeLy5cuMjo5y9uxZCmcUotfpr7EqYlZAOBzm8OHDvPLKK1gsFs6ePcu5c+eYM2cOwWCQbdu24Xa7cbvdNDU18d577+H1epk/fz4Oh4Mdu3Zw6eIl+vr6aGtr4+jRo2RkZDA+Ps6bb76J1WqloKCAsbEx/v2Nf6e1tZWxsTH27t3L0NAQVVVV7N27lx07dmA2m2m+3MzRo0fR6/WoVCp++9vf0tfXx9DwEDt27ECn01FYWHhDa2piYoIDBw7Q1tbGpG2Suro6RkZGuPPOO5FKpWzdupX169djtVrx+Xw0NjaiVCqpqanh//7f/0tHZwe1tbWo1Wr279vPa6+9Rn5+PnV1dezdu5exsTHMZjP79+/H4/EwMDDAxo0bMZvN2O122tvbaWxsxJhsIslg4HDdYc6ePSus1h88eJBdu3bx1FNPIZFI6Ojo4JVXXiEpKYmRkRF+8IMf0NHRQV1dHYcPH6aqqoru7m7e/+AD+vv66ezopKGxgdnFs3n33Xc5deoU4XCY3bt309fXx5IlS6YJ4oWLF9i6dStWq5XR0VH27t2Lw+nAYDCw56OPeP3117l06RIymYxLly6xb98+JFIpBQUFtLe380//9E+YzWYCgQD9/f10dHQwb948wQASLcRP4HA4UKlU17gkZrOZuLg4lj/wAPfccw9tra386Ec/or6+npSUFD744APuuOMOnnjiCZRKJT/4wQ9wOB1kZ2VjMplobGxk+fLllJWVEQqF2LZtG5mZmTzzzDMkGZL4P//n/zAyMsK4dZzUlFTh4RQUFPDss8/i8/nQarW8/fbb/OIXv+DHP/4xBoOB1rY2klNSePbZZ4lEInz00UfI5XK+9a1vIZPJ+Kd/+ifOnz/P5OQk8fHxgvu156M9XLhwgb/6q79i8eLFWK1Wdu3aRXx8PAaDgbVr1+Lz+wn4/ezatYtt27Zx5513kpOTw+DgIHPmzOGZZ57BZDKxfv16Nm/ejNVq5WR9PWfOnOEHP/gBd911F5cvX+b5558nPj4ejVrDr9/7NWlpaXzta18jPj6eF154gRMnTlBTU4PBYGDf3n185zvf4dvf/jYul4v169fzvf/+37n/vvs4e/YsOp3upgPXbDbz4YcfkpWVxde/8XVkUhnvv/8+SpUSmUyGUqmkqqqK1atXY7PZ+P73v09dXR1f//rXeffdd+nv7+fpp59m1qxZNDc385Of/ISf/exnvPDCCxQUFHDp0iWWL1/Oxo0bOX78OD/96U8pKCjggw8+oLevlxMnTvC73/2O++67j2effZaenh7+7u/+jlOnTqFSqbDZbLz44oskGZM4dvQY+fn5N70epVLJ4sWLeeyxx/D5fPx2/XrqDh3i1KlTpKens2fPHiorK3nuuefQ6/X4fD52796N2+1Gq9UyNjYmhCLkcrmQPXHixAlWr17Ngw8+SG9vL9/4xjcoKioiLy+Pvr4+7rnnHtatW4fH42H79u2cPXOGhXctYMHChWzbto2cnBwWL15MS0sLzc3NwstIpVLh9Xqx2+0sWrSIwsJCjh07xje+8Q0KCwtxuVy888473L98Offeey8NDQ38+Ec/oqOjg3A4TEpKCs8//zwPPfQQTqfzmhdfZkYmTz/9NPn5+VgsFtavX8/OHTtZsngJ+fn5NDc388yaZ3jxxRex2Wz88z//Mx9//DELFyxgy5YtTE1N8eKLL1JZWcm+Awc4fPgwvX19f7LY/TXe6u0khuFwWBhInxTEsbEx4uPjKZ09G5lUSk5ODiaTiQgRWlpaGBgYYMWKFaSkpNDS0sLo6CjJpmSys6OCmJaWxj333MP8+fPxer2cPXuWstIyEhMS2bZ9GydPniQ+Ph69Tj/tuAaDgeHhYTZt2sRrr73GxYsXGRsbIxgMctddd5GVmUlxcTFVVVWYkk2cPn2a6upq/n/23jw+yvLc/3/PTGYyWyYzySSTfd9JWEKAQMImiAq4gFqtoKhV61Ltcvr1eF5We2zP6eLB8/Mc22o9onU7dUGECiiy70HIRhJCNrLvM0lm32d+fwzzFGSxUnvEluv14h9gnrnnue/72q/PJzY2FrPZjMfjIS4uTggJxWIxVquV9957j/z8fCoqKoR8T1RUFCkpKUilUvr6+nj33XdZt24d9fX19Pf3097eTmZmJlFRURQUFBAbG2pdmTVrFmq1GrfbTfOJE8TGxlI0qQhACDlPnjzJxx9/THt7O9deey0ymYwdO3cwMjKCVCYjKiqK0tJSVCoVU6dOpbS0lJSUFFwuF2+8/jo7d+4kMzOT5KRkRGLRBXNKJ06c4OTJk6xevZrkpGQMBgNr1qwh8ZVd5QAAIABJREFUPi4esViMXC4nNy8XqVSKXq+nvLwcmUxGZ2cn77zzjlA0iYiIIDc3l/kL59Pc3IzD4SAzM1MIr6qqqkhMTCQ5ORm5XM5NN93Eg999kLq6OiwWCzfddBMej4f+/n7MZjP6OD0Ax48f5+c//zmbNm6iZHIJeXl5572IwWAQt9uNXC4nEAiwceNG1q1bx+jICA6Hg7q6Og4dOoTVamXx4sVER0cTDAZJSkpCIpGgVCqJjo5mcCBUDHQ6nbS1tSGRSGhqasLpdDL1dKri2LFj2O12srOzmTt3Lunp6UyZMgWFQhHay6Iierp7GB4eRqVSEQwGkcvlxMXFMXnyZCQSiZCLValUiMViRkdHSU9PF/Z0zpw5XHXVVRiNRhoaGpg2dSoBv5+21lYhzxwIBNixI+TFNjc3k5eXd04OMSEhAblczocffshbb72Fw+FgcHCQhsZGMrOzSExMZHb5bCIjI0lMTGT+/PlMjI9jNBo5efIky5YvIz8/H7/fT0pyMh6PB6vFctn0Il5WHqLdbsfr9ZKRkXFWGT4YDOLxeEhNTSUtLQ2JRILFYmF4eJjs7Gy2ffopHR0dvP7G60ilUswTZq5ecjU33nAjUVFROBwOkpOTiYmJwePx0NHRQWNjI2+88QZyuZzu7m6uu+46li5dilwuP2tNL774Ips3b2bp0qXMmjWLTz75hKqqKmQyGR6PB7FYTEF+fijv19BITW0N769/nzfffJPMzEzmVFQwc8YMdDrdWWGYyWQiLi5O+D6lUil4ElVVVTz33HMYDAYeffRRampqqK2txefzCX/CSjScqA8Xk4LBYKhwgeisooNEImH37t2MjY3x5ltv4nF7cDqdVFZWsnz5csGbCQaDQh41KSmJZ555hpdffplnnnkGuVzOL3/5SyorK89r0QOBAEaTkYmJCVJSUoTLpNPpCAaDmM1mXC4XSYlJQsFLLBYTDAY5deoUTpeL/IIC4XMymQxNlAaAoaEhTCYT/f39nGw5icPhYObMmYIHExUVhdfrpau7G7PZzLp16zCZTJhMJm6//XZuuvEmlEold6y6g08+/oRnn32WV155hZ/85CcsWLDgnIsvEomIjIykq6uLx//5n4nWaLj99tvR6/X09fUxNjaG1+tlYGDgrGKcWq0WjPmKFSs4fPgwO3fu5IYbb8DhdFA+u5ymxiZGR0d5+fe/Z2BgAK/Xy+rVq1m8eLFw1s8spIRD6UAgQFpqKjKZjISEBCIjI0lNTSUyMpKh4WHi9HpUKhXp6en09vYiEolQKBSCIQpXdbu6utiyZQvHjx/HarVyz733UFFRQUlJCUqlkg8//JC+vj5uu+02Hn74YZKTk4WzdeDAAV599VVSUlK4+eabEYlE1NfXQzCIPiaWiIgIdDqdsPaExEQGBwcxGo0MDg7i8/qE96vTavF4PNhstitFlQuFW2NjYxQUFp512Ww2G06nk+joaOGwmc1mzGYzcrmcSJmM6Oho5syeg0qlQqfTkZGRIXhlTqcTrVYbquIF/IxPjCMSiYSEfmRkJHl5eWg0mnPWVH/8OLNmzWL16tVER0dTX1+PSqVCqVQyPjGBRCIhLi4OqVQaqs66PcTHxZOamsrkyZPJyc1F87nKqEqtFiztmcokGAzicrnYtm0bCoWChx5+mMmTJ+NwONDpdCQkJOD1eomIiMDj8QiVQIvFgt1uJxgMkpGRQVNTE/39/ahUKg4fPszIyAi33HILarWapqYmFAol115zLdHR0aSkpOD1evF6vWddtHD4tWzZMnJzczl27Bgvv/wyn376KdNKS1EpledUS8ViMbExsQSDIa+9rKwMALfHTcAfUtoxMTFESP987CQSCQqlEr1eT6RMRn9fH06nU2jNmRifIDIyktmzZ1NXV0dERAQKuYK4uDghFxUWtVpNdHQ0LpeL9PR0CgoKSEtLIz09HZlMhlQq5bbbbmN2+WyGhob4t3/7N/70pz8xa9assyrUZ8rx48fpaG/n6Z8+zZIlSxgfH0cul6NUKtHH6bHZbAyPDJN/2ig6nU5cp4cMMjMzyczKYseOHaSmpyGVyigtLWWgfwCXy0VkZCSLFi2iuLiYSZMm4ff7mZiYENIq56umKxQKrDYbg4OD+P1+Yd/8ft9ZHRAdHR1YLBZSUlKQRUYKVeyYmBi0Wi0KpYK777kbhVxBTk4Ocrmc6OhovnPffVRWVtLQ0MBbb71FWVkZ119/vXDvwrny+++/n7KyMsbGxlAqlUKl3+fz0XHqFJWVlaFOgtO/Q6FQYDAYOHr0KHfccYdQwU5KSsJms13xEM8nExMTOJ1OpJ9rIfns6GccOXIEg8GAyWRCKpVy4sQJTCYTkZGRlJeXU1tbi1QqJTc3F6PJxM5du0hMTEAsEjMxMYFMJsPhcBATE0OCIQGVSkVCYgJ5eXnY7Xa2bt0aqubOKEOlVAme6ejICHF6PaOjo9hsNlpaWhgaGsLr9dLY0EBPTw9msxmxWExhYSHTTlf3KisrsdvtbPvkE5KTkykvLxfaKmJiYrjuuuv47LPPiImJISYmhu6eUNW1pKQEi8WCVColUiaj+WSz4NkFg0FaW1uxWCwMDg7idDmJkETQ2dnJ6OgoExMT5OTkEAgEeP3110lISODYsWMkJycza9Ys5s2bR2trK8HTuaKYmBgOHT6ExWJlzuzZDAwMCL9ToVDQ0tJCW1sbZWVlTJ8+ncLCQuRyORazmU0bNxIfH8/cuXOFnjuRSERqaioGg4GtW7cSGxuLz+dj79696OP0dJ7qpL+/n472DhITEwkEAiFP//T7LC4uZufOnaSnpzN16lS6urqoq6ujpKSExMREjh8/Tqw+Fl2MjpKSErZt28bHH39MeXk5RpOR+vp6Jk0qovl0QStcENi6dSvtHR2kpqTgdrtZcs01TJkyhfz8fOLj43E4HLzxxhsYDAYWL158lmGUSCSo1WoiZZHU1tYyODhIc3MzbrebKdOmodPpePedd4nTxxEVFUVXVxd9fX0MDw9TWlrK0uuu4ze/+Q3rXlnHjLIyKisqsZgt7N+/H6lUSllZGRqNhl27dhEZGUlycjITExMcPHiQyZMno9VqGRsbo6enh9bWVvLz83HY7UIxSaPRoNFoqKqqYu7cuQwNDdHV1YXT6cTtdocq2UNDtLa2kpuby+TJk8nMzGRwYJD58+bj9XnZsWMHSqWSrq4uFAoFCxcuFIqGWq32LA847ElLJBKMRmOoKGk00tPby6SJCWw2GwP9/UIUMzY2hsvlor+/n+LiYvbt20dTUxMZmSHD7fF4cLvd+Hy+87aO/cMqxGAwiNVqxWAwEBcXd1YIY7FYEIlEQstIamoqTqeT7OxsAoEA06aF2iCeeeYZcnJykEgkQstAW2srMpkMlUol9DvNmDGDVatWsWXzFnZs34FUKiU2Npbs7GxBGYZ79WbPns3//u//crKlhZkzZmA2m8nIyMDhcHD8+HHEYjFOp5NgMEh2djZ33Xknr732GnV1dSQlJZGekUFeXp7QkiKRSIiUybjqqquoqqripz/9KYYEA6kpqRgSDLjdbioqKli/fr0QNgcCAeRyOUajEbvdjlqtRiwWI5OGwnaLxUJ0dDSnTp1izZo1SKVS9uzZQ0dHBzKZTBh7vOaaa7jvvvv43e9+R2dnJ26PG220lrvuuosgQWy2UNvP2NgYcXFxdHV38/769Rw+fBi/349cLueBBx7AZrPx1ltvMWPGDGaVl3NmC3JcXBzXXnstO3fupKOjg+joaLKys5g6bSp1tXWoVCp6enqEXjeHw4FIJMJoNHLrrbfywQcf8M4777B582ah5WjFihVCqmFocIiuzi6uW7qUzs5OXnnlFTZu3Eh6Rjrl5bOprKhAJpWxadMm9u7dS1RUFBqNRsizvvrqqwwMDJCdnU1ySjJLly0VcmcZGRmUlpaepRBz83LJzc3l9ddfRxOtIUYXQ2ZmJi6XC01UFPfddx+vvfYaDz74ILNmzcLlcpGTm4PJZEIkErFo0SJqampoaGigsrIShULBvHnzGB8fZ9u2baFxzago3G43Tz31FCaTKZSPJDSZE/YU4+LiGB4ZJhAMnfcTJ06wa/cuFi9azI033si//fzfmDlzJqWlpeTl5dHf309TUxMT5gm0Wi2mMRM+n49JkybxyCOP8Mknn/DTn/5UiCqWLVuGx+Phgw8+4HDVYTxuD2VlZUyZMuWsKGDu3Ll0dnby/PPPk5mZicfjITk5mRNNTcgjI1EqlXR0dGA0mUhMSCAqKoqkpCT6+vpYvHgxDoeDl156CalUit1uJyUlBYlEIuRrv24RBS8TXzVIkN6eXpqamgRlFnbTh4aG6OzsJDExEYPBIFTqjCYjsTGxREdHh6zUaW8tPj4Usup0OiwWixDm6PV6IefkcDjo7eult6eXqKgoMjIy0Ov15xRzBgYGaGhowG63k5GZSZxej9vjJikxiYGBAdraQm0V4QKH2WKm+lg14xPjJCYmkZuTg16vP28jblVVFf39/ajVaoqKiggGg0gkErRaLf39/YwaR9HH6omPj+f48ePk5eXh8Xqoqa6htLSUrKwsgsEgPT09dPf0kJyUhF6vP6sJ2O128/TTT2Oz2fjdi79DqVBSU1PD+Pg4skgZWZlZJCUlIRaLhZRFdnY20dHROBwORkZGGBoeQiwKhVvhS7B161YsFgu33XbbWVMZgUBA6K/s6ekhWqslPS2NlJQUxsfHOXXqFHl5eej1egKBAIODg/T19aGLiSElORmz2Ux3d3cozaHTkpSYRHx8PCKRiNHRUerr68nPzycpKYmhoSFaWlrw+/1kZmWSmpIqVFk7Ozvp7Q3tbWZmJvHx8bjdbjq7ujCZTGijowUvOdxe1dvby/U3XH+WUQz3TbpcLsbGxkIhqExGV3c3hQUFREVF0d3dzf4DB5hcUoIuJgbR6ZxmeC8GhwYZHhqmqKhIyI17vV76+/vp6enB7XYTFxdHUVERHo+H1rZWkhKTiI2NRSKRYLVa6R/oRxutJTExkb6+PiwWC7H6WOL0cfT19fHJJ5+Qm5vLpEmThMKdTqfDbrdTV1dHRmYGBfkFRERE4HK5MBqN9Pf34/F4yMjIIDExEbvdTldXF909PSjkcgoLC0lMTDynoX9kZISuri5EIhHx8fFCCkcsFtPQ0IBWq6V89mwiZTKsViutra3o9XpSUlKYmJigs6uLifFxEhISUCgVSCOkZ+WcryjEr0i8Pu85Uwlh5XApJf1w5/3lsFFnhhR+v/+sQxreQofDwQsvvIDb7eaRRx4RcojPPfccmZmZPPvss1/JSJnf76e+vh6JREJRUdF5exLPXFsgGEAsEn/hHvwlUz2fX0d4wuiv2SOX24Vx1IjT5SQ3J/eC5+DzQwRnrsNqtaLRaIRplr90iif8XsK/PWzILgZ5F55E+fwaw/nlL7OG802eXGiy5Avv3+mpqgu9p2+CRPD3JMELb/Rfe0C+9o2KOLsQcb6G6PD0y+HDh+nu7kYul+NyuSgpKeHWW2/9ykKS8HvJzc39i/I+4dG9L+wB+5KX6KvaH4/Xg9FoJDEp8ZKfoVarBUP1F5+1IJxuBjhrvO+v6ckLj+R90ejeFz3jUj/7Tcct/bvyEK8IDAwOMDgwyNDQELGxsSQmJhIbG4tKpfpKG1/tdvsFK7PfODt6kRnjb+rv+Xv4HVcU4hX5Si5DkCA+r08YFbzcLt/lUlG8IlfkikK8Il8Ygl5MwYVD8wuF7xcSm82G1+tFq9VeNnnZb6rX91V5gHa7XQBQuVge+B9JrpjpfzAJBAMMDw9jtViFZtww2os/4MfpcGIymfB4PKSlpQl5R6vVSn9/P52dnVitVuLj45k+fbowKuZ2uwXkFp1Oh8FgOOt7h4aGOHXqFCmpKRTkF1wW7yJcGb3cvVWbzUZ9fT2FhYUoFAo+++wzCgsLiYuLu2TF6PP52LNnDzt37qSsrIybbrrpb4bh+E2Syw7t5uvwev6RxGK18PHWj/mP//gPAQXGYDAgl8sRi8WMjY3xL//yL2zYsIHM7CxSU1MYHgoh82zcuJG2tjZqamrYv38/o6OjpKSmCM3Dzz//PG+//TZWq5XS0tKzFM1nn33Gc889R0dHB0uWLPnaUa/tdrvQ5P9/kVr4a6S+vp6f//zn6HQ6xGIxjz32GDqdjkmTJl3ye7Tb7WzatImmE01k52RTUlJyxUvkH4CX+VJbEP5eRROlEaZmqqurycrKOgtmTa/XY7FYSE9Pp6S4hIbjDTzxxBN89tlnLFq0iP/6r//ihRde4Nvf/jZdXV08//89z9jYGHK5HL/fT1tbG3K5/JyKdm5uLomJiRQWFn7tytBsNvPRRx/R29t72UDXX9RrOd2L2NnZSaQ88qzZ5kuV3t5ejh8/zqPfe5RVd6y6JBTzKwrxivxdGIj09HRWrVpFREQELa0teH1eod2jp6eHjIwMHnroISRiMX/6059obm7m0Ucf5ZZbbkEul2MwGPjWt77FsuXLOH78ONs+/RSFQoFeH4LQLy8vP+d7U1NTKZ9dHpouCn69zIKDg4Ns2bKFwaHBb0RxJzExkaSkJDweD/Hx8cJwwl9j6MNz09G6EE7klVJCSL720+D3+xkdHaW7pweL2cy0adOIjY1FJBLhdDpp72jH7nCQlJCIOkqNWhXCFBweHha8EIfDgdvjJj4uHo1GI4yF9fX1YTQZiVJHndUzZ7PZ6O/vxx8IEKPTodfrkclkeL1eAVHFZrORnJxMlCYKpUJJY2Mj06ZNE+Cg+vr6QmNaOTmIxeIQWGtPT6g5NUKCPlaPSq2mra2NKLUal8vF6OgoCoWCgoIC1Go1ERER+P1+YULEZrMRGRlJYWEhSqUSv9/Pqc5TOB1OPB4PBoMBQ4KBCEkEVqsVu8NOhCQCiUSCRqP5i0MemUzGggUL2LJlCy+9+BK5ObkUFRXR1dXFG2+8QVZWFtnZ2ZhMJjZt2kRJSQmzZ88+pxeypLiE5ORkPt66lYo5c3CdhuY6H/mRWCxGrVJjs9vwuD1II86/1vHx8RBclz4EnNDd043P62P69Ok4nU4GhwZRKVUCUlAIrEJBZmamMALW19dHbGwsWq02BL4wPIxYHKIgkEql1NbWcuTIEfLz87lmyTXnbR8Kn6GQVyYnNSVFOJMtLS1k52QjEUswm83CiGRsbCzp6elERETgcDro7ekVaCCiNFEkJydflInPbrczPDzM4OAgubm5KBQKoqKi0Gq1xMfHh1BhgiEv/sxm8XPWThCHwwFBTp8TBz6fD7VahUqpQqPR0NHRgc1mY/++fSSdngCTiCTnXVNvXx9xer2AWuR0OgV4sUAggM1mE3Af9acRdyIjI7HZbCGWxeJigRKhsbERkVhEYUEhZrNZoJUYHx8XIOG+zgjia1WILpeL/fv309UVAvbs6ekhNzeXp55+CqfDydatW4WwJioqipjYGObPn4/D7uCxxx4jOzsbg8HAxMSEgCe4Zs0a0tLT2LVzFzU1NYwaR1EpVcyfP5+ZM2dSU1PDsWPHhNlJj8fDihUrSElJYdu2bdTW1iIWi3G5XLS2thIXF8fKlStZt24dDz38MMuWLhWAU00mE0888QRSqZTDVYc50XRCQDpOTk7mW7fdxosv/o7hodBMrt/vFxTtAw88QF5eHm1tbXz88ce4XC5OnTqF0Wjk0UcfZcqUKRw8eJCjR48K8Pnj4+P84Ec/QKlQ8vofXkcikeD1eRkdGeWBBx5g8uTJf/G7NxgMrFy5kh//+Me88cYb3HvvvWzZsoWenh7uv/9+ARlnaGiI++6777yeVExMDDk5OXz00UcMDAwglUYIXC/n80wlEgkOuwOpTHrBfO9bb7/FwQMHmTlzZgjxu6kJv8/HrbfeyuDQIN1d3YhEIqZMmcLNN9/Mhg0bMBqNPPXUUwIQ8L/+67+yYsUK7r77bl577TWhSOTxeJg6bRo11dWYTtMsNDU1UVZWdlbVOxgM4nQ5MRlN/Od//icJCQk8/vjjKBQKDh06xPPPP8/jjz9OcnIyr732mgDPHwwG+cEPfkBubi5btmyhr68Pv99Pd3c3Go2G++6/n/y8vAvuyebNm2lubkahUPDGG2+QmJjIAw88IIwdiiViggRRKBUCutHnJRAIYLPbcNgdvPPOO9TV1ZGSkoLNZiMQCDBz5kzmz5+Pz+djfHyc/fv2Uza9jNiYWCSRknP2o7e3l3//939n1epVzJ49G7/PT119Pds//ZQHH3yQgcFBtm7ZgtVqxev1CpQEt956KwcPHuSFF17gySefZM6cOdjsNt7+37fxerzcfffd/PKXv6S0tBR1lJrDhw6zZMkSlixZ8jcnkrtsFWJjYyMv/OYF7r77bp566inq6ur45JNP6OvrY/un26mpqWHNmjXMnDmT6upq1q5di8PuYMWKFWg0GoxGIwsXLmTGjBl0dnby7LPPsmjRIsxmMwcPHuTaa68lOyebifEJxsfHGRkZYf369UyfPp0l1yzB6XDyq1/9igMHDpCens4f/vAH7rzzTqZPn04gEODXv/41o6OjxBsMWCwWerq7BdKfpKQkmpubEYlEHD58mE1/2sSypctYsWIF69evZ+PGjcydN5eJ8QlMJhP33XcfkyZN4lj1MV568SVONJ/AkGDglVdeQSKR8NDDDzE+Ns5bb72FyWRi9+7dbN68mW/fcQcF+fmcOnWK73//+1xz7bX4A37cbjf33HMP4+PjHDx48KK8IBfKSy1ZsoQ5FRV8/PHHjIyM4PP5uPPOO0lJSQFgZGSE6Ohopk6degFPJORtWiyWEKK4QolUKr0gvp3H42FsfFzAajyfFBYU8vofXictLY2VK1eyYsUKfvvb3/LJJ5+w+s7V3LzyZvbu3cv7779PRUUFCoWC4eFhAd4qzL9iMpmw2+3s27ePNWvWMGnSJGpra1GpVMydO5fdu3ezYMECiouLz9sCJJPK0Ol0REVF0dfXJ3jvYbCNiYkJzGYzLS0t3HvvvWRmZgqI4jU1Nezbt48f/vCHaLVadu3axSuvvEJRURF5ubkXDHXLysrIz88nLi6OQ4cOsWnTJt57/31uv/12rFYrSpUSsUhMMBAUAEXOZ1QIhuC/Nm3aRGVlJffddx9+v5+amhp+85vfEBUVRUlJCTk5OZSUlDB16tTzFpZEIhHR0dEMDAxgMVtQq9QAKORy2traaDpxgh3bt5OcHELR9vv97N27lz/+8Y+UlpaSnZ1NT08PjY2NIXANlZr0tHS2bt3KxMQEupgYPvjgA2648Qbuuusu0tLSvvQ5/rtRiFablQ83fkiEJIKSkhKysrJIS0tj4cKFHD16lD179vDggw9y3XXXhVj4TkNADQ0Nodfryc7Oxnfac1AoFLg9blxut0Dyc+I0kY3f76ekpITJkyezdu1aZDIZq1atIjIyknfffZf29naKiorYunUrer2e5cuXExMTg9vtFtCrw258GMdPIpEQFRWFzWajpqaG119/nezsbBYuXIjP74fTB8npdAnezPz589FoNAKCidPhpLamltraWh566CEy0jNITU3lh4Yf4XF7WLt2LfGGeObPm0cgEOCjjz4iLi6OlORkjh8/Tk1NDQkJCSxZsoT7H3gA5SUkxaOionjmX/+VH/7wh+zbt48nnniC+fPnC/8eHx9PZGQkExMTF3yGz+cTwh6n04nX6z1vsj8YDIVxbpcLn993QU6WML/J1KlTKS8vD6EI5WTT1NhE2fQyDAYD7e3tAhJ2dHS0gA0ZzlWGPYww0Oq+ffswGAyUlZURFRXFwMAASUlJKFXK87aahFkMVSoV8fHxtLS0YLVaiYuLE0JCr9eLSqWiv7+f+vp6MjIyuO666wB48sknWbRoEXl5efh8Pnp7e3G73URrQxSlF8pbxsTG0t3TQ01NjfA5iUTCstPAxdIIqbA2t9t9XoUYPps1NTWMjo6yePFi0tPTQwU1jYYNGzawY+cOpkyZglQqPS+T4ZkSRptvaWkRaDSioqKQy+Ucr6/n2LFjrFy5UqCGjYuPo7q6mpdeeomHH34YhUKB0WgUHImcnByBJuSmG2/kSFUVFRUVLJi/4B+bQsDpcNJ8opns7GyB0DsiIoLIyEjq6uoAmDZtmnBx9Ho9hYWFTEyEPC6JREJMTMyfaQ4RCRexsLCQ3Nxc3nrrLR588EHWrl1LbW0tR48eRSaTceLECX7/+9/z4YcfUl5ezqJFi+js7CQ9I11Ato6ICIV/arWa0dFRPB6PgGgTRmlxOBxYLBba2toA2LlzJ2v/4z9oPnGClTevRBsdjdlixmAwCBcvzCsSZrnzeDwCtapYJCYlKRmvx0PziRPI5XIOHTrEyy+/zLFjx7jhhhvIzMwUGNWee+45vve977Fu3ToGBwcvaR8SEhIoLi4mJSWFBQsXnlUd1uv1OBwOqqqqLqAMvYyfRi0JoyQHg8HzKruwQvyiXrcwDNyZAKmxsfqzPJgwLavP58PtdgtN32d6oj6fD51OR2VlJVu2bOGee+7hF7/4BQ0NDQIGX6Ts4hVmj8dzzmzx6OgogWCAIEFycnKYNWsW27dv5+GHH+ZnP/sZu3fv5tixYzgcDt59912ef/559u3bx6xZs5g+ffpFv+8Pr73GB+vX09PTg1arJTs7G6lUikIRAsQNsxZGR0cLyOnnk0AggNPlRKVSCWg+ANHR0UyfPp3Dhw4LAMBfhFYtEolISUmhurqa3t5ewQgmJyej0WiQSCQC6x5AfFw8y5Yto+pIFe3t7YLCPXNWO4zkHWZRVMgvnwr31+Yhhi2dQqkQXHEAnz/EpavVatFEa4SD6HK56O7uDllXUShZPHPmTOGi+P1+FHI5KpWK5ORkfvazn7F8+XI+++wztm3bxsjICD09PQKVaWpqKs899xxarRaXy4VWG4KaCn+f1+vFbDajjlLjPJ2UTk9LD+XBnA7Gx8dRqVSrQxp7AAAgAElEQVQCNmNdXR0xsbHMmTOHnJwc0tLSGBgcwO12I5VKz0KqCaMFi0Qi5AoFKrVaeCeBQIBTp0IUprU1taSnh6g/ly1fhj5Wj0ajQaVS8Zvf/Iampibeffdd/ufll8nKzOS666770hMgYQWtUqvPQfYOV5Tr6+txuVxnKctgMEhPdw8nTpwQWNPS0tKIiAgVfM6nXEwmE7m5ueeAcJypcKRSKQbDn0m+RCIRfp9PKGYFg0EUCgUqlUqASpPL5Xi8HqFgFC5Uud1uvv3tb7N48WK2bdsmKKh77rmH4eFhxsbGLvpuHA4HERGholXY2CoUCrweLyPDI8THx/Ozn/2MoaEhgX2vtbUVtVrNxo0bWbhwISUlJaxYuYL4uHjBkz6fArNYLGzevJnly5ezZs0a4fe+9957OBwO1Go1IyMjuN1ugcLUZredF+VdIpEwvXQ6699ffxbncZgL3efzYbfbz6IpCN+9CEnEOc8qKytj9+7ddHR0CMW2xKREpk+fzoYNGxgZGRG80EAgQGZmZshFOR0pnVkkCTeTWywW4uPjsVqtDAwMXCGZksvlpKSEmn7DVmpwaIjdu3aj0+qwWq00n2gW/n9fXx+DQ0Pk5ubicYfIg84cxg+Te7tcLqxWK0ajkfnz5/P//t//IysrC7lcTkxMDCkpKdy04iZuvPFGUlJSOHnyJM3NzRgMBoaGhoS1dHZ20trait/nFxB9jUYjgUCA7u4e2trbUavVJCcnU1RUREFBATfffDPXXHMNEdIIduzYwejIKAF/QAjnwgdGKpUKEE5ul4uG48cFy3vixAk6OzvRarWkpKSwfNky5s2fj1qtpqamhvr6erZt24bX6+Waa67hW9/6FgqFQghXz/SU/hIJV1Nl5/HqNBoNixcvpquri3379glem9/vp7+/n02bNqHT6bj77rtRKpXExcVhNptpbGw8p3h2vOE4HR0d5Ofnn9PzdmboF4bzCns/Ho+Hrq6u01b0z9MlYS8wKSlkxIyjxlAHgd2GacyEUqlkaGiIpqYmsrKyWLFihcCdIhaLUalUX9iQrdPpiI2NxW6343K5BOKpsbExZDIZ7e3ttLS2kJiYyN133838+fOJioqirKwMmUzGokWLWLlyJVmZWXR3d7Nr167z7o/X68XhdGKz2UhITECr1eL1ejl+/Dh2u12oVFutVoFCd3R0FK/nwntdWFRIUnIS+/btE97v+Pg41dXVTJs2jYTEBJRKJRMTEwJx1+eVYXg/CgsLyc7OZsOGDQwODoZ4sCURQtS2d+/eUFX7tBF5f/37zJ83jxkzZjBnzhyqq6uFuzMwMMDY2BhWqxWZTIZYLKavv/+yafv52iZVwhwk69evp7m5maamJj7dvp2BwQGuvfZaxsfH2bdvHw6HgyNHjrB582bmzJnD8uXLqaurY8+ePRQVFTF58mSCwSBHjx5l9+7dpKen43K5+OMf/0j/QD+7d++mtbWV1atXk5ubS21tLQ0NDQwPD3PkyBFOnDhBbm4uGRkZvPnmm+zevZvu7m5qamo4cuQISclJLFu6jJMnT9Ld3U1vby/V1dW0tbYil8tZunQpEomEd999l472dgYGBjjZfJKxsTECgQDbt28nPj6ea665BoCTJ09SVVWFVqtl+vTpdHZ20tjYSFtbG7t37+bosaMUFxdTVFTEwYMHaW5upq2tjUOHDmGxWJDJZLz55pvU1tYKALUKhYIlS5bQ0NDAunXrSE5JFtIQXyQtrS28//77DA8PU1ZWRnJy8lkkT3l5eSiUCv70pz9RV1eH3+9n26fb2LBhAz09PVx11VUsXrwYkUgkXORt27bR0tJCMBikpqaGd955h/q6esrLy6msrDwnbA4bNbfHzc6dOzlw4AA6nS7ENtfTw8aNGxkfH2fy5MmIxCK2b9/Ojp07SUpMZObMmQL3sy42lmOfHWXnzp0kJCRgMBj44IMPqKmpYWxsLAQuW5DP8uXLGRoaor29XQgl1Wr1BTsh6urqOHXqFKdOnWLPnj3U1tYKhq3zVKcQTppMJsrLy5k8eTI1NTWcPHmS1tZWGhsb6ejoCLUqlZSc48VLJBLkcjnr33+fkeERWltb2bBhA93d3Xg8HnQ6HU1NTZhMJmJjY+np6eHYsWPk5+dTUFBwwdYqq8VKTU0NfX19VFVVcfjwYU6dOsVdd91FXFwcmzdvZnBwkOLiYuLj488bXYTbldLT0zlw4AAbNmygpaWFNWvWkJ+fj1wup629LXQvaqrZu3cvNdU13H777UyePJmIiAjee+89bDYb7e3tHDp0iBMnTgjkb9XV1cTodJSVlV0Wo4Nfm0IUiUQkJiYKyMzBYJD58+Zx/fXXk52VTUFBATKZjGPHjtHf3095eTmrV68O9ZbZbehj9cyePVsgXurr6yMuLk4I38RiseB93n777SxevJjc3FwhBAwz9t1www0UFxeTkJAQ8liHh9FoNCH6gbY25lTM4apFV6HT6ejp6UEikTB16lSWLVvGjBkzUCgUzJw5E5VKhclkYmxsjPLZ5Vx73bWIRCJkMhmTJk0iIyPjNNJyF0qlkuLiYoqLi6msrESlUmE2m9FoNFTMqWD+/PkUFxdTUFBAbW0tJpOJokmTWLp0Kfn5+RRNKmJ0ZJT29nays7O5+567KSwIUXcODw9TWFiINlp70RDE5/chEokwT5ixWq2kpqYyadIkEhMT/5yXPd3KNKk4hMLc1dVFe3s7gUCQqVOnsnr1ahYuXCiEgUqlkunTp5OVlcXI6AhVVVX09fWh1WpZsmQJN998M5GRkRcM6wP+gFC8SEtLIy8vD7/fHyJLSk1hdvlsNFEaAb6/uLiY6dOnM3XqVPx+P12dnUyZMoXKykrB4Oj1eiHfW1lZyW3fuo2YmBgSExOFIkFycvJ5CwvBYBCtVktMTAynTp3C6/UydepUKufORR4ZyYIFC9DpdHR0dODz+SgpKWHZsmUUFhWRm5dHe3s7bW1tiMVibrrpJubOnXvBYpJEImHSpElERkbS1t5ObGwMN914E8nJyahUKtLS0pg1axZpaWnIZKEKeF5eHllZWefPhUVEkJ+fT0ZGBu3t7YjFYvR6PYsXL2bevHkEg0EhbC0qKkKv119wXyIiIkhJSeHqq69mcHCQ2NhYli1bJtyT5JRkbNZQv6dWq+XWW2+loqICiUSCXq8nPT2dlpYWxsbGqKisYO68ucTExGAwGMjJziEnJ4fs7OzLYlrma0e78fv9Qvhz5qF0Op2IxWKGhoYQi8VCxTPsxrtcrrMsitVqFZK1YYrL8N+Fn2u325FKpaFmVbsdg8FwDt1puKdxeHiYRx55hB/84AcsWLBAyHsoFIpzyNoDgQCdnZ24XC6io6NJSEwgQhIhhDqA8D1WmxWfz3eWwgr/ns+jjoQ5b5VKpZArCocZTqczFKaIQsUPsUgsfCasdC6mEMO5zPBnfD4fCoXivGFkIBCgqakJpVIpNJQrlUrkcvlZ3xHOlw4NDSGXy3E6naHqqFSKUqkkIiLiC1Gxw42/fr+fqKgo/H4/4+PjiMVioeAVLqacifEY5vQOz2SH12I2m4XnajSas36fy+VCLBZfEEw1nNfyer1C47BcLheqvEqlUgDlDecXw/vn8/kYHR0V+G7+kt46jydEDev2hAo+arVaaCc6czIl3Awd3ocvkvHxceFMSCQSoVfUYrUSOP2eLzaxE07vDAwM8JOf/ITly5dz/fXXn3VWw2cYQK6QC+cx/C6MRiNisTjEfikRC/B0Xq8Xv99/2QBLXHbwX2Fe2nAy+6t+9hdBW4Uv665du3j88cdZsWIF9z9wP/Fx8Rd9djjp/lXCWn0emOJ86/8qk9EXe1ZYgV7w3z8Hh3+5zJB/fi2XMxbj5/fb7XYLCNxfF3ity+WiqqqKXbt2ESRIUlISS69bKhRR/t7ksjsZYYLwv9Wzv+jyhHktEhISWLp0KVlZWehj9V9cnfob4Pt9fr3nW/9XeUku9qwvMk5n0gR8HViHF1Lmn1/L5Ty7/Pn1h1uLLsav8n/xXmWRMux2OwWFhay6446/a5iwKwCxFwkpHQ6HECZdkSvyjyjBYBB/wI/dFmrT+Xya5IpC/Ac7DIFg4C8mSboiV+Tv+S6EvdUvRaT1DZMr8F9/ZZh9Rb5eCfNA/zXYgP9XEp6Q+Sas9UJ34e/9PlzxEL/h4vP5hPzZ8PAwVVVVTJkyRZgJ/mu9gsvdKFRXV3Po8CGWXreU7Ozsy3adTqeTQ4cO0d3dzbJly86hWPhbysDAAK+88grBYJDv3HcfKcnJVy7OFQ/xmylerxeL1XJBUFWJRCK0LdXV1fHb3/6WI0eOXHDO9S9VhG63G6vVetaUzeUoVVVVfPLxJ1gslst6nW63m9raWjZv3nze0ca/pXR2ddLX10eQIFzxf64oxG+y2O12Nn64keGh4QuGMeGewPz8fGJiYr4UR0ggEDhH6YlEIrq6uti5c+d5///l5B3r9XpcLhdOp/Oy3ke1Wo1OpxPAh/8vpburG4PBwEMPPkRSUtKVS/X3qBC9Xq8w4fKXXvz/C/EHvlqPamBggD179lz0wodDWqVSidVqFcYG/6IDcLpZ90zvMBAI0NLSQvPJZj4PXXg50YeKxWLy8/MFpfhVyeffXRjx5lL2Nnw+IyIiSE5Oxu/3f+Vet8t98d/e29vL8PAwCoXib7J/n0cb+ibL19KU5fP5BAgvjUYTAm4YHCQxMZH09HTBQwmPTYVDjtHRUXQ6nTD8H/5/ZrOZrKwsZJEynE4ngUCACEkIzy7cdzY6OorNZmNiYgJZpCw0KiQP4SjabXZhDtfn8wlMbBaLRRj7ys7ORq1WC8gnXq9XaB4PBoMYTUbkkXKUKiUOh4OBgQEmJiZIPA3Pfin9bx6vh+3bt9Pa2kp/fz8qlYrY2FisVistLS0EgkEK8vMF6K3wxIlOpxOmQtxuN9XV1WRkZBAfHy9c0ObmZrKysjCZTIyMjAi8HRKJhL6+PrZt24bRaKS7u5uM9AwCgQAjIyMCdLxarb5kljaPx8Pg4CCBQIDY2FhhiiU89WG329HpdIyMjAjTOyq1ikhZpODRHj16lPHxcWGMTSy59Iv+2WefodVqSU9Px2q10tvXexpl2s7J5mYSEhLIzMwU6CkaGhrw+/1MmjRJQNcJn8fwPrvdbo4cOUJERARTp01FpVQJRryxsZH4BAMiRERIJKhUKoHO9VIcA5/Ph8PvwHkaICJSHhmKFKSh/sHa2lpaWlp47733WLZsGYmJiV/qO8bHx+nr60OukJOVmSXcgbGxMTQajXDWjEYjY2NjxMTEEB0dLexpmCogTNVgs9loamqisLBQQIovKSnBaDJit9kpLCz82vLWX4tCbGho4LHvf59JRUWCQhkbG2N0dJS1a9fi9Xp5/PHHWbR4MT/+p39CoVCwceNGfvWrX/HwIw/jcDh47dXXmD17NrF6Pa0tLVgsFq6//nqGh4c5ePAgwWCQO+64gzVr1uB2u9m4cSObN29GLBYTExOD1+sVgFE3b9nCLTffTHd3N9HR0dx6660MDA6w7pV1jI6OkpiYiNfrZd68edxyyy0cbzjOL3/xS1bfeSer7riD8fFx/vnxf0ahUPCTn/yEg4cOsnnzZsZMYwSDQdasWcMtt9xySd7h/v37qa+vZ+3atay8eSVKhVJAMOno6ECj0fDoo48yZ84c3G43Xq+X2NhY3G4369evZ+/evQJGYWZmJvfccw+1tbU8++yzlJaWYjabEYvFjI+PM2PGDO677z4OHDjAwYMHGR0d5WfP/Izvfve7vP/++8IYWnd3N3PmzOGf/umfvnAU7/Nitph59tfP0traik6nY2xsjLy8PB5++GFUKhVP/MsT9Pf1U1RUxP79+4mOjiY1NZVFixZx9dVXs3v3brZu3cqpU6dQn+aqGRwcZPny5ZfmXblcvPzyy3R1dQk0n8PDw+Tm5pKXl0dnZydGoxG3282///u/k5GRwWuvvcbw8DC//vWvSU1NZd++ffzqV79izd13c/PKlezcuZPXX3+diYkJxGIxWVlZPPHEE0RERDAxMcHrr7/OoUOHBHCJNWvWsHLlygsCTFzM+xSLxVgtVn70ox+hVCrR6XS0t7eTk5PDY489hs8f4jEZHBxkz549LFiw4JLSNt/97nfR6XSsW7eOhIQEhoaGePDBB8nMzOT2b3+b9959l7GxMaKjozEajRgMBlavXk1iYiIPPvQgkbJI3nnnHQKBADt27OC///u/uffee5HJZPzqV7/i/gfuZ/eu3ZjNZt555x1hTPMfQiFqtVq00dG0tbXxzM+eIS01jZ6eHn7/+98zODhIWVkZWVlZqJRKIZxzOp0h1GFNNDG6GIxGI5mZmdyxahV1tbU8/fTTHD58mPvvv5+lS5ey/oP1HDt2jOuvv566ujo++OADSktLufPOO/F6vfzkJz/hyJEjlJSUsHXrVjZu3MhVV13F0qVLUavV/P6l35OcnMz3v/99EhISOHToEG+//TZFRUUY4g0hD+m0N6BSqUhISKC5uRmTycTRo0dZvWo1GRkZbN++/ZIbu+PjQmTwfX19fOc732HevHlYLBays7OJjY1lbGyMP77zDm+//Tb5+fnY7XbMZjOBQIC6ujo2bdrE0qVLuf7663E4HHz3u98NeYLJyUxMTDA8MsLTTz1FdHQ077//Plu2bGH+/PksXLiQY8eO0d7eziOPPEJGRgYdHR1873vfo7i4mNraWgHu6cs2KUgjpNxw4w0EA0HS09NpaGjgpZdeYvfu3axavYoZZTPYs3sPM2bM4MknnyQlJYUtW7awfv16MrMyefbZZ0lNTeUXv/iFsC8vvPDCJReR5HI58fHxNDQ0sHLlSiorKzl8+DAvvvgier2exx57jIiICF588UW2bNnCd77zHUpKSujt7RXg0EpLS9FoNJzq6GBgYICXX36ZuXPnsnLlSnp7e9m3bx8TExPCLPWs8nJWrVrFxPg4u3bt4tixY1x99dVfWiGGAXk//vhj7HY7jzzyCHl5eVRXV/P222/z3nvvsWpViAulqamJ22+//TRW4Zc8h/HxZGZm4vV6BQCG2NhYgdOoqbGRgYEB7r33XkpLSxkeHubpp59m3bp1PPnkk+Tn5bNnzx6sVitarZa8vDxkMhmjo6NUVFQgk8l4/733KSgoYMGCBURERAjz0/8QOUS5QoFSpUKtVjNn9hzS0tJISUnB4/EI1cIQS5ha8D7EYjEajYa4uDgmJiZQq9VMmTKF5KQksrOzBRy6mbNmMmPGDOLi4mlvb8dqs7Jp0yYmTZrEo48+SrwhnubmZiwWCxqNhsrKSlJTU9HpdHz729+mpKSEQ4cOYTKZWLx4MSUlJSQlJbF48WLcbjf79+8nEAggV8iJ1mqBEHBDbm6uEKLW1tTS1NSE1WrlxhtvZPHixZf0nsKowklJSVRUVKDVaomLi0MqldLY1ERHRwcd7e2cOHFCQJn2+/24XC42b95MUlKSABrb3NwsEFyJRODxesnNySErK4v4+HjS0tKw2+0CEABAVlYWJSUl+P1+WlpaePXVV+nq6mLWrFlUVFQAfOl5c6VSSWFBIW63WyAWGx4e5tixY/h9/hBSj07L5MmTmTdvHlOnTmVScTGDg4McPHCQwcFBrr3uOsrLy8nKyqK4uBjt6X24VElOTkYmkzF//nwKCwtZtGgRTqeT2NhY8vPzSU1LJTU1lbq6Omw2GyqVivHxcQFHMMwDYrVa+eSTT6ivr6eoqIjMzEwqKyv58Y9/TFFREUlJSaSnpzN9eikF+fnMmTOHiooKAe7/UsRqtVJVVcVVV13FnDlziI+PZ8mSJZSVlbFhwwaGhoaYOnUqSqVSYCb8siKVSpk6dSpms1nIf4aLebF6PTU1NRQUFFBWVoZarWbSpEnccOMNDA4O0tDYQGJiokDJACEwEr1ej9FoJCUlRUD5efTRR7nnnnuQK+Rf24jl16IQXU4nLpeTtLS0sxBXwogiw8PD9PT0nIUqI5FIBKTk0dFRDAaDgPkXRi2Ji4tDIVdgs9kYP42G3NjQSHV1NWq1msbGRt568y0++ugj5s6bF+JA8fmQSCTMnTuXuPjQ8w4cOEBeXh5Fp0P6cJUwLS2Ntra20GVwudFGRwseUhgtJpzz+uUvf8mPfvQjXn31VXp7ey8ZAHN0dFRAjHE6nWzYsIFnn32Wd/74R0wmE5mZmfh8PgYGBoTG2aHhIWpqaxGfzge+9NJLrF27lrIZMygsLCQyMhKZVEp6errw/hUKhYDG7XA4hPxQZGQkSpWSa665hhMnTvDII4/w5JNPcvLkyUsuOm34cAMvvPACe/bsEaDyh4eHsVgs2Gw29Ho9sbGxAkqR6jSPh9PpJCYmhslnYArqdDrcbvdfdYF8Ph8xMTFCXlSt0QiUpSKRCJ/XJxBLhdnqPk9zEEb3sVqtREVFCUpSLBYjl8uRSCSIxeJQ+sXjFdC/5XI5NlsI1PZSxGKx0NfXR2lpqTCHHwwGmTlzJlKplObmZtRqNW63W/Dqv6yIRCJycnIwm8309/cLkYHL5UJ7OoUSHR2NWCxGoVAgEolYsmQJqamptJxsQS6Xo1QqBQMSGRlJWloaTqcTnU5HfHw8iUmJ5OXnIYuUCdwx/zAhs9vtxu/zC+xuYaUWxp+bME/g9XnRRGsEhRQIBNBoNCgUCoLBIKmpqeTn5yMSibDarDgcDsEChZFZoqKiGBgcxGQyceTIkRCDXnw8d911FzNnzkSn09HS0sLQ0BAGgwF5pBy/309kZCSRkZHnYMRZrVaio6OFSqFI/OfOfaPRiEwmw2Aw8Lvf/Y7DVVVs2riRV155BY/Hw9M/ffq8iMRfWMGz2/B4Q9we/QP9vPnmmyxYuJDbb7uNuLg4NmzYwIEDB0JVaFHIcLhdbgYHBujt6cFkNJKWlsYTTzxBQWEhCQkJdHV1nRX+AAKhFqLQ+zObzQI/dpQ6iieffJLvPvhd3nzjTXbu3MnExIRASPVFXkcwGMTr8wojkHv37GXhwoWsWLGC2NhYOjs7OXz4sOCBqJQh/L8zjaFarRYUuMlkEprRPR4PEonkr6rchonEwqmNqNPFq7ARC4b/BIN4vV6BS+RMBSOXy7HZbSiVSoHG9vPvIDIyEo1GI8wDh+GwHA6HwN/yZRVBmFvFbrfj9/sFxRsGSTGbzeTl5Qn9quHPfFkDUl5eTn5+Phs+3EBObg7BQJCoqCgSEhMIBAIC7qPgaYnEguMyb9489uzZQ39/Pzk5OQSDQSIiIgRDr1KpMI4a8Xp9yP9GwC6XtYdot9txu91C4jRIEJvNJgBKKpVKdFod5olQPszpdArE2mFuY51OJyhAESI0Go3Q/a9SqUAUCs9mzphBXl4ey5Yt47//+795+qdPU1FRwejoKL19fUhlUgEfLgxfX1FRgdVqZXh4WFDgh6uq6OrqYtGiRfh8Pvr6+jjVcSpUKDCbhc13Op1IpVK+deutrF27lrlz5yKJkFxyu4NapSZKHSLp6enuwWg0kpebK0Dnd3Z2olAoyMvPI0ISIu3JyckhLy+PqVOn8vOf/5xf/OIXzJ8/H6fDwbFjx0hITMBisZw1qB+GmgoGg0gkEiSnq5+BQICu7m5OnjxJZkYmP/zhD7n11ltxOBz09fUJfBgX9Qr9fsbHQgT0wyPDdHZ2CqG61Wrl1KlTOJ1OAWDU6XIKyiYQDKBSqQTKiZGRET799FOh2jw4OIhEIsFivfTG7DBhmaDYTyva8LtRKZUkJiQI7ycjIwOpVIrJZBIM5eDgIFaLlaJJk5BKpYyMjAj0DHa7nQnzBAkJCdhsNgFO3+fzCQrS7TqXRS/8+YtJeno6V111FTt27MBoNAqFluHhYaRSKTNmzCAmJgalUonztJK+FO/LYDAwf/58du/azc4dO9m3bx8Wi4XUlFSuuuoqrFarwHgJIWT47p4eiouLiY2NxWg00tbWJhBgWa1W2trbhXWOj49flN3x79pDPHz4MI2NjUyfPl0ANK2vr6evr4+W1hbmzJ5DRkYG+/fvJyoqCqPRyKeffordbqehsYGmpiYgxBscFRVFdXU1w8PDdHZ1Mr1sOh0dHdTX1WO32xGJREybNo3Nmzej1WrJzc2ltbWVuro6bv3WtxgdHaGpqYnm5macTqfAkzI+Ps769euZMmUKg4OD/PGPfxTyJKOjo2i1WqqrqwUk6e3bt6PX69m7dy+dnZ0UFBQgFovJPE3+dDEu4ouJTCaju7ub/fv3o9VqMRgMfLT5I+RyOX39/ezdt4+RkREaGxppbm4OHSyzmeXLl7Nx40b+53/+h6uvvprm5ma6u7uprKykpTUE719fX8+yZcsAOHToEI2NjXz8/7N35oFR1nf+f809yWQmmdw3gZxAwhHucAgU5FZRUKxXq7Wnttuq3XZ/reu27vbYtrvVWhWvqvUCVE4FAoQjEEKAnITc9zWTZM5k7uP3x+R5FvBAqWJr+f6lIZn5zvN85/N8ztd77/t87zvfIzIykpKSEjRaDYZ+A6WlpSxevJiZM2cSCASYMGGCmLL4uC+Y4PVERUWJBHGlUsmxY8ew2qxYLVY6OjpwuVyMjo5y+vRpujq7OHr0qJjIP3LkCPX19VRWVhIZGcnJkyfZsmULarWaffv3hb58HZ1XdH0NBgMNDQ0cP36c6667jrVr11JbU0NbWxv19fWYzWZ8Ph+nz5yhvb2d6upqZs2aRVZ2FnV1dURERDBgMDA4OBiSZFUoWLlyJXv37kWhUCCTyRh1OJg5cwb9ff20tbXh8/lYuXIlSUlJtLS0YDabqaysZOHChRdVVyUSiej1feQXWC5nw4YN3H333fz2t79l/fr1OJwODh06REZGSNpWyNWWHjvGooULP1Xjvug5SaWsWr2K/fv38+tf/xqpVMrNN98symNUVFSwefNmFi9eTGJiIq+/8QYup5OCggKio6xTCeEAACAASURBVKPJzs5mx44d+Hw+RkZGMBqN9Pf10dXdzdDQEAMDA9TV1hIfF/eF9rpedQkBn99Hc0uzaCzy8/MJCwujr6+P6OhoJuZNJC8vj8TEROrOnaPh/Hn0Y5oL48aNw+MODcgXFBQwceJE1GFhNDY1oVQoyM3LIyszM0QCDgRITEyksLCQRdddh1QqpaysjOLiYgKBAOvWrWPBggUYjUaxj1EQ7E5ISBANsiBhUFhYyIMPPkhaWhrR0dFERUVRV1fHwMAAicmJTCmYgk6nY8qUKRiNxtAX3mplydIlzJs774pyXBKJBIVCgUoV6r+bOnUqM2fOpKamJqQcmJrKunXriIiIIDU1FZfLhUajYfKkSSxbtoxAMEBNTQ1lZWWMjIzwta99jYULF1JeXk5sbCzZOdlMmzoNJNDZFVI0TE1JZf78+cTExITyelYbq1avJjYmhorTp2loaCA5OZlbb7uNxMTEy365hNBQ6NkUfr+hoYGGhgY0Gg0FBQXI5XLS09PFLoSUlBTyJuYhl8s5e/YsMpmMJUuWcOONN6JQKDh69Citra1MnTKVxYsXk5GRQXJy8qeu6FssFgwGA1KplIKCAlFVzu/3ExcXR97EkGZJc3MzWVlZTJ06lUmTJqHV6aiqDOlqy2UyVqxYMbbniay4/nqam5s5fPgwZrOZmOhoCqcXYrPZkMvlxMXFMXXqVPR6vdgVMH78ePIm5hEedjFrUIhaPm5FRkYyYcIERkZGKC8v53z9eXJzc3nwwQeJjo6mvb0dpVJJRkZIwfFKDCKANkLL4sWL8Xq9tLa2cvvtt5OVlUV0dDS5ubl0dHRw+PBhqqqqmD17Nt/93vfIyspCo9EwZcoUKioqQmcvLpavLP0KySnJIQ85LAydVkvexLyL8tpfxPpC4A4joyPYrDYCgQAJCQmiCp1vTP1NJpPhDwTo7ekRm7e1Wi12ux2pVMrIyAhRUVFiaOdwOHC53aiUSrF1IRAIYLVaxSeu1+tlaGgIi8VCXFycmB8TdH2FJuELizy9vb1imJSUlPQBMKbJZArp5EZFIpVIRUU0h8NBd3c3YWFhxMTEfEBy4EqS/oL3KhRahAbssLAwRkdHRaF4wfiEh4caxIeHh0VjJOREh4aGUKlCiHphXw6HA5/fJ8obCHkwIZcoNN4KeV4hnL6Sw+t2uzEYDGg0GlFTRyimyOVyTKZQ/6bggQp9gJGRkahUKmw2GzabDYlEQkpKioij+rTXWDj6gvJcTEyMmD5xOp0h7ZaxfKHFYiE8PFyswLvdboaHh/F6vWJBRijQCdfYbDYTERFBfHy8aNQ8Ho+oiXxhusLv94sFiUv390k/l8fjESU3ZDKZ2IDt9rjxuEMpgE/b2vNhVe2nn36awcFBHn/88Ytgzjabjb6+PpRKJSkpKR8APRsMBiwWC+MnjEepCA1RKJVK3B4PbpfroubtfyqDeG39fa7Q8P8XT7cRKqV/T2OC/+zL7XbT0NDAe++/R8P5BjZs2MC6deu+dJ/zmkG8tq6ta+uyq6mpibe2vIXFbGHjxo3MnDnz71qO4ZpBvLaurWvrE3nfVxIBeDweTGYTMqlMnJX/Mq5rBvHaumYArq1ra2xdS9JcW1/qdc0YXlufZsmvXYIvn/fi8Xioq6vD4XRQUFDA8NAwjU1NLFm8GLVajcfrQalQ/sNdL7/fT09Pj9j8LlR/g8EgkZGReL1evD4vsTGx9PX1MTQ0xNKlS//uwrur7bUODQ3R1NREdna2WLn/tNf9s9ZIv2YQr60PHtThoRBwITnlE/WGjY6OAly2NaGvr49f/OIXWG1WfvPr3/Duu+9SWlrKzBkzxOmW9PT0fzh9XZvNxh133EFnZydTpkwhLS2NsrIy1Go1WVlZ4hjmxo0bMRgM9Pf3M2XKFBITE/+pH6RlJ8v479/+Nw8//DA33HDDFb2fy+USW9Y+yjj6/X4RmvKPakCvhcxf0AoEAxQXH+Cxx/6DhoaGyxKuhcmS2tray762Xq8nIyMjBKwNDycxMVHkHp4/f55HH32U48eP/0NeN7VazeLFi3n00Ue5bdMmVCoVWVlZPPTQQzz00ENMmzaNiIgIsVH5S1kJ/ZTeZeaETKKjo69YyyUQCHDkyBF+//vf09HR8ZGjmgcOHOCXv/wldXV1/7DKgv+0HqIQBgizosJ/X60nm9/nJ+D3M33aNMaPH3/Znjuv18uhkkNE6iKZO3fux99UuZyYmBjCwsKIjIwkIyNDpKuEh4eTnJxMTEzMP5zno9frOXDggPj/BqOR5JQU9Ho96enpFBYWcsuGW/B5fTz99NMAfzMa7PMIHa92XlOv1xMTE0NLS8sVhesCFRygp6eH5ORkEbJy4WvJ5XIiIyPR6XQfeZ7/3otcX5hB9Af8DA0O4fP5iI+PF6dVBPKM0+kkEAxNQqhVarHrPRAIIJFIsNlsKBSKD3T3u91ulEolHo+H1tZW4uLi0Ol0+P1+UXNEIJHExcXhdrvp6upCo9Gg1+tRqy9msTmcDhyjDtRq9UVTMHa7nfDwcBFi6XQ6sdlsxMbGigRwgToSHh5+EVkGQoSVdevWYTab0Wq1jI6O4nA4iImJYXR0FOOgEQkSUlNTUSqV9Pf309zUTEJCAp1dnaSlpSGVSMcmfHx0d3WHJBdiokUMmUBeGRkZEQ9pTk4OX/va15g8ebL4WdweN4YBA15vCEsVGRkpTo14vV68Xq8Iv1CHqVHIFeLPlEolw8PDOBwOwsLCiI6OvujL4HA4cLpc2G02oqOj0el0ooEfGh5mxG4Xr61Wq/1Yj+7SL1OERoNapRL3DaBUKFEqlISPwYUNBgMxsTEYDUaRYHSpUbuQA3nhtNKFDyO73S7u3e/3M2wyIR2b0ZbL5bS3txMfH4/Nbkej0aDTajGZTXg9XvE9vV4vVquVkZER1Gq1eI3dbjdBQCaV0tvbi1qtRqPRiDxM4bMLeDQkktB766MIU4d96LWy2+309vWhUirFc3ChZ+fz+cS9REZGXjRNZTabcTgcIWKUTkeERsP111/P1KlTCQQCKJShaZ7BwUEkUimaMZGzefPmkZGRgX5M9kPYt8VqwWaz4XF7iIqKIjY2ViQVOZ1OwsLCsFqtIbCIXE70mCTGl94gBgIBHE4HpytO097eTk1NDSaTifT0dL7//e9TWVXJb379GxE0ef78ecwWM/OL5nPfffcRFxdHZWUlJSUlovFJSU0lIiKCWbNmYrXaeOXll5k8eTJ+v5+//OUvIti1vLyc9evXU1tbS2VlJQkJCay/+WYcjpCqnVQqJT8/n5/89CdEyCOorq6mpKREhD7ExsayYsUKFi5cKFKely5dyu1fvR2pRMrmzZs5ffo0Dz/8MC0tLRw9ehS3241UKmXBggXcdNNNF+XsrFarSAh/8Pvfp6a6mp07d5KVlcX58+fp6OggLCyMe+65h0WLFvHKK69w8OBBMjMzUalU3H///Xg8Ho4cOUJlZSVut5uEhAQWLlzIkiVL0Gq1orGWyWTiaN/p06f5wx/+wLe+9S0WLFjAjh07OHr0qCjh0NrayvTp0/n2t7/NlClTKCkpoa6uDpPJRHh4OJmZmaxfv57NmzfT1NTEmjVrqKyspKOzE31UFOvXr+e6667D7/dz7Ngxdu3aRWNjI0qVioULFnDfffehVqs5ePAgx44do6WlBb/fT35+PnfeeacIxfgknpV0bKzS4/HAJf+mUqmQyWVsfm4znR2ddHV1kZKSwp133smKFSvweDzs3r2bEydOMDAwgEQqIT4unrvuuoupU6eK7+X3+3n77bfZtm0b//lf/0luTi6NTU08+cQTLFy4kK9+9au0tLTw4x//mPnz59PX34fb5WbWrFns2LGD1NRU/vVf/xWLxcLu3bvp7OxEJpcTodGwYMECiuYXceL4CY4fP05cXBznzp2jv78fi8XC/Pnz+cUvfoFCoeDAgQO89957oYel0YjRaKSoqIgNGzcwpWDKRSN5VqtVlCnQarVIJBIqKyvJy8tDIpEwMjLCm2+9SUtzC0ajEaVSyfXXX8/69evp7Ozkr3/9Ky0tLdhsNsaPH883v/lNjh07xpYtW5g2bRo///nPaW5uZu/evdTU1CCXy7npppuIj4/n2WefZdmyZdx1111YLBaKi4upqakR58XT0tK4/fbbSUxKZO/7e2loaCAyMpK6ujqRfHPPPfewcuXKK565/ofJITocDqoqq/jf//1fhoeHue+++1izZg179+5l957dREVGYTSG6DNFRUU89h//wYL5CygpKRHJys8//zx1dXXceuut3HbbbTgdDp595hna29oZHR2lqrqaV155hcrKSpYvX86CBQtQqpQhoZ2mJq5fsYIf/vCHGI1GtmzZglwm56GHHmLx4sXs3LmT8/XnCQQC/O///i81NTXccccd/OxnPyM7O5vf/e53VFRUoFAqaGpqwmQyIZfJRZRWa2sr/f39vPPOO+Tm5vKjH/2IvIl59Pb2fgDjJJVKsdlsVFRUYLGEnqD79+/n1KlTrL95PT/96U/Jzs7mz3/+MwMDA9xyyy3k5+ezYsUK7rvvPlQqFf/zP/9DSUkJa9eu5ZFHHiEYDPLyyy8zMDCAy+USJUkdDoco5GQ0Gmlra6O7u5v6+nqeeuopUlJSePjhh3nggQdISEggKyuLWbNmcejQIV555RUyMzP5zne+w9KlS3n66aeprqnGarNSWlpKaWkpt99+O7/5zW8oKCjglVdeoa+vj4aGBn7729+i0Wj45S9/yW233sqhQ4cYHBzk2LFjPPvss2RkZPCzn/2Mr371q5QcPkx5efmnAuk6HQ7R07jUnwgPD8fr8aKN0PLDH/6QH//4x1itVva89x4AnV1dbNu2DY1Gw/e//33uu/c+KioqKC4uvkhBLhAI0NfXR1dXF16Pd+zeSejp6RGLW2npaUyYEBJfClOHsWfPHl588UWmTJnC/PnzGRkZ4bnnn2doaIjvfve7PPDAAyQmJvLHP/6R46XHGRkZYc+ePZw4cYJly5fz85//nHnz5nHw4EE6Ojro7+9n8+bNOJ1OHn74Yb7zne+g1+sJEmTq1KkXFdl8Ph/Hjh3jrbfeYuXKlTzyyCOsXbsWpVKJ2WzG6XSyd+9etry1hVWrVvHggw/i9Xr5y1/+gs1m44033qC9o51vfetbfPOb32RwcJCDBw8SHx+PyWQSI5lXX32V8PBwfvaznzF79mwMBgNqtZrz58+LaY2Wlhb27dtHUVERjz/+ONdffz1nz57lqaeeYmhwCLvdzquvvsrJkye55557ePDBB9Hr9bz66qt0d3d/+T1Eg8HAnj17mDZtGt/4xjcIDw9nZGQErVaLz+sjPDwcjUbD2rVrWbRoEQqFggULFnDkyBGGTcPU19fj8Xi4++67yc/PD3l1Bfm8/PLLHDhwgPvuuw+dTodjdJTly5czZeoU4uPj6enpISoqitmzZrF82TKRPK1SqVi0aBHp6emYTCacTicOp5MdO3bQ39/PQw89xPz580VhqnfffZejR4+KlTohDBZIwAJkwGg0YjKZiImJYeOGjQSDwQ8M1Qvhm0DlcY+BBJYtW8baNWuRSqX4/X6qq6sZGR0hNi4WrU5LWloa6enpFBcXU1VVxaZNm1i4cCEul0sEBwhVQZFQrFaj1+tRqVRotdpQykAiobq6mvDwcJYuXcrEiRMZN24c+fn5DAwMYLaY2bNnD4WFhaxatYrIyEhaW1vx+/24XW4KpxeyZ3fo3wWyeEZGBm+88QYtLS309fXhdDq5++67ycvLIzc3l4iICJKSkvjDH/7AhAkT2LhxY4gcpNejGTPYn4TucuHyeDwf6klYrVY8Hg+zZ89m6tSp5OTkUFtbS21tLfYRO2fPniE5OZmvfvWrZGVlUV9fLwJBLvVK4+PjcbvdDA0NiUayv79fFIlSKkIpmpzcHL7yla+wbds2CgsLuffee0lISODo0aNUV1Vx3333MXny5DHobgTHTxxn165dfP3rXyc8PJy58+Zx8/r1KBQKdDodtbW1nKs/h9vlpre3lzvuuIPs7GyiY2JYsmQJFRUVBAMXpxGsVivvv/8+ycnJ3HjjjSKIIz09Has1hFp75513SE9PZ/r06QQCAbKysuju7ubEGA3qG9/4hkjgjouPIyoypH45c+ZMRkZGsFqt4hm//vrr2bRpUwjsq9EwZ84camtrGRkd4dChQ3i9XqZOnUpycjIrV67E5/Px0ksvUV5ezvTp00PM0tmzmTNnDhKJBJlMxo9+9CP6+/vJzMz8cnuIjY2N7Nq1C6/XS2NjI9u2beNPf/oTEyZMYOXKlSLNZvz48SJ1RK/X4/F4GDQOsnPnTlJSUvjKV74isuLGpY8jNjaW8+fPI5fLCVOrKSgoYOHChSTEh6Qe9Xo9iYmJxMfHi9KISqWStPQ0UlNTkUqlaDSaEETT6WTnzp1MnDiRGTNn4PV68Xg8REREkJubS29vr0g+EbwZhUKBVCoVFeLS09N56aWX2LhxI888+wxWq/UD4Z5SqUSn0xEVFYVuDDkfGxtLZmYmSqUSuVweonir1aE8URAsZgsJiQlIpVKOHDlCUlISeXl5VFdX8+zmZxkcGmTNmjUkJCRgNBpxjxnI4aEh/H6/qC2sUCqQy2RUVVUxceJEcnNzkcvlYsW2traWd995l9raWnJycujq6uL111+nuLiYVatWMW3aNPLz8/H7/aJnJBh5IZ965MgR0cgKqYPVq1fjcDg4fvw4iYmJmM1m9hfv59VXXiE5OZlZs2Z9KmEhQWTpw8Jpv9+PRCIhaUyYXbjedrudgf4BTpadFPOMhw8f5o033mDy5MkUFRVdtAeZTMa0adOIjY2lqakJCKHARkdHOXLkCE6nE5PJhNlsJjExkdTUVKKjo1m8eDHp6emoVCpOnjyJ3+9n5syZ4j5jY2NZsGAB9fX1Ig1cOyZhIJFIiIuLQ6vV0tPTQ1dXFzqdjnnz5oUexGo18+fPx2KxiHKuwnK5XBgMBqZNmybK00ZERDB+/HjMZjPd3d309/czceJE2traeO755zhRdoJJkybhdrkYGBhg1qxZqFQqFAoFMwpnkJmZiV6vZ+LEiQSDQXQ6HUuWLKGmpoZvfOMb/PnPf6ampmbMQSnAZDLR39/PqVOnyM3NJTo6Gp/PhzpMzfXXX09ERAQnT54UaUKZmZnI5XLkcjl5eXki6VvIQX5pPUSBQl1dXU1jYyMxMTGMyxjHTTfeREpKCm1tbVgsFvEGSyQSXC5XSNfC52NoaAhNhEb8N0GfWdBmsI+ERNonTZp0ERfP6/USHh4uGjFBNzkiIkLEakmlUhQKhUhiFhLawuu4XC56enpE4yEkhwHCNaHiSlRUFGFhYfzLv/wLeXl5HDp0iFdfeZXRkVF+9atffeDLLpeHCNdKpVJUFbwwf2az2XC73aLer9/vJyoyVDU1Go3U19fzwgsvEBYWRnh4ODfecCNLly4NFYYUcmTuUFFHIDsLIZ1aFUraSyQSXG7XRZrCAmnGYDBgNBrZs2cP+/btE5l9d955J4mJiSGD676Y8hwdHS0mxo1GI8ljxkhoohb0roPBIKWlpZhMJvHn999//6dWhAuGDgI+n+8DbR5qtZqwsDBUY96jIL7l8/kYGBigvb1dTOgLRaH777+f/Pz8i4yrRBIqbE2cOJH29nYAztefJzk5maGhIQaHBmlrbSMmJoa01DScTidyufyi+yjg5S5Fe3k9XkZHR1Gr1aLWt0QiEX9XoVDg8/qI0keFIp+xFIFWqyV8TGfG4XCIkhmC9+pyuUSxNgCtVkt6ejrt7e3ieTt79iwtLS3IZDIWzF/A2rVraW9vF730D6QnXC6sNpvoPNx8yy1IpVIOHDjA7t27KS4u5r9/9zuCgQAej0cs+AWDQbHwKZfK0URoQlHG2Fn3eDxiQUX4zJGRkaLoliB3cLWKLFfVICYkJJCcnMyKFSu44cYbSE5KBgmM2EfweL1YLBYkEglqtVr8og0ODqJQKJg0aRIxMTEMGgfxer1iK0BVVRUul4tZs2fj84Z4fkK4KHgso6OjxMXFiQbM4/Hg9XpFr1Aw1omJiYzPyCA6Opquri5cThc6rQ6fz0dDQwMdHR2sXbtWRJ7b7Xb8fj9qlZqBgQERD5+dnc2PfvQjbr/9dh577DHa2toYGhq6SCBcCM8EJqPb7SZ6jJ14YTio0+kIDw9nwDCAfQx8K7SThIWFsWrVKhYsWEBSUhIul4vh4WEUCgVWixWfzydWh4U2CZVaJVKrJ06cyDvvvENdXR2FhYW0tLRQUlLC8uXLmT17Nrt37w4pGc6eTVp6WugLOBpiLPp8PlF9TjjMEqkEr9fLoNFIbl4ujQ2NeDweUWDIbrcjk8vENqM77rhDLGBYLBbMZjNxcXFi6H+5BnSX04l7zMgJ6QFhCdfNOyZP6nK5cDgcBIMhLZDMzEyKi4vJzc1l9erVKBQKRkZGRI0SIf0hXOulS5fy+uuv8+abb2IwGPjWt77Fvn37ePWVV+nt7WXatGlotVpGRkK6KhcalcLCQs6ePYvZbL6oG8JisZCTk0NMTIxIFBdSAHK5nMTERBITE5kxcyaHDpWwZ88eNm7cyMjICK+//jopKSminIFYeddqmTVrFo2NjaL0qdfrxTg4yOjoKDGxMaSkpuB2ufnBD35AVlYWfr+fgYEBtDot8fHxbN26lYfG9NAFJqZSqcQ9RjUPBoPIZTI2bdrEPffcQ1lZGQ8//DBGg4GYmBhRVe/mm2/m0KFDYiXb6/UyNBhKO6SkpJCUnExUVJR4hi709k1jInFXW4r0qobMWVlZzJgxg7b2NkzDIbd665atvPjii1gtFgYGBkLI9dFRUeXs4MGDjIyMMDo6ypo1axgeHmb37t309vZy+MhhXn/99RD9OTub6upq+vv7GRwcZGRkhGAwpNVSX1+PwWAQRYwE0rXQXuB2u2lra8Nms2EwGFiwYEGoQnbgAC0tLTQ0NPDSSy+Rl5fH3LlzSUtPIyEhgerqalpaWjh16hSVlZVYrVYcDgcvvvhiaC8D/TidTiZOnPgB4e2RkRG6urro6OigoaGBmpoa+np76erqwufz4fV66enpwWw209PTQ1NjEwaDgTNnzmCz2ViwYAE6nU6sgp+qOMWTTz7J9u3baWxspLe3F6vVisvloqGhgfb2dkYdo3R1dWEcDGlfLFu2jNTUVDZv3szvf/97nn/+eVpaWlizZg3z5s1j8uTJnDp1io6ODgjCvn37ePbZZ+nq6qKsrAybzUZtXZ14kFuaW7BYLHT39DB71mw8Hg/bd2ynra2NkpIS3nrrLaxWK7fddht6vZ6uri4GBweprKpi165dom7O1q1befXVV/H5fZftzRS8EKfTeVG4LOS56sfkJmQyGW63m4GBAQwGA0VFRUilUsrLy6mpqRFlVsvKyi5S0xPW3Llz0Wq1/OUvfyEtLY0bbriB66+/nnfeeYczZ85QVFSEz+ejq6uL3t5ezjc0iIW0wsJC8vPz2b17N+fOnWNgYIAjR47Q3dPN6tWrGRwcpL+/n7q6Orq6uggGgxiNRmprazlz5gzh4eEU5Oezc+dOfvGLX/DYY4+xc+dO1Go1Wp32on1qwsNZsmQJdrud3//+95SWllJ+6hT1586FzoTFStG8IkZGRjh58iQDBgP79u3jiSefwDRs4rrrrqOsrIytW7dy7tw5du3axVNPPYXdbhcNVVNzM6+9/jrvvvuu2MKm0+nweDx0d3fjcDho72hnwYIFhIeHs2PHDrq7uxkcHGT37t3odDqKiooYGhwMaas0N2O2mAkSFD34mpqaL39RJS4ujuuuu463336bf/u3f0Oj0aDRaESxaqPRSFJSkujZORwORkdHUalUeDwe1q1bx/DwMHv37qW4uJihMUW5devWkZqSwtGjR5FKpWIYDWAcHMTpcjFhwgQxHLFarWLez+FwIJGGvLSwsDBsNhtLliyhoaGB3bt2Ubx/P/Hx8QSDQb73ve+Rl5eHx+NhwYIFbN26lT/+8Y9iyDphwgR6enqoqKjgzJkzREVFoVarWb169QfQ9h6PJ+QxyWScqjhFV2eX2IMo7F8QKmpqamLcuHHMnj2bU6dO4fP5WLZ8GTffcjPHjh7j5z//OT6fj6SkJO64446LQoyGhoaQ6LdSyZnTZ6ivP0+0PhqFQkFaWhpf//rXKSkpEcWlCgoKaGpqIicnhzvvvJOXX36Zp59+mh07dqBSqZgwYQIRERFYrVZ0Oh0WixmXy0V4eDiuMeqx0+Fgzpw5VFRU8MLzL7B9+w7GpaePVUQjWLxkMefq63nuuefYvHkzcrmchQsXsnz5cqRSKUajEbvdTjAQJCgN4va4UavUH8gRCpVNiVRCc3MzOTk5YqrBZrMRFxcnVoyFa6pUKjGZTaxetZra2lrKysqorq4mLS0NlUpFUVHRB3pbAZKSkli4cCG7du0SpVynF04XC0VxcXEEAgGxgNfX24vNZhObxpcvX8727dt56qmnxMJbbm4uy5YtE0NVj8fD4OAgaWlpoVagsd8bsdv59ne+TU5ODg0NDSGx+zlzGBoa4kDxAeYVzUMboRVzpTNmzqBofhHF+4s5deoUOTk56PV68vPz6evvo2DKFEwmE2+//Tbvvf8+apWK+QvmU1RURHZ2NgaDgR07drB9+3bRmx42DaNUKklMTKSzowOzyURtTQ315+sxDYfSVDqdLuSFxsRgs9ooyC+gqKiI48ePU1VVFUKImUzMnTuXGTNmUF1dTVhYGHa7ncHBIWJjYsUQv7+/X2yVuppjgFcd/+Vyuejr62NwcFDsS4qPj0cikTA4OIjT6SQ5OVls1O7v7ycYDIo/83g84hdGKpWSMT4DlVJFIBikp6eHocFBNGMaymFqNT6fD4PRiGIsX6dWq8Xkcnx8vBjG2mw2RkdHiY2NRaFQ4Pa4sVqtDA0ON7LSPwAAIABJREFUIZPJiIuLI/qChlOXy0VnZyd+v1/M6chkMtRqNQaDAZPJRGxsLFFRUReh+i8Mmaqrq9FoNGRnZ4veS3x8PJGRkfh8Pnp7e7GP2MnIyCA8LByDwSDmy5KSkkJqczYbnZ2dqFQqkpKS0Gg0yOVy+vr6AIgfK7AEx/7G6/ViMBiIjY3FPmLH5XQRHx8vpinefPNN/vjHP/LEE08we/ZshoeH6e7uRiqVkpiYSGRkJGFhYRgMBgYGBkK9oCkpYkNvW1sbmZmZREVFhfoa21pxu9xMmDCBtLS0/2syttvpaG/HYDSQmJBIdna2WLUX2kOEHORHNWkLnr3T5SQ+Ll58feE1jEajGMIJjcQ+n4+4+DgUcoX4cBwYGECpVBIdHf0BT/7CJRQxYmJiiImJwePxcKLsBGq1mvzJ+URGRmKxWOjp6UGv14vKiGIj+lCo1cTtdhMdHU1sbCyqscZyk8kkylgolcrQuR3r3YuJjaGqqorkpGTi4+PFnPMtt9xCUlISjz322EWfXYhAWlpbsJgt5OfnX6RfLfx9f38/druduLg4EhISxL0KqZ+h4WGiIiPR6/VER0fjdDpxOp1ERkYil8ux2+2YzWZkMpm4L6FbQzifXq+XkZERvGMpMU1EBHGxsSiVSrxeL52dnajVauLi41ApQ9eioaEBiURCfn7+VfcQr/EQP+dxs8/rby98jU8zDuYP+JFKQpmSv/71r9TV1fEv//IvREWFdFT+9Kc/8eabb/L8888zderUT72XS9tmAsEAEj5a7+QfnaTiG8tRXphz/KyHGQxGA3/4wx+YOWMma9euRaVSMWAY4L5772P+/Pn84Ac/uCj3/Hmc8UvPmKBR/Wmapz/svPv8PlxOl1jk+6LXNdrN3/pEueQmfhoD9VkcgE/7GoJYvJCjLS4upra2lqysLGw2G8PDw9x5551kZGRc0V4uNW6C8f3I/XyBxvBKRbIu7RT4XJP8UikSJHjcHv7whz/wzDPPkJCQwOjoKBkZGaxZswatVntVz7h47WTSv/l15DL53yx8dc1DvLY+k9XW1saxY8ew2+1odTqSEhNJS0sjNi6WCE3EB+avr60vbtXX13Oq4lSo8CiVMWXKFGbMmCF2Tlxb1wzitfUZeEhCJVTQT5ZKpQwNDxOp0131lodr6/L3Sgg7BbnTa+uaQby2rq1r69r6fFIUX5anp9CE/GHrwqbPL2J92CTFF738fr/YAH211rVn7+XP8edxjT6v1xW+V0Ix7cL3+KK/c1e65F+GQ1RXV0f5qVOsWb36olaNYDDUw9bQ0IDX46WgoOAD/YCf156QhAoKZrOZvXv3in2Efw8EZ5/fx/n68xw/fpzZs2dTWFh4dcKRa4JPH3lePB4PJSUlTJgwgezs7M8sHHa73ZSUlKDX65k2fRoqpeozeV2bzca5+nMYBgwolUqRPSBwHDMzM8UWsE/ycP576TT4hzeIPp+PsrIynnrqKXKysy8yiIFgALPZzPZ3t9PZ2cm///u/X1H19FO73WOHORgM0tnZyUsvvcS06dOYOnXqJzog9hE7w0PDpKamfi4G1DHq4Ny5czz77LOMjo4yadIk2tvbkUgkjB8/XmyM/6yW0P/2zyJUdCUGUeBjTpo0iZ/85CcijPZKPTez2Sz2Dj777LOoVCoe/6//JGvCZ0OQ6e/v55mnn6G8vJxZs2YxLmMcw0PDGAwGXC4Xt99+O+tuWCfO3n/U8nq9tLe3i32Z10Lmv3EplUpSU1OJior6QBFAJpWRmJCITCYTh+5Fz/GS2dfPIxQUmkvj4uKw2+wXMRE/KqTweDwcKD7AI488Qltb2+dyzbRaLcuXL2f8+PGEhYXR3tHBww8/zFtvvYXD4fhM3mPUEZq4sdvtbN++nfrz5z/0ul0asl8KjPhnWHK5nPj4eDIzM2lsbPzE2icfle4QmJMej4fIyEgWL1kSIq43Nl004nilZ93v95MxNvOflZXFf/7nf/Lozx/lf/7nf/jxj3+M3W7ntddeo6e757L30mazUXK45AvjH/5dG8QrzWep1WrUavWHqsgJ1VNh2F+4oZ9l+PZx+xYoKxERERd5exLJhzcrK5VKYmJimD1nDiqVCrfHTSD42eb5BKqIEKokJyWxYsUKZs6c+Zkp8WnCNSKlu6qqCp/P+6EPj0vBuRcSd/6RzuPful+JRMKkSZPweDxis/flcncX5u0ufH+r1crZs2dRKpVIJBLSxiKND5OyuJJ9ChVujUZDMBgkKioKpVKJegy9N3nyZAYGBhgwGD5wfy9dFouF8pPlyP5OxMCu6i6E2eSzZ8/i9fmYNXMmcXFxIj26ra1NRGvp9XqRdiLooOj1etGo9Pf3YzKZyMrKwmQyYbVaxblVgaxiMBjQ6/XiALowTSAg9T9ueTweBoeG8Ho8IvwyITGBkZGREB9RE8Hw8DCNjY1otVqmTJkioq0EHpwAl5DJZERFRX2ikDEQCJCdnU34mE5FS0sLCrlCpNm0trYilUnJzsr+2DGzj3oat7e3Y7fbUSqVYmgvl8uZO3cu4zLGiaNk9hE7Pd0hDeTs7Gyio6Pxer1UVlaKVJYJmRNIiE8QdVuGh4dDHDuJhOysLGQyGcdKSzl9+jTJycnExvzfmJ/H46G/v5/W1laioqKYNm0awWCQru5uYsd0Tbq6uoiLi7siLeFLvc7KykqCwSAKhUKcRe7t68Xv84u6NcL4ZFxcHOHh4TgcDmpqawn4/eI1kMlkdHR2EhUZiUqlora2FrPZzKxZs9Dr9Z8abmswGOjo6BBn+C/MHQq6JwMDA+h0OmJjY1Gr1YyOjtLf30+/IdSTmJiYEALBhmvo6Ohgz3vvUVdXx6lTp8jMzCQQCIjGcWBggO7ubrRaLVlZWX9TSkYYgx0wGETdosbGRrq7Q/o+o2NQlmHTMNH6aFHwy2azYbFaiIqMoqqqivr6eo6XlhKt14v6Sl96TRWPx8OJEyc4evQo9efPY7VaSU9L46c//SkJCQns3buX9957D6/Xi1arJTk5mU2bNpGVlcVrr73G8RPH+dEPf8T06dNxOBz8v//3/5BIJPz3f/83VqsVvV4fwmQNDLB//34qKytxuVxERUVx8OBBUlNTRQzRx11sgYZ86NAhkdwhjBV94/5vcOjgIfbu3cuSJUvo6+ujtLQUgAcffJAlS5bg9rh58cUXKS8vJy8vj8HBQc6fP8+sWbM+0U0eGBgQ9Vkef/xxysrKeOedd8S/r62tJSwsjFtuuYWbbrrpE49OGQwGXnvtNc6ePSt6hufPn2f16tUcOXKEF154gU2bNrFhwwZOnjxJbW0t5eXl2Gw2cnNz+Y//+A9qa2t58sknkclkmMxm0lJTRQr06dOn2bt3r0jx2bBhA3PnzmX37l2UlZUxOjqKXq/nxhtvpKOjg8rKSqqqqhgcHEQmk/G1r32NqKgofvWrX5Exfjz6qCi2bdvGT376U25ev/6Kiwxms5n9+/ezY8cOEbVWWFjImjVreOSRR4iPj+eXv/wl48ePp7aujp//7Gds2LCBG264gW3btnHy5Enxi7xs2TImTprIn578E3q9nqioKMrKyrBaraSkpHDPPfdQVFT0iYyi3W5n29vbKN5fLM6mOxwOfD4fUqkUl8tFcXExBw4cYGBgAIVCQVFREQsXLsTn8/G73/2O3t5ecnJycLvd3HrrrSxatIhz585RcugQNTU1PPnkkyxfvpy8vDysViuv/vVV0tLS6GgPSYnee999zB+j/lxprlwmk2G32Rg2mThfX8+WLVsYGhrikUceYfny5ZRXVPDMn/9MYWEh//qv/wrA1q1b2b59OzfeeCNNTU10dHTw1ltvAbB8+XLGjRt3VRmIV9UgClzC/v5+/vKXv5Cfn89Pf/IT2traePvtt+nv7+fMmTO8//77rF6zmpkzZmK323n++ed5+umnefTRR0Pk4O4eEcvkdrsZGRkReYSBQIDY2FikUik7du7keGkpixYtYsHChXR1dnL48GGSkpIum6gOBAIMDg6ydetWzpw5w9e//nUmTJhAU3MTTzzxBHPmhsLYAwcOkJ6ezqZNm1iyZAllZWXs2LGDrKwsDEYDra2tokEQ8FkXgiEutwefz4dtDMY5fvx4WltbiY6O5oYbbmDNmjW0trZy4sQJCgoKmDhx4mVf0+v1snvPbgYGBrj//vtJSUnh4MGDVFRUIFeEwtq+vj66u7vp7e1lx44d3HTTTcyfP5+a2loqz54lSIgj+L3vfY+YmBiMRiO//e1veeONN/jJT3/KoZISwsPD+eY3v0lrayutra0kJiZy5x13cvTIUVatWsXy5cvx+/0888wzJCYmcvfdd6NWq3nqqafYuXMnq1evpqmpiebmZvLz81m/fj05OTlX/MXw+Xzs2bOH48eP843772dcejoHDhzglVdeYf6CBSINHUIz3mlpadhsNhwOB8XFxVScrhCvV3l5OX/605944IEHUCqVHDx4kOuvv57vf//7OBwO/uu//outW7eKIIXLraqqKl568SVWrVrFTTfdhMvlYvv27fT29gLQ3d3NM888w8KFC7nzzjvx+/289tpr1NfXc++995KRkcF3v/dd0tLSOFd3jieeeIKYmBjmzJkjRicbNm5gRuEMTCZTCLQqk3PDuhtQKpUcO3aMY0ePMnuMjn0lobNUKsVgMLBlyxa0Wi0nT56kpqaGlJQUdLoQRzRKpyMYDIqfCyBKr6ejo4NAIMCyZcs4evQohYWFrFixgtTU1C90IOBzN4hKpRKr1coLL7yA3+/nhhtvYNLESUycNJGsrCyGhoZ44403mDt3LqtXrRbnGhcvXszm556ju7tbzP8JIbRcLic3N5empiYxhBV0lffv28fy5cvZsGEDOp0OjSacmJgYsrKy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
Background: #fff
Foreground: #000
PrimaryPale: #eeeeee
PrimaryLight: #eeeeee
PrimaryMid: #666666
PrimaryDark: #014
SecondaryPale: #cccccc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #666666
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #bbbbbb
Error: #f88
Background: #fff
Foreground: #000
PrimaryPale: #ddeeaa
PrimaryLight: #ddeeaa
PrimaryMid: #666633
PrimaryDark: #014
SecondaryPale: #bbdd88
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #666633
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #aacc88
Error: #f88
!usage
{{{[img[info.png]]}}}
[img[info.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/info.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/info.png
!data
data:image/png;base64,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
!usage
{{{[img[ministar.png]]}}}
[img[ministar.png]]
!notes
//none//
!type
image/png
!file
./ikoner/ministar.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADdSURBVDjLY/j//z8DJZhhmBvw41KQ07dzbk5kG/Dtgu/Jb2fsT5JkwI+bqZw/rsfYA21v+XE97f+PS5H/vx5Ra/98QN7+824ZTiIMSJr580bW/x+3iv//etD9/+fdpv/fzwX+/3LY6P/n7TIzCRtwPYYZaPvGH7dKgAb0AA1o/v/tQsh/oO0bP26TZiYqDIB+1/1+wef/z3vN/3/erPr/5aAOyHZdogMRGPIe38/7gvz+Gej3z18OG/8H2u5BvAFn7GO/Htdv/3pAQejzXjkhoO3tH7dIxY7EpEwMBgAr6O5Q8udliwAAAABJRU5ErkJggg==
!usage
{{{[img[next.png]]}}}
[img[next.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/next.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/next.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABHpJREFUWIXtln9oVWUYxz/ve85x3mTqps4UM1MLin6XLucoKhMtCcv6Q4oyIygMQjcjCcKgosj+kUQjLITlD6SFGGWsabM23HIq5q/QzZlTN5vatru7e36879sf95x5d93mnOBfe+C5z8s953m+3/N9nvO+BwZt0AZoBUW2mVFsPXe9deT1JE8ee+fGwmJ7JSAGWsMaaOItBXLlh699a8eTrY8wtW563my97dxv+Nda57oUkFIwv3Dx0AWPvTEnlnD25b/LhBtKwFMuR5uruGdqvvP6vPdvH2ZlHywotmfcMAJaBySDOEebKhk5Yrh8+4WPckYNH1tesMxa1N8aPQ5PQZFtEHT2mWmIffrWdxxoLMNTLsZoxmRPZExsEpvL1iTrmw5/Pb5BLd26FTUgAh8sXotlOUgkQggEAqIYZkph8+epH/G1i9YKgyY7azRTRj9IeU1psvrozj1JGcyv/YzW3gjYvVMz7D6xCSmsLhdCpJG5LIXWGm0M2ihaOk7TnrzAow/NHToqZ2zhz1Wb/8pfLp+s/tw93hNMrzOgjMJXHr72CLSHr118lVoHeCg8dBiV8FDCRZG63u5eoObUdiZOuM1+ac6SCcOcrNqZRfZT10TAGJ0CUx6+cvG1G4KELnwC4aGEjxY+Cpe438LFZCPnO05yrq2O3cc34Vlx8eq8d7JzRuRtm7ncWdrvFmitCLSHQCKlxBZWiq+UYf8FygR0eJdoS7aQ8NvRSqGVSXNo/ruBO/Km8/LcJbFtFSUfU3x8VuWq4JmrEvC1S8Jrw5I2juMQaIMJFEYFBMbF1XE8lcAIAIO0CWcEUj8aYwxGQ6A9PO2iTSCAKf1SIOG109RWj5BgORLLFli2QNoCaQmkBOmk3gmDwGiDjsCFASPACO4e/wR5scls2bGus7X94urKVcGKqxHoNhfSEkgrjLbACqOUAhHeaQwYHSlgAIMtYjw86Vn8uDbfl23oTHR0vlm9Wm0CTF8ERPp/Qqb2eynDp47Au1QQIQGD0eGTA8OcXKbd/Dz1J+uCipqyttZGs+DQZlVL6vBT6SQyCch0BV58YEUXUKSCkCn5hUz1u+zMl/iBi1apmmNiE7k392kq9+72Dh6prTv1R7DwTA1nw7rhJF/eHXtqgQBYu+WTHi51t+IlK7AcgQ6H79bs+5gUy2f7L6XJhtMNO49sVMvaW4in1yVj980kYABd9UUwHBgCOKGnrx3AKSy2KxBkWZZAG4u7Rj5OzB1HSekG999/Lq6p/UatA/ywZrp3OxsyCejQFRCEbCPvIthVRAiGZt3E/bmzuHS205T8tD5x7lhy6bEf1K4wP3KVtu5zCEkDvkKZtEIWgC2GMC1nIfv37wt2/f5rS+M+/crJcnUiA9xPi1d8MfVEwABeCBgBB+G9FtEgCYzyoayi3D1wZO/B+h3+oqbD/JdBNIou9Hws9+dj0r4CHGRBkX0hL3ec33T+bMmh9eq9eJyAyy2MSPu9AfelQKZFUkaz0PWqNjc3Ld+zWn1F9wGLVBu0QeuX/Q/MEx4pyYpYiQAAAABJRU5ErkJggg==
!usage
{{{[img[prev.png]]}}}
[img[prev.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/prev.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/prev.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABGdJREFUWIXtlm1o1VUcxz/nnP9/u87MihykIsO0FREUWbPdqWVWm9mDSgsCUxJNe5HY5l7GIKReqEFB0BPMN0VNyjDwRUqW6EUDiQXqFmXqfNp13j3eu3vveejF/7/bvdet9kDv9oUfvz/nz/n9vuf3dA5MYQqTxOJGVV/d4LmJ7peT8C2iO7ydC+66f6/vlU7YyIQIPN3I9Jom78Di+1a89foLb0c85U+YgDfeDVVNzE3iH1qzdNP8Rfcu85VUE3YO44xAdaP32HTv1rY3Vr+z8OHKJX5710ms05MiMOYIRBvU+lkzZ3+09cXmMuUrOrpOkjFpHCDA/H8EmpHRpLe7cs5DWzbU7Yj0ZeKc7/4dYzXOWXAOB2osnXB8txbjIhBtYgaD3v6aB+qqn4tuiFzqaSeRuop1BmsNxmmkkDS/9gnWWRwG62woBhdqYw3vtrw5NK4I1GyPzHfCHF67bOOcRZVP+B1dJ0hm+nC4nGHrDLG/vsVYjbEaHWpjs2ibzenl97w66iFHJFDT6D1e4vvfravbMWP2nfNE2+UfyZp0+NfhsCAcFoPF4KTGonEu0MPkrDM4LM6Nnp2bCEQb/C13zCzfs652+zTpQ9vlI0GuhUAIEBIQABYrDBYbkBAaJw3kpScIvwYsDkbs1wIC0Sb/q4ryyufXr2yMXOo7S2f3WQQCIQRSBloAQhCcDEvK9JPM9DKkk2iTxhqHcArpfBQlYW1YcIw4rQoIWGurhQeDmQR9Q9fRJgMEzpUQARkcg5ke+jNx+rPXydhU0AkOnAVrHVY7rHEY7fCIkNapsaVg7nlTcY6zuz7ev3Pzs0tfKlPS58y1GKUlPtIDQxot0iANUgmEFHhS4BDgHNaCMGGGAOcgm03lE1AUzYyCSdjaijm2S2/v7Uts3ffD3qRvytyjFXWk7SAD2W4yDCKURXkS5YlAfIHni3/WlEB6AqkEUoFUBa3vU1QLI41iGdtjvu6/kqn9/qd9iStXr+onF67ntrJZodHAgfIkyhcoX6J8ifRDxznnQeqC2imIeEHUR2pDCchTLbpt3hKWHLOHW28kuu5eWvVK6W/dB4mn/0TlOVlZ0QCOsAaCNATaYXVYE8YV2A7FjkYghwtHifd26FW6vm1PT1+idtVTayOdQ79yfvCXgIQX1MF7HzT/m5l8jGkUu5CdA2zvNYZOfGi2ZTd2bv5ioKVhzar6yO3l5ZzuP4RQJpfj47t1FNChZPMkk/dt8+znQlIMUyQa0Kc+1592nu7Z9OU3LQODceeqyuuZ5t8SDKYASWAISBc51XliwrUcRntNuBG+XfyMuyAVBy+nzqyIqLKyRxY8o0pUKUdjR7gYs+8XnbiYRDYkV9CGo9WACw3YPNGAd+5n3T5wieXOHv2sqztetbq2PpIXgeHwFkdwmNBNl8J/vaeGHZtwswF0MkHqYsy2li64Mb3jj/YHk0MD3sWY3Vl08nSeTO7ZVAQREvcAf/E29XL4GPHDtdx1NYUpjAV/A41jRqaMmBkaAAAAAElFTkSuQmCC
Background: #fff
Foreground: #000
PrimaryPale: #ddccff
PrimaryLight: #ddccff
PrimaryMid: #5500aa
PrimaryDark: #014
SecondaryPale: #ddbbff
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #5500aa
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #ccaaff
Error: #f88
!usage
{{{[img[youarehere.png]]}}}
[img[youarehere.png]]
!notes
//none//
!type
image/png
!file
./ChapBookClone/img/youarehere.png
!url
http://dl.dropbox.com/u/15835063/ChapBookClone/ChapBookClone/img/youarehere.png
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEsSURBVDjLY/j//z8DJZhhmBuQvdj8a+p8w//xc3U5yTIgeb7h18bNUf/DZ2j8958qz0nQgPyltv9zF5v/TV9o/Ddxrv7fmvWh/1ednvi/ZLX/f9d+8b+23YI8eA0AOvn/hnPT/q89OwWsccXpCf8n7Cn5v/B41/+MpW7/TdvZ/+o2M/LjNADoZLDmvl35/zt3ZP9v3Zb2v2Fz4v+mren/Zxxq/h+zwOa/aj3DH5wGRM/W/L/y1IT/S0/0/l94rOv/vKMdQEOy/k8/1PQ/banHf8VahlfSlQwGOA0InK74z3Oi9D/nftF/1t38/+LmW/2fdrDhf9Jit//ytQzPJSsZtEiKBe1mxq/xC53/y1czPAFqVic5GoFO/ipXzfxftJJBkeyUKFzOwDm48wIAh5XH+g7drOwAAAAASUVORK5CYII=
config.options.chkSaveBackups = true;
config.options.chkEnableAnimations = false;
config.options.chkShowRightSidebar= false;
config.options.chkSinglePageMode= true;
config.options.chkSinglePagePermalink= true;