diff --git a/uppbox/uppweb/www.cpp b/uppbox/uppweb/www.cpp index 67e8bd2fe..50fec1996 100644 --- a/uppbox/uppweb/www.cpp +++ b/uppbox/uppweb/www.cpp @@ -1,768 +1,769 @@ -#include "www.h" -#define IMAGECLASS WWW -#define IMAGEFILE -#include -#include - -#define TFILE -#include - -#define LLOG(x) // LOG(x) - -#ifdef PLATFORM_WIN32 -String rootdir = "u:\\upp.src"; -String uppbox = rootdir + "uppbox"; -String uppsrc = rootdir + "uppsrc"; -String reference = rootdir + "reference"; -String examples = rootdir + "examples"; -String targetdir = "u:\\uppwww"; -String diffdir = "u:\\wwwupp"; -String pdfdir = "u:\\pdf"; -#else -String rootdir; -String uppbox; -String uppsrc; -String reference; -String examples; -String targetdir; -String diffdir; -String pdfdir; -#endif -String bazaar; -bool ftpupload; -bool outPdf; - -String GetRcFile(const char *s) -{ - String f = GetDataFile(s); - if(FileExists(f)) - return f; - return GetHomeDirFile("upp.src/uppbox/uppweb/" + AsString(s)); -} - -bool ContainsAt(const String &source, const String &pattern, int pos) -{ - return pos >= 0 - && pos + pattern.GetLength() <= source.GetLength() - && 0 == memcmp(source.Begin() + pos, pattern.Begin(), pattern.GetLength()); -} - -bool StartsWith(const String &source, const String &pattern) -{ - return ContainsAt(source, pattern, 0); -} - -bool EndsWith(const String &source, const String &pattern) -{ - return ContainsAt(source, pattern, source.GetLength() - pattern.GetLength()); -} - -String ImgName(int q) -{ - return Sprintf("%di.png", q); -} - -typedef Image (*ImageFn)(); - -namespace Upp { -template<> -unsigned GetHashValue(const ::ImageFn& fn) { return (unsigned)(uintptr_t) fn; } -}; - -String GetImageSrc(ImageFn img) -{ - static Index il; - int q = il.Find(img); - if(il.Find(img) < 0) { - q = il.GetCount(); - il.Add(img); - PNGEncoder png; - png.SaveFile(AppendFileName(targetdir, ImgName(q)),(*img)()); - } - return ImgName(q); -} - -Htmls Wimg(ImageFn img) -{ - return HtmlImg(GetImageSrc(img)).Border(0); -} - -Htmls RoundFrame(Htmls data, String border, Color bg) -{ - return HtmlPackedTable().BgColor(bg).Width(-100) - .Attr("style", "border-style: solid; border-width: 1px; border-color: #" + border + ";") - / HtmlLine() / data; -} - -HtmlTag BoxWidth(int width) -{ - return HtmlPackedTable().Width(width) / HtmlLine(); -} - -Htmls BarSection(const char *txt) -{ - Htmls bar; - bar.Br(); - bar << HtmlPackedTable().BgColor(WhiteGray).Width(-100) / - (HtmlRow() / ( - HtmlCell().Width(10) / " " + - HtmlCell() / HtmlArial(8) / HtmlBold() / txt + - HtmlCell().Width(10) / " " - )); - return bar; -} - -Htmls BarCaption(const char *text) -{ - return HtmlLine() - .Width(-100) - .VCenter() - .Style("background-image: url('" + GetImageSrc(WWW::Caption) + "'); " - "border: 0px solid black;" - "padding-left:12px; padding-right:0px; " - "padding-top:1px; padding-bottom:1px;" - "color:#FFFFFF;") - / HtmlBold() / HtmlArial(8) / text; -} - -Htmls BarCaptionLang(const char *text) -{ - return HtmlLine() - .Width(20) - .VCenter() - .Style("background-image: url('" + GetImageSrc(WWW::News2) + "'); " - "border: 0px solid black;" - "padding-left:12px; padding-right:0px; " - "padding-top:1px; padding-bottom:1px;" - "color:#FFFFFF;") - / HtmlBold() / HtmlArial(8) / text; -} - -Htmls BarItem(Htmls content, const char *style) -{ - String bgStyle = "background-image: url('" + GetImageSrc(WWW::Button) + "'); "; - return HtmlLine().Width(-100).VCenter().Style(bgStyle + style) - / content; -} - -Htmls BarLink(const char *link, const char *text, bool nxt = true) -{ - String style = "border: 0px solid black; " - "padding-left:12px; padding-right:0px; " - "padding-top:6px; padding-bottom:6px;"; - if(nxt) - style += " border-top: 1px solid #6E89AE;"; - - return BarItem( HtmlLink(link).Class("l1") / text, style ); -} - -Htmls SearchBar(const char *domain) -{ - Htmls form = - HtmlForm("http://www.google.com/search", false, "GET") - .Style("margin:0px;padding:0px;") / - ( HtmlHidden("ie", "UTF-8") + - HtmlHidden("oe", "UTF-8") + - HtmlEdit("q", 15) + - HtmlHidden("domains", domain) + - HtmlHidden("sitesearch", domain) - ); - - Htmls content; - content << HtmlPackedTable().Width(-100) - / HtmlRow() / ( - HtmlCell() / Wimg(WWW::google) + - HtmlCell() / form - ); - - String style = "border: 0px solid black; " - "padding-left:6px; padding-right:0px; " - "padding-top:4px; padding-bottom:4px;"; - "border-top: 1px solid #6E89AE;"; - return BarItem(content, style); -} - -HtmlTag HtmlPadding(int p) -{ - return HtmlPackedTable().Width(-100) / - HtmlLine(); -} - -VectorMap escape; - -String QtfAsHtml(const char *qtf, Index& css, - const VectorMap& links, - const VectorMap& labels, - const String& outdir, const String& fn = Null) -{ - return EncodeHtml(ParseQTF(qtf), css, links, labels, outdir, fn, Zoom(8, 40), escape, 40); -} - -#define TOPICFILE -#include - -#define TOPICFILE -#include - -String GetText(const char *s) -{ - return GetTopic(s).text; -} - -VectorMap tt; - -String Www(const char *topic, int lang, String topicLocation = "topic://uppweb/www/") -{ - String strLang = ToLower(LNGAsText(lang)); - String www = GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << strLang); - if (www != "index.html") - return www; - return GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << "en-us"); -} - -String FolderLinks(String package, String group) -{ - String qtf; - FindFile ff(AppendFileName(AppendFileName(AppendFileName(uppsrc, package), group + ".tpp"), "*.tpp")); - while(ff) { - if(ff.IsFile()) { - String title; - String tl = "topic://" + package + '/' + group + '/' + GetFileTitle(ff.GetName()); - GatherTopics(tt, tl, title); - qtf << "________[^" << tl << "^ " << DeQtf(Nvl(title, tl)) << "]&"; - } - ff.Next(); - } - return qtf; -} - -void AddFiles(String& qtf, const String& dir, const char* ext, bool& b) -{ - FindFile ff(AppendFileName(dir, "*." + String(ext))); - while(ff) { - qtf << "[A4* " << DeQtf(ff.GetName()) << "]&&" - << CppAsQtf(LoadFile(AppendFileName(dir, ff.GetName()))) - << "&&&"; - ff.Next(); - b = true; - } -} - -struct Isort { - bool operator()(const String& a, const String& b) const - { - return ToUpper(a) < ToUpper(b); - } -}; - -String MakeExamples(const char *dir, const char *www, int language) -{ - String ttxt; - FindFile ff(AppendFileName(dir, "*.*")); - ttxt << "{{1:3 "; - bool next = false; - Vector ls; - while(ff) { - if(ff.IsFolder()) - ls.Add(ff.GetName()); - ff.Next(); - } - Sort(ls, Isort()); - for(int i = 0; i < ls.GetCount(); i++) { - String name = ls[i]; - String link = String().Cat() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html"; - Topic& topic = tt.Add(link); - topic.title = name; - String fn = AppendFileName( - AppendFileName( - AppendFileName(uppbox, "uppweb"), - String(www) + ".tpp" - ), - topic.title + "$" + ToLower(LNGAsText(language)) + ".tpp" - ); - String h = ReadTopic(LoadFile(fn)).text; - Package p; - p.Load(AppendFileName(AppendFileName(dir, name), name + ".upp")); - topic.text << "[R6* " << name << "]&&" << DeQtf(p.description) << "&"; - if(h.GetCount()) - topic.text << h; - topic.text << "[A2 x; - if(x.Find(folder) >= 0) - return; - x.Add(folder); - String srcdoc = FolderLinks(folder, "srcdoc"); - String src = FolderLinks(folder, "src"); - Package p; - p.Load(AppendFileName(uppsrc, AppendFileName(folder, GetFileName(folder) + ".upp"))); - if(srcdoc.GetLength() || src.GetLength()) { - qtf << "&&&[*4@b " << folder << "]&"; - if(!IsNull(p.description)) - qtf << "[2 " << p.description << "]&"; - if(srcdoc.GetCount()) { - qtf << "&[3/* Using " << folder << "]&"; - qtf << srcdoc; - } - if(src.GetCount()) { - qtf << "&[3/* " << folder << " reference]&"; - qtf << src; - } - } -} - -int CharFilterLbl(int c) -{ - return IsAlNum(c) ? c : '.'; -} - - -void QtfAsPdf(PdfDraw &pdf, const char *qtf) -{ - RichText txt = ParseQTF(qtf); - Size page = Size(3968, 6074); - UPP::Print(pdf, txt, page); -} - -VectorMap links; -VectorMap labels; -Htmls header, lastUpdate; - -Array bar; -Array languages; - -int GetLinkLanguage(const String &link) { - int pos = link.ReverseFind('$'); - if (pos < 0) - return 0; - int lang = LNGFromText(ToUpper(link.Mid(pos+1))); - for (int i = 0; i < languages.GetCount(); ++i) { - if (languages[i] == lang) - return i; - } - return 0; -} - -void ExportPage(int i) -{ - Index css; - String path = links.GetKey(i); - RLOG("Exporting " << path); - Htmls html; - String text = GetText(path); - int h; - h = ParseQTF(tt[i].text).GetHeight(1000); - - String page = QtfAsHtml(tt[i], css, links, labels, targetdir, links[i]); - Color paper = SWhite; - if(path == "topic://uppweb/www/download$en-us") - page << LoadFile(GetRcFile("adsense3.txt")); -/* if(path == "topic://uppweb/www/index$en-us") { - for(int q = 0; q < news.GetCount(); q++) { - String n = GetText("uppweb/www_news/" + news[q]); - String h = news[q]; - int i = h.Find('$'); - if(i >= 0) - h = h.Mid(0, i); - if(h.GetLength() == 8) - h = h.Mid(0, 4) + '-' + h.Mid(4, 2) + '-' + h.Mid(6, 2); - page << "
"; - page << "
  " - << h << "

"; - page << QtfAsHtml(n, css, links, targetdir, FormatIntAlpha(q) + "_n"); - page << "
"; - } - }*/ - Color bg = Color(210, 217, 210); - html << - HtmlPackedTable().Width(-100) / - HtmlLine().ColSpan(3) / header + - HtmlPackedTable().Width(-100) / ( - HtmlLine().ColSpan(3).BgColor(bg).Height(6) / "" + - HtmlRow() / ( - HtmlTCell().Center() / BoxWidth(160).Center() / ( - bar[GetLinkLanguage(path)] + - "
" + -// "

" + - LoadFile(GetRcFile("adsense2.txt")) + - "

" + - LoadFile(GetRcFile("adlinks.txt")) + - (h > 25000 ? "

" + LoadFile(GetRcFile("adsense2.txt")) - : "") + - "


" + -// LoadFile(GetRcFile("referral.txt")) + -// LoadFile(GetRcFile("referral2.txt")) + -// LoadFile(GetRcFile("donations.txt")) + -// "

" + -// amazon[i % amazon.GetCount()] + - "


" + - HtmlLink("http://sourceforge.net/projects/upp/") / - HtmlImg("http://sourceforge.net/sflogo.php?group_id=93970&type=2", - "SourceForge.net Logo").Border(0).Width(125).Height(37) + - "

" + - HtmlLink("http://www.sdjournal.org/en/") / - HtmlImg(GetImageSrc(WWW::Sdj)).Border(0) + - "

" + - (links[i] == "index.html" ? lastUpdate : Htmls()) + - HtmlImg("http://www.vol.cz/cgi-bin/wc/upp").Width(1).Height(1) - ) + - HtmlTCell().BgColor(bg) / BoxWidth(6) / "" + - HtmlTCell().Width(-100).BgColor(bg) / - RoundFrame(HtmlPadding(8) / page, "6E89AE;padding: 10px;", White) - ) - ); - - String topicTitle = tt.GetKey(i); - String pageTitle = tt[i].title; - if(IsNull(pageTitle)) - pageTitle = "Ultimate++"; - if(StartsWith(topicTitle, "examples$")) - pageTitle = "Demos / " + pageTitle; - else if(StartsWith(topicTitle, "reference$")) - pageTitle = "Examples / " + pageTitle; - - if(pageTitle != "Ultimate++") - pageTitle << " :: Ultimate++"; - - Htmls content = - "\n" + - HtmlHeader(pageTitle, AsCss(css) + - "a.l1 { text-decoration:none; font-size: 8pt; font-family: sans-serif; " - "font-weight: normal; }\n" - "a.l1:link { color:#000000; }\n" - "a.l1:visited { color:#000080; }\n" - "a.l1:hover { color:#9933CC; }\n" - "a.l1:active { color:#000000; }\n" - "a.l2 { text-decoration:none; font-size: 12pt; font-family: sans-serif; " - "font-variant: small-caps; }\n" - "a.l2:link { color:#0066FF; }\n" - "a.l2:visited { color:#FF6600; }\n" - "a.l2:hover { color:#BC0624; }\n" - "a.l2:active { color:#BC0024; }\n", - "" - "" -// "" - ) - - - .BgColor(bg) - .Alink(Red).Link(Black).Vlink(Blue) - / html; - SaveFile(AppendFileName(targetdir, links[i]), content); -} - -struct ProgramData { - String rootdir; - String targetdir; - String diffdir; - String pdfdir; - bool ftpUpload; - bool outPdf; - void Xmlize(XmlIO xml) { - xml - ("rootdir", rootdir) - ("targetdir", targetdir) - ("diffdir", diffdir) - ("pdfdir", pdfdir) - ("ftpUpload", ftpUpload) - ("outPdf", outPdf) - ; - } -}; - -GUI_APP_MAIN -{ -#ifdef PLATFORM_POSIX - StdLogSetup(LOG_COUT); - rootdir = GetHomeDirFile("upp.src"); - targetdir = GetHomeDirFile("uppwww"); - diffdir = GetHomeDirFile("wwwupp"); - pdfdir = GetHomeDirFile("pdf"); -#endif - ftpupload = true; - outPdf = true; - - ProgramData data; - - String configFile = GetHomeDirFile("uppweb.xml"); - bool cfgloaded = false; - if (FileExists(configFile)) { - if (LoadFromXMLFile(data, configFile)) { - rootdir = data.rootdir; - targetdir = data.targetdir; - diffdir = data.diffdir; - pdfdir = data.pdfdir; - ftpupload = data.ftpUpload; - outPdf = data.outPdf; - cfgloaded = true; - } - } - if (!cfgloaded) { - data.rootdir = rootdir; - data.targetdir = targetdir; - data.diffdir = diffdir; - data.pdfdir = pdfdir; - data.ftpUpload = ftpupload; - data.outPdf = outPdf; - StoreAsXMLFile(data, NULL, configFile); - } - if (!DirectoryExists(rootdir)) { - Exclamation ("Directory " + DeQtf(rootdir) + " does not exist"); - return; - } - - uppbox = AppendFileName(rootdir, "uppbox"); - uppsrc = AppendFileName(rootdir, "uppsrc"); - reference = AppendFileName(rootdir, "reference"); - examples = AppendFileName(rootdir, "examples"); - bazaar = AppendFileName(rootdir, "bazaar"); - - languages.Add(LNG_('E','N','U','S')); // en-us has to be the first one - languages.Add(LNG_('R','U','R','U')); - - RLOG("--- uppweb started at " << GetSysTime()); - - DeleteFolderDeep(targetdir); - DirectoryCreate(targetdir); - - DeleteFolderDeep(pdfdir); - DirectoryCreate(pdfdir); - - GatherRefLinks(uppsrc); - GatherRefLinks(AppendFileName(rootdir, "bazaar")); - - SaveFile(AppendFileName(targetdir, "sdj.gif"), LoadFile(GetRcFile("sdj.gif"))); - - escape.Add("PAYPAL", LoadFile(GetRcFile("donations.txt"))); - - header = HtmlPackedTable() - .Width(-100) - .BgColor(White) - .Attr("style", "border: 1px solid #6E89AE;" - "padding-left: 10px;padding-right: 0px;padding-top: 0px;padding-bottom: 0px;") - / - HtmlRow() / ( - HtmlCell() / HtmlLink("index.html") / Wimg(WWW::Logo6) + - HtmlCell().Right().Bottom() - .Style("padding-bottom: 5px; " - "background-image: url('" + GetImageSrc(WWW::HB) + "')") - / HtmlArial(14) / (LoadFile(GetRcFile("adsense.txt")) + "  "/* + "
..harnessing the real power of C++  "*/) - ); - - GatherTopics(tt, "topic://uppweb/www/index$en-us"); - - bar.SetCount(languages.GetCount()); - - int lang = GetCurrentLanguage(); - for (int i = 0; i < languages.GetCount(); ++i) { - Htmls bi, bex, bdoc, bcom, bcon, bsearch, blang; - - SetLanguage(languages[i]); - - // bi << BarLink("index.html", "Home", false); - bi << BarLink(Www("overview", languages[i]), t_("Overview"), false); - bi << BarLink(Www("examples", languages[i]), t_("Examples")); - { - int di = tt.Find("topic://uppweb/www/examples$" + ToLower(LNGAsText(languages[i]))); - tt[di].text << MakeExamples(examples, "examples", languages[i]); - tt[di].text << GetTopic("topic://uppweb/www/reference$" + ToLower(LNGAsText(languages[i]))).text; - tt[di].text << MakeExamples(reference, "reference", languages[i]); - } - - bi << BarLink(Www("ss", languages[i]), t_("Screenshots")); - bi << BarLink(Www("comparison", languages[i]), t_("Comparisons")); - bi << BarLink(Www("apps", languages[i]), t_("Applications")); - bi << BarLink(Www("download", languages[i]), t_("Download")); - - bi << BarLink(Www("documentation", languages[i]), t_("Manual")); - { - int di = tt.Find("topic://uppweb/www/documentation$" + ToLower(LNGAsText(languages[i]))); - if (di >= 0) { - String qtf; - FindFile ff(AppendFileName(uppsrc, "*.*")); - SrcDocs(qtf, "Core"); - SrcDocs(qtf, "Draw"); - SrcDocs(qtf, "CtrlCore"); - SrcDocs(qtf, "CtrlLib"); - SrcDocs(qtf, "RichText"); - SrcDocs(qtf, "RichEdit"); - while(ff) { - if(ff.IsFolder()) - SrcDocs(qtf, ff.GetName()); - ff.Next(); - } - tt[di].text << qtf; - } - } - bi << BarLink(Www("bazaar", languages[i]), t_("Bazaar")); - bi << BarLink(Www("Roadmap", languages[i]), t_("Status & Roadmap")); - bi << BarLink(Www("FAQ", languages[i]), t_("FAQ")); - bi << BarLink(Www("About", languages[i], "topic://ide/app/"), t_("Authors & License")); - - bi << BarLink("http://www.ultimatepp.org/forum", t_("Forums")); - // bcom << BarLink(Www("mailing"), "Mailing lists"); - // bi << BarLink("http://www.ultimatepp.org/wiki/index.php", "Wiki"); - bi << BarLink(Www("Funding", languages[i]), t_("Funding Ultimate++")); - // bcom << BarLink(Www("helpus"), "Getting involved"); - // bcom << BarLink("mailto: upp@ntllib.org", "Contact developers"); - - bsearch << BarCaption(t_("Search on this site")); - bsearch << SearchBar("www.ultimatepp.org"); - - //blang << BarCaptionLang(t_("Languages")); - //blang << BarLink(Www("English", languages[i]), t_("Bazaar")); - //blang << BarLink(Www("Russian", languages[i]), t_("Bazaar")); - - HtmlTag bf = HtmlPackedTable() - .Width(-100) - .BgColor(White) - .Attr("style", "border-style: solid; border-width: 1px; border-color: #6E89AE;" - "padding: 0px"); - String div = HtmlTable().Border(0).Width(-100) / HtmlLine(); - bar[i] = bf / bi + div + - // bf / bex + div + - // bf / bdoc + div + - // bf / bcom + div + - // bf / bcon + div + - bf / bsearch + div; - //bf / blang; - } - SetLanguage(lang); - - for(int i = 0; i < tt.GetCount(); i++) { - String topic = tt.GetKey(i); - links.Add(topic, topic == "topic://uppweb/www/index$en-us" ? "index.html" : - memcmp(topic, "topic://", 8) ? topic : TopicFileNameHtml(topic)); - } - - DUMPC(reflink.GetKeys()); - - for(int i = 0; i < reflink.GetCount(); i++) { - String l = reflink.GetKey(i); - String lbl = Filter(l, CharFilterLbl); - String f = links.Get(reflink[i], Null) + '#' + lbl; - links.Add(l, f); - static const char *x[] = { "::struct", "::class", "::union" }; - for(int i = 0; i < 3; i++) { - String e = x[i]; - if(EndsWith(l, e)) { - links.Add(l.Mid(0, l.GetLength() - e.GetLength()), f); - } - } - labels.Add(l, lbl); - } - - Date d = GetSysDate(); - lastUpdate = HtmlItalic() / HtmlArial(8) / HtmlFontColor(Gray()) / - (String().Cat() << "Last update " << GetSysDate()); - -// Vector amazon = Split(LoadFile(GetRcFile("amazon.txt")), '\n');//440 - - if (outPdf) { - PdfDraw pdf; - for(int i = 0; i < tt.GetCount(); i++) - QtfAsPdf(pdf, tt[i]); - SaveFile(AppendFileName(pdfdir, "Upp.pdf"), pdf.Finish()); - } - for(int i = 0; i < tt.GetCount(); i++) - ExportPage(i); - -// SaveFile(AppendFileName(targetdir, "favicon.ico"), LoadFile(AppendFileName(uppsrc, "ide/ide.ico"))); - SaveFile(AppendFileName(targetdir, "stats.html"), - HtmlImg("http://www.vol.cz/cgi-bin/wc/upp") + "
" + - HtmlLink("http://www.mygooglepagerank.com", "_blank") / - "" + - "" + - HtmlLink("http://www.mygooglepagerank.com", "_blank") / - "" + - "" - ); - BeepInformation(); - - if (!ftpupload) - return; - - RLOG("uppweb Finished, now about to upload the content"); - - Vector upload; - { - FindFile ff(AppendFileName(targetdir, "*.*")); - while(ff) { - if(ff.IsFile()) { - String s = LoadFile(AppendFileName(targetdir, ff.GetName())); - String f = AppendFileName(diffdir, ff.GetName()); - if(LoadFile(f) != s) { - upload.Add(ff.GetName()); - RLOG("upload: " << ff.GetName()); - } - } - ff.Next(); - } - } - DirectoryCreate(diffdir); - - if(upload.GetCount()) { - FtpClient ftp; - RLOG("Connecting ftp..."); - if(!ftp.Connect(getenv("UPPFTP"), getenv("UPPFTPUSR"), getenv("UPPFTPPWD"), true)) { - RLOG("Unable to connect!" + ftp.GetError()); - SetExitCode(1); - return; - } - if(!ftp.Cd("www")) { - RLOG("Unable to 'cd www'"); - SetExitCode(1); - return; - } - for(int i = 0; i < upload.GetCount(); i++) { - RLOG("Uploading " << upload[i]); - String s = LoadFile(AppendFileName(targetdir, upload[i])); - if(!ftp.Save(upload[i], s)) { - RLOG("FTP error (file upload): " + ftp.GetError()); - SetExitCode(1); - return; - } - SaveFile(AppendFileName(diffdir, upload[i]), s); - } - } - BeepInformation(); -} +#include "www.h" +#define IMAGECLASS WWW +#define IMAGEFILE +#include +#include + +#define TFILE +#include + +#define LLOG(x) // LOG(x) + +#ifdef PLATFORM_WIN32 +String rootdir = "u:\\upp.src"; +String uppbox = rootdir + "uppbox"; +String uppsrc = rootdir + "uppsrc"; +String reference = rootdir + "reference"; +String examples = rootdir + "examples"; +String targetdir = "u:\\uppwww"; +String diffdir = "u:\\wwwupp"; +String pdfdir = "u:\\pdf"; +#else +String rootdir; +String uppbox; +String uppsrc; +String reference; +String examples; +String targetdir; +String diffdir; +String pdfdir; +#endif +String bazaar; +bool ftpupload; +bool outPdf; + +String GetRcFile(const char *s) +{ + String f = GetDataFile(s); + if(FileExists(f)) + return f; + return GetHomeDirFile("upp.src/uppbox/uppweb/" + AsString(s)); +} + +bool ContainsAt(const String &source, const String &pattern, int pos) +{ + return pos >= 0 + && pos + pattern.GetLength() <= source.GetLength() + && 0 == memcmp(source.Begin() + pos, pattern.Begin(), pattern.GetLength()); +} + +bool StartsWith(const String &source, const String &pattern) +{ + return ContainsAt(source, pattern, 0); +} + +bool EndsWith(const String &source, const String &pattern) +{ + return ContainsAt(source, pattern, source.GetLength() - pattern.GetLength()); +} + +String ImgName(int q) +{ + return Sprintf("%di.png", q); +} + +typedef Image (*ImageFn)(); + +namespace Upp { +template<> +unsigned GetHashValue(const ::ImageFn& fn) { return (unsigned)(uintptr_t) fn; } +}; + +String GetImageSrc(ImageFn img) +{ + static Index il; + int q = il.Find(img); + if(il.Find(img) < 0) { + q = il.GetCount(); + il.Add(img); + PNGEncoder png; + png.SaveFile(AppendFileName(targetdir, ImgName(q)),(*img)()); + } + return ImgName(q); +} + +Htmls Wimg(ImageFn img) +{ + return HtmlImg(GetImageSrc(img)).Border(0); +} + +Htmls RoundFrame(Htmls data, String border, Color bg) +{ + return HtmlPackedTable().BgColor(bg).Width(-100) + .Attr("style", "border-style: solid; border-width: 1px; border-color: #" + border + ";") + / HtmlLine() / data; +} + +HtmlTag BoxWidth(int width) +{ + return HtmlPackedTable().Width(width) / HtmlLine(); +} + +Htmls BarSection(const char *txt) +{ + Htmls bar; + bar.Br(); + bar << HtmlPackedTable().BgColor(WhiteGray).Width(-100) / + (HtmlRow() / ( + HtmlCell().Width(10) / " " + + HtmlCell() / HtmlArial(8) / HtmlBold() / txt + + HtmlCell().Width(10) / " " + )); + return bar; +} + +Htmls BarCaption(const char *text) +{ + return HtmlLine() + .Width(-100) + .VCenter() + .Style("background-image: url('" + GetImageSrc(WWW::Caption) + "'); " + "border: 0px solid black;" + "padding-left:12px; padding-right:0px; " + "padding-top:1px; padding-bottom:1px;" + "color:#FFFFFF;") + / HtmlBold() / HtmlArial(8) / text; +} + +Htmls BarCaptionLang(const char *text) +{ + return HtmlLine() + .Width(20) + .VCenter() + .Style("background-image: url('" + GetImageSrc(WWW::News2) + "'); " + "border: 0px solid black;" + "padding-left:12px; padding-right:0px; " + "padding-top:1px; padding-bottom:1px;" + "color:#FFFFFF;") + / HtmlBold() / HtmlArial(8) / text; +} + +Htmls BarItem(Htmls content, const char *style) +{ + String bgStyle = "background-image: url('" + GetImageSrc(WWW::Button) + "'); "; + return HtmlLine().Width(-100).VCenter().Style(bgStyle + style) + / content; +} + +Htmls BarLink(const char *link, const char *text, bool nxt = true) +{ + String style = "border: 0px solid black; " + "padding-left:12px; padding-right:0px; " + "padding-top:6px; padding-bottom:6px;"; + if(nxt) + style += " border-top: 1px solid #6E89AE;"; + + return BarItem( HtmlLink(link).Class("l1") / text, style ); +} + +Htmls SearchBar(const char *domain) +{ + Htmls form = + HtmlForm("http://www.google.com/search", false, "GET") + .Style("margin:0px;padding:0px;") / + ( HtmlHidden("ie", "UTF-8") + + HtmlHidden("oe", "UTF-8") + + HtmlEdit("q", 15) + + HtmlHidden("domains", domain) + + HtmlHidden("sitesearch", domain) + ); + + Htmls content; + content << HtmlPackedTable().Width(-100) + / HtmlRow() / ( + HtmlCell() / Wimg(WWW::google) + + HtmlCell() / form + ); + + String style = "border: 0px solid black; " + "padding-left:6px; padding-right:0px; " + "padding-top:4px; padding-bottom:4px;"; + "border-top: 1px solid #6E89AE;"; + return BarItem(content, style); +} + +HtmlTag HtmlPadding(int p) +{ + return HtmlPackedTable().Width(-100) / + HtmlLine(); +} + +VectorMap escape; + +String QtfAsHtml(const char *qtf, Index& css, + const VectorMap& links, + const VectorMap& labels, + const String& outdir, const String& fn = Null) +{ + return EncodeHtml(ParseQTF(qtf), css, links, labels, outdir, fn, Zoom(8, 40), escape, 40); +} + +#define TOPICFILE +#include + +#define TOPICFILE +#include + +String GetText(const char *s) +{ + return GetTopic(s).text; +} + +VectorMap tt; + +String Www(const char *topic, int lang, String topicLocation = "topic://uppweb/www/") +{ + String strLang = ToLower(LNGAsText(lang)); + String www = GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << strLang); + if (www != "index.html") + return www; + return GatherTopics(tt, String().Cat() << topicLocation << topic << "$" << "en-us"); +} + +String FolderLinks(String package, String group) +{ + String qtf; + FindFile ff(AppendFileName(AppendFileName(AppendFileName(uppsrc, package), group + ".tpp"), "*.tpp")); + while(ff) { + if(ff.IsFile()) { + String title; + String tl = "topic://" + package + '/' + group + '/' + GetFileTitle(ff.GetName()); + GatherTopics(tt, tl, title); + qtf << "________[^" << tl << "^ " << DeQtf(Nvl(title, tl)) << "]&"; + } + ff.Next(); + } + return qtf; +} + +void AddFiles(String& qtf, const String& dir, const char* ext, bool& b) +{ + FindFile ff(AppendFileName(dir, "*." + String(ext))); + while(ff) { + qtf << "[A4* " << DeQtf(ff.GetName()) << "]&&" + << CppAsQtf(LoadFile(AppendFileName(dir, ff.GetName()))) + << "&&&"; + ff.Next(); + b = true; + } +} + +struct Isort { + bool operator()(const String& a, const String& b) const + { + return ToUpper(a) < ToUpper(b); + } +}; + +String MakeExamples(const char *dir, const char *www, int language) +{ + String ttxt; + FindFile ff(AppendFileName(dir, "*.*")); + ttxt << "{{1:3 "; + bool next = false; + Vector ls; + while(ff) { + if(ff.IsFolder()) + ls.Add(ff.GetName()); + ff.Next(); + } + Sort(ls, Isort()); + for(int i = 0; i < ls.GetCount(); i++) { + String name = ls[i]; + String link = String().Cat() << www << '$' << name << "$" << ToLower(LNGAsText(language)) << ".html"; + Topic& topic = tt.Add(link); + topic.title = name; + String fn = AppendFileName( + AppendFileName( + AppendFileName(uppbox, "uppweb"), + String(www) + ".tpp" + ), + topic.title + "$" + ToLower(LNGAsText(language)) + ".tpp" + ); + String h = ReadTopic(LoadFile(fn)).text; + Package p; + p.Load(AppendFileName(AppendFileName(dir, name), name + ".upp")); + topic.text << "[R6* " << name << "]&&" << DeQtf(p.description) << "&"; + if(h.GetCount()) + topic.text << h; + topic.text << "[A2 x; + if(x.Find(folder) >= 0) + return; + x.Add(folder); + String srcdoc = FolderLinks(folder, "srcdoc"); + String src = FolderLinks(folder, "src"); + Package p; + p.Load(AppendFileName(uppsrc, AppendFileName(folder, GetFileName(folder) + ".upp"))); + if(srcdoc.GetLength() || src.GetLength()) { + qtf << "&&&[*4@b " << folder << "]&"; + if(!IsNull(p.description)) + qtf << "[2 " << p.description << "]&"; + if(srcdoc.GetCount()) { + qtf << "&[3/* Using " << folder << "]&"; + qtf << srcdoc; + } + if(src.GetCount()) { + qtf << "&[3/* " << folder << " reference]&"; + qtf << src; + } + } +} + +int CharFilterLbl(int c) +{ + return IsAlNum(c) ? c : '.'; +} + + +void QtfAsPdf(PdfDraw &pdf, const char *qtf) +{ + RichText txt = ParseQTF(qtf); + Size page = Size(3968, 6074); + UPP::Print(pdf, txt, page); +} + +VectorMap links; +VectorMap labels; +Htmls header, lastUpdate; + +Array bar; +Array languages; + +int GetLinkLanguage(const String &link) { + int pos = link.ReverseFind('$'); + if (pos < 0) + return 0; + int lang = LNGFromText(ToUpper(link.Mid(pos+1))); + for (int i = 0; i < languages.GetCount(); ++i) { + if (languages[i] == lang) + return i; + } + return 0; +} + +void ExportPage(int i) +{ + Index css; + String path = links.GetKey(i); + RLOG("Exporting " << path); + Htmls html; + String text = GetText(path); + int h; + h = ParseQTF(tt[i].text).GetHeight(1000); + + String page = QtfAsHtml(tt[i], css, links, labels, targetdir, links[i]); + Color paper = SWhite; + if(path == "topic://uppweb/www/download$en-us") + page << LoadFile(GetRcFile("adsense3.txt")); +/* if(path == "topic://uppweb/www/index$en-us") { + for(int q = 0; q < news.GetCount(); q++) { + String n = GetText("uppweb/www_news/" + news[q]); + String h = news[q]; + int i = h.Find('$'); + if(i >= 0) + h = h.Mid(0, i); + if(h.GetLength() == 8) + h = h.Mid(0, 4) + '-' + h.Mid(4, 2) + '-' + h.Mid(6, 2); + page << "
"; + page << "

  " + << h << "

"; + page << QtfAsHtml(n, css, links, targetdir, FormatIntAlpha(q) + "_n"); + page << "
"; + } + }*/ + Color bg = Color(210, 217, 210); + html << + HtmlPackedTable().Width(-100) / + HtmlLine().ColSpan(3) / header + + HtmlPackedTable().Width(-100) / ( + HtmlLine().ColSpan(3).BgColor(bg).Height(6) / "" + + HtmlRow() / ( + HtmlTCell().Center() / BoxWidth(160).Center() / ( + bar[GetLinkLanguage(path)] + + "
" + +// "

" + + LoadFile(GetRcFile("adsense2.txt")) + + "

" + + LoadFile(GetRcFile("adlinks.txt")) + + (h > 25000 ? "

" + LoadFile(GetRcFile("adsense2.txt")) + : "") + + "


" + +// LoadFile(GetRcFile("referral.txt")) + +// LoadFile(GetRcFile("referral2.txt")) + +// LoadFile(GetRcFile("donations.txt")) + +// "

" + +// amazon[i % amazon.GetCount()] + + "


" + + HtmlLink("http://sourceforge.net/projects/upp/") / + HtmlImg("http://sourceforge.net/sflogo.php?group_id=93970&type=2", + "SourceForge.net Logo").Border(0).Width(125).Height(37) + + "

" + + HtmlLink("http://www.sdjournal.org/en/") / + HtmlImg(GetImageSrc(WWW::Sdj)).Border(0) + + "

" + + (links[i] == "index.html" ? lastUpdate : Htmls()) + + HtmlImg("http://www.vol.cz/cgi-bin/wc/upp").Width(1).Height(1) + ) + + HtmlTCell().BgColor(bg) / BoxWidth(6) / "" + + HtmlTCell().Width(-100).BgColor(bg) / + RoundFrame(HtmlPadding(8) / page, "6E89AE;padding: 10px;", White) + ) + ); + + String topicTitle = tt.GetKey(i); + String pageTitle = tt[i].title; + if(IsNull(pageTitle)) + pageTitle = "Ultimate++"; + if(StartsWith(topicTitle, "examples$")) + pageTitle = "Demos / " + pageTitle; + else if(StartsWith(topicTitle, "reference$")) + pageTitle = "Examples / " + pageTitle; + + if(pageTitle != "Ultimate++") + pageTitle << " :: Ultimate++"; + + Htmls content = + "\n" + + HtmlHeader(pageTitle, AsCss(css) + + "a.l1 { text-decoration:none; font-size: 8pt; font-family: sans-serif; " + "font-weight: normal; }\n" + "a.l1:link { color:#000000; }\n" + "a.l1:visited { color:#000080; }\n" + "a.l1:hover { color:#9933CC; }\n" + "a.l1:active { color:#000000; }\n" + "a.l2 { text-decoration:none; font-size: 12pt; font-family: sans-serif; " + "font-variant: small-caps; }\n" + "a.l2:link { color:#0066FF; }\n" + "a.l2:visited { color:#FF6600; }\n" + "a.l2:hover { color:#BC0624; }\n" + "a.l2:active { color:#BC0024; }\n", + "" + "" +// "" + ) + + + .BgColor(bg) + .Alink(Red).Link(Black).Vlink(Blue) + / html; + SaveFile(AppendFileName(targetdir, links[i]), content); +} + +struct ProgramData { + String rootdir; + String targetdir; + String diffdir; + String pdfdir; + bool ftpUpload; + bool outPdf; + void Xmlize(XmlIO xml) { + xml + ("rootdir", rootdir) + ("targetdir", targetdir) + ("diffdir", diffdir) + ("pdfdir", pdfdir) + ("ftpUpload", ftpUpload) + ("outPdf", outPdf) + ; + } +}; + +GUI_APP_MAIN +{ +#ifdef PLATFORM_POSIX + StdLogSetup(LOG_COUT); + rootdir = GetHomeDirFile("upp.src"); + targetdir = GetHomeDirFile("uppwww"); + diffdir = GetHomeDirFile("wwwupp"); + pdfdir = GetHomeDirFile("pdf"); +#endif + ftpupload = true; + outPdf = true; + + ProgramData data; + + String configFile = GetHomeDirFile("uppweb.xml"); + bool cfgloaded = false; + if (FileExists(configFile)) { + if (LoadFromXMLFile(data, configFile)) { + rootdir = data.rootdir; + targetdir = data.targetdir; + diffdir = data.diffdir; + pdfdir = data.pdfdir; + ftpupload = data.ftpUpload; + outPdf = data.outPdf; + cfgloaded = true; + } + } + if (!cfgloaded) { + data.rootdir = rootdir; + data.targetdir = targetdir; + data.diffdir = diffdir; + data.pdfdir = pdfdir; + data.ftpUpload = ftpupload; + data.outPdf = outPdf; + StoreAsXMLFile(data, NULL, configFile); + } + if (!DirectoryExists(rootdir)) { + Exclamation ("Directory " + DeQtf(rootdir) + " does not exist"); + return; + } + + uppbox = AppendFileName(rootdir, "uppbox"); + uppsrc = AppendFileName(rootdir, "uppsrc"); + reference = AppendFileName(rootdir, "reference"); + examples = AppendFileName(rootdir, "examples"); + bazaar = AppendFileName(rootdir, "bazaar"); + + languages.Add(LNG_('E','N','U','S')); // en-us has to be the first one + languages.Add(LNG_('R','U','R','U')); + + RLOG("--- uppweb started at " << GetSysTime()); + + DeleteFolderDeep(targetdir); + DirectoryCreate(targetdir); + + if (outPdf) { + DeleteFolderDeep(pdfdir); + DirectoryCreate(pdfdir); + } + GatherRefLinks(uppsrc); + GatherRefLinks(AppendFileName(rootdir, "bazaar")); + + SaveFile(AppendFileName(targetdir, "sdj.gif"), LoadFile(GetRcFile("sdj.gif"))); + + escape.Add("PAYPAL", LoadFile(GetRcFile("donations.txt"))); + + header = HtmlPackedTable() + .Width(-100) + .BgColor(White) + .Attr("style", "border: 1px solid #6E89AE;" + "padding-left: 10px;padding-right: 0px;padding-top: 0px;padding-bottom: 0px;") + / + HtmlRow() / ( + HtmlCell() / HtmlLink("index.html") / Wimg(WWW::Logo6) + + HtmlCell().Right().Bottom() + .Style("padding-bottom: 5px; " + "background-image: url('" + GetImageSrc(WWW::HB) + "')") + / HtmlArial(14) / (LoadFile(GetRcFile("adsense.txt")) + "  "/* + "
..harnessing the real power of C++  "*/) + ); + + GatherTopics(tt, "topic://uppweb/www/index$en-us"); + + bar.SetCount(languages.GetCount()); + + int lang = GetCurrentLanguage(); + for (int i = 0; i < languages.GetCount(); ++i) { + Htmls bi, bex, bdoc, bcom, bcon, bsearch, blang; + + SetLanguage(languages[i]); + + // bi << BarLink("index.html", "Home", false); + bi << BarLink(Www("overview", languages[i]), t_("Overview"), false); + bi << BarLink(Www("examples", languages[i]), t_("Examples")); + { + int di = tt.Find("topic://uppweb/www/examples$" + ToLower(LNGAsText(languages[i]))); + tt[di].text << MakeExamples(examples, "examples", languages[i]); + tt[di].text << GetTopic("topic://uppweb/www/reference$" + ToLower(LNGAsText(languages[i]))).text; + tt[di].text << MakeExamples(reference, "reference", languages[i]); + } + + bi << BarLink(Www("ss", languages[i]), t_("Screenshots")); + bi << BarLink(Www("comparison", languages[i]), t_("Comparisons")); + bi << BarLink(Www("apps", languages[i]), t_("Applications")); + bi << BarLink(Www("download", languages[i]), t_("Download")); + + bi << BarLink(Www("documentation", languages[i]), t_("Manual")); + { + int di = tt.Find("topic://uppweb/www/documentation$" + ToLower(LNGAsText(languages[i]))); + if (di >= 0) { + String qtf; + FindFile ff(AppendFileName(uppsrc, "*.*")); + SrcDocs(qtf, "Core"); + SrcDocs(qtf, "Draw"); + SrcDocs(qtf, "CtrlCore"); + SrcDocs(qtf, "CtrlLib"); + SrcDocs(qtf, "RichText"); + SrcDocs(qtf, "RichEdit"); + while(ff) { + if(ff.IsFolder()) + SrcDocs(qtf, ff.GetName()); + ff.Next(); + } + tt[di].text << qtf; + } + } + bi << BarLink(Www("bazaar", languages[i]), t_("Bazaar")); + bi << BarLink(Www("Roadmap", languages[i]), t_("Status & Roadmap")); + bi << BarLink(Www("FAQ", languages[i]), t_("FAQ")); + bi << BarLink(Www("About", languages[i], "topic://ide/app/"), t_("Authors & License")); + + bi << BarLink("http://www.ultimatepp.org/forum", t_("Forums")); + // bcom << BarLink(Www("mailing"), "Mailing lists"); + // bi << BarLink("http://www.ultimatepp.org/wiki/index.php", "Wiki"); + bi << BarLink(Www("Funding", languages[i]), t_("Funding Ultimate++")); + // bcom << BarLink(Www("helpus"), "Getting involved"); + // bcom << BarLink("mailto: upp@ntllib.org", "Contact developers"); + + bsearch << BarCaption(t_("Search on this site")); + bsearch << SearchBar("www.ultimatepp.org"); + + //blang << BarCaptionLang(t_("Languages")); + //blang << BarLink(Www("English", languages[i]), t_("Bazaar")); + //blang << BarLink(Www("Russian", languages[i]), t_("Bazaar")); + + HtmlTag bf = HtmlPackedTable() + .Width(-100) + .BgColor(White) + .Attr("style", "border-style: solid; border-width: 1px; border-color: #6E89AE;" + "padding: 0px"); + String div = HtmlTable().Border(0).Width(-100) / HtmlLine(); + bar[i] = bf / bi + div + + // bf / bex + div + + // bf / bdoc + div + + // bf / bcom + div + + // bf / bcon + div + + bf / bsearch + div; + //bf / blang; + } + SetLanguage(lang); + + for(int i = 0; i < tt.GetCount(); i++) { + String topic = tt.GetKey(i); + links.Add(topic, topic == "topic://uppweb/www/index$en-us" ? "index.html" : + memcmp(topic, "topic://", 8) ? topic : TopicFileNameHtml(topic)); + } + + DUMPC(reflink.GetKeys()); + + for(int i = 0; i < reflink.GetCount(); i++) { + String l = reflink.GetKey(i); + String lbl = Filter(l, CharFilterLbl); + String f = links.Get(reflink[i], Null) + '#' + lbl; + links.Add(l, f); + static const char *x[] = { "::struct", "::class", "::union" }; + for(int i = 0; i < 3; i++) { + String e = x[i]; + if(EndsWith(l, e)) { + links.Add(l.Mid(0, l.GetLength() - e.GetLength()), f); + } + } + labels.Add(l, lbl); + } + + Date d = GetSysDate(); + lastUpdate = HtmlItalic() / HtmlArial(8) / HtmlFontColor(Gray()) / + (String().Cat() << "Last update " << GetSysDate()); + +// Vector amazon = Split(LoadFile(GetRcFile("amazon.txt")), '\n');//440 + + if (outPdf) { + PdfDraw pdf; + for(int i = 0; i < tt.GetCount(); i++) + QtfAsPdf(pdf, tt[i]); + SaveFile(AppendFileName(pdfdir, "Upp.pdf"), pdf.Finish()); + } + for(int i = 0; i < tt.GetCount(); i++) + ExportPage(i); + +// SaveFile(AppendFileName(targetdir, "favicon.ico"), LoadFile(AppendFileName(uppsrc, "ide/ide.ico"))); + SaveFile(AppendFileName(targetdir, "stats.html"), + HtmlImg("http://www.vol.cz/cgi-bin/wc/upp") + "
" + + HtmlLink("http://www.mygooglepagerank.com", "_blank") / + "" + + "" + + HtmlLink("http://www.mygooglepagerank.com", "_blank") / + "" + + "" + ); + BeepInformation(); + + if (!ftpupload) + return; + + RLOG("uppweb Finished, now about to upload the content"); + + Vector upload; + { + FindFile ff(AppendFileName(targetdir, "*.*")); + while(ff) { + if(ff.IsFile()) { + String s = LoadFile(AppendFileName(targetdir, ff.GetName())); + String f = AppendFileName(diffdir, ff.GetName()); + if(LoadFile(f) != s) { + upload.Add(ff.GetName()); + RLOG("upload: " << ff.GetName()); + } + } + ff.Next(); + } + } + DirectoryCreate(diffdir); + + if(upload.GetCount()) { + FtpClient ftp; + RLOG("Connecting ftp..."); + if(!ftp.Connect(getenv("UPPFTP"), getenv("UPPFTPUSR"), getenv("UPPFTPPWD"), true)) { + RLOG("Unable to connect!" + ftp.GetError()); + SetExitCode(1); + return; + } + if(!ftp.Cd("www")) { + RLOG("Unable to 'cd www'"); + SetExitCode(1); + return; + } + for(int i = 0; i < upload.GetCount(); i++) { + RLOG("Uploading " << upload[i]); + String s = LoadFile(AppendFileName(targetdir, upload[i])); + if(!ftp.Save(upload[i], s)) { + RLOG("FTP error (file upload): " + ftp.GetError()); + SetExitCode(1); + return; + } + SaveFile(AppendFileName(diffdir, upload[i]), s); + } + } + BeepInformation(); +} diff --git a/uppbox/uppweb/www.tpp/Roadmap$en-us.tpp b/uppbox/uppweb/www.tpp/Roadmap$en-us.tpp index 4ad9cf9a6..a07020b54 100644 --- a/uppbox/uppweb/www.tpp/Roadmap$en-us.tpp +++ b/uppbox/uppweb/www.tpp/Roadmap$en-us.tpp @@ -24,6 +24,13 @@ topic "Changelog"; [{_}%EN-US [s0; [*R6 Roadmap]&] [s0;4 &] +[s0; [*_3 Development]&] +[s0;*_3 &] +[s0;i150;O0; [^topic`:`/`/uppweb`/www`/gsoc`$en`-us^ Google Summer +of Code Ideas]&] +[s0;i150;O0; More current topics&] +[s0;*_3 &] +[s0;*_3 &] [s0; [*_3 Current release]&] [s0; &] [s0; [*_4 2070]&] diff --git a/uppbox/uppweb/www.tpp/Roadmap$en-us.tppi b/uppbox/uppweb/www.tpp/Roadmap$en-us.tppi index feee49bcc..f5239844c 100644 --- a/uppbox/uppweb/www.tpp/Roadmap$en-us.tppi +++ b/uppbox/uppweb/www.tpp/Roadmap$en-us.tppi @@ -1,29 +1,29 @@ TITLE("Changelog") COMPRESSED -120,156,165,91,139,118,219,70,146,253,149,94,219,19,75,14,69,17,0,193,151,246,228,140,68,249,161,196,178,21,81,74,178,199,199,51,108,130,77,18,17,8,32,120,72,98,230,236,124,251,222,170,110,128,36,0,217,241,108,28,189,128,126,86,87,221,186,85,213,252,100,139,23,47,58,173,206,243,206,87,254,27,157,171,133,204,131,236,243,167,192,30,12,78,124,203,178,59,39,210,234,159,124,28,158,252,251,223,255,110,91,221,206,224,132,6,179,48,152,213,233,58,150,109,225,89,167,107,247,45,119,216,25,186,3,107,208,113,250,93,219,237,119,220,81,44,19,185,254,252,73,14,156,147,87,215,61,244,178,91,238,115,199,114,172,142,213,179,187,104,213,113,58,118,215,178,93,107,48,232,90,125,119,224,12,123,189,145,39,227,204,143,194,207,159,102,212,175,139,110,14,186,117,250,131,94,215,66,167,174,107,59,125,183,139,206,221,46,150,231,96,226,126,175,223,31,101,126,22,168,207,159,124,90,55,86,59,166,85,118,91,189,231,88,157,221,71,207,174,221,237,117,157,129,237,88, -3,219,238,13,157,238,176,139,101,91,246,200,207,20,22,57,235,218,39,18,95,212,205,197,124,93,183,107,57,144,72,183,239,58,104,214,199,207,110,103,104,217,152,116,208,113,93,204,167,30,11,49,205,32,32,18,18,245,237,97,74,187,239,82,143,65,119,96,57,253,129,221,181,123,54,22,209,233,99,163,180,2,119,52,87,169,135,190,142,109,157,100,88,214,201,248,239,238,137,133,206,253,86,255,185,221,25,118,236,94,127,136,73,177,96,236,217,25,14,45,103,128,73,187,150,219,177,156,145,23,205,177,207,153,237,118,28,158,113,128,163,232,97,100,22,139,219,179,176,104,219,25,96,202,190,229,56,248,238,118,7,253,81,170,232,48,178,40,249,252,233,213,223,15,58,237,78,219,118,221,67,234,62,68,247,129,211,117,156,110,111,216,181,58,14,166,193,24,93,146,89,175,131,227,180,92,123,48,154,201,20,115,102,120,212,215,146,181,72,155,32,123,103,224,58,152,186,135,111,56,87,108,208,129,124,236,97,119,224,56,131,206,200,11,100,154,26,33,145,128,94,209,38,45,171,101, -89,207,251,36,91,215,177,187,67,18,142,99,67,200,118,207,29,90,144,178,219,235,118,236,81,162,254,200,253,68,173,85,8,49,251,80,143,147,226,136,140,46,98,49,90,21,237,150,101,67,25,221,94,175,67,242,114,161,16,182,227,66,224,29,107,208,197,138,240,15,199,156,25,109,156,109,247,224,180,44,231,249,208,238,58,88,201,176,219,133,4,48,128,53,180,44,171,51,192,63,236,12,114,97,253,176,140,98,153,233,117,247,110,203,234,62,239,67,141,113,82,195,46,77,63,116,72,126,54,196,111,247,58,46,206,193,214,221,109,146,186,253,2,114,183,236,1,125,177,228,45,183,101,193,30,176,68,203,117,177,111,7,162,182,7,216,187,11,217,59,172,226,86,127,48,250,160,30,210,115,153,41,163,48,175,198,47,180,166,89,189,150,213,123,222,161,254,238,96,136,3,180,186,36,63,167,219,29,218,67,199,113,237,161,235,244,58,144,99,170,13,154,58,147,73,177,57,150,131,244,91,86,31,198,133,189,186,46,118,207,221,176,243,190,69,75,177,7,195,30,73,193,12,50,61,10, -252,144,214,1,205,56,209,202,240,106,252,189,101,245,105,160,1,140,102,48,232,117,156,33,132,1,25,116,92,104,58,0,97,128,131,198,57,219,48,3,66,4,239,78,46,213,244,200,88,43,47,129,52,208,117,220,1,233,45,122,98,233,88,4,198,25,118,58,61,60,25,12,96,77,163,165,140,247,20,208,238,180,236,14,180,8,248,227,194,40,49,23,212,175,51,36,44,1,50,224,4,0,69,67,87,107,224,244,40,84,105,166,230,56,124,183,195,219,182,173,150,109,65,118,208,63,215,29,116,187,61,172,23,115,247,9,154,232,8,97,192,110,223,25,93,73,216,203,191,254,249,191,127,123,253,225,232,118,34,62,165,157,19,241,137,160,236,58,146,243,53,86,244,221,103,122,214,21,250,39,222,253,211,17,227,60,73,160,180,34,81,129,34,179,49,239,182,77,186,2,86,217,169,61,23,55,43,117,113,254,218,60,247,97,236,39,31,241,226,54,85,137,240,195,76,37,11,233,41,177,136,18,241,198,15,231,66,226,235,90,197,1,61,124,144,169,72,253,101,232,47,124,79,134,89,176, -193,228,15,81,114,167,230,149,193,138,181,169,185,15,44,16,116,156,194,79,69,24,61,136,149,191,92,5,248,130,156,48,157,200,86,74,4,106,145,137,153,76,218,181,165,190,247,103,137,76,54,102,173,175,138,55,227,40,81,163,202,148,147,60,142,163,36,227,133,255,234,135,142,45,218,65,120,39,22,126,160,82,113,240,86,101,147,205,250,189,31,222,93,201,108,37,22,121,232,17,248,183,120,143,111,208,102,58,26,93,164,166,137,88,171,108,21,205,15,197,244,72,164,114,173,118,196,2,1,208,4,87,81,234,63,138,116,179,198,206,238,210,118,117,247,81,120,175,146,140,140,73,172,208,35,84,15,226,38,193,148,244,32,98,175,35,14,50,243,32,21,55,62,166,200,34,65,237,15,91,194,139,32,187,52,142,194,185,31,46,197,36,155,239,12,87,142,178,12,162,153,12,138,153,132,156,207,213,188,34,190,113,150,4,144,95,77,78,129,63,87,9,189,20,15,254,124,169,178,86,185,198,31,243,117,108,246,222,22,149,110,167,73,34,55,220,139,85,189,236,243,235,74,133,151,81, -158,170,203,232,94,137,177,12,130,25,108,175,214,253,53,20,225,141,175,130,249,94,199,215,36,87,225,21,157,42,125,110,228,140,39,44,122,124,136,78,61,79,197,153,17,225,254,110,207,19,249,80,221,42,20,93,164,74,38,222,138,15,109,237,167,41,137,116,25,108,226,21,116,194,183,6,33,180,50,205,213,33,107,54,13,187,246,255,44,5,89,168,219,190,217,93,37,234,222,199,134,11,187,75,155,12,15,224,208,253,171,134,119,154,103,81,170,178,60,102,243,72,148,23,193,192,254,132,94,104,45,158,156,255,36,250,240,163,255,31,219,248,109,29,92,199,158,48,168,72,218,2,59,222,177,151,223,46,223,79,143,174,175,198,130,252,239,92,60,168,25,192,224,222,247,84,77,181,223,203,112,153,99,140,139,112,17,241,193,204,148,10,161,178,235,56,80,153,98,64,128,157,192,230,107,234,120,38,255,148,50,169,174,236,109,20,45,3,168,181,12,211,128,104,195,72,192,13,9,232,116,138,19,174,78,254,198,88,109,218,189,213,237,138,13,61,248,176,105,236,202,167,183,48,139,194, -188,83,50,43,189,56,242,239,44,27,6,52,99,27,13,134,155,37,81,240,213,241,151,137,140,87,190,135,161,117,251,154,186,79,54,41,73,104,36,46,214,113,2,195,152,139,219,208,39,66,85,136,189,93,87,45,104,13,120,206,95,213,154,118,102,160,77,98,75,164,56,169,164,105,120,165,105,150,64,207,83,90,30,161,3,30,207,54,2,84,80,198,164,254,63,88,118,95,120,43,176,20,15,214,7,59,32,129,144,253,9,192,82,0,135,131,70,135,109,76,11,192,94,248,143,152,226,94,133,42,145,179,64,9,108,6,63,214,34,90,136,219,155,55,211,163,129,153,11,8,143,177,100,144,18,164,143,127,252,137,116,119,30,61,164,44,236,203,201,152,15,1,203,253,6,136,111,70,175,155,68,41,6,133,139,48,37,76,76,162,194,108,178,60,193,121,251,208,108,44,206,231,183,216,120,8,153,215,148,248,148,225,4,54,71,77,243,204,199,226,55,187,58,179,146,25,220,28,180,198,95,108,208,44,80,120,129,61,106,121,251,116,228,243,220,195,224,7,169,2,192,103,89,60,58,62, -126,120,120,104,131,186,248,107,160,115,28,183,163,100,121,156,38,222,244,133,217,199,244,5,57,153,137,10,110,49,221,244,133,10,167,71,121,218,94,101,235,224,176,178,184,119,74,22,248,236,69,65,190,14,181,219,132,191,133,189,1,98,37,116,58,194,68,241,211,184,78,237,129,169,36,127,128,21,206,24,107,141,18,31,22,32,141,239,89,73,184,45,33,239,99,252,255,95,135,251,103,114,237,123,43,130,235,170,232,201,32,214,57,176,116,77,86,164,22,11,18,11,22,148,198,42,192,201,138,185,207,242,195,89,18,166,64,14,45,35,91,95,209,58,152,101,207,181,65,106,167,245,49,86,225,199,5,168,68,195,24,190,150,116,36,110,167,223,79,191,47,223,243,17,212,49,105,134,51,154,11,34,222,108,153,90,98,107,73,196,196,216,110,146,224,201,220,79,193,99,54,79,18,143,114,196,2,227,129,103,113,226,223,147,195,157,100,155,64,93,202,16,112,144,24,23,8,123,98,163,128,18,173,233,5,233,72,185,6,24,198,134,212,165,196,200,53,142,85,196,249,44,240,189,138,17, -128,93,1,17,26,197,205,190,56,21,227,85,4,23,113,149,48,15,105,153,63,77,8,77,43,100,55,202,39,190,163,174,197,243,179,215,111,62,94,191,198,9,48,220,195,168,189,68,97,71,243,22,89,0,183,36,81,196,171,77,10,82,23,96,7,0,188,20,14,200,56,3,232,139,183,194,116,97,49,96,149,102,52,248,155,139,80,59,47,34,51,97,26,65,70,50,134,53,121,82,27,88,24,1,103,66,18,100,12,243,133,227,147,226,82,165,41,38,62,139,30,197,195,138,230,146,192,203,59,44,174,69,182,156,193,38,104,149,27,241,144,0,104,244,130,169,69,1,63,145,62,79,133,99,78,68,148,103,113,158,49,244,96,185,107,63,196,110,43,139,126,155,248,115,50,149,234,194,47,201,132,153,173,98,101,121,156,110,77,137,228,149,51,125,160,190,231,90,147,72,155,99,9,169,240,236,228,13,96,99,127,201,239,209,233,238,121,41,227,49,76,167,219,36,33,242,121,123,126,197,150,131,168,98,122,164,73,97,202,32,156,69,192,6,205,250,26,72,10,60,9,66,220,186,39,105, -134,218,29,239,151,40,253,136,3,47,159,190,125,116,32,44,149,221,102,30,177,212,166,183,180,147,9,14,55,19,247,48,91,68,5,218,226,38,250,96,230,42,0,167,194,49,52,117,53,236,149,249,239,165,15,50,126,41,31,27,214,212,42,157,193,46,179,110,237,117,231,200,130,224,177,176,10,109,58,16,226,15,36,47,40,53,83,109,8,122,142,95,142,51,234,163,233,111,74,156,254,1,240,210,110,215,96,32,74,179,101,162,38,63,191,31,145,16,46,140,83,185,152,107,135,171,61,57,78,128,40,84,70,80,144,234,189,195,80,214,4,131,119,80,216,233,75,127,62,125,89,221,85,177,159,75,21,230,103,50,97,50,76,112,56,201,103,244,168,197,15,198,1,204,206,60,41,73,114,90,133,253,63,130,22,125,123,253,24,143,232,39,197,49,188,206,15,209,79,106,115,192,156,59,61,20,209,26,167,64,254,60,73,51,227,87,72,193,200,160,195,185,217,2,45,87,163,37,24,169,31,122,58,41,242,101,62,82,83,34,156,35,134,66,3,194,108,66,90,77,128,104,164,148,102,196, -160,204,135,242,48,84,30,25,61,228,116,10,94,14,13,39,160,47,24,151,183,82,32,36,12,5,218,151,147,50,29,235,222,244,107,153,103,210,20,67,230,143,48,91,26,171,28,64,27,163,17,151,184,50,143,53,60,98,133,124,130,43,166,40,113,44,124,194,41,225,47,224,18,165,31,48,170,55,155,85,167,255,53,179,170,10,132,2,147,38,229,55,16,242,43,4,126,225,145,83,46,49,133,232,7,83,116,184,124,90,24,105,173,12,55,34,2,200,36,69,191,195,166,49,79,179,44,185,81,143,153,49,7,8,252,229,4,122,187,166,84,200,75,113,192,65,124,202,88,85,140,91,122,65,56,49,65,169,198,42,29,41,85,149,168,22,177,47,99,54,149,102,191,42,52,185,143,252,57,173,65,122,171,73,228,221,169,236,64,255,152,126,39,82,254,5,154,250,113,252,211,235,27,145,182,196,12,44,70,204,130,136,81,190,58,235,229,132,141,238,98,142,35,4,57,211,26,45,86,42,136,33,129,131,217,38,38,255,139,37,67,207,62,220,92,220,252,79,161,210,70,87,162,176,105,27, -236,169,224,109,151,80,54,149,0,112,51,181,126,23,101,48,19,48,57,254,107,122,132,205,129,210,69,25,108,225,176,89,5,220,254,127,134,172,35,113,202,112,189,27,119,173,233,88,9,54,41,158,28,76,143,102,64,81,21,34,78,32,250,94,141,148,84,180,46,198,32,250,58,6,163,206,53,161,131,215,166,183,42,131,254,203,96,9,170,151,173,208,214,62,215,84,235,81,172,242,32,32,4,241,242,192,48,64,198,206,199,119,120,254,49,1,109,172,138,11,64,50,50,168,194,232,50,97,179,129,161,222,144,109,180,196,143,192,7,232,167,14,199,249,125,85,33,136,69,146,42,142,64,243,76,88,77,81,136,7,221,216,231,73,192,99,201,54,12,165,134,231,110,176,158,150,136,131,28,236,10,168,189,40,36,0,56,62,101,250,121,197,86,173,101,90,13,23,17,188,0,26,192,53,88,189,215,140,76,179,188,144,236,171,234,193,90,85,219,190,148,191,19,157,128,147,89,193,167,20,81,31,17,211,69,34,193,60,114,15,65,7,39,182,22,126,232,167,43,226,8,154,175,250,5,105, -47,25,226,10,20,6,14,34,21,115,236,136,41,11,84,89,243,33,51,219,129,106,47,219,229,235,114,50,77,99,96,211,76,135,219,241,78,32,210,200,174,90,140,225,144,164,248,205,178,14,203,177,31,37,69,193,35,241,233,31,20,176,76,71,211,227,41,197,44,211,157,160,101,74,81,203,244,24,17,188,74,160,133,10,193,139,30,159,14,97,202,193,202,63,190,16,238,52,247,227,110,159,43,33,134,118,18,187,174,97,244,173,38,5,51,134,114,114,128,202,65,5,165,33,181,247,194,57,47,161,51,178,208,147,75,153,121,43,184,114,67,9,170,154,174,178,73,110,82,158,37,31,35,219,44,179,65,2,187,40,56,37,14,242,250,237,217,169,86,90,204,154,194,73,194,69,253,135,226,221,206,253,77,210,221,118,219,19,238,54,188,229,157,159,1,236,239,22,20,142,95,221,150,160,195,58,180,229,121,245,244,28,232,195,7,128,2,59,17,67,161,138,232,147,14,139,208,209,120,165,39,236,189,85,132,51,229,147,247,108,215,55,9,214,139,32,101,166,163,237,255,80,98,77,99,126, -147,236,154,6,104,150,226,46,102,107,50,139,239,74,174,33,161,107,69,233,49,245,101,102,84,75,160,242,72,5,61,225,72,138,128,27,60,43,200,41,50,148,217,170,64,2,114,86,211,239,215,148,85,37,10,164,2,74,215,32,94,34,197,12,51,14,206,154,33,204,177,26,178,142,95,166,39,133,99,108,162,19,26,64,83,74,33,96,165,128,147,99,114,58,254,159,199,147,241,197,37,167,116,0,57,230,64,57,143,90,245,89,133,180,247,6,119,245,224,63,223,188,41,196,75,240,54,61,202,54,177,18,9,122,136,104,246,59,121,27,157,69,168,186,65,19,185,53,13,169,71,211,25,233,123,117,29,1,5,198,18,199,30,208,159,77,29,202,236,156,201,18,235,242,83,186,173,81,224,212,191,237,148,49,34,217,217,220,79,152,102,110,64,124,242,4,216,146,17,115,98,235,51,26,80,133,161,93,86,80,6,161,233,61,231,86,65,221,97,140,28,32,87,37,188,67,157,119,98,146,84,128,62,1,156,86,106,45,181,183,168,185,198,64,193,149,107,47,21,83,182,53,205,74,174,191, -13,82,163,112,122,164,17,54,246,51,206,162,19,139,55,241,48,57,32,83,223,57,200,41,83,32,117,190,112,142,64,234,176,145,58,217,110,161,158,187,138,251,21,5,253,197,208,163,189,64,2,83,211,14,19,21,80,38,67,164,89,190,88,136,3,16,145,43,149,144,218,76,188,196,143,51,166,46,103,62,167,164,84,200,158,152,139,55,111,209,183,96,119,127,245,96,223,237,168,4,185,129,54,164,203,190,185,157,254,17,24,143,92,19,114,200,66,210,47,11,74,110,34,23,85,184,148,194,135,215,252,18,51,174,2,47,230,190,12,162,37,248,252,105,16,128,202,155,34,82,162,235,114,204,172,178,85,17,221,208,27,226,59,148,166,203,17,221,33,228,195,66,53,17,137,13,71,88,75,63,44,6,215,107,219,38,199,102,81,48,111,62,191,142,251,237,231,71,249,129,183,183,23,90,171,179,21,32,148,235,90,100,111,126,166,52,131,122,226,40,196,19,67,106,240,22,115,69,181,72,149,140,10,113,192,186,96,193,148,186,50,226,42,152,80,26,235,132,120,77,191,181,144,112,4,11, -157,219,73,31,72,207,21,199,22,109,72,163,37,218,254,58,224,64,137,61,34,101,240,15,138,132,84,49,255,97,117,220,143,48,93,30,56,81,186,13,13,199,217,255,80,222,251,75,10,91,155,96,120,250,253,24,44,142,210,240,196,44,54,107,156,131,248,61,95,199,156,182,160,232,125,174,136,103,242,86,171,153,138,167,195,91,210,11,42,75,55,123,12,203,174,153,228,223,142,26,232,23,30,86,87,204,46,137,45,81,113,66,6,152,66,233,198,34,247,235,5,74,134,121,76,13,10,51,157,71,94,237,12,74,8,206,76,13,136,118,215,212,80,131,123,146,135,156,187,209,249,1,178,102,184,98,28,182,255,39,29,31,249,155,95,100,144,171,130,9,234,130,95,17,242,213,66,115,29,124,142,196,152,51,162,244,39,89,201,127,223,252,176,87,83,96,199,116,83,237,188,78,126,207,166,47,83,157,50,124,143,241,117,210,89,37,75,134,70,230,89,20,147,242,171,74,95,64,239,153,132,222,226,39,184,133,228,85,48,152,164,145,206,116,232,122,174,248,200,17,191,113,254,181,34,211, -185,9,21,182,37,55,81,61,173,237,111,250,84,247,237,170,225,84,175,183,99,141,161,176,31,10,125,109,21,46,210,232,229,129,86,216,159,15,53,61,140,98,74,216,123,166,234,239,151,14,117,193,37,223,38,5,35,229,235,12,123,165,242,85,22,250,53,245,195,131,43,201,36,106,196,208,44,254,200,37,241,144,150,152,62,155,252,242,246,248,234,252,13,229,134,85,184,204,86,211,103,144,235,34,123,144,108,145,4,136,69,58,114,103,180,119,96,143,48,63,94,254,142,167,169,181,251,241,234,237,181,100,101,42,120,49,33,154,120,253,219,197,27,152,90,190,158,133,210,15,234,221,62,158,159,141,217,101,149,87,9,106,77,46,125,47,137,104,161,220,110,66,12,115,247,66,134,89,213,188,222,111,15,88,57,71,170,11,149,240,156,12,250,164,88,239,229,159,155,219,152,114,159,186,120,81,101,4,24,231,125,228,201,224,42,137,40,43,167,27,213,154,108,131,250,215,148,165,80,239,110,46,223,239,37,52,240,59,220,141,113,190,105,62,43,127,5,129,190,83,181,240,30,67,178,214, -175,65,41,16,43,215,39,188,164,226,85,8,56,205,30,180,5,235,154,196,53,122,69,235,82,95,234,26,254,37,189,49,151,67,226,249,12,128,58,203,151,75,85,100,231,247,200,33,90,26,0,213,229,54,13,41,247,132,46,236,30,56,219,61,43,169,85,181,111,113,92,133,95,53,180,161,40,205,146,247,221,89,64,243,24,15,82,59,35,173,184,107,181,158,65,117,231,32,181,128,86,174,247,148,45,182,247,89,0,10,203,233,119,92,23,165,168,88,191,111,176,29,227,249,73,129,103,138,113,71,211,136,80,174,235,170,121,181,75,20,76,23,47,10,24,38,56,253,154,178,39,212,212,225,216,207,96,138,30,147,197,167,70,50,156,136,217,9,49,221,57,229,94,65,153,21,95,42,210,128,87,215,244,201,47,31,10,109,107,241,31,43,40,5,145,108,8,150,6,172,117,160,112,133,132,199,71,71,45,90,58,106,41,30,197,36,158,90,175,45,167,110,62,22,98,52,43,5,222,146,102,216,166,174,57,209,181,13,216,43,47,101,108,50,217,80,221,39,14,150,70,168,240,129,153,124, -162,45,93,53,42,40,157,94,25,39,207,16,156,51,60,44,162,10,50,84,251,211,157,6,226,46,203,136,20,226,224,52,192,206,126,212,176,93,146,139,96,159,80,21,121,247,251,232,78,23,0,205,123,93,246,204,20,2,119,0,73,77,110,55,240,2,30,239,189,72,135,157,144,39,207,215,101,225,153,38,189,247,83,159,80,137,175,29,80,252,64,70,116,72,193,67,97,104,50,12,163,204,148,10,201,100,56,130,170,235,240,233,108,70,101,90,221,112,36,56,123,198,174,122,250,204,7,228,211,240,113,66,88,166,93,213,244,83,123,250,153,54,171,30,99,122,135,152,138,104,213,226,224,80,156,212,198,230,140,188,14,110,70,98,65,177,27,52,18,139,78,204,194,234,29,56,241,140,105,217,44,4,254,47,11,215,30,221,150,43,226,252,84,28,108,121,37,190,103,113,44,150,73,148,199,135,117,83,161,114,43,135,127,180,220,131,82,18,218,118,234,237,95,155,229,222,68,183,49,80,248,248,61,130,180,228,248,2,132,113,12,104,61,158,60,200,120,12,244,108,204,106,219,157,206,160, -109,125,107,238,192,92,213,217,136,5,60,162,73,146,28,255,106,42,127,126,113,235,166,65,96,218,132,200,109,199,58,94,163,40,93,28,172,163,20,230,127,40,168,40,128,192,147,196,190,82,50,230,128,211,211,44,228,41,246,88,137,46,154,19,194,227,232,87,202,18,114,91,143,248,121,16,1,38,201,154,2,5,6,169,117,180,193,243,209,229,29,48,153,249,46,184,54,207,176,173,24,62,209,0,206,167,215,45,93,230,129,122,228,12,122,225,6,170,57,168,159,115,196,3,28,167,55,173,106,247,166,136,212,198,69,181,53,113,144,168,40,89,74,186,68,118,72,117,201,90,206,160,188,202,71,133,190,53,83,115,83,63,49,252,179,78,245,215,8,44,32,156,247,81,116,55,253,110,65,41,169,189,120,156,129,92,188,189,249,137,205,238,23,128,148,252,182,240,122,139,29,251,136,97,18,12,180,55,162,66,203,68,102,5,189,230,16,246,129,239,25,213,4,19,196,250,219,87,251,212,204,160,255,117,51,168,229,162,175,230,11,66,21,58,81,141,58,152,139,77,0,2,243,195,252,177, -196,195,42,217,214,68,210,95,235,140,224,94,81,97,239,74,93,227,29,219,233,179,242,92,136,225,34,134,8,89,245,185,146,5,8,167,76,154,185,5,52,139,224,236,66,201,215,117,160,243,119,124,127,139,165,189,119,47,67,18,1,77,5,161,59,25,101,42,78,63,156,131,212,195,199,174,121,124,246,21,112,253,198,79,204,143,41,237,83,45,154,147,105,227,249,34,47,238,151,2,155,139,164,29,229,227,2,48,112,169,181,150,132,197,183,90,17,209,109,115,122,187,69,40,18,43,97,184,94,158,185,233,38,231,191,231,41,211,21,181,32,43,158,41,218,183,122,84,94,158,105,127,5,147,134,133,231,1,88,210,245,249,217,229,4,86,144,212,107,150,230,84,133,46,72,211,93,35,128,49,241,159,52,174,241,115,241,6,104,116,54,57,23,197,37,26,29,32,46,121,14,154,174,20,105,165,223,235,71,64,156,207,10,29,0,30,168,10,122,53,46,1,128,174,157,110,47,148,61,177,190,178,198,81,244,58,189,190,100,217,93,17,194,99,180,241,213,109,205,198,139,170,23,149,10,247, -77,138,11,74,48,124,10,155,171,221,46,169,32,185,174,85,103,184,15,32,74,223,7,252,54,203,38,125,96,119,90,178,139,131,50,75,41,131,120,37,153,238,133,74,171,195,202,240,0,86,181,88,203,5,47,50,10,241,153,250,115,165,254,176,182,132,115,159,152,245,44,231,79,244,60,97,166,123,71,88,22,250,171,80,63,203,195,44,23,109,64,242,54,63,102,174,250,206,247,167,221,34,199,211,183,130,95,57,123,0,211,43,51,104,127,29,93,126,67,140,165,201,36,69,250,32,203,250,72,14,22,140,30,45,129,233,124,188,131,188,96,118,135,251,131,124,245,116,166,207,222,109,230,137,196,225,250,193,28,48,50,61,210,238,113,122,68,101,35,126,90,247,7,139,60,225,196,196,78,242,185,30,51,127,227,225,240,149,112,115,105,148,18,108,146,239,251,97,57,120,18,210,173,84,125,39,13,17,71,110,18,158,110,231,111,123,51,213,68,109,127,179,168,73,87,117,249,170,56,251,218,21,100,182,69,35,162,45,223,208,213,143,18,240,235,183,92,191,92,26,122,58,224,176,203,41, -201,50,183,145,197,206,164,100,54,101,177,178,105,128,233,179,95,252,36,203,129,63,230,62,33,206,153,108,172,185,237,205,187,139,201,217,233,248,167,253,86,59,10,243,150,111,3,83,34,1,17,76,187,109,154,17,214,84,242,178,130,179,15,208,203,101,209,195,248,5,125,17,58,244,65,83,171,25,22,74,223,32,234,198,134,98,138,123,20,70,215,33,203,199,195,109,114,182,189,58,110,123,113,220,88,217,128,87,52,158,83,248,124,123,4,196,45,41,71,105,241,103,58,202,139,141,219,22,105,113,37,148,198,20,7,97,84,149,53,136,68,16,248,75,170,34,86,89,154,41,147,237,164,65,204,167,51,202,20,1,13,126,117,126,86,9,247,107,217,219,130,181,37,101,226,152,162,253,233,51,170,104,113,104,97,18,59,233,110,173,7,64,191,228,139,155,250,66,65,148,164,212,5,146,166,3,44,99,245,176,184,187,222,160,241,132,41,211,35,208,36,14,196,141,42,105,95,81,144,9,10,150,167,207,138,155,28,58,213,67,215,187,48,197,113,237,5,126,217,125,46,3,18,127,20,130, -201,192,155,131,109,248,20,227,155,219,185,219,59,236,219,122,123,57,250,33,39,220,171,39,76,75,54,121,76,19,28,233,207,139,113,227,150,9,180,232,204,244,157,115,115,225,5,129,162,200,215,119,197,117,239,2,39,255,185,15,26,174,213,192,254,52,83,250,122,40,244,219,78,50,140,234,238,245,50,59,131,195,241,233,229,57,98,0,63,221,191,69,88,69,125,203,50,183,239,13,180,10,96,162,169,181,242,113,240,101,18,18,64,84,48,90,125,11,89,145,2,248,33,149,150,76,1,191,184,180,175,121,132,185,237,216,176,254,59,170,87,81,165,162,184,106,72,182,18,103,138,63,27,128,95,233,26,26,95,241,154,83,48,204,18,54,45,113,230,192,23,22,180,153,172,78,229,232,222,46,209,29,125,47,131,10,97,28,205,78,143,180,53,234,43,62,152,3,60,141,124,11,239,209,112,212,185,140,179,154,209,60,205,112,190,13,124,169,20,202,81,146,73,179,21,134,87,221,129,142,189,77,60,194,31,73,162,211,227,252,38,127,0,194,124,48,166,14,71,230,218,85,148,104,19,166, -98,95,85,45,52,110,234,251,108,134,89,110,237,31,228,157,8,120,44,67,101,146,237,216,39,145,241,89,2,103,137,16,223,12,122,92,160,203,177,87,78,89,96,166,174,16,54,132,130,147,201,197,228,134,164,92,166,64,135,246,214,27,148,225,181,6,67,198,109,232,88,176,73,141,246,22,8,15,142,30,5,247,170,248,108,24,0,149,210,255,197,173,128,150,238,105,214,187,91,109,76,25,139,139,148,116,171,112,80,45,113,191,239,177,90,124,11,11,81,4,236,65,101,94,121,85,119,127,185,164,196,82,167,200,138,132,168,177,49,136,37,5,103,10,232,21,149,70,205,189,122,206,93,102,154,155,16,12,45,40,28,203,54,252,49,153,233,203,233,209,15,84,106,5,11,121,217,214,191,232,6,58,159,52,161,32,161,121,25,58,169,167,246,92,10,77,85,190,216,222,52,42,63,102,98,238,181,110,43,127,250,147,60,58,125,68,87,254,228,246,250,245,238,100,227,40,222,236,20,6,161,4,16,166,190,88,70,16,83,28,80,241,153,11,3,9,187,173,168,158,73,247,122,244,217,237, -188,57,228,235,210,219,154,99,249,57,161,3,138,71,205,93,103,174,115,210,231,73,224,79,85,49,188,193,152,195,166,5,191,141,246,70,221,91,48,69,98,244,113,137,236,129,110,85,109,27,233,147,218,105,201,137,193,162,220,180,123,175,235,203,172,179,106,251,140,47,199,160,157,166,94,234,199,102,87,147,243,247,80,22,29,126,209,212,165,205,133,244,105,21,188,125,173,175,47,21,59,165,159,212,7,230,194,87,87,138,28,105,241,89,21,241,249,255,0,63,234,46,145, +120,156,165,91,137,118,219,198,146,253,149,30,59,47,150,28,138,34,0,130,155,230,228,140,76,121,81,98,217,138,40,37,153,227,227,60,54,129,38,137,8,91,176,104,201,156,121,223,62,183,170,27,32,9,80,113,252,38,142,37,26,232,181,186,234,214,173,234,226,39,91,124,243,77,175,211,123,222,251,194,127,147,51,181,148,101,88,124,254,20,218,163,209,73,96,89,118,239,68,90,195,147,143,227,147,127,253,235,95,93,171,223,27,157,208,96,22,6,179,122,125,199,178,45,60,235,245,237,161,229,142,123,99,119,100,141,122,206,176,111,187,195,158,59,73,101,38,163,207,159,228,200,57,121,121,53,64,47,187,227,62,119,44,199,234,89,3,187,143,86,61,167,103,247,45,219,181,70,163,190,53,116,71,206,120,48,152,120,50,45,130,36,254,252,105,65,253,250,232,230,160,91,111,56,26,244,45,116,234,187,182,51,116,251,232,220,239,99,121,14,38,30,14,134,195,73,17,20,161,250,252,41,160,117,99,181,83,90,101,191,51,120,142,213,217,67,244,236,219,253,65,223,25,217,142,53, +178,237,193,216,233,143,251,88,182,101,79,130,66,97,145,139,190,125,34,241,151,186,185,152,175,239,246,45,7,18,233,15,93,7,205,134,248,221,239,141,45,27,147,142,122,174,139,249,212,67,37,166,5,4,68,66,162,190,3,76,105,15,93,234,49,234,143,44,103,56,178,251,246,192,198,34,122,67,108,148,86,224,78,124,149,123,232,235,216,214,73,129,101,157,76,255,203,61,177,208,121,216,25,62,183,123,227,158,61,24,142,49,41,22,140,61,59,227,177,229,140,48,105,223,114,123,150,51,241,18,31,251,92,216,110,207,225,25,71,56,138,1,70,102,177,184,3,11,139,182,157,17,166,28,90,142,131,159,110,127,52,156,228,138,14,163,72,178,207,159,94,254,215,65,175,219,235,218,174,123,72,221,199,232,62,114,250,142,211,31,140,251,86,207,193,52,24,163,79,50,27,244,112,156,150,107,143,38,11,153,99,206,2,143,134,90,178,22,105,19,100,239,140,92,7,83,15,240,3,231,138,13,58,144,143,61,238,143,28,103,212,155,120,161,204,115,35,36,18,208,75,218,164,101,117,44, +235,249,144,100,235,58,118,127,76,194,113,108,8,217,30,184,99,11,82,118,7,253,158,61,201,212,31,101,144,169,72,197,16,115,0,245,56,169,142,200,232,34,22,163,85,209,238,88,54,148,209,29,12,122,36,47,23,10,97,59,46,4,222,179,70,125,172,8,127,112,204,133,209,198,197,102,15,78,199,114,158,143,237,190,131,149,140,251,125,72,0,3,88,99,203,178,122,35,252,193,206,32,23,214,15,203,40,150,153,94,119,239,119,172,254,243,33,212,24,39,53,238,211,244,99,135,228,103,67,252,246,160,231,226,28,108,221,221,38,169,219,223,64,238,150,61,162,191,44,121,203,237,88,176,7,44,209,114,93,236,219,129,168,237,17,246,238,66,246,14,171,184,53,28,77,62,168,251,252,76,22,202,40,204,203,233,55,90,211,172,65,199,26,60,239,81,127,119,52,198,1,90,125,146,159,211,239,143,237,177,227,184,246,216,117,6,61,200,49,215,6,77,157,201,164,216,28,235,65,134,29,107,8,227,194,94,93,23,187,231,110,216,249,208,162,165,216,163,241,128,164,96,6,153,31,133, +65,76,235,128,102,156,104,101,120,57,253,206,178,134,52,208,8,70,51,26,13,122,206,24,194,128,12,122,46,52,29,128,48,194,65,227,156,109,152,1,33,130,119,43,87,106,126,100,172,149,151,64,26,232,58,238,136,244,22,61,177,116,44,2,227,140,123,189,1,158,140,70,176,166,201,74,166,59,10,104,247,58,118,15,90,4,252,113,97,148,152,11,234,215,27,19,150,0,25,112,2,128,162,177,171,53,112,126,20,171,188,80,62,14,223,237,241,182,109,171,99,91,144,29,244,207,117,71,253,254,0,235,197,220,67,130,38,58,66,24,176,59,116,38,151,18,246,242,63,255,252,223,127,188,254,112,116,51,19,159,242,222,137,248,68,80,118,149,72,63,194,138,190,253,76,207,250,66,255,198,187,127,58,226,76,221,169,48,73,89,113,245,115,122,170,63,5,48,225,147,143,212,242,183,34,73,3,111,62,153,31,207,143,203,52,189,87,139,249,241,253,253,253,252,120,149,39,222,252,27,21,207,143,202,252,55,241,54,73,86,161,18,179,50,138,84,38,146,165,152,194,250,197,185,175,100, +254,185,49,228,69,146,41,225,149,89,134,137,5,143,158,55,167,223,124,210,75,157,154,214,153,10,21,89,184,121,183,105,210,23,0,144,94,235,185,184,94,171,243,179,215,205,21,220,228,88,99,16,23,42,91,74,79,137,101,146,137,55,65,236,11,137,191,87,42,13,233,225,189,204,69,30,172,226,96,25,120,50,46,194,71,76,126,159,100,183,202,111,12,86,173,77,249,1,96,75,144,230,137,32,23,113,114,47,214,193,106,29,226,47,142,20,211,137,98,173,68,168,150,133,88,200,172,219,90,234,251,96,145,201,236,177,58,138,234,205,20,210,154,52,166,156,225,32,146,172,224,133,255,18,196,142,45,186,97,124,43,150,65,168,114,113,240,86,21,179,199,232,125,16,223,94,202,98,45,150,101,236,145,159,234,240,30,223,160,205,124,50,57,207,77,19,17,169,98,157,248,135,98,126,36,114,25,169,45,177,64,0,52,193,101,146,7,15,34,127,140,176,179,219,188,219,220,125,18,223,169,172,32,187,23,107,244,136,213,189,184,206,48,37,61,72,216,65,138,131,194,60,200,197,117,128, +41,138,68,80,251,195,142,240,18,200,46,79,147,216,15,226,149,152,21,254,214,112,245,40,171,48,89,200,176,154,73,72,223,87,126,67,124,211,34,11,33,191,150,156,194,192,87,25,189,20,247,129,191,82,69,167,94,227,15,101,148,154,189,119,155,58,127,154,101,242,145,123,177,85,214,125,126,89,171,248,34,41,115,117,145,220,41,49,149,97,184,0,76,180,186,191,134,34,188,9,84,232,239,116,124,77,114,21,94,213,169,209,231,90,46,120,194,170,199,135,228,212,243,84,90,24,17,238,238,246,44,147,247,205,173,66,209,69,174,100,230,173,249,208,162,32,207,73,164,171,240,49,93,67,39,2,107,20,67,43,243,82,29,178,102,211,176,81,240,103,45,200,74,221,118,17,226,50,83,119,1,54,92,217,93,190,207,240,128,99,253,191,107,120,167,101,145,228,170,40,83,54,143,76,121,9,12,236,79,232,133,214,226,217,217,143,98,8,151,255,255,177,141,95,163,240,42,245,132,1,112,210,22,216,241,150,189,252,122,241,126,126,116,117,57,21,68,21,124,1,60,3,24,220,5,158, +106,169,246,123,25,175,74,140,113,30,47,19,62,152,133,82,49,84,54,74,67,85,40,6,4,216,9,108,190,165,142,175,228,159,82,102,205,149,105,136,188,206,100,156,135,196,112,38,2,30,83,64,167,115,156,112,115,242,55,198,106,243,254,141,110,87,109,232,62,128,77,99,87,1,189,133,89,84,230,157,147,89,233,197,17,162,179,108,24,208,140,109,236,49,220,34,75,194,47,142,191,202,100,186,14,60,12,173,219,183,212,125,246,152,147,132,38,226,60,74,51,24,134,47,110,226,128,184,95,37,246,110,91,181,160,53,160,100,127,87,107,186,133,129,54,137,45,145,226,228,146,166,225,149,230,69,6,61,207,105,121,132,14,120,188,120,20,96,173,50,37,245,255,222,178,135,194,91,131,80,121,176,62,216,1,9,132,236,79,0,150,66,248,70,52,58,236,98,90,0,246,50,120,192,20,119,42,86,153,92,192,149,97,51,248,21,145,47,187,185,126,51,63,26,153,185,128,240,24,75,134,57,65,250,244,135,31,73,119,253,228,62,103,97,95,204,166,124,8,88,238,87,64,252,126,244, +186,206,148,98,80,56,143,115,194,196,44,169,204,166,40,51,156,119,0,205,198,226,2,126,139,141,199,144,121,75,137,79,25,78,96,115,212,180,44,2,44,254,113,91,103,214,178,128,155,131,214,4,203,71,52,11,21,94,96,143,90,222,1,29,185,95,122,24,252,32,87,0,248,162,72,39,199,228,254,187,96,89,65,4,116,78,211,110,146,173,142,243,12,92,192,236,99,254,13,57,153,153,10,111,48,93,197,16,186,235,34,10,15,27,139,123,167,100,133,207,94,18,150,81,172,221,38,252,45,236,13,16,43,161,211,9,38,74,159,198,117,106,15,76,37,249,3,172,112,198,88,107,146,5,176,0,105,124,207,90,194,109,9,121,151,226,255,255,56,220,61,147,171,192,91,19,92,55,69,79,6,17,149,192,210,136,172,72,45,151,36,22,44,40,79,85,136,147,21,126,192,242,195,89,18,166,64,14,29,35,219,64,209,58,56,32,240,181,65,106,167,245,49,85,241,199,37,168,196,158,49,2,45,233,68,220,204,191,155,127,87,191,231,35,104,99,210,2,103,228,11,138,17,216,50,181, +196,34,73,196,196,216,110,150,225,137,31,228,224,49,143,79,18,143,122,196,10,227,129,103,105,22,220,145,195,157,21,143,161,186,144,49,224,32,51,46,16,246,196,70,1,37,138,232,5,233,72,189,6,24,198,35,169,75,141,145,17,142,85,164,229,34,12,188,134,17,128,93,1,17,246,138,155,125,113,46,166,235,4,46,226,50,99,30,210,49,255,52,209,62,173,144,221,40,159,248,150,186,86,207,95,189,126,243,241,234,53,78,128,225,30,70,237,101,10,59,242,59,100,1,220,146,68,145,174,31,115,144,186,16,59,0,224,229,112,64,198,25,64,95,188,53,166,139,171,1,155,52,99,143,191,57,143,181,243,34,50,19,231,9,100,36,83,88,147,39,181,129,197,9,112,38,38,65,166,48,95,56,62,41,46,84,158,99,226,87,201,131,184,95,211,92,18,120,121,139,197,117,200,150,11,216,4,173,242,81,220,103,0,26,189,96,106,81,193,79,162,207,83,225,152,65,180,203,34,45,11,134,30,44,55,10,98,236,182,177,232,183,89,224,147,169,52,23,126,65,38,204,108,21,43,43, +211,124,99,74,36,175,146,233,3,245,61,211,154,68,218,156,202,128,40,59,102,39,111,0,27,251,91,126,143,78,119,199,75,25,143,97,58,221,100,25,145,207,155,179,75,182,28,4,64,243,35,77,10,115,6,225,34,1,54,104,214,183,135,164,192,147,32,26,111,123,146,253,80,187,229,253,50,165,31,113,140,24,208,143,143,14,132,165,138,155,194,35,150,186,239,45,237,100,134,195,45,196,29,204,22,81,129,182,184,153,62,24,95,133,224,84,56,134,125,93,13,123,101,254,123,17,128,140,95,200,135,61,107,234,212,206,96,155,89,119,118,186,115,100,65,240,88,89,133,54,29,8,241,123,146,23,148,154,169,54,4,237,227,195,113,65,125,52,253,205,137,211,223,3,94,186,221,22,12,36,121,177,202,212,236,167,247,19,18,194,185,113,42,231,190,118,184,218,147,227,4,136,66,21,4,5,185,222,59,12,37,34,24,188,133,194,206,95,4,254,252,69,115,87,213,126,46,84,92,190,146,25,147,97,130,195,89,185,160,71,29,126,48,13,97,118,230,73,77,146,243,38,236,255,17,118, +232,199,235,135,116,66,191,41,142,225,117,126,72,126,84,143,7,204,185,243,67,145,68,56,5,242,231,89,94,24,191,66,10,70,6,29,251,102,11,180,92,141,150,96,164,65,236,233,252,205,95,243,145,150,18,225,28,49,20,26,16,102,19,210,106,2,68,35,229,52,35,6,101,62,84,198,177,242,200,232,33,167,83,240,114,104,56,1,125,197,184,188,181,2,33,97,40,208,190,156,148,233,88,247,166,143,117,74,76,83,12,89,62,192,108,105,172,122,0,109,140,70,92,226,210,60,214,240,136,21,242,9,174,153,162,164,169,8,8,167,68,176,132,75,148,65,200,168,190,223,172,122,195,47,153,85,83,32,20,152,236,83,126,3,33,191,64,224,231,30,57,229,26,83,136,126,48,69,135,203,167,133,145,214,202,248,81,36,0,153,172,234,119,184,111,204,211,162,200,174,213,67,97,204,1,2,127,49,131,222,70,148,181,121,33,14,56,136,207,25,171,170,113,107,47,8,39,38,40,43,218,164,35,181,170,18,213,34,246,101,204,166,209,236,23,133,38,119,73,224,211,26,164,183,158,37, +222,173,42,14,244,175,249,183,34,231,15,208,212,143,211,31,95,95,139,188,35,22,96,49,98,17,38,140,242,205,89,47,102,108,116,231,62,142,16,228,76,107,180,88,171,48,133,4,14,22,143,41,249,95,44,25,122,246,225,250,252,250,191,43,149,54,186,146,196,251,182,193,158,10,222,118,5,101,83,25,0,183,80,209,187,164,128,153,128,201,241,191,230,71,216,28,40,93,82,192,22,14,247,171,128,59,252,247,144,117,34,78,25,174,183,227,174,136,142,149,96,147,226,201,209,252,104,1,20,85,49,226,4,162,239,205,72,73,37,81,53,6,209,215,41,24,117,169,9,29,188,54,189,85,5,244,95,134,43,80,189,98,141,182,246,153,166,90,15,98,93,134,33,33,136,87,134,134,1,50,118,62,188,195,243,143,25,104,99,83,92,0,146,137,65,21,70,151,25,155,13,12,245,154,108,163,35,126,0,62,64,63,117,56,206,239,155,10,65,44,146,84,113,2,154,103,194,106,138,66,60,232,198,46,79,2,30,75,182,97,40,53,60,247,30,235,233,136,52,44,193,174,128,218,203,74, +2,128,227,83,166,159,151,108,213,90,166,205,112,17,193,11,160,1,92,131,213,59,98,100,90,148,149,100,95,54,15,214,106,218,246,133,252,157,232,4,156,204,26,62,165,138,250,136,152,46,51,9,230,81,122,8,58,56,177,181,12,226,32,95,19,71,208,124,53,168,72,123,205,16,215,160,48,112,16,185,240,177,35,166,44,80,101,205,135,204,108,7,170,187,234,214,175,235,201,52,141,129,77,51,29,238,166,91,129,200,94,118,213,97,12,135,36,197,175,150,117,88,143,253,32,41,10,158,136,79,191,81,192,162,83,151,148,178,220,10,90,230,20,181,204,143,17,193,171,12,90,168,16,188,232,241,233,16,230,28,172,252,246,23,225,206,254,126,220,237,115,35,196,208,78,98,219,53,76,190,214,164,96,198,80,78,14,80,57,168,160,52,164,246,94,56,231,21,116,70,86,122,114,33,11,111,13,87,110,40,65,83,211,85,49,43,77,202,179,230,99,100,155,117,54,72,96,23,21,167,196,65,94,189,125,117,170,149,22,179,230,112,146,112,81,255,166,120,55,115,127,149,116,55,221,118, +132,187,9,111,121,231,175,0,246,183,75,10,199,47,111,106,208,97,29,218,240,188,118,122,14,244,225,3,64,129,157,136,161,80,85,244,73,135,69,232,104,188,210,19,246,222,169,194,153,250,201,123,182,235,235,12,235,69,144,178,208,209,246,191,41,177,125,99,126,149,236,246,13,176,95,138,219,152,173,201,44,126,42,25,65,66,87,138,210,99,234,175,153,81,43,129,202,35,85,244,132,35,41,2,110,240,172,176,164,200,80,22,235,10,9,200,89,205,191,139,40,171,74,20,72,133,148,174,65,188,68,138,25,23,28,156,237,135,48,199,218,147,117,252,107,122,82,57,198,125,116,66,3,104,78,41,4,172,20,112,114,76,78,39,248,243,120,54,61,191,224,148,14,32,199,28,40,231,81,155,62,171,146,246,206,224,174,30,252,167,235,55,149,120,9,222,230,71,197,99,170,68,134,30,34,89,252,78,222,70,103,17,154,110,208,68,110,251,134,212,163,233,140,244,157,186,74,128,2,83,137,99,15,233,159,251,58,212,217,57,147,37,214,55,101,249,230,142,2,167,254,117,167,140,17,201, +206,252,32,99,154,249,8,226,83,102,192,150,130,152,19,91,159,209,128,38,12,109,179,130,58,8,205,239,56,183,10,234,14,99,228,0,185,41,225,45,234,188,21,147,228,2,244,9,224,180,86,145,212,222,162,229,26,67,5,87,174,189,84,74,217,214,188,168,185,254,38,72,77,226,249,145,70,216,52,40,56,139,78,44,222,196,195,228,128,204,253,206,65,73,153,2,169,243,133,62,2,169,195,189,212,201,118,43,245,220,86,220,47,40,232,207,134,30,237,4,18,152,154,118,152,169,144,50,25,34,47,202,229,82,28,128,136,92,170,140,212,102,230,101,65,90,48,117,121,21,112,74,74,197,236,137,249,242,230,45,250,86,236,238,239,30,236,187,45,149,32,55,208,133,116,217,55,119,243,63,66,227,145,91,66,142,89,72,250,101,69,201,77,228,162,42,151,82,249,240,150,95,98,198,85,225,133,31,200,48,89,129,207,159,134,33,168,188,185,68,202,244,189,28,51,171,98,93,69,55,244,134,248,14,165,233,74,68,119,8,249,176,80,77,68,82,195,17,34,25,196,213,224,122,109,155, +228,216,34,9,253,253,231,215,115,191,254,252,40,63,240,246,230,92,107,117,177,6,132,242,189,22,217,91,80,40,205,160,158,56,10,241,196,144,26,188,133,175,232,46,82,101,147,74,28,176,46,88,48,165,174,140,184,42,38,148,167,58,33,222,210,111,45,36,28,193,82,231,118,242,123,210,115,197,177,69,23,210,232,136,110,16,133,28,40,177,71,164,12,254,65,149,144,170,230,63,108,142,251,17,166,203,3,103,74,183,161,225,56,251,31,203,187,96,69,97,235,62,24,158,127,55,5,139,163,52,60,49,139,199,8,231,32,126,47,163,148,211,22,20,189,251,138,120,38,111,181,153,169,120,58,188,37,189,160,27,244,253,30,195,178,91,38,249,143,163,61,244,11,15,155,43,102,151,196,150,168,56,33,3,76,161,116,99,149,251,245,66,37,227,50,165,6,149,153,250,137,215,58,131,26,130,11,115,7,68,187,219,215,80,131,123,86,198,156,187,209,249,1,178,102,184,98,28,118,240,39,29,31,249,155,159,101,88,170,138,9,234,11,191,42,228,107,133,230,58,248,156,136,41,103,68, +233,159,100,37,255,121,253,253,206,157,2,59,166,235,102,231,40,251,189,152,191,200,117,202,240,61,198,215,73,103,149,173,24,26,153,103,81,76,202,175,26,125,1,189,175,36,244,22,191,193,45,36,175,130,193,36,79,116,166,67,223,231,138,143,28,241,27,231,223,186,100,58,51,161,194,230,202,77,52,79,107,243,73,159,234,174,93,237,57,213,171,205,88,84,172,240,161,210,215,78,229,34,141,94,30,104,133,253,233,80,211,195,36,165,132,125,85,191,16,212,14,117,201,87,190,251,20,140,148,175,55,30,212,202,215,88,232,151,212,15,15,46,37,147,168,9,67,179,248,163,148,196,67,58,98,254,108,246,243,219,227,203,179,55,148,27,86,241,170,88,207,159,65,174,203,226,94,178,69,18,32,86,233,200,173,209,222,129,61,194,252,120,249,91,158,166,213,238,135,203,183,87,146,149,169,226,197,132,104,226,245,175,231,111,96,106,101,180,136,101,16,182,187,125,60,123,53,101,151,85,151,18,180,154,92,4,94,150,208,66,185,221,140,24,230,118,65,134,89,149,223,238,183,3,172,156, +35,213,23,149,240,156,12,250,164,88,239,229,159,143,55,41,229,62,245,229,69,147,17,96,156,247,137,39,195,203,44,161,172,156,110,212,106,178,9,234,95,83,150,66,189,187,190,120,191,147,208,192,103,184,27,227,124,243,114,81,127,4,129,190,85,173,240,30,67,178,214,71,160,20,136,149,219,19,94,208,229,85,12,56,45,238,181,5,235,59,137,43,244,74,162,90,95,218,26,254,87,122,99,138,67,82,127,1,64,93,148,171,149,170,178,243,59,228,16,45,13,128,234,235,54,13,41,119,132,46,236,30,56,219,189,168,169,85,179,111,117,92,149,95,53,180,161,186,154,37,239,187,181,128,253,99,220,75,237,140,180,226,70,42,90,64,117,125,144,90,64,43,223,247,212,45,54,245,44,0,133,213,252,91,190,23,165,168,88,191,223,99,59,198,243,147,2,47,20,227,142,166,17,177,140,218,170,121,185,77,20,76,23,47,9,25,38,56,253,154,179,39,212,212,225,56,40,96,138,30,147,197,167,70,50,156,136,217,9,49,93,159,114,175,160,204,138,139,138,52,224,181,53,125,246,243, +135,74,219,58,252,143,53,148,130,72,54,4,75,3,182,58,80,184,66,194,227,163,163,22,29,29,181,84,143,82,18,79,171,215,134,83,239,63,22,98,52,107,5,222,146,23,216,166,190,115,162,178,13,216,43,47,101,106,50,217,80,221,39,14,150,70,104,240,129,133,124,162,45,149,26,85,148,78,175,140,147,103,8,206,25,30,150,73,3,25,154,253,169,166,129,184,203,42,33,133,56,56,13,177,179,31,52,108,215,228,34,220,37,84,85,222,253,46,185,213,23,128,230,189,190,246,44,20,2,119,0,73,75,110,215,92,20,71,123,175,210,97,39,228,201,203,168,190,120,166,73,239,130,60,32,84,226,178,3,138,31,200,136,14,41,120,168,12,77,198,113,82,152,171,66,50,25,142,160,218,58,124,186,88,208,53,173,110,56,17,156,61,99,87,61,127,22,0,242,105,248,52,35,44,211,174,106,254,169,59,255,76,155,85,15,41,189,11,10,166,85,203,131,67,113,210,26,155,51,242,58,184,153,136,37,197,110,208,72,44,58,51,11,107,119,224,196,51,166,101,179,16,248,191,190,184, +246,168,90,174,138,243,115,113,176,225,149,248,89,164,169,88,101,73,153,30,182,77,133,174,91,57,252,163,229,30,212,146,208,182,211,110,255,218,44,247,58,185,73,129,194,199,239,17,164,101,199,231,32,140,83,64,235,241,236,94,166,83,160,231,222,172,182,221,235,141,186,214,215,230,14,76,169,206,163,88,194,35,154,36,201,241,47,230,230,47,168,170,110,246,8,76,155,16,185,237,84,199,107,20,165,139,131,40,201,97,254,135,130,46,5,16,120,146,216,215,74,166,28,112,122,154,133,60,197,30,27,209,197,254,132,240,52,249,133,178,132,220,214,35,126,30,38,128,73,178,166,80,129,65,106,29,221,227,249,168,120,7,76,198,223,6,215,253,51,108,110,12,159,104,0,231,51,232,215,46,243,64,61,112,6,189,114,3,205,28,212,79,37,226,1,142,211,247,173,106,187,82,68,106,227,162,187,53,113,144,169,36,91,73,42,34,59,164,123,201,86,206,160,46,229,163,139,190,136,169,185,185,63,49,252,179,77,245,35,4,22,16,206,251,36,185,157,127,187,164,148,212,78,60,206,64, +46,222,94,255,200,102,247,51,64,74,126,93,120,189,193,142,93,196,48,9,6,218,27,81,161,85,38,139,138,94,115,8,123,207,117,70,45,193,132,169,254,241,197,62,45,51,24,126,217,12,90,185,232,75,127,73,168,66,39,170,81,7,115,177,9,64,96,65,92,62,212,120,216,36,219,154,72,6,145,206,8,238,92,42,236,148,212,237,173,177,157,63,171,207,133,24,46,98,136,152,85,159,111,178,0,225,148,73,51,85,64,139,4,206,46,150,92,174,3,157,191,229,250,45,150,246,78,93,134,36,2,154,11,66,119,50,202,92,156,126,56,3,169,135,143,141,120,124,246,21,112,253,198,79,248,199,148,246,105,94,154,147,105,227,249,178,172,234,75,129,205,85,210,142,242,113,33,24,184,212,90,75,194,226,170,86,68,116,155,156,222,246,37,20,137,149,48,92,47,207,84,186,73,255,247,50,103,186,162,150,100,197,11,69,251,86,15,202,43,11,237,175,96,210,176,240,50,4,75,186,58,123,117,49,131,21,100,237,59,75,115,170,66,95,72,83,173,17,192,152,248,79,158,182,248,185, +120,3,52,122,53,59,19,85,17,141,14,16,87,60,7,77,87,139,180,209,239,245,3,32,46,96,133,14,1,15,116,11,122,57,173,1,128,202,78,55,5,101,79,172,175,190,227,168,122,157,94,93,176,236,46,9,225,49,218,244,242,166,101,227,213,173,23,93,21,238,154,20,95,40,193,240,41,108,110,118,187,160,11,201,168,117,59,195,125,0,81,186,30,240,235,44,155,244,129,221,105,205,46,14,234,44,165,12,211,181,100,186,23,43,173,14,107,195,3,88,213,82,45,23,188,40,40,196,103,234,207,55,245,135,173,37,156,5,196,172,23,37,127,249,232,9,51,221,57,194,250,162,191,9,245,139,50,46,74,209,5,36,111,242,99,166,212,215,223,157,118,131,28,79,87,5,191,116,118,0,102,80,103,208,254,62,186,252,138,24,75,147,73,138,244,65,150,245,145,28,44,25,61,58,2,211,5,120,7,121,193,236,14,119,7,249,226,233,204,159,189,123,244,51,137,195,13,66,31,48,50,63,210,238,113,126,68,215,70,252,180,237,15,150,101,198,137,137,173,228,115,59,102,254,202,195, +225,146,112,83,52,74,9,54,201,245,126,88,14,158,196,84,149,170,107,210,16,113,148,38,225,233,246,254,177,51,83,75,212,246,87,139,154,116,85,95,95,85,103,223,42,65,102,91,52,34,218,240,13,125,251,81,3,126,187,202,245,175,175,134,158,14,56,236,122,74,178,204,77,100,177,53,41,153,77,125,89,185,111,128,249,179,159,131,172,40,129,63,166,158,16,231,76,54,182,191,237,245,187,243,217,171,211,233,143,187,173,182,20,230,45,87,3,83,34,1,17,76,183,107,154,17,214,52,242,178,130,179,15,208,203,85,213,195,248,5,93,8,29,7,160,169,205,12,11,165,111,16,117,99,67,41,197,61,10,163,235,144,229,227,225,38,57,219,93,31,119,189,52,221,123,179,1,175,104,60,167,8,184,122,4,196,45,171,71,233,240,119,58,234,194,198,77,139,188,42,9,165,49,197,65,156,52,101,13,34,17,134,193,138,110,17,155,44,205,92,147,109,165,65,204,183,51,234,20,1,13,126,121,246,170,17,238,183,178,183,21,107,203,234,196,49,69,251,243,103,116,163,197,161,133,73, +236,228,219,119,61,0,250,21,23,110,234,130,130,36,203,169,11,36,77,7,88,199,234,113,85,187,190,71,227,9,83,230,71,160,73,28,136,27,85,210,190,162,34,19,20,44,207,159,85,149,28,58,213,67,229,93,152,226,184,245,2,31,182,159,203,144,196,159,196,96,50,240,230,96,27,1,197,248,166,58,119,83,195,190,185,111,175,71,63,228,132,123,243,132,105,201,38,143,105,130,35,253,213,54,110,220,49,129,22,157,153,174,57,55,5,47,8,20,69,25,221,86,229,222,21,78,254,115,23,52,92,107,15,251,211,76,233,203,161,208,175,91,201,48,186,119,111,95,179,51,56,28,159,94,156,33,6,8,242,221,42,194,38,234,91,150,169,190,55,208,42,128,137,230,174,149,143,131,139,73,72,0,73,197,104,117,21,178,34,5,8,98,186,90,50,23,248,85,209,190,230,17,166,218,113,207,250,111,233,190,138,110,42,170,82,67,178,149,180,80,252,221,0,124,164,50,52,46,241,242,41,24,102,9,155,150,56,115,224,11,11,218,76,214,166,114,84,183,75,116,71,215,101,208,69,24, +71,179,243,35,109,141,186,196,7,115,128,167,145,111,225,61,26,142,234,203,180,104,25,205,211,12,231,235,192,151,174,66,57,74,50,105,182,202,240,154,59,208,177,183,137,71,248,43,73,116,122,156,223,228,47,64,152,47,198,180,225,200,148,93,37,153,54,97,186,236,107,170,133,198,77,93,207,102,152,229,198,254,65,222,137,128,167,50,86,38,217,142,125,18,25,95,100,112,150,8,241,205,160,199,21,186,28,123,245,148,21,102,234,27,194,61,161,224,108,118,62,187,38,41,215,41,208,177,189,241,6,117,120,173,193,144,113,27,58,22,62,230,70,123,43,132,7,71,79,194,59,85,125,55,12,128,74,233,255,170,42,160,163,123,154,245,110,223,54,230,140,197,85,74,186,83,57,168,142,184,219,245,88,29,174,194,66,20,1,123,80,133,87,151,234,238,46,151,148,88,234,20,89,149,16,53,54,6,177,228,224,76,33,189,162,171,81,83,87,207,185,203,66,115,19,130,161,37,133,99,197,35,127,77,102,254,98,126,244,61,93,181,130,133,188,232,234,15,186,129,206,39,205,40,72,216, +191,12,157,212,83,59,46,133,166,170,95,108,42,141,234,175,153,152,186,214,205,205,159,254,38,143,78,31,81,201,159,220,148,95,111,79,54,77,210,199,173,139,65,40,1,132,169,11,203,8,98,170,3,170,190,115,97,32,97,187,21,221,103,82,93,143,62,187,173,55,135,92,46,189,185,115,172,191,39,116,64,241,168,169,117,230,123,78,250,62,9,252,169,170,134,55,24,115,184,111,193,111,147,157,81,119,22,76,145,24,125,93,162,184,167,170,170,77,35,125,82,91,45,57,49,88,93,55,109,215,117,253,53,235,108,218,62,227,203,49,104,167,185,47,13,82,179,171,217,217,123,40,139,14,191,104,234,218,230,98,250,182,10,222,190,214,229,75,213,78,233,55,245,129,185,112,233,74,149,35,173,190,171,34,62,255,31,229,209,101,217, diff --git a/uppbox/uppweb/www.tpp/all.i b/uppbox/uppweb/www.tpp/all.i index 8d1c7362a..d48531397 100644 --- a/uppbox/uppweb/www.tpp/all.i +++ b/uppbox/uppweb/www.tpp/all.i @@ -70,6 +70,10 @@ TOPIC("Funding$ru-ru") #include "Funding$ru-ru.tppi" END_TOPIC +TOPIC("gsoc$en-us") +#include "gsoc$en-us.tppi" +END_TOPIC + TOPIC("helpus$en-us") #include "helpus$en-us.tppi" END_TOPIC diff --git a/uppbox/uppweb/www.tpp/gsoc$en-us.tpp b/uppbox/uppweb/www.tpp/gsoc$en-us.tpp new file mode 100644 index 000000000..3dc59bd31 --- /dev/null +++ b/uppbox/uppweb/www.tpp/gsoc$en-us.tpp @@ -0,0 +1,129 @@ +topic "Google Summer of Code"; +[ $$0,0#00000000000000000000000000000000:Default] +[b117;*+117 $$1,2#27457433418004101424360058862402:Caption] +[b50;2 $$2,2#03324558446220344731010354752573:Par] +[{_}%EN-US +[s1;#b0; [R6 Google Summer of Code Ideas]&] +[s1;#b0; &] +[s1;#b0; Introduction &] +[s0;2 &] +[s0; [2 Google Summer of Code 2010 have been announced and this year +Ultimate`+`+ project really wants to participate as a mentoring +organization. ]&] +[s0;2 &] +[s0; [2 If you like C`+`+ and you want to use a radical focus to more +effective programming we would be happy if you come with us.]&] +[s0;2 &] +[s0; [2 Here we will describe you our proposals. We hope you will like +them !. However you can ask for additional information and we +would like to hear also your ideas.]&] +[s0;2 &] +[s0; [2 You can introduce yourself in our ][^http`:`/`/www`.ultimatepp`.org`/forum`/^2 Fo +rum][2 , discuss with the community these ideas and your proposals +adding your personal touches.]&] +[s0;2 &] +[s1; Project Ideas&] +[s0;# &] +[s0;# [* U`+`+ port to KDE]&] +[s0;# &] +[s0;# [*2 Difficulty]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;# [*2 Experience required]&] +[s0;# [2 U`+`+, Qt.]&] +[s0;#2 &] +[s0;# [*2 Description]&] +[s0;# [2 The goal is to provide a library which wraps Qt theming API +and draw U`+`+ widgets using it.]&] +[s0;# [2 Right now U`+`+ is using gtk`+ theming API which make applications +look ugly under KDE and gtk`+ libs have to be available in order +for application to run.]&] +[s0;# [2 This library will make U`+`+ non`-dependent on a theming API +but rather selecting proper theming engine at runtime so application +look will be changed based on running context `- KDE(Qt based) +or Gnome(gtk`+ based). If Qt or gtk`+ do not exist and user have +only X11 server U`+`+ will use its own theming API for drawing +widgets.]&] +[s0;#2 &] +[s0;# [*2 We suggest you this roadmap]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;#2 &] +[s0;# [* SVG parser]&] +[s0;# &] +[s0;# [*2 Difficulty]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;# [*2 Experience required]&] +[s0;# [2 U`+`+, SVG.]&] +[s0;#2 &] +[s0;# [*2 Description]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;# [*2 We propose you this roadmap]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;#2 &] +[s0;# [* Video Player Control]&] +[s0;# &] +[s0;# [*2 Difficulty]&] +[s0;# [2 Medium.]&] +[s0;#2 &] +[s0;# [*2 Skills]&] +[s0;# [2 U`+`+, ffmpeg, sdl, gcc/mingw compiling infrastructure.]&] +[s0;#2 &] +[s0;# [*2 Description]&] +[s0;# [2 This control would integrate ffmpeg video decoding and sdl +to visualize .avi, .mpg, ... video files.]&] +[s0;#2 &] +[s0;# [*2 We propose you this roadmap]&] +[s0; [2 TBD]&] +[s0;# &] +[s0;# &] +[s0;# [* Web Browser Control]&] +[s0;# &] +[s0;# [*2 Difficulty]&] +[s0;# [2 Medium.]&] +[s0;#2 &] +[s0;# [*2 Experience required]&] +[s0;# [2 U`+`+, webkit, gcc/mingw compiling infrastructure.]&] +[s0;#2 &] +[s0;# [*2 Description]&] +[s0;# [2 This control would integrate a web browser into a control. +Possibly the best option would be to use webkit.]&] +[s0;#2 &] +[s0;# [*2 We propose you this roadmap]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;#2 &] +[s0;# [* U`+`+ as a library]&] +[s0;# &] +[s0;# [*2 Difficulty]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s0;# [*2 Experience required]&] +[s0;# [2 U`+`+, MSC, gcc/mingw compiling infrastructure.]&] +[s0;#2 &] +[s0;# [*2 Description]&] +[s0;# [2 U`+`+ as library (with possible separation or mode of TheIDE +as resource editor only).]&] +[s0;# [2 Create tools and processes that can be integrated with infrastructure +server so that U`+`+ can be provided as pure library (or set +of libraries).]&] +[s0;# [2 Create a special mode of TheIDE so that it can be used as +resource editor only.]&] +[s0;#2 &] +[s0;# [*2 We propose you this roadmap]&] +[s0;# [2 TBD]&] +[s0;#2 &] +[s1; Some requirements&] +[s0;# &] +[s0;# [2 As the main U`+`+ platforms are Windows and GNU/Linux it would +be important that all projects would support both operating systems +and leaving open the possibility to, in a future, be implemented +in OSX.]&] +[s0;#2 &] +[s0;# [2 Ultimate`+`+ project is proud of its BSD license so we really +prefer that all external libraries to be linked with U`+`+ code +would be BSD or similar.]&] +[s0; ] \ No newline at end of file diff --git a/uppbox/uppweb/www.tpp/gsoc$en-us.tppi b/uppbox/uppweb/www.tpp/gsoc$en-us.tppi new file mode 100644 index 000000000..66351088c --- /dev/null +++ b/uppbox/uppweb/www.tpp/gsoc$en-us.tppi @@ -0,0 +1,9 @@ +TITLE("Google Summer of Code") +COMPRESSED +120,156,189,87,239,83,219,70,16,253,87,182,67,218,201,15,199,216,178,13,12,124,74,32,37,76,155,148,198,37,73,199,227,212,103,233,100,95,144,116,234,221,9,225,116,250,191,247,237,157,100,32,152,38,105,51,225,131,177,79,119,187,111,119,223,238,61,77,232,222,189,94,167,183,213,251,196,223,254,145,76,69,149,185,233,100,222,239,239,30,60,124,132,79,28,237,119,162,173,104,119,56,218,29,14,6,195,254,94,175,55,236,247,250,195,104,56,216,233,245,70,123,123,59,209,176,23,237,31,138,210,41,93,224,232,168,119,16,225,84,132,83,189,193,32,26,142,70,123,195,225,78,20,245,6,195,225,238,0,71,123,131,209,112,119,20,141,118,7,251,167,194,76,39,127,253,241,247,247,207,94,62,62,27,211,196,246,15,182,230,189,3,154,188,218,161,99,173,23,153,164,113,149,231,210,144,78,233,80,39,146,78,18,41,236,244,135,233,122,235,181,175,39,133,51,58,169,98,6,226,215,25,73,248,79,147,232,14,131,17,0,209,82,92,72,154,75,89,144,40,10,93,21,177,76,240, +45,33,183,84,150,86,82,24,58,203,156,202,133,147,179,71,179,71,84,26,253,94,198,142,140,20,89,182,162,90,20,206,146,211,84,10,227,84,172,74,236,35,97,73,80,46,11,167,141,42,22,164,205,66,20,234,131,96,108,93,154,222,70,119,146,210,74,87,148,169,115,73,135,222,11,3,224,37,54,207,214,43,11,171,100,68,162,98,145,81,170,227,202,59,205,181,145,36,211,20,128,20,162,0,182,133,17,121,206,78,107,73,181,174,178,4,161,33,196,178,92,145,10,94,98,157,227,145,114,75,24,237,110,0,243,92,194,38,159,86,89,70,137,180,177,81,48,193,39,117,101,216,69,169,173,200,108,151,222,192,176,46,195,35,191,217,227,119,75,153,211,119,93,122,174,107,121,129,92,123,151,2,201,181,231,192,109,72,36,137,226,68,32,12,85,96,33,247,105,241,1,175,33,7,67,154,150,156,125,248,210,108,197,144,226,250,111,130,252,123,227,67,53,36,240,152,140,149,89,138,37,15,123,58,121,183,116,174,156,237,207,182,103,219,117,93,207,186,85,83,212,178,156,117,81,160, +217,54,176,84,249,108,251,93,68,63,242,183,41,236,118,40,81,22,169,182,33,95,8,141,179,151,87,133,114,43,254,133,162,120,76,109,185,174,165,199,199,137,50,132,85,105,172,143,216,233,42,198,177,155,49,244,15,232,180,33,149,103,120,120,182,69,237,255,201,67,58,11,212,211,198,147,225,167,163,103,211,219,155,34,58,82,105,170,98,4,182,90,63,70,16,191,61,61,106,127,70,55,182,63,187,4,46,37,65,120,144,249,207,74,25,153,92,63,231,125,118,232,87,215,221,124,252,200,83,35,116,254,117,119,72,210,66,115,117,67,91,24,125,129,28,129,188,153,154,27,97,208,49,75,21,47,169,54,162,180,48,238,249,194,137,122,114,122,226,211,152,24,81,55,241,214,42,89,72,116,87,101,121,131,186,2,194,126,94,169,197,210,81,161,219,205,170,221,183,112,231,248,121,221,108,240,152,11,144,10,141,144,161,133,24,180,165,76,235,115,170,22,232,226,170,72,64,85,228,213,67,8,22,128,215,134,225,128,48,208,1,226,66,168,76,204,49,69,152,83,134,15,120,62,95,89, +228,141,166,42,186,55,211,1,96,235,208,185,75,60,142,128,185,208,197,236,113,34,75,9,247,232,115,110,131,27,192,231,21,230,140,192,138,33,144,153,155,28,15,152,98,88,104,247,201,98,161,10,160,115,236,26,148,150,132,118,185,14,202,71,233,61,35,136,120,41,138,5,6,220,92,88,124,226,41,14,21,108,38,214,133,147,151,142,102,143,57,13,247,81,24,191,229,1,34,165,227,2,35,227,126,200,74,88,237,242,200,194,30,60,12,203,137,70,48,142,228,165,178,206,231,16,3,203,132,236,233,2,9,126,219,239,35,4,195,3,161,173,45,0,241,84,83,40,176,174,139,27,113,115,94,153,7,126,142,5,18,220,65,66,204,32,91,45,22,18,94,121,208,248,153,109,180,72,114,81,126,170,7,174,27,162,241,235,99,158,224,128,248,237,58,11,62,191,176,181,238,242,247,70,54,131,71,254,191,44,188,70,167,106,58,205,196,10,117,58,212,60,77,179,47,200,199,11,153,168,42,191,35,166,241,57,42,110,55,164,33,77,243,82,46,58,100,147,172,67,139,56,222,102,26,212, +60,104,75,149,249,198,47,82,35,172,51,184,220,43,35,191,116,26,33,21,113,136,164,185,92,112,73,72,220,146,184,166,131,103,186,240,81,39,50,214,126,98,51,123,129,133,155,249,66,217,74,100,234,131,164,174,184,80,29,234,230,37,128,118,187,221,230,76,170,50,249,47,204,252,68,77,62,42,9,221,78,52,140,204,233,169,209,181,253,250,245,248,60,142,214,114,126,174,220,55,174,139,96,183,52,111,226,198,58,6,90,187,185,75,167,218,90,53,207,252,5,140,145,134,206,215,222,252,149,220,105,244,82,192,254,159,203,243,121,45,19,166,153,23,124,205,148,255,118,3,228,197,248,240,235,87,102,29,80,123,105,221,247,218,167,12,89,199,184,149,152,147,225,102,193,148,206,89,70,67,78,227,214,63,225,219,19,73,148,22,146,7,192,65,62,232,95,63,254,31,220,184,18,15,33,157,29,87,73,103,65,57,161,16,177,180,86,66,48,44,113,143,177,146,155,203,43,62,36,65,125,221,12,170,189,77,112,217,249,67,1,118,115,180,17,29,9,227,41,121,243,58,22,205,55,169, +99,196,97,73,73,187,17,156,32,91,202,88,65,198,124,20,97,235,79,173,113,86,54,56,218,20,248,87,38,31,148,226,152,213,123,195,9,126,195,184,173,22,35,122,98,125,111,228,2,66,165,81,142,153,112,172,181,145,111,100,227,141,42,18,244,150,207,253,241,203,179,237,159,85,81,93,114,68,235,14,82,57,107,77,255,238,193,193,226,77,167,125,239,177,205,38,91,149,94,142,206,53,74,195,130,68,120,113,98,87,214,201,60,152,206,36,134,38,191,254,64,223,120,64,129,67,160,40,171,103,221,97,29,37,40,173,184,156,157,198,107,230,131,146,60,13,232,151,241,219,77,249,139,54,191,143,33,133,248,90,37,92,43,214,20,79,199,71,168,113,44,11,235,21,81,45,219,55,182,210,200,212,235,167,38,48,168,30,105,88,156,175,25,209,8,62,180,210,121,75,190,134,94,204,133,117,146,216,3,243,73,229,208,133,166,133,74,211,127,0,213,255,8,133, +