Showing preview only (847K chars total). Download the full file or copy to clipboard to get everything.
Repository: fuxiaohei/GoBlog
Branch: master
Commit: e7a14822cddb
Files: 124
Total size: 802.6 KB
Directory structure:
gitextract_0hi50ltt/
├── LICENSE
├── README.md
├── app/
│ ├── admin.go
│ ├── app.go
│ ├── cmd/
│ │ ├── backup.go
│ │ ├── init.go
│ │ ├── install.go
│ │ ├── log.go
│ │ ├── monitor.go
│ │ ├── reboot.go
│ │ ├── theme.go
│ │ ├── upgrade.go
│ │ └── zip.go
│ ├── cmd.go
│ ├── handler/
│ │ ├── admin.go
│ │ ├── cmd.go
│ │ ├── func.go
│ │ ├── home.go
│ │ ├── rss.go
│ │ └── upload.go
│ ├── log.go
│ ├── model/
│ │ ├── article.go
│ │ ├── comment.go
│ │ ├── content.go
│ │ ├── file.go
│ │ ├── locker.go
│ │ ├── message.go
│ │ ├── page.go
│ │ ├── setting.go
│ │ ├── statis.go
│ │ ├── storage.go
│ │ ├── timer.go
│ │ ├── token.go
│ │ ├── user.go
│ │ └── version.go
│ ├── plugin/
│ │ ├── email.go
│ │ ├── hello.go
│ │ └── plugin.go
│ ├── upgrade/
│ │ ├── v20140130.go
│ │ ├── v20140131.go
│ │ ├── v20140209.go
│ │ └── v20140228.go
│ └── utils/
│ ├── avatar.go
│ ├── crypto.go
│ ├── date.go
│ ├── file.go
│ ├── html.go
│ ├── pager.go
│ ├── sorter.go
│ └── validator.go
├── main.go
├── static/
│ ├── css/
│ │ ├── admin.css
│ │ ├── cmd.css
│ │ ├── codemirror.css
│ │ ├── common.css
│ │ ├── highlight.css
│ │ ├── ling.css
│ │ ├── saber.css
│ │ ├── sitemap.xsl
│ │ └── style.css
│ ├── js/
│ │ ├── home.js
│ │ └── upload.js
│ ├── koala-config.json
│ └── less/
│ ├── admin.less
│ ├── cmd.less
│ ├── common/
│ │ ├── base.less
│ │ ├── form.less
│ │ ├── grid.less
│ │ ├── label.less
│ │ ├── markdown.less
│ │ ├── pager.less
│ │ ├── reset.less
│ │ └── var.less
│ ├── common.less
│ ├── ling.less
│ ├── saber.less
│ └── style.less
└── view/
├── admin/
│ ├── admin.layout
│ ├── articles.html
│ ├── cmd/
│ │ ├── backup.html
│ │ ├── log.html
│ │ ├── message.html
│ │ ├── monitor.html
│ │ ├── reader.html
│ │ └── theme.html
│ ├── cmd.layout
│ ├── comments.html
│ ├── edit_article.html
│ ├── edit_page.html
│ ├── files.html
│ ├── home.html
│ ├── login.html
│ ├── pages.html
│ ├── password.html
│ ├── plugin.html
│ ├── plugin_setting.html
│ ├── profile.html
│ ├── setting.html
│ ├── write_article.html
│ └── write_page.html
├── default/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ └── page.html
├── ling/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ └── page.html
├── rss.xml
├── saber/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ ├── page.html
│ └── sidebar.html
└── sitemap.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014 傅小黑
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
### Notice: this project is deprecated. Please try my new blog engine [pugo](https://github.com/go-xiaohei/pugo).
#Fxh.Go
A fast and simple blog engine with [GoInk](https://github.com/fuxiaohei/GoInk) framework in Golang.
[](https://drone.io/github.com/fuxiaohei/GoBlog/latest)
[](http://gowalker.org/github.com/fuxiaohei/GoBlog)
Current version is **0.2.5** on 2014.02.28
Development board is in [Trello](https://trello.com/b/7AHrcQL8/fxh-go-with-goink).
### Overview
`Fxh.Go` is a dynamic blog engine written in Golang. It's fast and very simple configs. Fxh.Go persists data into pieces of json files and support compress them as backup zip for next upgrade or installation.
`Fxh.Go` supports markdown contents as articles or pages, ajax comments and dynamic administration.
`Fxh.Go` contains two kinds of content as article and page. They can be customized as you want.
### Installation
`Fxh.Go` requires **Go 1.2** or above.
##### Gobuild.io
[Gobuild.io](http://gobuild.io/) can build cross-platform executable file for pure go projects. You can download `Fxh.Go` binary from Gobuild.io.
[](http://gobuild.io/github.com/fuxiaohei/GoBlog)
##### Manual
Use go get command:
go get github.com/fuxiaohei/GoBlog
Then you can find binary file `GoBlog(.exe)` in `$GOPATH/bin`.
### Run
Make a new dir to run `Fxh.Go`:
cd new_dir
Goblog
Then it will unzip static files in `new_dir` , initialize raw data and start server at `localhost:9001`.
##### Admin
Visit `localhost:9001/login/` to enter administrator with username `admin` and password `admin`. You'd better change them after installed successfully.
##### Deployment
I prefer to use nginx as proxy. The server section in `nginx.conf`:
server {
listen 80;
server_name your_domain;
charset utf-8;
access_log /var/log/nginx/your_domain.access.log;
location / {
proxy_pass http://127.0.0.1:9001;
}
location /static {
root /var/www/your_domain; # binary file is in this directory
expires 1d;
add_header Cache-Control public;
access_log off;
}
}
### Questions
Create issues or pull requests here.
### Products
* [抛弃世俗之浮躁,留我钻研之刻苦](http://wuwen.org)
* [FuXiaoHei.Me](http://fuxiaohei.me)
### Thanks
* [@Unknwon](https://github.com/Unknwon) on testing and [zip library](https://github.com/Unknwon/cae) support.
### License
The MIT License
================================================
FILE: app/admin.go
================================================
package app
import "github.com/fuxiaohei/GoBlog/app/handler"
func registerAdminHandler() {
// add admin handlers
App.Get("/admin/", handler.Auth, handler.Admin)
App.Route("GET,POST", "/admin/profile/", handler.Auth, handler.AdminProfile)
App.Route("GET,POST", "/admin/password/", handler.Auth, handler.AdminPassword)
App.Route("GET,POST", "/admin/article/write/", handler.Auth, handler.ArticleWrite)
App.Get("/admin/articles/", handler.Auth, handler.AdminArticle)
App.Route("GET,POST,DELETE", "/admin/article/:id/", handler.Auth, handler.ArticleEdit)
App.Route("GET,POST", "/admin/page/write/", handler.Auth, handler.PageWrite)
App.Get("/admin/pages/", handler.Auth, handler.AdminPage)
App.Route("GET,POST,DELETE", "/admin/page/:id/", handler.Auth, handler.PageEdit)
App.Route("GET,POST,PUT,DELETE", "/admin/comments/", handler.Auth, handler.AdminComments)
App.Route("GET,POST", "/admin/setting/", handler.Auth, handler.AdminSetting)
App.Post("/admin/setting/custom/", handler.Auth, handler.CustomSetting)
App.Post("/admin/setting/nav/", handler.Auth, handler.NavigatorSetting)
App.Route("GET,DELETE", "/admin/files/", handler.Auth, handler.AdminFiles)
App.Post("/admin/files/upload/", handler.Auth, handler.FileUpload)
App.Route("GET,POST", "/admin/plugins/", handler.Auth, handler.AdminPlugin)
App.Route("GET,POST", "/admin/plugins/:plugin_key/", handler.Auth, handler.PluginSetting)
App.Post("/admin/message/read/", handler.Auth, handler.AdminMessageRead)
}
================================================
FILE: app/app.go
================================================
package app
import (
"fmt"
"github.com/fuxiaohei/GoBlog/app/handler"
"github.com/fuxiaohei/GoBlog/app/model"
"github.com/fuxiaohei/GoBlog/app/plugin"
"github.com/fuxiaohei/GoBlog/app/utils"
"github.com/fuxiaohei/GoInk"
"net/http"
"os"
"os/signal"
"path"
"runtime/debug"
"strconv"
"strings"
"syscall"
)
var (
// APP VERSION, as date version
VERSION = 20140228
// Global GoInk application
App *GoInk.App
staticFileSuffix = ".css,.js,.jpg,.jpeg,.png,.gif,.ico,.xml,.zip,.txt,.html,.otf,.svg,.eot,.woff,.ttf,.doc,.ppt,.xls,.docx,.pptx,.xlsx,.xsl"
uploadFileSuffix = ".jpg,.png,.gif,.zip,.txt,.doc,.docx,.xls,.xlsx,.ppt,.pptx"
)
func init() {
// init application
App = GoInk.New()
// init some settings
App.Config().StringOr("app.static_dir", "static")
App.Config().StringOr("app.log_dir", "tmp/log")
os.MkdirAll(App.Get("log_dir"), os.ModePerm)
os.MkdirAll("tmp/data", os.ModePerm)
App.Config().IntOr("app.upload_size", 1024*1024*10)
App.Config().StringOr("app.upload_files", uploadFileSuffix)
App.Config().StringOr("app.upload_dir", path.Join(App.Get("static_dir"), "upload"))
os.MkdirAll(App.Get("upload_dir"), os.ModePerm)
if App.Get("static_files") != "" {
staticFileSuffix = App.Get("static_files")
}
App.Static(func(context *GoInk.Context) {
static := App.Config().String("app.static_dir")
url := strings.TrimPrefix(context.Url, "/")
if url == "favicon.ico" {
url = path.Join(static, url)
}
if !strings.HasPrefix(url, static) {
return
}
if !strings.Contains(staticFileSuffix, context.Ext) {
context.Status = 403
context.End()
return
}
f, e := os.Stat(url)
if e == nil {
if f.IsDir() {
context.Status = 403
context.End()
return
}
}
/*_, e := os.Stat(url)
if e != nil {
context.Throw(404)
return
}*/
http.ServeFile(context.Response, context.Request, url)
context.IsEnd = true
})
// set recover handler
App.Recover(func(context *GoInk.Context) {
go LogError(append(append(context.Body, []byte("\n")...), debug.Stack()...))
theme := handler.Theme(context)
if theme.Has("error/error.html") {
theme.Layout("").Render("error/error", map[string]interface{}{
"error": string(context.Body),
"stack": string(debug.Stack()),
"context": context,
})
} else {
context.Body = append([]byte("<pre>"), context.Body...)
context.Body = append(context.Body, []byte("\n")...)
context.Body = append(context.Body, debug.Stack()...)
context.Body = append(context.Body, []byte("</pre>")...)
}
context.End()
})
// set not found handler
App.NotFound(func(context *GoInk.Context) {
theme := handler.Theme(context)
if theme.Has("error/notfound.html") {
theme.Layout("").Render("error/notfound", map[string]interface{}{
"context": context,
})
}
context.End()
})
// add recover defer
defer func() {
e := recover()
if e != nil {
bytes := append([]byte(fmt.Sprint(e)+"\n"), debug.Stack()...)
LogError(bytes)
println("panic error, crash down")
os.Exit(1)
}
}()
// catch exit command
go catchExit()
}
// code from https://github.com/Unknwon/gowalker/blob/master/gowalker.go
func catchExit() {
sigTerm := syscall.Signal(15)
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt, sigTerm)
for {
switch <-sig {
case os.Interrupt, sigTerm:
println("before exit, saving data")
model.SyncAll()
println("ready to exit")
os.Exit(0)
}
}
}
// Init starts Fxh.Go application preparation.
// Load models and plugins, update views.
func Init() {
// init storage
model.Init(VERSION)
// load all data
model.All()
// init plugin
plugin.Init()
// update plugin handlers
plugin.Update(App)
App.View().FuncMap["DateInt64"] = utils.DateInt64
App.View().FuncMap["DateString"] = utils.DateString
App.View().FuncMap["DateTime"] = utils.DateTime
App.View().FuncMap["Now"] = utils.Now
App.View().FuncMap["Html2str"] = utils.Html2str
App.View().FuncMap["FileSize"] = utils.FileSize
App.View().FuncMap["Setting"] = model.GetSetting
App.View().FuncMap["Navigator"] = model.GetNavigators
App.View().FuncMap["Md2html"] = utils.Markdown2HtmlTemplate
App.View().IsCache = (model.GetSetting("theme_cache") == "true")
println("app version @ " + strconv.Itoa(model.GetVersion().Version))
}
func registerHomeHandler() {
App.Route("GET,POST", "/login/", handler.Login)
App.Get("/logout/", handler.Logout)
App.Get("/article/:id/:slug", handler.Article)
App.Get("/page/:id/:slug", handler.Page)
App.Get("/p/:page/", handler.Home)
App.Post("/comment/:id/", handler.Comment)
App.Get("/tag/:tag/", handler.TagArticles)
App.Get("/tag/:tag/p/:page/", handler.TagArticles)
App.Get("/feed/", handler.Rss)
App.Get("/sitemap", handler.SiteMap)
App.Get("/:slug", handler.TopPage)
App.Get("/", handler.Home)
}
// Run begins Fxh.Go http server.
func Run() {
registerAdminHandler()
registerCmdHandler()
registerHomeHandler()
App.Run()
}
================================================
FILE: app/cmd/backup.go
================================================
package cmd
import (
"github.com/Unknwon/cae/zip"
"github.com/fuxiaohei/GoBlog/app/model"
"github.com/fuxiaohei/GoBlog/app/utils"
"github.com/fuxiaohei/GoInk"
"os"
"path"
"path/filepath"
"time"
)
var backupDir = "backup"
func init() {
// close zip terminal output
zip.Verbose = false
}
// DoBackup backups whole files to zip archive.
// If withData is false, it compresses static files to zip archive without data files, config files and install lock file.
func DoBackup(app *GoInk.App, withData bool) (string, error) {
os.Mkdir(backupDir, os.ModePerm)
// create zip file name from time unix
filename := path.Join(backupDir, utils.DateTime(time.Now(), "YYYYMMDDHHmmss"))
if withData {
filename += ".zip"
} else {
filename += "_static.zip"
}
z, e := zip.Create(filename)
if e != nil {
return "", e
}
root, _ := os.Getwd()
if withData {
// if with data, add install lock file and config file
lockFile := path.Join(root, "install.lock")
if utils.IsFile(lockFile) {
z.AddFile("install.lock", lockFile)
}
configFile := path.Join(root, "config.json")
if utils.IsFile(configFile) {
z.AddFile("config.json", configFile)
}
}
z.AddDir("static/css", path.Join(root, "static", "css"))
z.AddDir("static/img", path.Join(root, "static", "img"))
z.AddDir("static/js", path.Join(root, "static", "js"))
z.AddDir("static/lib", path.Join(root, "static", "lib"))
z.AddFile("static/favicon.ico", path.Join(root, "static", "favicon.ico"))
if withData {
// if with data, backup data files and uploaded files
z.AddDir("data", path.Join(root, "data"))
z.AddDir("static/upload", path.Join(root, "static", "upload"))
}
z.AddDir(app.View().Dir, path.Join(root, app.View().Dir))
e = z.Flush()
if e != nil {
return "", e
}
println("backup success in " + filename)
return filename, nil
}
// RemoveBackupFile removes backup zip file with filename(not filepath).
func RemoveBackupFile(file string) {
file = path.Join(backupDir, file)
os.Remove(file)
}
// GetBackupFileAbsPath returns backup zip absolute filepath by filename.
func GetBackupFileAbsPath(name string) string {
return path.Join(backupDir, name)
}
// GetBackupFile returns fileinfo slice of all backup files.
func GetBackupFiles() ([]os.FileInfo, error) {
fi := make([]os.FileInfo, 0)
e := filepath.Walk(backupDir, func(_ string, info os.FileInfo, _ error) error {
if info == nil {
return nil
}
if !info.IsDir() {
fi = append([]os.FileInfo{info}, fi...)
}
return nil
})
return fi, e
}
// StartBackupTimer starts backup operation timer for auto backup stuff.
func StartBackupTimer(app *GoInk.App, t int) {
model.SetTimerFunc("backup-data", 144, func() {
filename, e := DoBackup(app, true)
if e != nil {
model.CreateMessage("backup", "[0]"+e.Error())
} else {
model.CreateMessage("backup", "[1]"+filename)
}
println("backup files in", t, "hours")
})
}
================================================
FILE: app/cmd/init.go
================================================
package cmd
import "github.com/fuxiaohei/GoInk"
func Init(app *GoInk.App) {
StartBackupTimer(app, 24)
}
================================================
FILE: app/cmd/install.go
================================================
package cmd
import (
"bytes"
"encoding/base64"
"fmt"
"github.com/Unknwon/cae/zip"
"github.com/fuxiaohei/GoBlog/app/utils"
"io/ioutil"
"os"
)
var (
tmpZipFile = "tmp.zip"
installLockFile = "install.lock"
)
func CheckInstall() bool {
_, e := os.Stat(installLockFile)
return e == nil
}
func ExtractBundleBytes() {
// origin from https://github.com/wendal/gor/blob/master/gor/gor.go
decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(zipBytes))
b, _ := ioutil.ReadAll(decoder)
ioutil.WriteFile(tmpZipFile, b, os.ModePerm)
z, e := zip.Open(tmpZipFile)
if e != nil {
panic(e)
os.Exit(1)
}
z.ExtractTo("")
defer func() {
z.Close()
decoder = nil
os.Remove(tmpZipFile)
}()
}
func DoInstall() {
ExtractBundleBytes()
ioutil.WriteFile(installLockFile, []byte(fmt.Sprint(utils.Now())), os.ModePerm)
println("install success")
}
func DoUpdateZipBytes(file string) error {
// copy from https://github.com/wendal/gor/blob/master/gor/gor.go
bytes, _ := ioutil.ReadFile(file)
zipWriter, _ := os.OpenFile("app/cmd/zip.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.ModePerm)
header := `package cmd
const zipBytes="`
zipWriter.Write([]byte(header))
encoder := base64.NewEncoder(base64.StdEncoding, zipWriter)
encoder.Write(bytes)
encoder.Close()
zipWriter.Write([]byte(`"`))
zipWriter.Sync()
zipWriter.Close()
println("update success")
return nil
}
================================================
FILE: app/cmd/log.go
================================================
package cmd
import (
"github.com/fuxiaohei/GoInk"
"io/ioutil"
"os"
"path/filepath"
)
type logItem struct {
Name string
CreateTime int64
Text string
}
func GetLogs(app *GoInk.App) []*logItem {
dir := app.Get("log_dir")
logs := make([]*logItem, 0)
filepath.Walk(dir, func(_ string, info os.FileInfo, err error) error {
if err == nil {
if info.IsDir() {
return nil
}
ext := filepath.Ext(info.Name())
if ext != ".log" {
return nil
}
bytes, e := ioutil.ReadFile(filepath.Join(dir, info.Name()))
if e != nil {
return nil
}
l := new(logItem)
l.Name = info.Name()
l.CreateTime = info.ModTime().Unix()
l.Text = string(bytes)
logs = append([]*logItem{l}, logs...)
}
return nil
})
return logs
}
func RemoveLogFile(app *GoInk.App, file string) {
f := filepath.Join(app.Get("log_dir"), file)
os.Remove(f)
}
================================================
FILE: app/cmd/monitor.go
================================================
package cmd
import (
"fmt"
"github.com/fuxiaohei/GoBlog/app/utils"
"runtime"
"time"
)
type monitorStats struct {
NumGoroutine int
MemAllocated string
MemMalloc string
MemTotal string
MemSys string
MemHeap string
MemGc string
LastGcTime string
}
func ReadMemStats() *monitorStats {
m := new(runtime.MemStats)
runtime.ReadMemStats(m)
ms := new(monitorStats)
ms.NumGoroutine = runtime.NumGoroutine()
ms.MemAllocated = utils.FileSize(int64(m.Alloc))
ms.MemTotal = utils.FileSize(int64(m.TotalAlloc))
ms.MemSys = utils.FileSize(int64(m.Sys))
ms.MemHeap = utils.FileSize(int64(m.HeapAlloc))
ms.MemMalloc = utils.FileSize(int64(m.Mallocs))
ms.LastGcTime = fmt.Sprintf("%.1fs", float64(time.Now().UnixNano()-int64(m.LastGC))/1000/1000/1000)
ms.MemGc = utils.FileSize(int64(m.NextGC))
return ms
}
================================================
FILE: app/cmd/reboot.go
================================================
package cmd
================================================
FILE: app/cmd/theme.go
================================================
package cmd
import (
"github.com/fuxiaohei/GoBlog/app/model"
"github.com/fuxiaohei/GoInk"
"io/ioutil"
"path/filepath"
)
var adminTheme = "admin"
type themeItem struct {
Name string
Files []string
ErrorFiles []string
Layout []string
}
func SetThemeCache(ctx *GoInk.Context, cache bool) {
ctx.App().View().NoCache()
ctx.App().View().IsCache = cache
if cache {
model.SetSetting("theme_cache", "true")
} else {
model.SetSetting("theme_cache", "false")
}
model.SyncSettings()
}
func GetThemes(dir string) map[string]*themeItem {
m := make(map[string]*themeItem)
files, e := ioutil.ReadDir(dir)
if e != nil {
panic(e)
}
for _, fi := range files {
if fi.IsDir() && fi.Name() != adminTheme {
theme, e := createThemeItem(filepath.Join(dir, fi.Name()))
if e != nil {
continue
}
theme.Name = fi.Name()
m[fi.Name()] = theme
}
}
return m
}
func createThemeItem(dir string) (*themeItem, error) {
files, e := ioutil.ReadDir(dir)
if e != nil {
return nil, e
}
theme := new(themeItem)
theme.Files = make([]string, 0)
theme.Layout = make([]string, 0)
for _, fi := range files {
if fi.IsDir() {
if fi.Name() == "error" {
theme.ErrorFiles, _ = filepath.Glob(filepath.Join(dir, fi.Name(), "*.html"))
for i, f := range theme.ErrorFiles {
theme.ErrorFiles[i] = filepath.Join(fi.Name(), filepath.Base(f))
}
} else {
f, _ := filepath.Glob(filepath.Join(dir, fi.Name(), "*.html"))
for _, ff := range f {
theme.Files = append(theme.Files, filepath.Join(fi.Name(), filepath.Base(ff)))
}
}
} else {
ext := filepath.Ext(fi.Name())
if ext == ".html" {
theme.Files = append(theme.Files, fi.Name())
continue
}
if ext == ".layout" {
theme.Layout = append(theme.Layout, fi.Name())
}
}
}
return theme, nil
}
================================================
FILE: app/cmd/upgrade.go
================================================
package cmd
import (
"github.com/fuxiaohei/GoBlog/app/model"
"github.com/fuxiaohei/GoInk"
"sort"
"strconv"
)
var upgradeScript map[int]func(app *GoInk.App) bool
func init() {
upgradeScript = make(map[int]func(app *GoInk.App) bool)
}
func SetUpgradeScript(v int, script func(app *GoInk.App) bool) {
upgradeScript[v] = script
}
func CheckUpgrade(v int, print bool) bool {
model.Init(v)
appV := model.GetVersion()
b := v > appV.Version
if b && print {
println("app version @ " + strconv.Itoa(v) + " is ahead of current version @ " + strconv.Itoa(appV.Version) + " , please run 'GoBlog upgrade'")
}
return b
}
func DoUpgrade(v int, app *GoInk.App) {
if !CheckUpgrade(v, false) {
println("app version @", v, "is updated")
return
}
oldVersion := model.GetVersion().Version
scriptIndex := []int{}
for vr, _ := range upgradeScript {
if vr <= v && vr > oldVersion {
scriptIndex = append(scriptIndex, vr)
}
}
sort.Sort(sort.IntSlice(scriptIndex))
for _, cv := range scriptIndex {
upgradeScript[cv](app)
println("upgrade @", cv, "success")
}
model.GetVersion().Version = v
model.SyncVersion()
println("app has upgraded to version @", v, "successfully, restart and keep enjoy !!")
}
================================================
FILE: app/cmd/zip.go
================================================
package cmd
const zipBytes="UEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAc3RhdGljL1BLBwgAAAAAAAAAAAAAAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAAAsAAABzdGF0aWNcY3NzL1BLBwgAAAAAAAAAAAAAAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAABQAAABzdGF0aWNcY3NzXGFkbWluLmNzc2JvZHksZGl2LGRsLGR0LGRkLHVsLG9sLGxpLGgxLGgyLGgzLGg0LGg1LGg2LHByZSxjb2RlLGZvcm0sZmllbGRzZXQsbGVnZW5kLGlucHV0LHRleHRhcmVhLHAsYmxvY2txdW90ZSx0aCx0ZHttYXJnaW46MDtwYWRkaW5nOjB9aGVhZGVyLGZvb3RlcixzZWN0aW9uLGFydGljbGUsYXNpZGUsbmF2LGhncm91cCxhZGRyZXNzLGZpZ3VyZSxmaWdjYXB0aW9uLG1lbnUsZGV0YWlsc3tkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH1maWVsZHNldCxpbWd7Ym9yZGVyOjB9YWRkcmVzcyxjYXB0aW9uLGNpdGUsY29kZSxkZm4sZW0sdGgsdmFye2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbH1vbCx1bHtsaXN0LXN0eWxlOm5vbmV9Y2FwdGlvbix0aHt0ZXh0LWFsaWduOmxlZnR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6bm9ybWFsfXE6YmVmb3JlLHE6YWZ0ZXJ7Y29udGVudDonJ31hYmJyLGFjcm9ueW17Ym9yZGVyOjA7Zm9udC12YXJpYW50Om5vcm1hbH1zdXB7dmVydGljYWwtYWxpZ246dGV4dC10b3B9c3Vie3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tfWlucHV0LHRleHRhcmVhLHNlbGVjdHtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXR9bGVnZW5ke2NvbG9yOiMwMDB9aHRtbCxib2R5e2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjMwcHg7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9YXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojMDA3OWJjfWE6aG92ZXJ7Y29sb3I6IzAwNWI5Yn1we21hcmdpbi1ib3R0b206MThweH1oMSxoMixoMyxoNCxoNSxoNntwYWRkaW5nOjEycHggMH1oMXtmb250LXNpemU6MjhweH1oMntmb250LXNpemU6MjRweH1oM3tmb250LXNpemU6MjFweH1oNHtmb250LXNpemU6MTlweH1oNXtmb250LXNpemU6MTZweH1oNntmb250LXNpemU6MTRweH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0ubGVmdHtmbG9hdDpsZWZ0fS5yaWdodHtmbG9hdDpyaWdodH0uYWJzb2x1dGV7cG9zaXRpb246YWJzb2x1dGV9LnJlbGF0aXZle3Bvc2l0aW9uOnJlbGF0aXZlfS5jbGVhcjphZnRlcnt2aXNpYmlsaXR5OmhpZGRlbjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowO2NvbnRlbnQ6IiAiO2NsZWFyOmJvdGg7aGVpZ2h0OjB9LnZlcnRpY2FsLW1pZGRsZXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mYWRlLW91dHtvcGFjaXR5OjB9LmhpZGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmNvbnRhaW5lcnttYXgtd2lkdGg6MTIwMHB4O21hcmdpbjphdXRvfS5jb250YWluZXI5NjB7bWF4LXdpZHRoOjk2MHB4O21hcmdpbjphdXRvfS5ncmlkLTEtMnt3aWR0aDo1MCV9LmdyaWQtMS0ze3dpZHRoOjMzLjMzMzMlfS5ncmlkLTEtNHt3aWR0aDoyNSV9LmdyaWQtMS01e3dpZHRoOjIwJX0uZ3JpZC0xLTZ7d2lkdGg6MTYuNjY2NiV9LmdyaWQtMi0ze3dpZHRoOjY2LjY2NjYlfS5ncmlkLTMtNHt3aWR0aDo3NSV9LmdyaWQtMy01e3dpZHRoOjYwJX0uZ3JpZC00LTV7d2lkdGg6ODAlfS5ncmlkLTUtNnt3aWR0aDo4My4zMzMzJX1pbnB1dCx0ZXh0YXJlYSxzZWxlY3QsYnV0dG9ue2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmfS5mb3JtIGxlZ2VuZHtmb250LXNpemU6MThweDttYXJnaW4tYm90dG9tOjE0cHh9LmZvcm0gbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLmlwdHtwYWRkaW5nOjhweCAxMnB4O2JvcmRlcjoxcHggc29saWQgIzk5OTtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7b3V0bGluZTpub25lO21pbi13aWR0aDoxODBweH0uZm9ybSAuaXB0OmZvY3Vze2JvcmRlci1jb2xvcjojMDA3OWJjfS5mb3JtIC5jaGt7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjJweCA2cHggMCAwO2xpbmUtaGVpZ2h0Om5vcm1hbH0uZm9ybSAuZmllbGR7bWFyZ2luLWJvdHRvbToyNHB4fS5mb3JtIC5pbnZhbGlke21hcmdpbi1yaWdodDoxMnB4fS5mb3JtIC50aXB7Zm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTttYXJnaW4tbGVmdDoxMnB4fS5mb3JtLXZlcnRpY2FsIGxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo4cHh9LmZvcm0tdmVydGljYWwgLmlwdHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uZm9ybS12ZXJ0aWNhbCAuaW52YWxpZHttYXJnaW4tcmlnaHQ6MDttYXJnaW4tdG9wOjZweH0uZm9ybS1hbGlnbiBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NjBweDt0ZXh0LWFsaWduOnJpZ2h0fS5mb3JtLWFsaWduIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5idG57bWluLXdpZHRoOjEyMHB4O2hlaWdodDozNnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5OTk7Y3Vyc29yOnBvaW50ZXJ9YS5idG57bGluZS1oZWlnaHQ6MzZweDtjb2xvcjojZmZmfS5idG4tcmVke2JhY2tncm91bmQtY29sb3I6I2U2NDM0Njtjb2xvcjojZmJmYmZifS5idG4tcmVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2M3MzgzYX0uYnRuLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9LmJ0bi1ibHVlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwNWI5Yn0uYnRuLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifS5idG4tZ3JlZW46aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ5NDYyfS5sYmx7cGFkZGluZzo0cHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Y29sb3I6IzMzMztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LmxibC1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9YS5sYmx7bGluZS1oZWlnaHQ6MjZweH1hLmxibC1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhO2NvbG9yOiNmYmZiZmJ9LmxibC1ibHVle2JhY2tncm91bmQtY29sb3I6IzAwNzliYztjb2xvcjojZmJmYmZifWEubGJsLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjliO2NvbG9yOiNmYmZiZmJ9LmxibC1ncmVlbntiYWNrZ3JvdW5kLWNvbG9yOiM3YWIyNzc7Y29sb3I6I2ZiZmJmYn1hLmxibC1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjI7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLml0ZW17cGFkZGluZzoycHggOHB4O21hcmdpbjowIDZweDtjb2xvcjojMzMzO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjIwcHh9LnBhZ2VyIC5pdGVtIGF7Y29sb3I6IzMzM30ucGFnZXIgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLml0ZW06aG92ZXIgYXtjb2xvcjojZmZmfS5wYWdlciAuY3VycmVudHtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY7Y29sb3I6I2ZiZmJmYjtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LnBhZ2VyIC5jdXJyZW50IGF7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLmN1cnJlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjfS5tYXJrZG93biBoMSwubWFya2Rvd24gaDIsLm1hcmtkb3duIGgzLC5tYXJrZG93biBoNCwubWFya2Rvd24gaDUsLm1hcmtkb3duIGg2e3BhZGRpbmc6MThweCAwIDlweCAwO2ZvbnQtd2VpZ2h0OmJvbGR9Lm1hcmtkb3duIGgxe2ZvbnQtc2l6ZToyNHB4fS5tYXJrZG93biBoMntmb250LXNpemU6MjFweH0ubWFya2Rvd24gaDEsLm1hcmtkb3duIGgye21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfS5tYXJrZG93biBoM3tmb250LXNpemU6MTlweH0ubWFya2Rvd24gaDR7Zm9udC1zaXplOjE4cHh9Lm1hcmtkb3duIGg1e2ZvbnQtc2l6ZToxNnB4fS5tYXJrZG93biBoNntmb250LXNpemU6MTRweH0ubWFya2Rvd24gcHttYXJnaW4tYm90dG9tOjEwcHh9Lm1hcmtkb3duIHVse2xpc3Qtc3R5bGU6ZGlzYyBpbnNpZGV9Lm1hcmtkb3duIG9se2xpc3Qtc3R5bGU6ZGVjaW1hbCBpbnNpZGV9Lm1hcmtkb3duIGNvZGV7Zm9udC1mYW1pbHk6Q29uc29sYXMsIkNvdXJpZXIgTmV3IixBcmlhbH0ubWFya2Rvd24gcCBjb2Rle2NvbG9yOiNjNzM4M2F9Lm1hcmtkb3duIGJsb2NrcXVvdGV7cGFkZGluZzo4cHggMThweDtib3JkZXItbGVmdDo0cHggc29saWQgI2NjYztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9Lm1hcmtkb3duIGJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjB9Lm1hcmtkb3duIHByZSBjb2Rle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE4cHggIWltcG9ydGFudDtwYWRkaW5nOjhweCAxOHB4O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjEycHggMCAxOHB4IDB9Lm1hcmtkb3duIG9sLC5tYXJrZG93biB1bHttYXJnaW46MTJweCAyNHB4fS5tYXJrZG93biBwIGltZ3ttYXgtd2lkdGg6OTklO2hlaWdodDphdXRvO21hcmdpbjowIGF1dG87ZGlzcGxheTpibG9ja30ubWFya2Rvd24gdGFibGV7bWFyZ2luOjEycHggMDt3aWR0aDo5OCV9Lm1hcmtkb3duIHRhYmxlIHRoLC5tYXJrZG93biB0YWJsZSB0ZHtib3JkZXI6MXB4IHNvbGlkICNjY2M7cGFkZGluZzo0cHggMTJweH0ubWFya2Rvd24gdGFibGUgdGhlYWR7YmFja2dyb3VuZDojZjZmNmY2fTo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6OHB4O21hcmdpbi1yaWdodDoycHh9Ojotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkMmQyZDJ9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOiM5ZmEwOWM7d2lkdGg6OHB4fTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDojYjdiOGFkfSNoZWFkZXJ7aGVpZ2h0OjM5cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM5OTk7bGluZS1oZWlnaHQ6MzlweDtib3gtc2hhZG93OjAgMCAycHggI2NjYzstbW96LWJveC1zaGFkb3c6MCAwIDJweCAjY2NjOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMnB4ICNjY2N9I2hlYWRlciAubmF2PmF7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzowIDE4cHg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjY2NjO2NvbG9yOiM2NjY7bWFyZ2luLWxlZnQ6LTFweH0jaGVhZGVyIC5uYXY+YTpob3Zlcntib3JkZXItY29sb3I6IzAwNzliYztiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmM7Y29sb3I6I2ZiZmJmYn0jaGVhZGVyIC5sb2dve2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE0cHggMCAwO21hcmdpbjowO2ZvbnQtc2l6ZToxNHB4fSNoZWFkZXIgLm5hdi1pdGVte2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MCAxOHB4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjY2NjO2JvcmRlci1yaWdodDoxcHggc29saWQgI2NjYztjb2xvcjojNjY2O21hcmdpbi1yaWdodDotMXB4fSNoZWFkZXIgLm5hdi1pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2VlZX0jaGVhZGVyIC5vdXR7Y29sb3I6I2M3MzgzYX0jaGVhZGVyIC5vdXQ6aG92ZXJ7Ym9yZGVyLWNvbG9yOiNlNjQzNDY7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9I2Zvb3RlcntwYWRkaW5nOjI0cHg7YmFja2dyb3VuZDojZjZmNmY2O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7bWFyZ2luLXRvcDozMHB4O2NvbG9yOiM5OTk7Zm9udC1zaXplOjEycHh9I2Zvb3RlciBwe21hcmdpbi1ib3R0b206MH0jZm9vdGVyIGF7Y29sb3I6Izk5OTtwYWRkaW5nOjZweCAxMnB4fSNmb290ZXIgYTpob3Zlcntib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2JiYn0uYWRtaW57bWFyZ2luOjI0cHggYXV0byA0OHB4IGF1dG99I3Byb2ZpbGV7d2lkdGg6ODAwcHg7bWFyZ2luOjI0cHggYXV0byA0OHB4IGF1dG99I3Byb2ZpbGUgLmF2YXRhciBpbWd7d2lkdGg6MTgwcHg7cGFkZGluZzo0cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDtib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7aGVpZ2h0OjE4MHB4fSNwcm9maWxlIC5pcHR7d2lkdGg6MjgwcHh9I3Byb2ZpbGUgLmludmFsaWR7bWFyZ2luLWxlZnQ6NzVweH0jcHJvZmlsZSAuYmlve21hcmdpbi1sZWZ0Ojc1cHg7aGVpZ2h0OjE2MHB4fSNwYXNzd29yZHt3aWR0aDo0MDBweDttYXJnaW46MjRweCBhdXRvIDQ4cHggYXV0b30jcGFzc3dvcmQgLmludmFsaWR7bWFyZ2luLWxlZnQ6NzVweH0jYXJ0aWNsZS1saXN0e21hcmdpbi1ib3R0b206MjRweH0jYXJ0aWNsZS1saXN0IGxpe21hcmdpbi1ib3R0b206OHB4O3BhZGRpbmctYm90dG9tOjhweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jYXJ0aWNsZS1saXN0IGxpPip7bWFyZ2luLXJpZ2h0OjE2cHh9I2FydGljbGUtbGlzdCBsaSAudGltZSwjYXJ0aWNsZS1saXN0IGxpIC5jb21tZW50e2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWY7Y29sb3I6Izk5OX0jYXJ0aWNsZS1saXN0IGxpIC5jb21tZW50e2NvbG9yOiM2NDk0NjJ9I2FydGljbGUtbGlzdCBsaSAuY29tbWVudCAuZmF7bWFyZ2luLXJpZ2h0OjZweH0jYXJ0aWNsZS1saXN0IGxpIC5pcy1jb21tZW50e2NvbG9yOiNmZjQ0NDd9I2FydGljbGUtbGlzdCBsaSAuaXMtY29tbWVudCAuZmF7bWFyZ2luLXJpZ2h0OjZweH0jYXJ0aWNsZS1saXN0IGxpIC5kZWwsI2FydGljbGUtbGlzdCBsaSAuZWRpdHtvcGFjaXR5OjB9I2FydGljbGUtbGlzdCBsaTpob3ZlciAuZGVsLCNhcnRpY2xlLWxpc3QgbGk6aG92ZXIgLmVkaXR7b3BhY2l0eToxfSNhcnRpY2xlLWxpc3QgbGk6Zmlyc3QtY2hpbGQgaDR7cGFkZGluZy10b3A6MH0jYXJ0aWNsZS1mb3Jte21hcmdpbjoyNHB4IGF1dG8gNDhweCBhdXRvfSNhcnRpY2xlLWZvcm0gaW5wdXQudGl0bGV7d2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLWJvdHRvbTpub25lO21hcmdpbi1ib3R0b206LTFweDtmb250LXNpemU6MThweH0jYXJ0aWNsZS1mb3JtIHNlbGVjdHtwYWRkaW5nOjRweCA2cHh9I2FydGljbGUtZm9ybSAucHJldmlld3tib3JkZXI6MXB4IHNvbGlkICM5OTk7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTJweDtoZWlnaHQ6NzAwcHg7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmFkaXVzOjJweDtvdmVyZmxvdy14OnNjcm9sbH0jYXJ0aWNsZS1mb3JtIC5mb3JtLXZlcnRpY2Fse3dpZHRoOjEwMCU7bWFyZ2luLXRvcDoxOHB4fSNhcnRpY2xlLWZvcm0gLmZvcm0tdmVydGljYWwgaW5wdXQuaXB0e3dpZHRoOjMwMHB4fSNhcnRpY2xlLWZvcm0gLmZvcm0tdmVydGljYWwgLml0ZW17ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MThweH0jYXJ0aWNsZS1mb3JtIC5mb3JtLXZlcnRpY2FsIC5idG57bWFyZ2luLXJpZ2h0OjE2cHh9I2FydGljbGUtZm9ybSAuZm9ybS12ZXJ0aWNhbCAuaW52YWxpZHtkaXNwbGF5OmlubGluZX0jYXJ0aWNsZS1mb3JtIC5maWxlLXByb2dyZXNze3BhZGRpbmc6MCAxMnB4O2JhY2tncm91bmQ6cmdiYSgwLDE1MCwyMjMsMC4yKTtjb2xvcjojNjY2O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWY7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0jYXJ0aWNsZS1mb3JtIC5maWxlLXByb2dyZXNzLmVycntiYWNrZ3JvdW5kOnJnYmEoMjU1LDY4LDcxLDAuMik7Y29sb3I6I2FhMzkzY30jc2V0dGluZy1uYXZ7d2lkdGg6MTAwMHB4O21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjEycHg7cGFkZGluZy1ib3R0b206MTJweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jc2V0dGluZy1uYXYgbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgMTJweH0jc2V0dGluZy1uYXYgbGkgYXtwYWRkaW5nOjNweCAxMHB4fSNzZXR0aW5nLW5hdiBsaSBhOmhvdmVyLCNzZXR0aW5nLW5hdiBsaSBhLmN1cnJlbnR7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzAwNWI5Yn0uc2V0dGluZy1wYW5lbHtkaXNwbGF5Om5vbmV9LnNldHRpbmctZm9ybXt3aWR0aDo4MjBweDttYXJnaW46MjRweCBhdXRvIDQ4cHggYXV0b30uc2V0dGluZy1mb3JtIC5pcHR7d2lkdGg6NDgwcHh9LnNldHRpbmctZm9ybSAuaW52YWxpZHttYXJnaW4tbGVmdDo3NXB4fS5zZXR0aW5nLWZvcm0gbGFiZWx7bWluLXdpZHRoOjEwZW19LnNldHRpbmctZm9ybSAudGlwLmJsb2Nre21hcmdpbi1sZWZ0OjEyZW19I3NldHRpbmctY3VzdG9tLWZvcm17d2lkdGg6MTAwMHB4fSNzZXR0aW5nLWN1c3RvbS1mb3JtIGlucHV0LmtleXt3aWR0aDoyNDBweH0jc2V0dGluZy1jdXN0b20tZm9ybSBpbnB1dC52YWx1ZXt3aWR0aDo2NDBweH0jc2V0dGluZy1jdXN0b20tZm9ybSAuaXRlbXttYXJnaW4tYm90dG9tOjEycHg7cGFkZGluZy1ib3R0b206MTJweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jc2V0dGluZy1jdXN0b20tZm9ybSAuZGVse21hcmdpbi1sZWZ0OjEycHg7Y29sb3I6I2U2NDM0Njtmb250LXNpemU6MTJweH0jc2V0dGluZy1jdXN0b20tZm9ybSAudGlwe21hcmdpbi1sZWZ0OjB9I3NldHRpbmctbmF2LWZvcm17d2lkdGg6MTAwMHB4fSNzZXR0aW5nLW5hdi1mb3JtIC5pdGVte21hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nLWJvdHRvbToxMnB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfSNzZXR0aW5nLW5hdi1mb3JtIHNwYW4ubGFiZWx7bWFyZ2luLXJpZ2h0OjZweH0jc2V0dGluZy1uYXYtZm9ybSBpbnB1dC5vcmRlcnt3aWR0aDoyLjVlbTttaW4td2lkdGg6MH0jc2V0dGluZy1uYXYtZm9ybSBpbnB1dC50ZXh0e3dpZHRoOjgwcHg7bWluLXdpZHRoOjB9I3NldHRpbmctbmF2LWZvcm0gaW5wdXQudGl0bGV7d2lkdGg6MTUwcHg7bWluLXdpZHRoOjB9I3NldHRpbmctbmF2LWZvcm0gaW5wdXQubGlua3t3aWR0aDozNDBweH0jc2V0dGluZy1uYXYtZm9ybSAuZGVse21hcmdpbi1sZWZ0OjEycHg7Y29sb3I6I2U2NDM0Nn0jY29tbWVudC1saXN0IC5jLWF2YXRhcnt3aWR0aDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7bWFyZ2luLXJpZ2h0OjE4cHh9I2NvbW1lbnQtbGlzdCAuY29tbWVudHttYXJnaW4tYm90dG9tOjEycHg7cGFkZGluZy1ib3R0b206MTJweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jY29tbWVudC1saXN0IC5jLW1ldGE+KnttYXJnaW4tcmlnaHQ6MTZweH0jY29tbWVudC1saXN0IC5jLXRpbWV7Y29sb3I6Izk5OTtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNjb21tZW50LWxpc3QgLmMtdGltZSAuZmF7bWFyZ2luLXJpZ2h0OjZweH0jY29tbWVudC1saXN0IC5jLWNudCwjY29tbWVudC1saXN0IC5jLWVtYWlse2NvbG9yOiM5OTk7Zm9udC1zaXplOjEycHh9I2NvbW1lbnQtbGlzdCAuYy1hdXRob3J7Zm9udC1zaXplOjEzcHh9I2NvbW1lbnQtbGlzdCAuYy1hdXRob3IuYWRtaW57YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9I2NvbW1lbnQtbGlzdCAuYy1wLW1ke21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzY2Nn0jY29tbWVudC1saXN0IC5jLXNlY3Rpb257bWF4LXdpZHRoOjgzMHB4fSNjb21tZW50LWxpc3QgLmMtY2hlY2ssI2NvbW1lbnQtbGlzdCAuYy1kZWx7Y29sb3I6I2U2NDM0Nn0jY29tbWVudC1saXN0IC5jLWNoZWNrIC5mYSwjY29tbWVudC1saXN0IC5jLWRlbCAuZmF7bWFyZ2luLXJpZ2h0OjZweH0jY29tbWVudC1saXN0IC5jLWNoZWNrOmhvdmVyLCNjb21tZW50LWxpc3QgLmMtZGVsOmhvdmVye2NvbG9yOiNhYTM5M2N9I2NvbW1lbnQtbGlzdCAuYy1yZXBseSwjY29tbWVudC1saXN0IC5jLWNoZWNrLCNjb21tZW50LWxpc3QgLmMtZGVse2ZvbnQtc2l6ZToxMnB4fSNjb21tZW50LWZvcm17cGFkZGluZy10b3A6MTJweDtkaXNwbGF5Om5vbmU7bWFyZ2luLWxlZnQ6NzJweH0jY29tbWVudC1mb3JtIC5idG57bWFyZ2luLXJpZ2h0OjI0cHh9I2NvbW1lbnQtY29udGVudHt3aWR0aDo1MDBweDtoZWlnaHQ6ODBweDttYXJnaW4tcmlnaHQ6MjRweH0jZmlsZXMtbGlzdCBsaS5maWxle21hcmdpbi1ib3R0b206OHB4O3BhZGRpbmctYm90dG9tOjhweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jZmlsZXMtbGlzdCBsaS5maWxlPip7bWFyZ2luLXJpZ2h0OjE2cHh9I2ZpbGVzLWxpc3QgbGkuZmlsZTpob3ZlciAuZGVse29wYWNpdHk6MSAhaW1wb3J0YW50fSNmaWxlcy1saXN0IC51cGxvYWQtdGltZXtjb2xvcjojOTk5O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWZ9I2ZpbGVzLWxpc3QgLmRlbHtjb2xvcjojZTY0MzQ2fSNmaWxlcy1saXN0IC5maWxlLXByb2dyZXNze3BhZGRpbmc6MCAxMnB4O2JhY2tncm91bmQ6cmdiYSgwLDE1MCwyMjMsMC4yKTtjb2xvcjojNjY2O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWY7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0jZmlsZXMtbGlzdCAuZmlsZS1wcm9ncmVzcy5lcnJ7YmFja2dyb3VuZDpyZ2JhKDI1NSw2OCw3MSwwLjIpO2NvbG9yOiNhYTM5M2N9I2ZpbGVzLWxpc3QgLnNpemV7d2lkdGg6NGVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrfSNwbHVnaW4tbGlzdCBsaXttYXJnaW4tYm90dG9tOjE2cHg7cGFkZGluZy1ib3R0b206MTZweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jcGx1Z2luLWxpc3QgbGkgLmRlc2N7bWFyZ2luLWJvdHRvbTowO3dpZHRoOjk5JTtjb2xvcjojOTk5fSNwbHVnaW4tbGlzdCBsaSBhLmxibHtwYWRkaW5nOjAgOHB4O21hcmdpbi1sZWZ0OjE2cHh9I3BsdWdpbi1saXN0IGxpIC52ZXJzaW9ue2NvbG9yOiM1MDc2NTA7bWFyZ2luLWxlZnQ6MTZweH0jcGx1Z2luLWxpc3QgbGkgLm5hbWV7Zm9udC1zaXplOjE2cHh9I3BsdWdpbi1saXN0IGxpIC5hY3RpdmV7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDttYXJnaW4tcmlnaHQ6MTZweDtwYWRkaW5nOjA7bWFyZ2luLXRvcDoxMHB4fSNwbHVnaW4tbGlzdCBsaSAuc2V0dGluZ3ttYXJnaW4tbGVmdDoxNnB4fSNwbHVnaW4tc2V0dGluZy1mb3JtIHAuaXRlbXtjbGVhcjpib3RofSNwbHVnaW4tc2V0dGluZy1mb3JtIGxhYmVse2Zsb2F0OmxlZnQ7bWluLXdpZHRoOjZlbTt0ZXh0LWFsaWduOnJpZ2h0O21hcmdpbi1yaWdodDoyZW19I3BsdWdpbi1zZXR0aW5nLWZvcm0gLnRpdGxle3BhZGRpbmctdG9wOjA7bWFyZ2luLWJvdHRvbToxOHB4fSNwbHVnaW4tc2V0dGluZy1mb3JtIGlucHV0LmlwdHt3aWR0aDo2MDBweH0jZGFzaGJvYXJkIC5ncmlkLTEtNXttYXJnaW4tcmlnaHQ6MiV9I2Rhc2hib2FyZCAucXVpY2stbGluayBsaXtsaXN0LXN0eWxlOmluc2lkZSBkaXNjO21hcmdpbi1ib3R0b206NnB4O3BhZGRpbmctYm90dG9tOjZweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jZGFzaGJvYXJkIC5zdGF0cyAubGJse3BhZGRpbmc6MXB4IDVweDttYXJnaW46MCAzcHh9I2Rhc2hib2FyZCAuYWN0aXZpdHkgLm1zZ3twYWRkaW5nOjhweCAxMnB4O21hcmdpbi1ib3R0b206OHB4O3BhZGRpbmctYm90dG9tOjhweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxMnB4fSNkYXNoYm9hcmQgLmFjdGl2aXR5IC5tc2cgLnRpbWV7Zm9udC1mYW1pbHk6VmVyZGFuYSxUYWhvbWEsJ+W+rui9r+mbhem7kScsJ+Wui+S9kycsc2Fucy1zZXJpZn0jZGFzaGJvYXJkIC5hY3Rpdml0eSAubXNnIC5kYXRhe2NvbG9yOiM2NjY7bWFyZ2luLWxlZnQ6MS4yZW19I2Rhc2hib2FyZCAuYWN0aXZpdHkgLm1zZyAuZGF0YSBwe21hcmdpbi1ib3R0b206MDtsaW5lLWhlaWdodDoyNHB4fSNkYXNoYm9hcmQgLmFjdGl2aXR5IC5tc2cgLnJlYWR7dG9wOjA7cmlnaHQ6MTJweDtvcGFjaXR5OjB9I2Rhc2hib2FyZCAuYWN0aXZpdHkgLm1zZyAucmVhZDpob3Zlcntjb2xvcjojZTY0MzQ2fSNkYXNoYm9hcmQgLmFjdGl2aXR5IC5tc2c6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMTUwLDIyMywwLjA2KX0jZGFzaGJvYXJkIC5hY3Rpdml0eSAubXNnOmhvdmVyIC5yZWFke29wYWNpdHk6MX1QSwcISUNrj9cyAADXMgAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAc3RhdGljXGNzc1xjbWQuY3NzYm9keSxkaXYsZGwsZHQsZGQsdWwsb2wsbGksaDEsaDIsaDMsaDQsaDUsaDYscHJlLGNvZGUsZm9ybSxmaWVsZHNldCxsZWdlbmQsaW5wdXQsdGV4dGFyZWEscCxibG9ja3F1b3RlLHRoLHRke21hcmdpbjowO3BhZGRpbmc6MH1oZWFkZXIsZm9vdGVyLHNlY3Rpb24sYXJ0aWNsZSxhc2lkZSxuYXYsaGdyb3VwLGFkZHJlc3MsZmlndXJlLGZpZ2NhcHRpb24sbWVudSxkZXRhaWxze2Rpc3BsYXk6YmxvY2t9YXVkaW8sY2FudmFzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowfWZpZWxkc2V0LGltZ3tib3JkZXI6MH1hZGRyZXNzLGNhcHRpb24sY2l0ZSxjb2RlLGRmbixlbSx0aCx2YXJ7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsfW9sLHVse2xpc3Qtc3R5bGU6bm9uZX1jYXB0aW9uLHRoe3RleHQtYWxpZ246bGVmdH1oMSxoMixoMyxoNCxoNSxoNntmb250LXNpemU6MTAwJTtmb250LXdlaWdodDpub3JtYWx9cTpiZWZvcmUscTphZnRlcntjb250ZW50OicnfWFiYnIsYWNyb255bXtib3JkZXI6MDtmb250LXZhcmlhbnQ6bm9ybWFsfXN1cHt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LXRvcH1zdWJ7dmVydGljYWwtYWxpZ246dGV4dC1ib3R0b219aW5wdXQsdGV4dGFyZWEsc2VsZWN0e2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1sZWdlbmR7Y29sb3I6IzAwMH1odG1sLGJvZHl7Zm9udC1mYW1pbHk6VWJ1bnR1LENvbnNvbGFzLCJNaWNyb3NvZnQgWWFIZWkiLFZlcmRhbmEsVGFob21hLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MzBweDtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZiZmJmYn1he3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiMwMDc5YmN9YTpob3Zlcntjb2xvcjojMDA1YjlifXB7bWFyZ2luLWJvdHRvbToxOHB4fWgxLGgyLGgzLGg0LGg1LGg2e3BhZGRpbmc6MTJweCAwfWgxe2ZvbnQtc2l6ZToyOHB4fWgye2ZvbnQtc2l6ZToyNHB4fWgze2ZvbnQtc2l6ZToyMXB4fWg0e2ZvbnQtc2l6ZToxOXB4fWg1e2ZvbnQtc2l6ZToxNnB4fWg2e2ZvbnQtc2l6ZToxNHB4fS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5sZWZ0e2Zsb2F0OmxlZnR9LnJpZ2h0e2Zsb2F0OnJpZ2h0fS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LmNsZWFyOmFmdGVye3Zpc2liaWxpdHk6aGlkZGVuO2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjA7Y29udGVudDoiICI7Y2xlYXI6Ym90aDtoZWlnaHQ6MH0udmVydGljYWwtbWlkZGxle3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmZhZGUtb3V0e29wYWNpdHk6MH0uaGlkZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0uY29udGFpbmVye21heC13aWR0aDoxMjAwcHg7bWFyZ2luOmF1dG99LmNvbnRhaW5lcjk2MHttYXgtd2lkdGg6OTYwcHg7bWFyZ2luOmF1dG99LmdyaWQtMS0ye3dpZHRoOjUwJX0uZ3JpZC0xLTN7d2lkdGg6MzMuMzMzMyV9LmdyaWQtMS00e3dpZHRoOjI1JX0uZ3JpZC0xLTV7d2lkdGg6MjAlfS5ncmlkLTEtNnt3aWR0aDoxNi42NjY2JX0uZ3JpZC0yLTN7d2lkdGg6NjYuNjY2NiV9LmdyaWQtMy00e3dpZHRoOjc1JX0uZ3JpZC0zLTV7d2lkdGg6NjAlfS5ncmlkLTQtNXt3aWR0aDo4MCV9LmdyaWQtNS02e3dpZHRoOjgzLjMzMzMlfWlucHV0LHRleHRhcmVhLHNlbGVjdCxidXR0b257Zm9udC1mYW1pbHk6VWJ1bnR1LENvbnNvbGFzLCJNaWNyb3NvZnQgWWFIZWkiLFZlcmRhbmEsVGFob21hLEFyaWFsLHNhbnMtc2VyaWZ9LmZvcm0gbGVnZW5ke2ZvbnQtc2l6ZToxOHB4O21hcmdpbi1ib3R0b206MTRweH0uZm9ybSBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6MTJweH0uZm9ybSAuaXB0e3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyOjFweCBzb2xpZCAjOTk5O2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7bWluLXdpZHRoOjE4MHB4fS5mb3JtIC5pcHQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMwMDc5YmN9LmZvcm0gLmNoa3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MnB4IDZweCAwIDA7bGluZS1oZWlnaHQ6bm9ybWFsfS5mb3JtIC5maWVsZHttYXJnaW4tYm90dG9tOjI0cHh9LmZvcm0gLmludmFsaWR7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLnRpcHtmb250LXNpemU6MTNweDtjb2xvcjojOTk5O21hcmdpbi1sZWZ0OjEycHh9LmZvcm0tdmVydGljYWwgbGFiZWx7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjhweH0uZm9ybS12ZXJ0aWNhbCAuaXB0e3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94fS5mb3JtLXZlcnRpY2FsIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5mb3JtLWFsaWduIGxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo2MHB4O3RleHQtYWxpZ246cmlnaHR9LmZvcm0tYWxpZ24gLmludmFsaWR7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLXRvcDo2cHh9LmJ0bnttaW4td2lkdGg6MTIwcHg7aGVpZ2h0OjM2cHg7YmFja2dyb3VuZC1jb2xvcjojY2NjO2NvbG9yOiMzMzM7Ym9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MnB4O291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MH0uYnRuOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk5OTtjdXJzb3I6cG9pbnRlcn1hLmJ0bntsaW5lLWhlaWdodDozNnB4O2NvbG9yOiNmZmZ9LmJ0bi1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9LmJ0bi1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhfS5idG4tYmx1ZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmM7Y29sb3I6I2ZiZmJmYn0uYnRuLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjlifS5idG4tZ3JlZW57YmFja2dyb3VuZC1jb2xvcjojN2FiMjc3O2NvbG9yOiNmYmZiZmJ9LmJ0bi1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjJ9LmxibHtwYWRkaW5nOjRweCAxMnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ubGJsLXJlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlNjQzNDY7Y29sb3I6I2ZiZmJmYn1hLmxibHtsaW5lLWhlaWdodDoyNnB4fWEubGJsLXJlZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjNzM4M2E7Y29sb3I6I2ZiZmJmYn0ubGJsLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9YS5sYmwtYmx1ZTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDViOWI7Y29sb3I6I2ZiZmJmYn0ubGJsLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifWEubGJsLWdyZWVuOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzY0OTQ2Mjtjb2xvcjojZmJmYmZifS5wYWdlciAuaXRlbXtwYWRkaW5nOjJweCA4cHg7bWFyZ2luOjAgNnB4O2NvbG9yOiMzMzM7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MjBweH0ucGFnZXIgLml0ZW0gYXtjb2xvcjojMzMzfS5wYWdlciAuaXRlbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmM7Ym9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MnB4fS5wYWdlciAuaXRlbTpob3ZlciBhe2NvbG9yOiNmZmZ9LnBhZ2VyIC5jdXJyZW50e2JhY2tncm91bmQtY29sb3I6IzY2Njtjb2xvcjojZmJmYmZiO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLmN1cnJlbnQgYXtjb2xvcjojZmJmYmZifS5wYWdlciAuY3VycmVudDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmN9Lm1hcmtkb3duIGgxLC5tYXJrZG93biBoMiwubWFya2Rvd24gaDMsLm1hcmtkb3duIGg0LC5tYXJrZG93biBoNSwubWFya2Rvd24gaDZ7cGFkZGluZzoxOHB4IDAgOXB4IDA7Zm9udC13ZWlnaHQ6Ym9sZH0ubWFya2Rvd24gaDF7Zm9udC1zaXplOjI0cHh9Lm1hcmtkb3duIGgye2ZvbnQtc2l6ZToyMXB4fS5tYXJrZG93biBoMSwubWFya2Rvd24gaDJ7bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGR9Lm1hcmtkb3duIGgze2ZvbnQtc2l6ZToxOXB4fS5tYXJrZG93biBoNHtmb250LXNpemU6MThweH0ubWFya2Rvd24gaDV7Zm9udC1zaXplOjE2cHh9Lm1hcmtkb3duIGg2e2ZvbnQtc2l6ZToxNHB4fS5tYXJrZG93biBwe21hcmdpbi1ib3R0b206MTBweH0ubWFya2Rvd24gdWx7bGlzdC1zdHlsZTpkaXNjIGluc2lkZX0ubWFya2Rvd24gb2x7bGlzdC1zdHlsZTpkZWNpbWFsIGluc2lkZX0ubWFya2Rvd24gY29kZXtmb250LWZhbWlseTpDb25zb2xhcywiQ291cmllciBOZXciLEFyaWFsfS5tYXJrZG93biBwIGNvZGV7Y29sb3I6I2M3MzgzYX0ubWFya2Rvd24gYmxvY2txdW90ZXtwYWRkaW5nOjhweCAxOHB4O2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjY2NjO2JhY2tncm91bmQtY29sb3I6I2ZiZmJmYn0ubWFya2Rvd24gYmxvY2txdW90ZSBwe21hcmdpbi1ib3R0b206MH0ubWFya2Rvd24gcHJlIGNvZGV7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MThweCAhaW1wb3J0YW50O3BhZGRpbmc6OHB4IDE4cHg7ZGlzcGxheTpibG9jazttYXJnaW46MTJweCAwIDE4cHggMH0ubWFya2Rvd24gb2wsLm1hcmtkb3duIHVse21hcmdpbjoxMnB4IDI0cHh9Lm1hcmtkb3duIHAgaW1ne21heC13aWR0aDo5OSU7aGVpZ2h0OmF1dG87bWFyZ2luOjAgYXV0bztkaXNwbGF5OmJsb2NrfS5tYXJrZG93biB0YWJsZXttYXJnaW46MTJweCAwO3dpZHRoOjk4JX0ubWFya2Rvd24gdGFibGUgdGgsLm1hcmtkb3duIHRhYmxlIHRke2JvcmRlcjoxcHggc29saWQgI2NjYztwYWRkaW5nOjRweCAxMnB4fS5tYXJrZG93biB0YWJsZSB0aGVhZHtiYWNrZ3JvdW5kOiNmNmY2ZjZ9Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo4cHg7bWFyZ2luLXJpZ2h0OjJweH06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNle2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXItbGVmdDoxcHggc29saWQgI2QyZDJkMn06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6IzlmYTA5Yzt3aWR0aDo4cHh9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcntiYWNrZ3JvdW5kOiNiN2I4YWR9LmNtZHttYXJnaW46MjRweCA0OHB4fS5jbWQtaGVhZGVye21hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nLWJvdHRvbToxMnB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfSNiYWNrdXAtYnRuLCN0aGVtZS1jYWNoZS1idG57bWFyZ2luOjEwcHggMCAwIDMwcHg7bWluLXdpZHRoOjA7cGFkZGluZzowIDJlbX0jdGhlbWUtY2FjaGUtYnRue2JhY2tncm91bmQtY29sb3I6I2U2NDM0Njtjb2xvcjojZmJmYmZifSN0aGVtZS1jYWNoZS1idG46aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhfSN0aGVtZS1jYWNoZS1idG4udHJ1ZXtiYWNrZ3JvdW5kLWNvbG9yOiM3YWIyNzc7Y29sb3I6I2ZiZmJmYn0jdGhlbWUtY2FjaGUtYnRuLnRydWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ5NDYyfS5jbWQtbGlzdCBsaXttYXJnaW4tYm90dG9tOjEycHg7cGFkZGluZy1ib3R0b206MTJweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jYmFja3VwLWxpc3QgbGl7bGlzdC1zdHlsZTpkaXNjIGluc2lkZTtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNiYWNrdXAtbGlzdCBsaT5zcGFuLCNiYWNrdXAtbGlzdCBsaT5he21hcmdpbi1yaWdodDoxNnB4fSNiYWNrdXAtbGlzdCBsaSAuZGVse2NvbG9yOiNlNjQzNDY7b3BhY2l0eTowfSNiYWNrdXAtbGlzdCBsaSAubGlua3ttYXJnaW4tbGVmdDoxMnB4fSNiYWNrdXAtbGlzdCBsaTpob3ZlciAuZGVse29wYWNpdHk6MX0jbWVzc2FnZS1saXN0IC5tZXNzYWdle3BhZGRpbmc6OHB4IDEycHg7bWFyZ2luLWJvdHRvbTo4cHg7cGFkZGluZy1ib3R0b206OHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkO2xpbmUtaGVpZ2h0OjI0cHg7Zm9udC1zaXplOjEycHh9I21lc3NhZ2UtbGlzdCAubWVzc2FnZSAudGltZXtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNtZXNzYWdlLWxpc3QgLm1lc3NhZ2UgLmRhdGF7Y29sb3I6IzY2NjttYXJnaW4tbGVmdDoxLjJlbX0jbWVzc2FnZS1saXN0IC5tZXNzYWdlIC5kYXRhIHB7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjI0cHh9I21lc3NhZ2UtbGlzdCAubWVzc2FnZSAucmVhZHt0b3A6MDtyaWdodDoxMnB4O29wYWNpdHk6MH0jbWVzc2FnZS1saXN0IC5tZXNzYWdlIC5yZWFkOmhvdmVye2NvbG9yOiNlNjQzNDZ9I21lc3NhZ2UtbGlzdCAubWVzc2FnZTpob3ZlciAucmVhZHtvcGFjaXR5OjF9I2xvZy1saXN0IC5sb2d7Zm9udC1zaXplOjEycHh9I2xvZy1saXN0IC5uYW1le21hcmdpbi1yaWdodDoxLjVlbTtmb250LXdlaWdodDpib2xkfSNsb2ctbGlzdCAudGltZSwjbG9nLWxpc3QgLm5hbWV7Zm9udC1mYW1pbHk6VmVyZGFuYSxUYWhvbWEsJ+W+rui9r+mbhem7kScsJ+Wui+S9kycsc2Fucy1zZXJpZn0jbG9nLWxpc3QgLnRleHR7bGluZS1oZWlnaHQ6MjBweDtmb250LWZhbWlseTpDb25zb2xhcywiQ291cmllciBOZXciLEFyaWFsO2NvbG9yOiM2NjY7cGFkZGluZzo4cHggMTJweDtiYWNrZ3JvdW5kOiNmM2YzZjN9I2xvZy1saXN0IC5yZW1vdmV7dG9wOjA7cmlnaHQ6MTJweDtjb2xvcjojZTY0MzQ2fSN0aGVtZS1saXN0IHNwYW57bWFyZ2luLWxlZnQ6MTJweH0jdGhlbWUtbGlzdCBzcGFuLmZpbGV7Y29sb3I6IzAwNzliY30jdGhlbWUtbGlzdCBzcGFuLmVycm9yLWZpbGV7Y29sb3I6I2M3MzgzYX0jdGhlbWUtbGlzdCBoNXtjdXJzb3I6cG9pbnRlcn0jcmVhZGVyLWxpc3QgbGk+KnttYXJnaW4tcmlnaHQ6MThweH0jcmVhZGVyLWxpc3QgLmVtYWlse2NvbG9yOiM5OTl9I3JlYWRlci1saXN0IC5jb21tZW50c3tmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6MnB4IDZweH1QSwcIZG84qfQcAAD0HAAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAc3RhdGljXGNzc1xjb2RlbWlycm9yLmNzcy8qIEJBU0lDUyAqLwoKLkNvZGVNaXJyb3IgewogICAgLyogU2V0IGhlaWdodCwgd2lkdGgsIGJvcmRlcnMsIGFuZCBnbG9iYWwgZm9udCBwcm9wZXJ0aWVzIGhlcmUgKi8KICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgIk1pY3Jvc29mdCBZYUhlaSIsICJDb3VyaWVyIE5ldyIsIEFyaWFsOwogICAgaGVpZ2h0OiA2NjBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGJvcmRlcjoxcHggc29saWQgIzk5OTsKfQoKLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICAgIC8qIFNldCBzY3JvbGxpbmcgYmVoYXZpb3VyIGhlcmUgKi8KICAgIG92ZXJmbG93OiBhdXRvOwp9CgovKiBQQURESU5HICovCgouQ29kZU1pcnJvci1saW5lcyB7CiAgICBwYWRkaW5nOiA0cHggMDsgLyogVmVydGljYWwgcGFkZGluZyBhcm91bmQgY29udGVudCAqLwp9CgouQ29kZU1pcnJvciBwcmUgewogICAgcGFkZGluZzogMCA0cHg7IC8qIEhvcml6b250YWwgcGFkZGluZyBvZiBjb250ZW50ICovCn0KCi5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IC8qIFRoZSBsaXR0bGUgc3F1YXJlIGJldHdlZW4gSCBhbmQgViBzY3JvbGxiYXJzICovCn0KCi8qIEdVVFRFUiAqLwoKLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5Db2RlTWlycm9yLWxpbmVudW1iZXJzIHsKfQoKLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgICBwYWRkaW5nOiAwIDNweCAwIDVweDsKICAgIG1pbi13aWR0aDogMjBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgY29sb3I6ICM1NTU7CiAgICBsaW5lLWhlaWdodDogMjBweDsKfQoKLyogQ1VSU09SICovCgouQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1jdXJzb3IgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKICAgIHotaW5kZXg6IDM7Cn0KCi8qIFNob3duIHdoZW4gbW92aW5nIGluIGJpLWRpcmVjdGlvbmFsIHRleHQgKi8KLkNvZGVNaXJyb3IgZGl2LkNvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgc2lsdmVyOwp9CgouQ29kZU1pcnJvci5jbS1rZXltYXAtZmF0LWN1cnNvciBkaXYuQ29kZU1pcnJvci1jdXJzb3IgewogICAgd2lkdGg6IGF1dG87CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiAjN2U3OwogICAgei1pbmRleDogMTsKfQoKLyogQ2FuIHN0eWxlIGN1cnNvciBkaWZmZXJlbnQgaW4gb3ZlcndyaXRlIChub24taW5zZXJ0KSBtb2RlICovCi5Db2RlTWlycm9yIGRpdi5Db2RlTWlycm9yLWN1cnNvci5Db2RlTWlycm9yLW92ZXJ3cml0ZSB7Cn0KCi5jbS10YWIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKiBERUZBVUxUIFRIRU1FICovCgouY20tcy1kZWZhdWx0IC5jbS1rZXl3b3JkIHsKICAgIGNvbG9yOiAjNzA4Owp9CgouY20tcy1kZWZhdWx0IC5jbS1hdG9tIHsKICAgIGNvbG9yOiAjMjE5Owp9CgouY20tcy1kZWZhdWx0IC5jbS1udW1iZXIgewogICAgY29sb3I6ICMxNjQ7Cn0KCi5jbS1zLWRlZmF1bHQgLmNtLWRlZiB7CiAgICBjb2xvcjogIzAwZjsKfQoKLmNtLXMtZGVmYXVsdCAuY20tdmFyaWFibGUgewogICAgY29sb3I6IGJsYWNrOwp9CgouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZS0yIHsKICAgIGNvbG9yOiAjMDVhOwp9CgouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZS0zIHsKICAgIGNvbG9yOiAjMDg1Owp9CgouY20tcy1kZWZhdWx0IC5jbS1wcm9wZXJ0eSB7CiAgICBjb2xvcjogYmxhY2s7Cn0KCi5jbS1zLWRlZmF1bHQgLmNtLW9wZXJhdG9yIHsKICAgIGNvbG9yOiBibGFjazsKfQoKLmNtLXMtZGVmYXVsdCAuY20tY29tbWVudCB7CiAgICBjb2xvcjogI2E1MDsKfQoKLmNtLXMtZGVmYXVsdCAuY20tc3RyaW5nIHsKICAgIGNvbG9yOiAjYTExOwp9CgouY20tcy1kZWZhdWx0IC5jbS1zdHJpbmctMiB7CiAgICBjb2xvcjogI2Y1MDsKfQoKLmNtLXMtZGVmYXVsdCAuY20tbWV0YSB7CiAgICBjb2xvcjogIzU1NTsKfQoKLmNtLXMtZGVmYXVsdCAuY20tcXVhbGlmaWVyIHsKICAgIGNvbG9yOiAjNTU1Owp9CgouY20tcy1kZWZhdWx0IC5jbS1idWlsdGluIHsKICAgIGNvbG9yOiAjMzBhOwp9CgouY20tcy1kZWZhdWx0IC5jbS1icmFja2V0IHsKICAgIGNvbG9yOiAjOTk3Owp9CgouY20tcy1kZWZhdWx0IC5jbS10YWcgewogICAgY29sb3I6ICMxNzA7Cn0KCi5jbS1zLWRlZmF1bHQgLmNtLWF0dHJpYnV0ZSB7CiAgICBjb2xvcjogIzAwYzsKfQoKLmNtLXMtZGVmYXVsdCAuY20taGVhZGVyIHsKICAgIGNvbG9yOiBibHVlOwp9CgouY20tcy1kZWZhdWx0IC5jbS1xdW90ZSB7CiAgICBjb2xvcjogIzA5MDsKfQoKLmNtLXMtZGVmYXVsdCAuY20taHIgewogICAgY29sb3I6ICM5OTk7Cn0KCi5jbS1zLWRlZmF1bHQgLmNtLWxpbmsgewogICAgY29sb3I6ICMwMGM7Cn0KCi5jbS1uZWdhdGl2ZSB7CiAgICBjb2xvcjogI2Q0NDsKfQoKLmNtLXBvc2l0aXZlIHsKICAgIGNvbG9yOiAjMjkyOwp9CgouY20taGVhZGVyLCAuY20tc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgouY20tZW0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgouY20tbGluayB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmNtLXMtZGVmYXVsdCAuY20tZXJyb3IgewogICAgY29sb3I6ICNmMDA7Cn0KCi5jbS1pbnZhbGlkY2hhciB7CiAgICBjb2xvcjogI2YwMDsKfQoKZGl2LkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7CiAgICBjb2xvcjogIzBmMDsKfQoKZGl2LkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7CiAgICBjb2xvcjogI2YyMjsKfQoKLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsKICAgIGJhY2tncm91bmQ6ICNlOGYyZmY7Cn0KCi8qIFNUT1AgKi8KCi8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBjb250YWlucyBzdHlsZXMgcmVsYXRlZCB0byB0aGUgbWVjaGFuaWNzIG9mCiAgIHRoZSBlZGl0b3IuIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdG91Y2ggdGhlbS4gKi8KCi5Db2RlTWlycm9yIHsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgY29sb3I6IGJsYWNrOwp9CgouQ29kZU1pcnJvci1zY3JvbGwgewogICAgLyogMzBweCBpcyB0aGUgbWFnaWMgbWFyZ2luIHVzZWQgdG8gaGlkZSB0aGUgZWxlbWVudCdzIHJlYWwgc2Nyb2xsYmFycyAqLwogICAgLyogU2VlIG92ZXJmbG93OiBoaWRkZW4gaW4gLkNvZGVNaXJyb3IgKi8KICAgIG1hcmdpbi1ib3R0b206IC0zMHB4OwogICAgbWFyZ2luLXJpZ2h0OiAtMzBweDsKICAgIHBhZGRpbmctYm90dG9tOiAzMHB4OwogICAgcGFkZGluZy1yaWdodDogMzBweDsKICAgIGhlaWdodDogMTAwJTsKICAgIG91dGxpbmU6IG5vbmU7IC8qIFByZXZlbnQgZHJhZ2dpbmcgZnJvbSBoaWdobGlnaHRpbmcgdGhlIGVsZW1lbnQgKi8KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKfQoKLkNvZGVNaXJyb3Itc2l6ZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgovKiBUaGUgZmFrZSwgdmlzaWJsZSBzY3JvbGxiYXJzLiBVc2VkIHRvIGZvcmNlIHJlZHJhdyBkdXJpbmcgc2Nyb2xsaW5nCiAgIGJlZm9yZSBhY3R1YWxsIHNjcm9sbGluZyBoYXBwZW5zLCB0aHVzIHByZXZlbnRpbmcgc2hha2luZyBhbmQKICAgZmxpY2tlcmluZyBhcnRpZmFjdHMuICovCi5Db2RlTWlycm9yLXZzY3JvbGxiYXIsIC5Db2RlTWlycm9yLWhzY3JvbGxiYXIsIC5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogNjsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5Db2RlTWlycm9yLXZzY3JvbGxiYXIgewogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDA7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KCi5Db2RlTWlycm9yLWhzY3JvbGxiYXIgewogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIG92ZXJmbG93LXg6IHNjcm9sbDsKfQoKLkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlciB7CiAgICByaWdodDogMDsKICAgIGJvdHRvbTogMDsKfQoKLkNvZGVNaXJyb3ItZ3V0dGVyLWZpbGxlciB7CiAgICBsZWZ0OiAwOwogICAgYm90dG9tOiAwOwp9CgouQ29kZU1pcnJvci1ndXR0ZXJzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB0b3A6IDA7CiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDsKICAgIHotaW5kZXg6IDM7Cn0KCi5Db2RlTWlycm9yLWd1dHRlciB7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgaGVpZ2h0OiAxMDAlOwogICAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgcGFkZGluZy1ib3R0b206IDMwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAtMzJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIC8qIEhhY2sgdG8gbWFrZSBJRTcgYmVoYXZlICovCiAgICAqem9vbTogMTsKICAgICpkaXNwbGF5OiBpbmxpbmU7Cn0KCi5Db2RlTWlycm9yLWd1dHRlci1lbHQgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgei1pbmRleDogNDsKfQoKLkNvZGVNaXJyb3ItbGluZXMgewogICAgY3Vyc29yOiB0ZXh0Owp9CgouQ29kZU1pcnJvciBwcmUgewogICAgLyogUmVzZXQgc29tZSBzdHlsZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgcGFnZSBtaWdodCBoYXZlIHNldCAqLwogICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJvcmRlci13aWR0aDogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICBtYXJnaW46IDA7CiAgICBsaW5lLWhlaWdodDogMjBweDsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgei1pbmRleDogMjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9CgouQ29kZU1pcnJvci13cmFwIHByZSB7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBub3JtYWw7Cn0KCi5Db2RlTWlycm9yLWNvZGUgcHJlIHsKICAgIHdpZHRoOiAtd2Via2l0LWZpdC1jb250ZW50OwogICAgd2lkdGg6IC1tb3otZml0LWNvbnRlbnQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7Cn0KCi5Db2RlTWlycm9yLXdyYXAgLkNvZGVNaXJyb3ItY29kZSBwcmUgewogICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgd2lkdGg6IGF1dG87Cn0KCi5Db2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHotaW5kZXg6IDA7Cn0KCi5Db2RlTWlycm9yLWxpbmV3aWRnZXQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMjsKICAgIG92ZXJmbG93OiBhdXRvOwp9CgouQ29kZU1pcnJvci13aWRnZXQgewp9CgouQ29kZU1pcnJvci13cmFwIC5Db2RlTWlycm9yLXNjcm9sbCB7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47Cn0KCi5Db2RlTWlycm9yLW1lYXN1cmUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgouQ29kZU1pcnJvci1tZWFzdXJlIHByZSB7CiAgICBwb3NpdGlvbjogc3RhdGljOwp9CgouQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1jdXJzb3IgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgd2lkdGg6IDA7Cn0KCi5Db2RlTWlycm9yLWZvY3VzZWQgZGl2LkNvZGVNaXJyb3ItY3Vyc29yIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KCi5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6ICNkOWQ5ZDk7Cn0KCi5Db2RlTWlycm9yLWZvY3VzZWQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogI2Q3ZDRmMDsKfQoKLmNtLXNlYXJjaGluZyB7CiAgICBiYWNrZ3JvdW5kOiAjZmZhOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMCwgLjQpOwp9CgovKiBJRTcgaGFjayB0byBwcmV2ZW50IGl0IGZyb20gcmV0dXJuaW5nIGZ1bm55IG9mZnNldFRvcHMgb24gdGhlIHNwYW5zICovCi5Db2RlTWlycm9yIHNwYW4gewogICAgKnZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKfQoKQG1lZGlhIHByaW50IHsKICAgIC8qIEhpZGUgdGhlIGN1cnNvciB3aGVuIHByaW50aW5nICovCiAgICAuQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1jdXJzb3IgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KfQoKLmNtLXMtYmFzZTE2LWRhcmsuQ29kZU1pcnJvciB7CiAgICBiYWNrZ3JvdW5kOiAjMTUxNTE1OwogICAgY29sb3I6ICNlMGUwZTA7Cn0KCi5jbS1zLWJhc2UxNi1kYXJrIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6ICMyMDIwMjAgIWltcG9ydGFudDsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgICBiYWNrZ3JvdW5kOiAjMTUxNTE1OwogICAgYm9yZGVyLXJpZ2h0OiAwcHg7Cn0KCi5jbS1zLWJhc2UxNi1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogICAgY29sb3I6ICM1NTU7Cn0KCi5jbS1zLWJhc2UxNi1kYXJrIC5Db2RlTWlycm9yLWN1cnNvciB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNiMGIwYjAgIWltcG9ydGFudDsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1jb21tZW50IHsKICAgIGNvbG9yOiAjOGY1NTM2Owp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWF0b20gewogICAgY29sb3I6ICNhYTc1OWY7Cn0KCi5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tbnVtYmVyIHsKICAgIGNvbG9yOiAjYWE3NTlmOwp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWF0dHJpYnV0ZSB7CiAgICBjb2xvcjogIzkwYTk1OTsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHsKICAgIGNvbG9yOiAjYWM0MTQyOwp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXN0cmluZyB7CiAgICBjb2xvcjogI2Y0YmY3NTsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS12YXJpYWJsZSB7CiAgICBjb2xvcjogIzkwYTk1OTsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0yIHsKICAgIGNvbG9yOiAjNmE5ZmI1Owp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWRlZiB7CiAgICBjb2xvcjogI2QyODQ0NTsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1icmFja2V0IHsKICAgIGNvbG9yOiAjZTBlMGUwOwp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXRhZyB7CiAgICBjb2xvcjogI2FjNDE0MjsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1saW5rIHsKICAgIGNvbG9yOiAjYWE3NTlmOwp9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWVycm9yIHsKICAgIGJhY2tncm91bmQ6ICNhYzQxNDI7CiAgICBjb2xvcjogI2IwYjBiMDsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsKICAgIGJhY2tncm91bmQ6ICMyRjJGMkYgIWltcG9ydGFudDsKfQoKLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7Cn0KUEsHCCMDNYJOIAAATiAAAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAHN0YXRpY1xjc3NcY29tbW9uLmNzc2JvZHksZGl2LGRsLGR0LGRkLHVsLG9sLGxpLGgxLGgyLGgzLGg0LGg1LGg2LHByZSxjb2RlLGZvcm0sZmllbGRzZXQsbGVnZW5kLGlucHV0LHRleHRhcmVhLHAsYmxvY2txdW90ZSx0aCx0ZHttYXJnaW46MDtwYWRkaW5nOjB9aGVhZGVyLGZvb3RlcixzZWN0aW9uLGFydGljbGUsYXNpZGUsbmF2LGhncm91cCxhZGRyZXNzLGZpZ3VyZSxmaWdjYXB0aW9uLG1lbnUsZGV0YWlsc3tkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH1maWVsZHNldCxpbWd7Ym9yZGVyOjB9YWRkcmVzcyxjYXB0aW9uLGNpdGUsY29kZSxkZm4sZW0sdGgsdmFye2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbH1vbCx1bHtsaXN0LXN0eWxlOm5vbmV9Y2FwdGlvbix0aHt0ZXh0LWFsaWduOmxlZnR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6bm9ybWFsfXE6YmVmb3JlLHE6YWZ0ZXJ7Y29udGVudDonJ31hYmJyLGFjcm9ueW17Ym9yZGVyOjA7Zm9udC12YXJpYW50Om5vcm1hbH1zdXB7dmVydGljYWwtYWxpZ246dGV4dC10b3B9c3Vie3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tfWlucHV0LHRleHRhcmVhLHNlbGVjdHtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXR9bGVnZW5ke2NvbG9yOiMwMDB9aHRtbCxib2R5e2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjMwcHg7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9YXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojMDA3OWJjfWE6aG92ZXJ7Y29sb3I6IzAwNWI5Yn1we21hcmdpbi1ib3R0b206MThweH1oMSxoMixoMyxoNCxoNSxoNntwYWRkaW5nOjEycHggMH1oMXtmb250LXNpemU6MjhweH1oMntmb250LXNpemU6MjRweH1oM3tmb250LXNpemU6MjFweH1oNHtmb250LXNpemU6MTlweH1oNXtmb250LXNpemU6MTZweH1oNntmb250LXNpemU6MTRweH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0ubGVmdHtmbG9hdDpsZWZ0fS5yaWdodHtmbG9hdDpyaWdodH0uYWJzb2x1dGV7cG9zaXRpb246YWJzb2x1dGV9LnJlbGF0aXZle3Bvc2l0aW9uOnJlbGF0aXZlfS5jbGVhcjphZnRlcnt2aXNpYmlsaXR5OmhpZGRlbjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowO2NvbnRlbnQ6IiAiO2NsZWFyOmJvdGg7aGVpZ2h0OjB9LnZlcnRpY2FsLW1pZGRsZXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mYWRlLW91dHtvcGFjaXR5OjB9LmhpZGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmNvbnRhaW5lcnttYXgtd2lkdGg6MTIwMHB4O21hcmdpbjphdXRvfS5jb250YWluZXI5NjB7bWF4LXdpZHRoOjk2MHB4O21hcmdpbjphdXRvfS5ncmlkLTEtMnt3aWR0aDo1MCV9LmdyaWQtMS0ze3dpZHRoOjMzLjMzMzMlfS5ncmlkLTEtNHt3aWR0aDoyNSV9LmdyaWQtMS01e3dpZHRoOjIwJX0uZ3JpZC0xLTZ7d2lkdGg6MTYuNjY2NiV9LmdyaWQtMi0ze3dpZHRoOjY2LjY2NjYlfS5ncmlkLTMtNHt3aWR0aDo3NSV9LmdyaWQtMy01e3dpZHRoOjYwJX0uZ3JpZC00LTV7d2lkdGg6ODAlfS5ncmlkLTUtNnt3aWR0aDo4My4zMzMzJX1pbnB1dCx0ZXh0YXJlYSxzZWxlY3QsYnV0dG9ue2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmfS5mb3JtIGxlZ2VuZHtmb250LXNpemU6MThweDttYXJnaW4tYm90dG9tOjE0cHh9LmZvcm0gbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLmlwdHtwYWRkaW5nOjhweCAxMnB4O2JvcmRlcjoxcHggc29saWQgIzk5OTtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7b3V0bGluZTpub25lO21pbi13aWR0aDoxODBweH0uZm9ybSAuaXB0OmZvY3Vze2JvcmRlci1jb2xvcjojMDA3OWJjfS5mb3JtIC5jaGt7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjJweCA2cHggMCAwO2xpbmUtaGVpZ2h0Om5vcm1hbH0uZm9ybSAuZmllbGR7bWFyZ2luLWJvdHRvbToyNHB4fS5mb3JtIC5pbnZhbGlke21hcmdpbi1yaWdodDoxMnB4fS5mb3JtIC50aXB7Zm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTttYXJnaW4tbGVmdDoxMnB4fS5mb3JtLXZlcnRpY2FsIGxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo4cHh9LmZvcm0tdmVydGljYWwgLmlwdHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uZm9ybS12ZXJ0aWNhbCAuaW52YWxpZHttYXJnaW4tcmlnaHQ6MDttYXJnaW4tdG9wOjZweH0uZm9ybS1hbGlnbiBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NjBweDt0ZXh0LWFsaWduOnJpZ2h0fS5mb3JtLWFsaWduIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5idG57bWluLXdpZHRoOjEyMHB4O2hlaWdodDozNnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5OTk7Y3Vyc29yOnBvaW50ZXJ9YS5idG57bGluZS1oZWlnaHQ6MzZweDtjb2xvcjojZmZmfS5idG4tcmVke2JhY2tncm91bmQtY29sb3I6I2U2NDM0Njtjb2xvcjojZmJmYmZifS5idG4tcmVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2M3MzgzYX0uYnRuLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9LmJ0bi1ibHVlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwNWI5Yn0uYnRuLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifS5idG4tZ3JlZW46aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ5NDYyfS5sYmx7cGFkZGluZzo0cHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Y29sb3I6IzMzMztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LmxibC1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9YS5sYmx7bGluZS1oZWlnaHQ6MjZweH1hLmxibC1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhO2NvbG9yOiNmYmZiZmJ9LmxibC1ibHVle2JhY2tncm91bmQtY29sb3I6IzAwNzliYztjb2xvcjojZmJmYmZifWEubGJsLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjliO2NvbG9yOiNmYmZiZmJ9LmxibC1ncmVlbntiYWNrZ3JvdW5kLWNvbG9yOiM3YWIyNzc7Y29sb3I6I2ZiZmJmYn1hLmxibC1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjI7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLml0ZW17cGFkZGluZzoycHggOHB4O21hcmdpbjowIDZweDtjb2xvcjojMzMzO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjIwcHh9LnBhZ2VyIC5pdGVtIGF7Y29sb3I6IzMzM30ucGFnZXIgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLml0ZW06aG92ZXIgYXtjb2xvcjojZmZmfS5wYWdlciAuY3VycmVudHtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY7Y29sb3I6I2ZiZmJmYjtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LnBhZ2VyIC5jdXJyZW50IGF7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLmN1cnJlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjfS5tYXJrZG93biBoMSwubWFya2Rvd24gaDIsLm1hcmtkb3duIGgzLC5tYXJrZG93biBoNCwubWFya2Rvd24gaDUsLm1hcmtkb3duIGg2e3BhZGRpbmc6MThweCAwIDlweCAwO2ZvbnQtd2VpZ2h0OmJvbGR9Lm1hcmtkb3duIGgxe2ZvbnQtc2l6ZToyNHB4fS5tYXJrZG93biBoMntmb250LXNpemU6MjFweH0ubWFya2Rvd24gaDEsLm1hcmtkb3duIGgye21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfS5tYXJrZG93biBoM3tmb250LXNpemU6MTlweH0ubWFya2Rvd24gaDR7Zm9udC1zaXplOjE4cHh9Lm1hcmtkb3duIGg1e2ZvbnQtc2l6ZToxNnB4fS5tYXJrZG93biBoNntmb250LXNpemU6MTRweH0ubWFya2Rvd24gcHttYXJnaW4tYm90dG9tOjEwcHh9Lm1hcmtkb3duIHVse2xpc3Qtc3R5bGU6ZGlzYyBpbnNpZGV9Lm1hcmtkb3duIG9se2xpc3Qtc3R5bGU6ZGVjaW1hbCBpbnNpZGV9Lm1hcmtkb3duIGNvZGV7Zm9udC1mYW1pbHk6Q29uc29sYXMsIkNvdXJpZXIgTmV3IixBcmlhbH0ubWFya2Rvd24gcCBjb2Rle2NvbG9yOiNjNzM4M2F9Lm1hcmtkb3duIGJsb2NrcXVvdGV7cGFkZGluZzo4cHggMThweDtib3JkZXItbGVmdDo0cHggc29saWQgI2NjYztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9Lm1hcmtkb3duIGJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjB9Lm1hcmtkb3duIHByZSBjb2Rle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE4cHggIWltcG9ydGFudDtwYWRkaW5nOjhweCAxOHB4O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjEycHggMCAxOHB4IDB9Lm1hcmtkb3duIG9sLC5tYXJrZG93biB1bHttYXJnaW46MTJweCAyNHB4fS5tYXJrZG93biBwIGltZ3ttYXgtd2lkdGg6OTklO2hlaWdodDphdXRvO21hcmdpbjowIGF1dG87ZGlzcGxheTpibG9ja30ubWFya2Rvd24gdGFibGV7bWFyZ2luOjEycHggMDt3aWR0aDo5OCV9Lm1hcmtkb3duIHRhYmxlIHRoLC5tYXJrZG93biB0YWJsZSB0ZHtib3JkZXI6MXB4IHNvbGlkICNjY2M7cGFkZGluZzo0cHggMTJweH0ubWFya2Rvd24gdGFibGUgdGhlYWR7YmFja2dyb3VuZDojZjZmNmY2fTo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6OHB4O21hcmdpbi1yaWdodDoycHh9Ojotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkMmQyZDJ9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOiM5ZmEwOWM7d2lkdGg6OHB4fTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDojYjdiOGFkfVBLBwgCIbcNaRUAAGkVAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAABgAAABzdGF0aWNcY3NzXGhpZ2hsaWdodC5jc3MvKg0KDQpTdW5idXJzdC1saWtlIHN0eWxlIChjKSBWYXNpbHkgUG9sb3ZueW92IDx2YXN0QHdoaXRlYW50cy5uZXQ+DQoNCiovDQoNCnByZSBjb2RlIHsNCiAgICBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMC41ZW07DQogICAgYmFja2dyb3VuZDogIzAwMDsgY29sb3I6ICNmOGY4Zjg7DQp9DQoNCnByZSAuY29tbWVudCwNCnByZSAudGVtcGxhdGVfY29tbWVudCwNCnByZSAuamF2YWRvYyB7DQogICAgY29sb3I6ICNhZWFlYWU7DQogICAgZm9udC1zdHlsZTogaXRhbGljOw0KfQ0KDQpwcmUgLmtleXdvcmQsDQpwcmUgLnJ1YnkgLmZ1bmN0aW9uIC5rZXl3b3JkLA0KcHJlIC5yZXF1ZXN0LA0KcHJlIC5zdGF0dXMsDQpwcmUgLm5naW54IC50aXRsZSB7DQogICAgY29sb3I6ICNFMjg5NjQ7DQp9DQoNCnByZSAuZnVuY3Rpb24gLmtleXdvcmQsDQpwcmUgLnN1YiAua2V5d29yZCwNCnByZSAubWV0aG9kLA0KcHJlIC5saXN0IC50aXRsZSB7DQogICAgY29sb3I6ICM5OUNGNTA7DQp9DQoNCnByZSAuc3RyaW5nLA0KcHJlIC50YWcgLnZhbHVlLA0KcHJlIC5jZGF0YSwNCnByZSAuZmlsdGVyIC5hcmd1bWVudCwNCnByZSAuYXR0cl9zZWxlY3RvciwNCnByZSAuYXBhY2hlIC5jYnJhY2tldCwNCnByZSAuZGF0ZSwNCnByZSAudGV4IC5jb21tYW5kLA0KcHJlIC5jb2ZmZWVzY3JpcHQgLmF0dHJpYnV0ZSB7DQogICAgY29sb3I6ICM2NUIwNDI7DQp9DQoNCnByZSAuc3Vic3Qgew0KICAgIGNvbG9yOiAjREFFRkEzOw0KfQ0KDQpwcmUgLnJlZ2V4cCB7DQogICAgY29sb3I6ICNFOUMwNjI7DQp9DQoNCnByZSAudGl0bGUsDQpwcmUgLnN1YiAuaWRlbnRpZmllciwNCnByZSAucGksDQpwcmUgLnRhZywNCnByZSAudGFnIC5rZXl3b3JkLA0KcHJlIC5kZWNvcmF0b3IsDQpwcmUgLnNoZWJhbmcsDQpwcmUgLnByb21wdCB7DQogICAgY29sb3I6ICM4OUJERkY7DQp9DQoNCnByZSAuY2xhc3MgLnRpdGxlLA0KcHJlIC5oYXNrZWxsIC50eXBlLA0KcHJlIC5zbWFsbHRhbGsgLmNsYXNzLA0KcHJlIC5qYXZhZG9jdGFnLA0KcHJlIC55YXJkb2N0YWcsDQpwcmUgLnBocGRvYyB7DQogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQp9DQoNCnByZSAuc3ltYm9sLA0KcHJlIC5ydWJ5IC5zeW1ib2wgLnN0cmluZywNCnByZSAubnVtYmVyIHsNCiAgICBjb2xvcjogIzMzODdDQzsNCn0NCg0KcHJlIC5wYXJhbXMsDQpwcmUgLnZhcmlhYmxlLA0KcHJlIC5jbG9qdXJlIC5hdHRyaWJ1dGUgew0KICAgIGNvbG9yOiAjM0U4N0UzOw0KfQ0KDQpwcmUgLmNzcyAudGFnLA0KcHJlIC5ydWxlcyAucHJvcGVydHksDQpwcmUgLnBzZXVkbywNCnByZSAudGV4IC5zcGVjaWFsIHsNCiAgICBjb2xvcjogI0NEQTg2OTsNCn0NCg0KcHJlIC5jc3MgLmNsYXNzIHsNCiAgICBjb2xvcjogIzlCNzAzRjsNCn0NCg0KcHJlIC5ydWxlcyAua2V5d29yZCB7DQogICAgY29sb3I6ICNDNUFGNzU7DQp9DQoNCnByZSAucnVsZXMgLnZhbHVlIHsNCiAgICBjb2xvcjogI0NGNkE0QzsNCn0NCg0KcHJlIC5jc3MgLmlkIHsNCiAgICBjb2xvcjogIzhCOThBQjsNCn0NCg0KcHJlIC5hbm5vdGF0aW9uLA0KcHJlIC5hcGFjaGUgLnNxYnJhY2tldCwNCnByZSAubmdpbnggLmJ1aWx0X2luIHsNCiAgICBjb2xvcjogIzlCODU5RDsNCn0NCg0KcHJlIC5wcmVwcm9jZXNzb3IsDQpwcmUgLnByYWdtYSB7DQogICAgY29sb3I6ICM4OTk2QTg7DQp9DQoNCnByZSAuaGV4Y29sb3IsDQpwcmUgLmNzcyAudmFsdWUgLm51bWJlciB7DQogICAgY29sb3I6ICNERDdCM0I7DQp9DQoNCnByZSAuY3NzIC5mdW5jdGlvbiB7DQogICAgY29sb3I6ICNEQUQwODU7DQp9DQoNCnByZSAuZGlmZiAuaGVhZGVyLA0KcHJlIC5jaHVuaywNCnByZSAudGV4IC5mb3JtdWxhIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMEUyMjMxOw0KICAgIGNvbG9yOiAjRjhGOEY4Ow0KICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCn0NCg0KcHJlIC5kaWZmIC5jaGFuZ2Ugew0KICAgIGJhY2tncm91bmQtY29sb3I6ICM0QTQxMEQ7DQogICAgY29sb3I6ICNGOEY4Rjg7DQp9DQoNCnByZSAuYWRkaXRpb24gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMyNTNCMjI7DQogICAgY29sb3I6ICNGOEY4Rjg7DQp9DQoNCnByZSAuZGVsZXRpb24gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICM0MjBFMDk7DQogICAgY29sb3I6ICNGOEY4Rjg7DQp9DQoNCnByZSAuY29mZmVlc2NyaXB0IC5qYXZhc2NyaXB0LA0KcHJlIC5qYXZhc2NyaXB0IC54bWwsDQpwcmUgLnRleCAuZm9ybXVsYSwNCnByZSAueG1sIC5qYXZhc2NyaXB0LA0KcHJlIC54bWwgLnZic2NyaXB0LA0KcHJlIC54bWwgLmNzcywNCnByZSAueG1sIC5jZGF0YSB7DQogICAgb3BhY2l0eTogMC41Ow0KfQ0KDQpwcmUgLmdvIC50eXBlbmFtZXsNCiAgICBjb2xvcjogI2ZmYmM1NDsNCn1QSwcIw2jj3l0JAABdCQAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAc3RhdGljXGNzc1xsaW5nLmNzc2JvZHksZGl2LGRsLGR0LGRkLHVsLG9sLGxpLGgxLGgyLGgzLGg0LGg1LGg2LHByZSxjb2RlLGZvcm0sZmllbGRzZXQsbGVnZW5kLGlucHV0LHRleHRhcmVhLHAsYmxvY2txdW90ZSx0aCx0ZHttYXJnaW46MDtwYWRkaW5nOjB9aGVhZGVyLGZvb3RlcixzZWN0aW9uLGFydGljbGUsYXNpZGUsbmF2LGhncm91cCxhZGRyZXNzLGZpZ3VyZSxmaWdjYXB0aW9uLG1lbnUsZGV0YWlsc3tkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH1maWVsZHNldCxpbWd7Ym9yZGVyOjB9YWRkcmVzcyxjYXB0aW9uLGNpdGUsY29kZSxkZm4sZW0sdGgsdmFye2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbH1vbCx1bHtsaXN0LXN0eWxlOm5vbmV9Y2FwdGlvbix0aHt0ZXh0LWFsaWduOmxlZnR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6bm9ybWFsfXE6YmVmb3JlLHE6YWZ0ZXJ7Y29udGVudDonJ31hYmJyLGFjcm9ueW17Ym9yZGVyOjA7Zm9udC12YXJpYW50Om5vcm1hbH1zdXB7dmVydGljYWwtYWxpZ246dGV4dC10b3B9c3Vie3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tfWlucHV0LHRleHRhcmVhLHNlbGVjdHtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXR9bGVnZW5ke2NvbG9yOiMwMDB9aHRtbCxib2R5e2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjMwcHg7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9YXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojMDA3OWJjfWE6aG92ZXJ7Y29sb3I6IzAwNWI5Yn1we21hcmdpbi1ib3R0b206MThweH1oMSxoMixoMyxoNCxoNSxoNntwYWRkaW5nOjEycHggMH1oMXtmb250LXNpemU6MjhweH1oMntmb250LXNpemU6MjRweH1oM3tmb250LXNpemU6MjFweH1oNHtmb250LXNpemU6MTlweH1oNXtmb250LXNpemU6MTZweH1oNntmb250LXNpemU6MTRweH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0ubGVmdHtmbG9hdDpsZWZ0fS5yaWdodHtmbG9hdDpyaWdodH0uYWJzb2x1dGV7cG9zaXRpb246YWJzb2x1dGV9LnJlbGF0aXZle3Bvc2l0aW9uOnJlbGF0aXZlfS5jbGVhcjphZnRlcnt2aXNpYmlsaXR5OmhpZGRlbjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowO2NvbnRlbnQ6IiAiO2NsZWFyOmJvdGg7aGVpZ2h0OjB9LnZlcnRpY2FsLW1pZGRsZXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mYWRlLW91dHtvcGFjaXR5OjB9LmhpZGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmNvbnRhaW5lcnttYXgtd2lkdGg6MTIwMHB4O21hcmdpbjphdXRvfS5jb250YWluZXI5NjB7bWF4LXdpZHRoOjk2MHB4O21hcmdpbjphdXRvfS5ncmlkLTEtMnt3aWR0aDo1MCV9LmdyaWQtMS0ze3dpZHRoOjMzLjMzMzMlfS5ncmlkLTEtNHt3aWR0aDoyNSV9LmdyaWQtMS01e3dpZHRoOjIwJX0uZ3JpZC0xLTZ7d2lkdGg6MTYuNjY2NiV9LmdyaWQtMi0ze3dpZHRoOjY2LjY2NjYlfS5ncmlkLTMtNHt3aWR0aDo3NSV9LmdyaWQtMy01e3dpZHRoOjYwJX0uZ3JpZC00LTV7d2lkdGg6ODAlfS5ncmlkLTUtNnt3aWR0aDo4My4zMzMzJX1pbnB1dCx0ZXh0YXJlYSxzZWxlY3QsYnV0dG9ue2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmfS5mb3JtIGxlZ2VuZHtmb250LXNpemU6MThweDttYXJnaW4tYm90dG9tOjE0cHh9LmZvcm0gbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLmlwdHtwYWRkaW5nOjhweCAxMnB4O2JvcmRlcjoxcHggc29saWQgIzk5OTtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7b3V0bGluZTpub25lO21pbi13aWR0aDoxODBweH0uZm9ybSAuaXB0OmZvY3Vze2JvcmRlci1jb2xvcjojMDA3OWJjfS5mb3JtIC5jaGt7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjJweCA2cHggMCAwO2xpbmUtaGVpZ2h0Om5vcm1hbH0uZm9ybSAuZmllbGR7bWFyZ2luLWJvdHRvbToyNHB4fS5mb3JtIC5pbnZhbGlke21hcmdpbi1yaWdodDoxMnB4fS5mb3JtIC50aXB7Zm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTttYXJnaW4tbGVmdDoxMnB4fS5mb3JtLXZlcnRpY2FsIGxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo4cHh9LmZvcm0tdmVydGljYWwgLmlwdHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uZm9ybS12ZXJ0aWNhbCAuaW52YWxpZHttYXJnaW4tcmlnaHQ6MDttYXJnaW4tdG9wOjZweH0uZm9ybS1hbGlnbiBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NjBweDt0ZXh0LWFsaWduOnJpZ2h0fS5mb3JtLWFsaWduIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5idG57bWluLXdpZHRoOjEyMHB4O2hlaWdodDozNnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5OTk7Y3Vyc29yOnBvaW50ZXJ9YS5idG57bGluZS1oZWlnaHQ6MzZweDtjb2xvcjojZmZmfS5idG4tcmVke2JhY2tncm91bmQtY29sb3I6I2U2NDM0Njtjb2xvcjojZmJmYmZifS5idG4tcmVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2M3MzgzYX0uYnRuLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9LmJ0bi1ibHVlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwNWI5Yn0uYnRuLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifS5idG4tZ3JlZW46aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ5NDYyfS5sYmx7cGFkZGluZzo0cHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Y29sb3I6IzMzMztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LmxibC1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9YS5sYmx7bGluZS1oZWlnaHQ6MjZweH1hLmxibC1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhO2NvbG9yOiNmYmZiZmJ9LmxibC1ibHVle2JhY2tncm91bmQtY29sb3I6IzAwNzliYztjb2xvcjojZmJmYmZifWEubGJsLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjliO2NvbG9yOiNmYmZiZmJ9LmxibC1ncmVlbntiYWNrZ3JvdW5kLWNvbG9yOiM3YWIyNzc7Y29sb3I6I2ZiZmJmYn1hLmxibC1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjI7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLml0ZW17cGFkZGluZzoycHggOHB4O21hcmdpbjowIDZweDtjb2xvcjojMzMzO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjIwcHh9LnBhZ2VyIC5pdGVtIGF7Y29sb3I6IzMzM30ucGFnZXIgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLml0ZW06aG92ZXIgYXtjb2xvcjojZmZmfS5wYWdlciAuY3VycmVudHtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY7Y29sb3I6I2ZiZmJmYjtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LnBhZ2VyIC5jdXJyZW50IGF7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLmN1cnJlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjfS5tYXJrZG93biBoMSwubWFya2Rvd24gaDIsLm1hcmtkb3duIGgzLC5tYXJrZG93biBoNCwubWFya2Rvd24gaDUsLm1hcmtkb3duIGg2e3BhZGRpbmc6MThweCAwIDlweCAwO2ZvbnQtd2VpZ2h0OmJvbGR9Lm1hcmtkb3duIGgxe2ZvbnQtc2l6ZToyNHB4fS5tYXJrZG93biBoMntmb250LXNpemU6MjFweH0ubWFya2Rvd24gaDEsLm1hcmtkb3duIGgye21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfS5tYXJrZG93biBoM3tmb250LXNpemU6MTlweH0ubWFya2Rvd24gaDR7Zm9udC1zaXplOjE4cHh9Lm1hcmtkb3duIGg1e2ZvbnQtc2l6ZToxNnB4fS5tYXJrZG93biBoNntmb250LXNpemU6MTRweH0ubWFya2Rvd24gcHttYXJnaW4tYm90dG9tOjEwcHh9Lm1hcmtkb3duIHVse2xpc3Qtc3R5bGU6ZGlzYyBpbnNpZGV9Lm1hcmtkb3duIG9se2xpc3Qtc3R5bGU6ZGVjaW1hbCBpbnNpZGV9Lm1hcmtkb3duIGNvZGV7Zm9udC1mYW1pbHk6Q29uc29sYXMsIkNvdXJpZXIgTmV3IixBcmlhbH0ubWFya2Rvd24gcCBjb2Rle2NvbG9yOiNjNzM4M2F9Lm1hcmtkb3duIGJsb2NrcXVvdGV7cGFkZGluZzo4cHggMThweDtib3JkZXItbGVmdDo0cHggc29saWQgI2NjYztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9Lm1hcmtkb3duIGJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjB9Lm1hcmtkb3duIHByZSBjb2Rle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE4cHggIWltcG9ydGFudDtwYWRkaW5nOjhweCAxOHB4O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjEycHggMCAxOHB4IDB9Lm1hcmtkb3duIG9sLC5tYXJrZG93biB1bHttYXJnaW46MTJweCAyNHB4fS5tYXJrZG93biBwIGltZ3ttYXgtd2lkdGg6OTklO2hlaWdodDphdXRvO21hcmdpbjowIGF1dG87ZGlzcGxheTpibG9ja30ubWFya2Rvd24gdGFibGV7bWFyZ2luOjEycHggMDt3aWR0aDo5OCV9Lm1hcmtkb3duIHRhYmxlIHRoLC5tYXJrZG93biB0YWJsZSB0ZHtib3JkZXI6MXB4IHNvbGlkICNjY2M7cGFkZGluZzo0cHggMTJweH0ubWFya2Rvd24gdGFibGUgdGhlYWR7YmFja2dyb3VuZDojZjZmNmY2fTo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6OHB4O21hcmdpbi1yaWdodDoycHh9Ojotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkMmQyZDJ9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOiM5ZmEwOWM7d2lkdGg6OHB4fTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDojYjdiOGFkfWh0bWwsYm9keXtiYWNrZ3JvdW5kOiNmM2YzZjN9I2hlYWRlcntiYWNrZ3JvdW5kOiMwMDkzYzQ7bWluLXdpZHRoOjEyMHB4O3BhZGRpbmc6NDBweCAwIDQ4cHggMDtjb2xvcjojZmJmYmZifSNoZWFkZXIgYTpob3Zlcntjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgMCAzcHggIzMzMzstbW96LXRleHQtc2hhZG93OjAgMCAzcHggIzMzMzstd2Via2l0LXRleHQtc2hhZG93OjAgMCAzcHggIzMzM30jaGVhZGVyLWltZ3t3aWR0aDo5NnB4O2hlaWdodDo5NnB4O2JvcmRlci1yYWRpdXM6NTBweDstbW96LWJvcmRlci1yYWRpdXM6NTBweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NTBweH0jaGVhZGVyLWh7bGluZS1oZWlnaHQ6OTRweDtjb2xvcjojZmJmYmZiO3BhZGRpbmc6MDttYXJnaW4tbGVmdDoyNHB4fSNoZWFkZXItaCBhe2NvbG9yOiNmYmZiZmJ9I2hlYWRlci1zdWJ7Y29sb3I6I2YzZjNmMzttYXJnaW4tbGVmdDoxLjJlbTtmb250LXNpemU6MTZweH0jbmF2e2xpbmUtaGVpZ2h0OjkwcHh9I25hdiBsaXtsaW5lLWhlaWdodDo1MHB4O21hcmdpbi1sZWZ0OjQ0cHh9I25hdiBsaSBhe2ZvbnQtc2l6ZToxOHB4O2NvbG9yOiNmM2YzZjM7ZGlzcGxheTpibG9ja30jbmF2IGxpIGE6aG92ZXJ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIDAgM3B4ICMzMzM7LW1vei10ZXh0LXNoYWRvdzowIDAgM3B4ICMzMzM7LXdlYmtpdC10ZXh0LXNoYWRvdzowIDAgM3B4ICMzMzN9I2Zvb3RlcntwYWRkaW5nOjMwcHggNDBweDtjb2xvcjojOTk5fSNtYWlue21hcmdpbjozMHB4IGF1dG99I2dvLXRvcHtib3R0b206NTBweDtyaWdodDo0MHB4O3Bvc2l0aW9uOmZpeGVkO2NvbG9yOiNmZmY7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjhweDtvcGFjaXR5Oi40fSNhcnRpY2xlLWNvbnRhaW5lcntoZWlnaHQ6MTAwJX0jYXJ0aWNsZS1jb250YWluZXIgLmNvbW1lbnRzLCNhcnRpY2xlLWNvbnRhaW5lciAudmlld3N7Zm9udC1mYW1pbHk6VmVyZGFuYSxUYWhvbWEsJ+W+rui9r+mbhem7kScsJ+Wui+S9kycsc2Fucy1zZXJpZn0jYXJ0aWNsZS1jb250YWluZXIgLmNvbW1lbnRze3dpZHRoOjU2cHg7aGVpZ2h0OjU2cHg7Ym9yZGVyLXJhZGl1czozNnB4Oy1tb3otYm9yZGVyLXJhZGl1czozNnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozNnB4O2xpbmUtaGVpZ2h0OjU2cHg7Zm9udC1zaXplOjI0cHg7cGFkZGluZzowO21hcmdpbi10b3A6NDBweDttYXJnaW4tbGVmdDo4cHg7Ym9yZGVyOjZweCBzb2xpZCAjZmZmO2JveC1zaGFkb3c6MCAwIDJweCAjOTk5Oy1tb3otYm94LXNoYWRvdzowIDAgMnB4ICM5OTk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAycHggIzk5OX0jYXJ0aWNsZS1jb250YWluZXIgLmNvbW1lbnRzIGF7Y29sb3I6I2ZmZn0jYXJ0aWNsZS1jb250YWluZXIgLmNvbW1lbnRzOmhvdmVye2JveC1zaGFkb3c6MCAwIDRweCAjNjY2Oy1tb3otYm94LXNoYWRvdzowIDAgNHB4ICM2NjY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCA0cHggIzY2Nn0jYXJ0aWNsZS1jb250YWluZXIgLnZpZXdze3RvcDoxNHB4O2xlZnQ6MDt3aWR0aDozNnB4O2hlaWdodDozNnB4O2xpbmUtaGVpZ2h0OjM2cHg7Ym9yZGVyLXJhZGl1czozMHB4Oy1tb3otYm9yZGVyLXJhZGl1czozMHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozMHB4O3BhZGRpbmc6MDtib3JkZXI6NHB4IHNvbGlkICNmZmY7Ym94LXNoYWRvdzowIDAgMnB4ICM5OTk7LW1vei1ib3gtc2hhZG93OjAgMCAycHggIzk5OTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCAjOTk5fSNhcnRpY2xlLWNvbnRhaW5lciAubWFpbnttYXJnaW4tbGVmdDoxMTZweDtib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7Ym94LXNoYWRvdzowIDFweCAycHggI2JiYjstbW96LWJveC1zaGFkb3c6MCAxcHggMnB4ICNiYmI7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAjYmJiO2JhY2tncm91bmQ6I2ZmZjtwYWRkaW5nOjE4cHggMjRweH0jYXJ0aWNsZS1jb250YWluZXIgLm1haW46YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztib3JkZXI6MTFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQtY29sb3I6I2ZmZjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjNweDtsZWZ0Oi0yMnB4fSNhcnRpY2xlLWNvbnRhaW5lciAubWFpbiBoMy50aXRsZXtmb250LXNpemU6MjhweDtwYWRkaW5nLWJvdHRvbToyNHB4fSNhcnRpY2xlLWNvbnRhaW5lciAubWFpbiAudGltZS1pbmZve2NvbG9yOiM5OTk7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmctYm90dG9tOjIwcHg7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGQ7dGV4dC1pbmRlbnQ6MWVtO2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWZ9I2FydGljbGUtY29udGFpbmVyIGFydGljbGV7bWFyZ2luLWJvdHRvbTo1MHB4fSNhcnRpY2xlLWNvbnRhaW5lciAuYXJ0aWNsZS1zaW5nbGUgLm1haW57bWFyZ2luLWxlZnQ6MH0jYXJ0aWNsZS1jb250YWluZXIgLmFydGljbGUtc2luZ2xlIC5tYWluOmJlZm9yZXtkaXNwbGF5Om5vbmV9I2FydGljbGUtY29udGFpbmVyIC5hcnRpY2xlLXNpbmdsZSAubWV0YXtyaWdodDo0NHB4O3RvcDotMzZweH0jYXJ0aWNsZS1jb250YWluZXIgLmFydGljbGUtc2luZ2xlIC52aWV3c3t3aWR0aDo1NnB4O2hlaWdodDo1NnB4O2JvcmRlci1yYWRpdXM6MzZweDstbW96LWJvcmRlci1yYWRpdXM6MzZweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MzZweDtsaW5lLWhlaWdodDo1NnB4O2ZvbnQtc2l6ZToyNHB4O3BhZGRpbmc6MDtib3JkZXI6NnB4IHNvbGlkICNmZmZ9I2FydGljbGUtY29udGFpbmVyIC50YWcgYXttYXJnaW46MCA0cHg7Y29sb3I6Izk5OX0jYXJ0aWNsZS1wYWdlcnttYXJnaW4tbGVmdDoxMTZweH0jYXJ0aWNsZS1wYWdlciAuaXRlbXttYXJnaW46MDtjb2xvcjojZmZmO2JhY2tncm91bmQ6Izk5OTtwYWRkaW5nOjEycHggMThweDtib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHh9I2FydGljbGUtcGFnZXIgLml0ZW06aG92ZXJ7YmFja2dyb3VuZDojMDA3OWJjfSNjb21tZW50e2JvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDtib3gtc2hhZG93OjAgMXB4IDJweCAjYmJiOy1tb3otYm94LXNoYWRvdzowIDFweCAycHggI2JiYjstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4ICNiYmI7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6MThweCAyNHB4fSNjb21tZW50IC5tZXRhe3JpZ2h0Oi0yNHB4O3RvcDotMzBweH0jY29tbWVudCAubWV0YSAuY29tbWVudHN7bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjB9I2NvbW1lbnQtbGlzdCAuY29tbWVudHttYXJnaW4tYm90dG9tOjMycHh9I2NvbW1lbnQtbGlzdCAuYy1hdmF0YXJ7bWFyZ2luLXJpZ2h0OjE4cHg7Ym9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4O21hcmdpbi10b3A6NnB4fSNjb21tZW50LWxpc3QgLmMtbWV0YSBwe21hcmdpbi1ib3R0b206MH0jY29tbWVudC1saXN0IC5jLW1ldGEgLmMtdGltZXtjb2xvcjojOTk5O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWZ9I2NvbW1lbnQtbGlzdCAuYy1tZXRhIC5jLWF1dGhvcntmb250LXNpemU6MTZweDtjb2xvcjojMzMzO2Rpc3BsYXk6YmxvY2t9I2NvbW1lbnQtbGlzdCAuYy1tZXRhIC5jLWF1dGhvcjpob3Zlcntjb2xvcjojMDA1YjlifSNjb21tZW50LWxpc3QgLmMtbWV0YSAuYy1yZXBseXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2RkZDtwYWRkaW5nOjNweCAxMHB4fSNjb21tZW50LWxpc3QgLmMtbWV0YSAuYy1yZXBseTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmN9I2NvbW1lbnQtbGlzdCAuYy1jb250ZW50e3BhZGRpbmctdG9wOjRweH0jY29tbWVudC1saXN0IC5jLWNoZWNre2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiNlNjQzNDY7bWFyZ2luLWxlZnQ6MTJweH0jY29tbWVudC1saXN0IC5jLXAtbWR7bWFyZ2luLXRvcDoxMnB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Y29sb3I6IzY2Nn0jY29tbWVudC1zaG93e21hcmdpbi1ib3R0b206MzJweH0jY29tbWVudC10aXRsZXttYXJnaW4tYm90dG9tOjIwcHg7cGFkZGluZy1ib3R0b206MjBweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jY29tbWVudC1mb3Jte3dpZHRoOjgwJTttYXJnaW46YXV0bzttYXJnaW4tYm90dG9tOjMwcHh9I2NvbW1lbnQtZm9ybSAuYy1pbmZve3dpZHRoOjI2JX0jY29tbWVudC1mb3JtIC5jLWluZm8gLmlwdHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4td2lkdGg6MH0jY29tbWVudC1mb3JtIC5jLWNvbnRlbnR7d2lkdGg6NzAlfSNjb21tZW50LWZvcm0gLmMtYXZhdGFye2JvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDttYXJnaW4tdG9wOjZweDt3aWR0aDo1MHB4fSNjb21tZW50LWZvcm0gLnJlcGx5LW1ke21hcmdpbi1ib3R0b206MTZweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiM2NjZ9I2NvbW1lbnQtZm9ybSAuY2FuY2VsLXJlcGx5e2JvcmRlcjpub25lO21hcmdpbi1sZWZ0OjE4cHg7ZGlzcGxheTpub25lfSNjb21tZW50LWZvcm0gLmNhbmNlbC1yZXBseTpob3ZlcntjdXJzb3I6cG9pbnRlcn0jY29tbWVudC1jb250ZW50e3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxODBweDtyZXNpemU6bm9uZX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTYwcHgpey5jb250YWluZXI5NjB7cGFkZGluZzowIDI0cHg7d2lkdGg6YXV0b319QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2MHB4KXsuY29udGFpbmVyOTYwe3BhZGRpbmc6MCAyNHB4O3dpZHRoOmF1dG99I2FydGljbGUtY29udGFpbmVyIC5tYWlue21hcmdpbi1sZWZ0OjB9I2FydGljbGUtY29udGFpbmVyIC5tZXRhe2Rpc3BsYXk6bm9uZX0jYXJ0aWNsZS1jb250YWluZXIgLm1haW46YmVmb3Jle2Rpc3BsYXk6bm9uZX0jY29tbWVudC1mb3JtIC5jLWluZm8sI2NvbW1lbnQtZm9ybSAuYy1jb250ZW50e3dpZHRoOjEwMCU7ZmxvYXQ6bGVmdH0jY29tbWVudC1mb3JtIC5jLWluZm97dGV4dC1hbGlnbjpsZWZ0fSNuYXYsI2hlYWRlci1oe2xpbmUtaGVpZ2h0OjUwcHh9I2Zvb3RlciBzcGFue2Zsb2F0Om5vbmU7dGV4dC1hbGlnbjpjZW50ZXJ9I2FydGljbGUtcGFnZXJ7bWFyZ2luLWxlZnQ6MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjU2MHB4KXsuY29udGFpbmVyOTYwe3BhZGRpbmc6MDt3aWR0aDphdXRvfSNhcnRpY2xlLXBhZ2Vye21hcmdpbjowIDEycHh9I2hlYWRlci1oe21hcmdpbi1sZWZ0OjI0cHh9I2hlYWRlci1pbWd7ZGlzcGxheTpub25lfSNjb21tZW50LWZvcm17d2lkdGg6MTAwJX0jbmF2e2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MjRweH0jbmF2IGxpe21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjQ0cHh9I2Zvb3RlciBzcGFue2Zsb2F0Om5vbmU7ZGlzcGxheTpibG9ja319QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQ4MHB4KXsjaGVhZGVyLXN1YntkaXNwbGF5Om5vbmV9fVBLBwgVjEFXvCsAALwrAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAABQAAABzdGF0aWNcY3NzXHNhYmVyLmNzc2JvZHksZGl2LGRsLGR0LGRkLHVsLG9sLGxpLGgxLGgyLGgzLGg0LGg1LGg2LHByZSxjb2RlLGZvcm0sZmllbGRzZXQsbGVnZW5kLGlucHV0LHRleHRhcmVhLHAsYmxvY2txdW90ZSx0aCx0ZHttYXJnaW46MDtwYWRkaW5nOjB9aGVhZGVyLGZvb3RlcixzZWN0aW9uLGFydGljbGUsYXNpZGUsbmF2LGhncm91cCxhZGRyZXNzLGZpZ3VyZSxmaWdjYXB0aW9uLG1lbnUsZGV0YWlsc3tkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH1maWVsZHNldCxpbWd7Ym9yZGVyOjB9YWRkcmVzcyxjYXB0aW9uLGNpdGUsY29kZSxkZm4sZW0sdGgsdmFye2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbH1vbCx1bHtsaXN0LXN0eWxlOm5vbmV9Y2FwdGlvbix0aHt0ZXh0LWFsaWduOmxlZnR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6bm9ybWFsfXE6YmVmb3JlLHE6YWZ0ZXJ7Y29udGVudDonJ31hYmJyLGFjcm9ueW17Ym9yZGVyOjA7Zm9udC12YXJpYW50Om5vcm1hbH1zdXB7dmVydGljYWwtYWxpZ246dGV4dC10b3B9c3Vie3ZlcnRpY2FsLWFsaWduOnRleHQtYm90dG9tfWlucHV0LHRleHRhcmVhLHNlbGVjdHtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXR9bGVnZW5ke2NvbG9yOiMwMDB9aHRtbCxib2R5e2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjMwcHg7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9YXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojMDA3OWJjfWE6aG92ZXJ7Y29sb3I6IzAwNWI5Yn1we21hcmdpbi1ib3R0b206MThweH1oMSxoMixoMyxoNCxoNSxoNntwYWRkaW5nOjEycHggMH1oMXtmb250LXNpemU6MjhweH1oMntmb250LXNpemU6MjRweH1oM3tmb250LXNpemU6MjFweH1oNHtmb250LXNpemU6MTlweH1oNXtmb250LXNpemU6MTZweH1oNntmb250LXNpemU6MTRweH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0ubGVmdHtmbG9hdDpsZWZ0fS5yaWdodHtmbG9hdDpyaWdodH0uYWJzb2x1dGV7cG9zaXRpb246YWJzb2x1dGV9LnJlbGF0aXZle3Bvc2l0aW9uOnJlbGF0aXZlfS5jbGVhcjphZnRlcnt2aXNpYmlsaXR5OmhpZGRlbjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowO2NvbnRlbnQ6IiAiO2NsZWFyOmJvdGg7aGVpZ2h0OjB9LnZlcnRpY2FsLW1pZGRsZXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmlubGluZXtkaXNwbGF5OmlubGluZX0uaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5mYWRlLW91dHtvcGFjaXR5OjB9LmhpZGV7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmNvbnRhaW5lcnttYXgtd2lkdGg6MTIwMHB4O21hcmdpbjphdXRvfS5jb250YWluZXI5NjB7bWF4LXdpZHRoOjk2MHB4O21hcmdpbjphdXRvfS5ncmlkLTEtMnt3aWR0aDo1MCV9LmdyaWQtMS0ze3dpZHRoOjMzLjMzMzMlfS5ncmlkLTEtNHt3aWR0aDoyNSV9LmdyaWQtMS01e3dpZHRoOjIwJX0uZ3JpZC0xLTZ7d2lkdGg6MTYuNjY2NiV9LmdyaWQtMi0ze3dpZHRoOjY2LjY2NjYlfS5ncmlkLTMtNHt3aWR0aDo3NSV9LmdyaWQtMy01e3dpZHRoOjYwJX0uZ3JpZC00LTV7d2lkdGg6ODAlfS5ncmlkLTUtNnt3aWR0aDo4My4zMzMzJX1pbnB1dCx0ZXh0YXJlYSxzZWxlY3QsYnV0dG9ue2ZvbnQtZmFtaWx5OlVidW50dSxDb25zb2xhcywiTWljcm9zb2Z0IFlhSGVpIixWZXJkYW5hLFRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmfS5mb3JtIGxlZ2VuZHtmb250LXNpemU6MThweDttYXJnaW4tYm90dG9tOjE0cHh9LmZvcm0gbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLmlwdHtwYWRkaW5nOjhweCAxMnB4O2JvcmRlcjoxcHggc29saWQgIzk5OTtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7b3V0bGluZTpub25lO21pbi13aWR0aDoxODBweH0uZm9ybSAuaXB0OmZvY3Vze2JvcmRlci1jb2xvcjojMDA3OWJjfS5mb3JtIC5jaGt7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjJweCA2cHggMCAwO2xpbmUtaGVpZ2h0Om5vcm1hbH0uZm9ybSAuZmllbGR7bWFyZ2luLWJvdHRvbToyNHB4fS5mb3JtIC5pbnZhbGlke21hcmdpbi1yaWdodDoxMnB4fS5mb3JtIC50aXB7Zm9udC1zaXplOjEzcHg7Y29sb3I6Izk5OTttYXJnaW4tbGVmdDoxMnB4fS5mb3JtLXZlcnRpY2FsIGxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo4cHh9LmZvcm0tdmVydGljYWwgLmlwdHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uZm9ybS12ZXJ0aWNhbCAuaW52YWxpZHttYXJnaW4tcmlnaHQ6MDttYXJnaW4tdG9wOjZweH0uZm9ybS1hbGlnbiBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NjBweDt0ZXh0LWFsaWduOnJpZ2h0fS5mb3JtLWFsaWduIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5idG57bWluLXdpZHRoOjEyMHB4O2hlaWdodDozNnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5OTk7Y3Vyc29yOnBvaW50ZXJ9YS5idG57bGluZS1oZWlnaHQ6MzZweDtjb2xvcjojZmZmfS5idG4tcmVke2JhY2tncm91bmQtY29sb3I6I2U2NDM0Njtjb2xvcjojZmJmYmZifS5idG4tcmVkOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2M3MzgzYX0uYnRuLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9LmJ0bi1ibHVlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwNWI5Yn0uYnRuLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifS5idG4tZ3JlZW46aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjQ5NDYyfS5sYmx7cGFkZGluZzo0cHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Y29sb3I6IzMzMztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LmxibC1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9YS5sYmx7bGluZS1oZWlnaHQ6MjZweH1hLmxibC1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhO2NvbG9yOiNmYmZiZmJ9LmxibC1ibHVle2JhY2tncm91bmQtY29sb3I6IzAwNzliYztjb2xvcjojZmJmYmZifWEubGJsLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjliO2NvbG9yOiNmYmZiZmJ9LmxibC1ncmVlbntiYWNrZ3JvdW5kLWNvbG9yOiM3YWIyNzc7Y29sb3I6I2ZiZmJmYn1hLmxibC1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjI7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLml0ZW17cGFkZGluZzoycHggOHB4O21hcmdpbjowIDZweDtjb2xvcjojMzMzO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjIwcHh9LnBhZ2VyIC5pdGVtIGF7Y29sb3I6IzMzM30ucGFnZXIgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLml0ZW06aG92ZXIgYXtjb2xvcjojZmZmfS5wYWdlciAuY3VycmVudHtiYWNrZ3JvdW5kLWNvbG9yOiM2NjY7Y29sb3I6I2ZiZmJmYjtib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9LnBhZ2VyIC5jdXJyZW50IGF7Y29sb3I6I2ZiZmJmYn0ucGFnZXIgLmN1cnJlbnQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjfS5tYXJrZG93biBoMSwubWFya2Rvd24gaDIsLm1hcmtkb3duIGgzLC5tYXJrZG93biBoNCwubWFya2Rvd24gaDUsLm1hcmtkb3duIGg2e3BhZGRpbmc6MThweCAwIDlweCAwO2ZvbnQtd2VpZ2h0OmJvbGR9Lm1hcmtkb3duIGgxe2ZvbnQtc2l6ZToyNHB4fS5tYXJrZG93biBoMntmb250LXNpemU6MjFweH0ubWFya2Rvd24gaDEsLm1hcmtkb3duIGgye21hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfS5tYXJrZG93biBoM3tmb250LXNpemU6MTlweH0ubWFya2Rvd24gaDR7Zm9udC1zaXplOjE4cHh9Lm1hcmtkb3duIGg1e2ZvbnQtc2l6ZToxNnB4fS5tYXJrZG93biBoNntmb250LXNpemU6MTRweH0ubWFya2Rvd24gcHttYXJnaW4tYm90dG9tOjEwcHh9Lm1hcmtkb3duIHVse2xpc3Qtc3R5bGU6ZGlzYyBpbnNpZGV9Lm1hcmtkb3duIG9se2xpc3Qtc3R5bGU6ZGVjaW1hbCBpbnNpZGV9Lm1hcmtkb3duIGNvZGV7Zm9udC1mYW1pbHk6Q29uc29sYXMsIkNvdXJpZXIgTmV3IixBcmlhbH0ubWFya2Rvd24gcCBjb2Rle2NvbG9yOiNjNzM4M2F9Lm1hcmtkb3duIGJsb2NrcXVvdGV7cGFkZGluZzo4cHggMThweDtib3JkZXItbGVmdDo0cHggc29saWQgI2NjYztiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmJ9Lm1hcmtkb3duIGJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjB9Lm1hcmtkb3duIHByZSBjb2Rle2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE4cHggIWltcG9ydGFudDtwYWRkaW5nOjhweCAxOHB4O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjEycHggMCAxOHB4IDB9Lm1hcmtkb3duIG9sLC5tYXJrZG93biB1bHttYXJnaW46MTJweCAyNHB4fS5tYXJrZG93biBwIGltZ3ttYXgtd2lkdGg6OTklO2hlaWdodDphdXRvO21hcmdpbjowIGF1dG87ZGlzcGxheTpibG9ja30ubWFya2Rvd24gdGFibGV7bWFyZ2luOjEycHggMDt3aWR0aDo5OCV9Lm1hcmtkb3duIHRhYmxlIHRoLC5tYXJrZG93biB0YWJsZSB0ZHtib3JkZXI6MXB4IHNvbGlkICNjY2M7cGFkZGluZzo0cHggMTJweH0ubWFya2Rvd24gdGFibGUgdGhlYWR7YmFja2dyb3VuZDojZjZmNmY2fTo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6OHB4O21hcmdpbi1yaWdodDoycHh9Ojotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkMmQyZDJ9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOiM5ZmEwOWM7d2lkdGg6OHB4fTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDojYjdiOGFkfWh0bWwsYm9keXtiYWNrZ3JvdW5kOiNmOWY5Zjl9I2hlYWRlcntiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDAgNHB4ICM2NjY7bGluZS1oZWlnaHQ6NjBweDtwYWRkaW5nOjEycHggMCAxOHB4IDA7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTt0b3A6MDt6LWluZGV4Ojk5fSNoZWFkZXItaW1ne3dpZHRoOjYwcHg7aGVpZ2h0OjYwcHg7bWFyZ2luLXJpZ2h0OjI0cHg7Ym9yZGVyLXJhZGl1czozMHB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0jaGVhZGVyLWgsI2hlYWRlci1zdWJ7cGFkZGluZzowIDE4cHggMCAwfSNoZWFkZXItc3Vie2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiM5OTl9I25hdnttYXJnaW4tcmlnaHQ6LTE4cHh9I25hdiBsaSBhe21hcmdpbi1sZWZ0OjI0cHg7cGFkZGluZzowIDE4cHg7Zm9udC1zaXplOjE1cHh9I25hdiBsaSBhOmhvdmVye3BhZGRpbmc6NHB4IDEycHg7YmFja2dyb3VuZC1jb2xvcjojY2NjO2NvbG9yOiMzMzM7Ym9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQtY29sb3I6IzAwNzliYztjb2xvcjojZmJmYmZiO3BhZGRpbmc6NnB4IDE4cHh9I2Zvb3RlcntwYWRkaW5nOjMwcHggNDBweDtjb2xvcjojOTk5fSNtYWlue21hcmdpbi10b3A6MTMycHg7bWFyZ2luLWJvdHRvbTo0OHB4fSNnby10b3B7Ym90dG9tOjUwcHg7cmlnaHQ6NDBweDtwb3NpdGlvbjpmaXhlZDtjb2xvcjojZmZmO3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo4cHg7b3BhY2l0eTouNH0jYXJ0aWNsZS1jb250YWluZXIgYXJ0aWNsZXttYXJnaW4tYm90dG9tOjQwcHg7cGFkZGluZy1ib3R0b206NDBweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2JiYjttYXJnaW4tYm90dG9tOjUwcHh9I2FydGljbGUtY29udGFpbmVyIC50YWctYmFubmVye2ZvbnQtc2l6ZToxNnB4O21hcmdpbi1ib3R0b206MjBweDtwYWRkaW5nLWJvdHRvbToyMHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjYmJiO21hcmdpbi1ib3R0b206MjhweH0jYXJ0aWNsZS1jb250YWluZXIgLm1ldGEgLmNvbW1lbnRze21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjhweDttYXJnaW4tcmlnaHQ6MThweDtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmO3BhZGRpbmctYm90dG9tOjJweH0jYXJ0aWNsZS1jb250YWluZXIgLm1ldGEgLmNvbW1lbnRzIGF7Y29sb3I6I2ZmZjtmb250LXNpemU6MThweDtkaXNwbGF5OmJsb2NrO2N1cnNvcjpwb2ludGVyfSNhcnRpY2xlLWNvbnRhaW5lciAubWV0YSAudmlld3N7dG9wOi04cHg7bGVmdDotMTJweDtwYWRkaW5nOjJweCA2cHg7bGluZS1oZWlnaHQ6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmO21hcmdpbi1ib3R0b206MH0jYXJ0aWNsZS1jb250YWluZXIgLnRpdGxle21hcmdpbi1ib3R0b206MjRweDtwYWRkaW5nLWJvdHRvbToyNHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkO2ZvbnQtc2l6ZToyNHB4fSNhcnRpY2xlLWNvbnRhaW5lciAuY29udGVudHttYXJnaW4tdG9wOi0xMnB4fSNhcnRpY2xlLWNvbnRhaW5lciAuaW5mb3ttYXJnaW4tYm90dG9tOjA7Y29sb3I6Izk5OTtmb250LXNpemU6MTJweH0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8gc3Bhbntib3JkZXItcmlnaHQ6MXB4IGRhc2hlZCAjOTk5O3BhZGRpbmctcmlnaHQ6MTJweDttYXJnaW4tcmlnaHQ6MTJweH0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8gLnRhZyBhe21hcmdpbi1sZWZ0OjRweH0jYXJ0aWNsZS1jb250YWluZXIgLmFydGljbGUtc2luZ2xlIGgzLnRpdGxle3BhZGRpbmctdG9wOjB9I2FydGljbGUtY29udGFpbmVyIC5hcnRpY2xlLXNpbmdsZSAudmlld3N7Y29sb3I6I2ZmZjtmb250LXNpemU6MThweH0jYXJ0aWNsZS1wYWdlciBhe21hcmdpbjowfSNhcnRpY2xlLXBhZ2VyIGE6aG92ZXJ7Y29sb3I6I2ZiZmJmYn0jYXJ0aWNsZS1zaWRlYmFyIC5zaWRlYmFye21hcmdpbi1ib3R0b206MjRweH0jYXJ0aWNsZS1zaWRlYmFyIC5zaWRlYmFyIC50aXRsZXtwYWRkaW5nLXRvcDowfSNwb3AtYXJ0aWNsZS1zaWRlYmFyIC5saXN0IGxpe21hcmdpbi1ib3R0b206OHB4O3BhZGRpbmctYm90dG9tOjhweDtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgI2RkZH0jcG9wLWFydGljbGUtc2lkZWJhciAucG9wLW51bXtwYWRkaW5nOjRweDttYXJnaW4tbGVmdDoxMnB4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9I3JlY2VudC1jb21tZW50LXNpZGViYXIgLmxpc3QgbGl7bWFyZ2luLWJvdHRvbTo4cHg7cGFkZGluZy1ib3R0b206OHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfSNyZWNlbnQtY29tbWVudC1zaWRlYmFyIC5hdXRob3J7cGFkZGluZzo0cHggNnB4O21hcmdpbi1yaWdodDo2cHh9I2NvbW1lbnQgaDR7cGFkZGluZy10b3A6MH0jY29tbWVudCAuY29tbWVudHMgYXtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxOHB4fSNjb21tZW50LWxpc3QgLmNvbW1lbnR7bWFyZ2luLWJvdHRvbTozMnB4fSNjb21tZW50LWxpc3QgLmMtYXZhdGFye21hcmdpbi1yaWdodDoxOHB4O2JvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDttYXJnaW4tdG9wOjZweH0jY29tbWVudC1saXN0IC5jLW1ldGEgcHttYXJnaW4tYm90dG9tOjB9I2NvbW1lbnQtbGlzdCAuYy1tZXRhIC5jLXRpbWV7Y29sb3I6Izk5OTtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNjb21tZW50LWxpc3QgLmMtbWV0YSAuYy1hdXRob3J7Zm9udC1zaXplOjE2cHg7Y29sb3I6IzMzMztkaXNwbGF5OmJsb2NrfSNjb21tZW50LWxpc3QgLmMtbWV0YSAuYy1hdXRob3I6aG92ZXJ7Y29sb3I6IzAwNWI5Yn0jY29tbWVudC1saXN0IC5jLW1ldGEgLmMtcmVwbHl7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNkZGQ7cGFkZGluZzozcHggMTBweH0jY29tbWVudC1saXN0IC5jLW1ldGEgLmMtcmVwbHk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjfSNjb21tZW50LWxpc3QgLmMtY29udGVudHtwYWRkaW5nLXRvcDo0cHh9I2NvbW1lbnQtbGlzdCAuYy1jaGVja3tmb250LXNpemU6MTNweDtjb2xvcjojZTY0MzQ2O21hcmdpbi1sZWZ0OjEycHh9I2NvbW1lbnQtbGlzdCAuYy1wLW1ke21hcmdpbi10b3A6MTJweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiM2NjZ9I2NvbW1lbnQtc2hvd3ttYXJnaW4tYm90dG9tOjMycHh9I2NvbW1lbnQtdGl0bGV7bWFyZ2luLWJvdHRvbToyMHB4O3BhZGRpbmctYm90dG9tOjIwcHg7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGR9I2NvbW1lbnQtZm9ybXt3aWR0aDo4MCU7bWFyZ2luOmF1dG87bWFyZ2luLWJvdHRvbTozMHB4fSNjb21tZW50LWZvcm0gLmMtaW5mb3t3aWR0aDoyNiV9I2NvbW1lbnQtZm9ybSAuYy1pbmZvIC5pcHR7d2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLXdpZHRoOjB9I2NvbW1lbnQtZm9ybSAuYy1jb250ZW50e3dpZHRoOjcwJX0jY29tbWVudC1mb3JtIC5jLWF2YXRhcntib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7bWFyZ2luLXRvcDo2cHg7d2lkdGg6NTBweH0jY29tbWVudC1mb3JtIC5yZXBseS1tZHttYXJnaW4tYm90dG9tOjE2cHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojNjY2fSNjb21tZW50LWZvcm0gLmNhbmNlbC1yZXBseXtib3JkZXI6bm9uZTttYXJnaW4tbGVmdDoxOHB4O2Rpc3BsYXk6bm9uZX0jY29tbWVudC1mb3JtIC5jYW5jZWwtcmVwbHk6aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9I2NvbW1lbnQtY29udGVudHt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtoZWlnaHQ6MTgwcHg7cmVzaXplOm5vbmV9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjEyNDhweCl7LmNvbnRhaW5lcntwYWRkaW5nOjAgMjRweDt3aWR0aDphdXRvfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTYwcHgpey5jb250YWluZXI5NjB7cGFkZGluZzowIDI0cHg7d2lkdGg6YXV0b30jYXJ0aWNsZS1jb250YWluZXIubGVmdHt3aWR0aDoxMDAlfSNhcnRpY2xlLXNpZGViYXJ7ZGlzcGxheTpub25lfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzYwcHgpeyNoZWFkZXItc3Vie2Rpc3BsYXk6bm9uZX0jaGVhZGVye3BhZGRpbmc6MTJweCAwfSNhcnRpY2xlLWNvbnRhaW5lciAubWFpbnttYXJnaW4tbGVmdDowfSNhcnRpY2xlLWNvbnRhaW5lciAubWV0YXtkaXNwbGF5Om5vbmV9I2FydGljbGUtY29udGFpbmVyIC5tYWluOmJlZm9yZXtkaXNwbGF5Om5vbmV9I2NvbW1lbnQtZm9ybSAuYy1pbmZvLCNjb21tZW50LWZvcm0gLmMtY29udGVudHt3aWR0aDoxMDAlO2Zsb2F0OmxlZnR9I2NvbW1lbnQtZm9ybSAuYy1pbmZve3RleHQtYWxpZ246bGVmdH0jZm9vdGVyIHNwYW57ZGlzcGxheTpibG9jaztmbG9hdDpub25lO3RleHQtYWxpZ246Y2VudGVyfSNhcnRpY2xlLXBhZ2Vye21hcmdpbi1sZWZ0OjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo1NjBweCl7I2FydGljbGUtY29udGFpbmVyIC52aWV3c3tkaXNwbGF5Om5vbmV9fVBLBwhas8hZGigAABooAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAABYAAABzdGF0aWNcY3NzXHNpdGVtYXAueHNsPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIyLjAiIA0KICAgICAgICAgICAgICAgIHhtbG5zOmh0bWw9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiDQogICAgICAgICAgICAgICAgeG1sbnM6c2l0ZW1hcD0iaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOSINCiAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQoJPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgaW5kZW50PSJ5ZXMiLz4NCgk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4NCgkJPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KCQkJPGhlYWQ+DQoJCQkJPHRpdGxlPlhNTCBTaXRlbWFwPC90aXRsZT4NCgkJCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCgkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCQkJCQlib2R5IHsNCgkJCQkJCWZvbnQtZmFtaWx5OiJMdWNpZGEgR3JhbmRlIiwiTHVjaWRhIFNhbnMgVW5pY29kZSIsVGFob21hLFZlcmRhbmE7DQoJCQkJCQlmb250LXNpemU6MTNweDsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJI2ludHJvIHsNCgkJCQkJCWJhY2tncm91bmQtY29sb3I6I0NGRUJGNzsNCgkJCQkJCWJvcmRlcjoxcHggIzI1ODBCMiBzb2xpZDsNCgkJCQkJCXBhZGRpbmc6NXB4IDEzcHggNXB4IDEzcHg7DQoJCQkJCQltYXJnaW46MTBweDsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJI2ludHJvIHAgew0KCQkJCQkJbGluZS1oZWlnaHQ6CTE2Ljg2NjdweDsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJdGQgew0KCQkJCQkJZm9udC1zaXplOjExcHg7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCXRoIHsNCgkJCQkJCXRleHQtYWxpZ246bGVmdDsNCgkJCQkJCXBhZGRpbmctcmlnaHQ6MzBweDsNCgkJCQkJCWZvbnQtc2l6ZToxMXB4Ow0KCQkJCQl9DQoJCQkJCQ0KCQkJCQl0ci5oaWdoIHsNCgkJCQkJCWJhY2tncm91bmQtY29sb3I6d2hpdGVzbW9rZTsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJI2Zvb3RlciB7DQoJCQkJCQlwYWRkaW5nOjJweDsNCgkJCQkJCW1hcmdpbjoxMHB4Ow0KCQkJCQkJZm9udC1zaXplOjhwdDsNCgkJCQkJCWNvbG9yOmdyYXk7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCSNmb290ZXIgYSB7DQoJCQkJCQljb2xvcjpncmF5Ow0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlhIHsNCgkJCQkJCWNvbG9yOmJsYWNrOw0KCQkJCQl9DQoJCQkJPC9zdHlsZT4NCgkJCTwvaGVhZD4NCgkJCTxib2R5Pg0KCQkJCTxoMT5YTUwgU2l0ZW1hcDwvaDE+DQoJCQkJPGRpdiBpZD0iaW50cm8iPg0KCQkJCQk8cD4NCgkJCQkJCVRoaXMgaXMgYSBYTUwgU2l0ZW1hcCB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBwcm9jZXNzZWQgYnkgc2VhcmNoIGVuZ2luZXMgbGlrZSA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20iPkdvb2dsZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly9zZWFyY2gubXNuLmNvbSI+TVNOIFNlYXJjaDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cueWFob28uY29tIj5ZQUhPTzwvYT4uPGJyIC8+DQoJCQkJCQk8IS0tSXQgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgQmxvZ2dpbmctU29mdHdhcmUgPGEgaHJlZj0iaHR0cDovL3dvcmRwcmVzcy5vcmcvIj5Xb3JkUHJlc3M8L2E+IGFuZCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcm5lYnJhY2hob2xkLmRlL3JlZGlyL3NpdGVtYXAtaG9tZS8iIHRpdGxlPSJHb29nbGUgU2l0ZW1hcCBHZW5lcmF0b3IgUGx1Z2luIGZvciBXb3JkUHJlc3MiPkdvb2dsZSBTaXRlbWFwIEdlbmVyYXRvciBQbHVnaW48L2E+IGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXJuZWJyYWNoaG9sZC5kZS8iPkFybmUgQnJhY2hob2xkPC9hPi48YnIgLz4tLT4NCgkJCQkJCVlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFhNTCBzaXRlbWFwcyBvbiA8YSBocmVmPSJodHRwOi8vc2l0ZW1hcHMub3JnIj5zaXRlbWFwcy5vcmc8L2E+IGFuZCBHb29nbGUncyA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3NtX3RoaXJkcGFydHkuaHRtbCI+bGlzdCBvZiBzaXRlbWFwIHByb2dyYW1zPC9hPi4NCgkJCQkJPC9wPg0KCQkJCTwvZGl2Pg0KCQkJCTxkaXYgaWQ9ImNvbnRlbnQiPg0KCQkJCQk8dGFibGUgY2VsbHBhZGRpbmc9IjUiPg0KCQkJCQkJPHRyIHN0eWxlPSJib3JkZXItYm90dG9tOjFweCBibGFjayBzb2xpZDsiPg0KCQkJCQkJCTx0aD5VUkw8L3RoPg0KCQkJCQkJCTx0aD5Qcmlvcml0eTwvdGg+DQoJCQkJCQkJPHRoPkNoYW5nZSBGcmVxdWVuY3k8L3RoPg0KCQkJCQkJCTx0aD5MYXN0Q2hhbmdlIChHTVQpPC90aD4NCgkJCQkJCTwvdHI+DQoJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imxvd2VyIiBzZWxlY3Q9IidhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiciLz4NCgkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idXBwZXIiIHNlbGVjdD0iJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyIvPg0KCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InNpdGVtYXA6dXJsc2V0L3NpdGVtYXA6dXJsIj4NCgkJCQkJCQk8dHI+DQoJCQkJCQkJCTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiAhPSAxIj4NCgkJCQkJCQkJCTx4c2w6YXR0cmlidXRlICBuYW1lPSJjbGFzcyI+aGlnaDwveHNsOmF0dHJpYnV0ZT4NCgkJCQkJCQkJPC94c2w6aWY+DQoJCQkJCQkJCTx0ZD4NCgkJCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iaXRlbVVSTCI+DQoJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InNpdGVtYXA6bG9jIi8+DQoJCQkJCQkJCQk8L3hzbDp2YXJpYWJsZT4NCgkJCQkJCQkJCTxhIGhyZWY9InskaXRlbVVSTH0iPg0KCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzaXRlbWFwOmxvYyIvPg0KCQkJCQkJCQkJPC9hPg0KCQkJCQkJCQk8L3RkPg0KCQkJCQkJCQk8dGQ+DQoJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KHNpdGVtYXA6cHJpb3JpdHkqMTAwLCclJykiLz4NCgkJCQkJCQkJPC90ZD4NCgkJCQkJCQkJPHRkPg0KCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoc3Vic3RyaW5nKHNpdGVtYXA6Y2hhbmdlZnJlcSwgMSwgMSksY29uY2F0KCRsb3dlciwgJHVwcGVyKSxjb25jYXQoJHVwcGVyLCAkbG93ZXIpKSxzdWJzdHJpbmcoc2l0ZW1hcDpjaGFuZ2VmcmVxLCAyKSkiLz4NCgkJCQkJCQkJPC90ZD4NCgkJCQkJCQkJPHRkPg0KCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdChzdWJzdHJpbmcoc2l0ZW1hcDpsYXN0bW9kLDAsMTEpLGNvbmNhdCgnICcsIHN1YnN0cmluZyhzaXRlbWFwOmxhc3Rtb2QsMTIsNSkpKSIvPg0KCQkJCQkJCQk8L3RkPg0KCQkJCQkJCTwvdHI+DQoJCQkJCQk8L3hzbDpmb3ItZWFjaD4NCgkJCQkJPC90YWJsZT4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGlkPSJmb290ZXIiPg0KCQkJCQlHZW5lcmF0ZWQgd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3LmFybmVicmFjaGhvbGQuZGUvcmVkaXIvc2l0ZW1hcC1ob21lLyIgdGl0bGU9Ikdvb2dsZSBTaXRlbWFwIEdlbmVyYXRvciBQbHVnaW4gZm9yIFdvcmRQcmVzcyI+R29vZ2xlIFNpdGVtYXAgR2VuZXJhdG9yIFBsdWdpbiBmb3IgV29yZFByZXNzPC9hPiBieSA8YSBocmVmPSJodHRwOi8vd3d3LmFybmVicmFjaGhvbGQuZGUvIj5Bcm5lIEJyYWNoaG9sZDwvYT4uIFRoaXMgWFNMVCB0ZW1wbGF0ZSBpcyByZWxlYXNlZCB1bmRlciBHUEwuDQoJCQkJPC9kaXY+DQoJCQk8L2JvZHk+DQoJCTwvaHRtbD4NCgk8L3hzbDp0ZW1wbGF0ZT4NCjwveHNsOnN0eWxlc2hlZXQ+UEsHCItTeJ5FDwAARQ8AAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAHN0YXRpY1xjc3Ncc3R5bGUuY3NzYm9keSxkaXYsZGwsZHQsZGQsdWwsb2wsbGksaDEsaDIsaDMsaDQsaDUsaDYscHJlLGNvZGUsZm9ybSxmaWVsZHNldCxsZWdlbmQsaW5wdXQsdGV4dGFyZWEscCxibG9ja3F1b3RlLHRoLHRke21hcmdpbjowO3BhZGRpbmc6MH1oZWFkZXIsZm9vdGVyLHNlY3Rpb24sYXJ0aWNsZSxhc2lkZSxuYXYsaGdyb3VwLGFkZHJlc3MsZmlndXJlLGZpZ2NhcHRpb24sbWVudSxkZXRhaWxze2Rpc3BsYXk6YmxvY2t9YXVkaW8sY2FudmFzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowfWZpZWxkc2V0LGltZ3tib3JkZXI6MH1hZGRyZXNzLGNhcHRpb24sY2l0ZSxjb2RlLGRmbixlbSx0aCx2YXJ7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsfW9sLHVse2xpc3Qtc3R5bGU6bm9uZX1jYXB0aW9uLHRoe3RleHQtYWxpZ246bGVmdH1oMSxoMixoMyxoNCxoNSxoNntmb250LXNpemU6MTAwJTtmb250LXdlaWdodDpub3JtYWx9cTpiZWZvcmUscTphZnRlcntjb250ZW50OicnfWFiYnIsYWNyb255bXtib3JkZXI6MDtmb250LXZhcmlhbnQ6bm9ybWFsfXN1cHt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LXRvcH1zdWJ7dmVydGljYWwtYWxpZ246dGV4dC1ib3R0b219aW5wdXQsdGV4dGFyZWEsc2VsZWN0e2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1sZWdlbmR7Y29sb3I6IzAwMH1odG1sLGJvZHl7Zm9udC1mYW1pbHk6VWJ1bnR1LENvbnNvbGFzLCJNaWNyb3NvZnQgWWFIZWkiLFZlcmRhbmEsVGFob21hLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MzBweDtjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZiZmJmYn1he3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiMwMDc5YmN9YTpob3Zlcntjb2xvcjojMDA1YjlifXB7bWFyZ2luLWJvdHRvbToxOHB4fWgxLGgyLGgzLGg0LGg1LGg2e3BhZGRpbmc6MTJweCAwfWgxe2ZvbnQtc2l6ZToyOHB4fWgye2ZvbnQtc2l6ZToyNHB4fWgze2ZvbnQtc2l6ZToyMXB4fWg0e2ZvbnQtc2l6ZToxOXB4fWg1e2ZvbnQtc2l6ZToxNnB4fWg2e2ZvbnQtc2l6ZToxNHB4fS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5sZWZ0e2Zsb2F0OmxlZnR9LnJpZ2h0e2Zsb2F0OnJpZ2h0fS5hYnNvbHV0ZXtwb3NpdGlvbjphYnNvbHV0ZX0ucmVsYXRpdmV7cG9zaXRpb246cmVsYXRpdmV9LmNsZWFyOmFmdGVye3Zpc2liaWxpdHk6aGlkZGVuO2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjA7Y29udGVudDoiICI7Y2xlYXI6Ym90aDtoZWlnaHQ6MH0udmVydGljYWwtbWlkZGxle3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW5saW5le2Rpc3BsYXk6aW5saW5lfS5pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmJsb2Nre2Rpc3BsYXk6YmxvY2t9LmZhZGUtb3V0e29wYWNpdHk6MH0uaGlkZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0uY29udGFpbmVye21heC13aWR0aDoxMjAwcHg7bWFyZ2luOmF1dG99LmNvbnRhaW5lcjk2MHttYXgtd2lkdGg6OTYwcHg7bWFyZ2luOmF1dG99LmdyaWQtMS0ye3dpZHRoOjUwJX0uZ3JpZC0xLTN7d2lkdGg6MzMuMzMzMyV9LmdyaWQtMS00e3dpZHRoOjI1JX0uZ3JpZC0xLTV7d2lkdGg6MjAlfS5ncmlkLTEtNnt3aWR0aDoxNi42NjY2JX0uZ3JpZC0yLTN7d2lkdGg6NjYuNjY2NiV9LmdyaWQtMy00e3dpZHRoOjc1JX0uZ3JpZC0zLTV7d2lkdGg6NjAlfS5ncmlkLTQtNXt3aWR0aDo4MCV9LmdyaWQtNS02e3dpZHRoOjgzLjMzMzMlfWlucHV0LHRleHRhcmVhLHNlbGVjdCxidXR0b257Zm9udC1mYW1pbHk6VWJ1bnR1LENvbnNvbGFzLCJNaWNyb3NvZnQgWWFIZWkiLFZlcmRhbmEsVGFob21hLEFyaWFsLHNhbnMtc2VyaWZ9LmZvcm0gbGVnZW5ke2ZvbnQtc2l6ZToxOHB4O21hcmdpbi1ib3R0b206MTRweH0uZm9ybSBsYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6MTJweH0uZm9ybSAuaXB0e3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyOjFweCBzb2xpZCAjOTk5O2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtvdXRsaW5lOm5vbmU7bWluLXdpZHRoOjE4MHB4fS5mb3JtIC5pcHQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMwMDc5YmN9LmZvcm0gLmNoa3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MnB4IDZweCAwIDA7bGluZS1oZWlnaHQ6bm9ybWFsfS5mb3JtIC5maWVsZHttYXJnaW4tYm90dG9tOjI0cHh9LmZvcm0gLmludmFsaWR7bWFyZ2luLXJpZ2h0OjEycHh9LmZvcm0gLnRpcHtmb250LXNpemU6MTNweDtjb2xvcjojOTk5O21hcmdpbi1sZWZ0OjEycHh9LmZvcm0tdmVydGljYWwgbGFiZWx7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjhweH0uZm9ybS12ZXJ0aWNhbCAuaXB0e3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94fS5mb3JtLXZlcnRpY2FsIC5pbnZhbGlke21hcmdpbi1yaWdodDowO21hcmdpbi10b3A6NnB4fS5mb3JtLWFsaWduIGxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDo2MHB4O3RleHQtYWxpZ246cmlnaHR9LmZvcm0tYWxpZ24gLmludmFsaWR7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLXRvcDo2cHh9LmJ0bnttaW4td2lkdGg6MTIwcHg7aGVpZ2h0OjM2cHg7YmFja2dyb3VuZC1jb2xvcjojY2NjO2NvbG9yOiMzMzM7Ym9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MnB4O291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MH0uYnRuOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk5OTtjdXJzb3I6cG9pbnRlcn1hLmJ0bntsaW5lLWhlaWdodDozNnB4O2NvbG9yOiNmZmZ9LmJ0bi1yZWR7YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9LmJ0bi1yZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzczODNhfS5idG4tYmx1ZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmM7Y29sb3I6I2ZiZmJmYn0uYnRuLWJsdWU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA1YjlifS5idG4tZ3JlZW57YmFja2dyb3VuZC1jb2xvcjojN2FiMjc3O2NvbG9yOiNmYmZiZmJ9LmJ0bi1ncmVlbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2NDk0NjJ9LmxibHtwYWRkaW5nOjRweCAxMnB4O2JhY2tncm91bmQtY29sb3I6I2NjYztjb2xvcjojMzMzO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ubGJsLXJlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlNjQzNDY7Y29sb3I6I2ZiZmJmYn1hLmxibHtsaW5lLWhlaWdodDoyNnB4fWEubGJsLXJlZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjNzM4M2E7Y29sb3I6I2ZiZmJmYn0ubGJsLWJsdWV7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9YS5sYmwtYmx1ZTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDViOWI7Y29sb3I6I2ZiZmJmYn0ubGJsLWdyZWVue2JhY2tncm91bmQtY29sb3I6IzdhYjI3Nztjb2xvcjojZmJmYmZifWEubGJsLWdyZWVuOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzY0OTQ2Mjtjb2xvcjojZmJmYmZifS5wYWdlciAuaXRlbXtwYWRkaW5nOjJweCA4cHg7bWFyZ2luOjAgNnB4O2NvbG9yOiMzMzM7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MjBweH0ucGFnZXIgLml0ZW0gYXtjb2xvcjojMzMzfS5wYWdlciAuaXRlbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmM7Ym9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MnB4fS5wYWdlciAuaXRlbTpob3ZlciBhe2NvbG9yOiNmZmZ9LnBhZ2VyIC5jdXJyZW50e2JhY2tncm91bmQtY29sb3I6IzY2Njtjb2xvcjojZmJmYmZiO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweH0ucGFnZXIgLmN1cnJlbnQgYXtjb2xvcjojZmJmYmZifS5wYWdlciAuY3VycmVudDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDc5YmN9Lm1hcmtkb3duIGgxLC5tYXJrZG93biBoMiwubWFya2Rvd24gaDMsLm1hcmtkb3duIGg0LC5tYXJrZG93biBoNSwubWFya2Rvd24gaDZ7cGFkZGluZzoxOHB4IDAgOXB4IDA7Zm9udC13ZWlnaHQ6Ym9sZH0ubWFya2Rvd24gaDF7Zm9udC1zaXplOjI0cHh9Lm1hcmtkb3duIGgye2ZvbnQtc2l6ZToyMXB4fS5tYXJrZG93biBoMSwubWFya2Rvd24gaDJ7bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNkZGR9Lm1hcmtkb3duIGgze2ZvbnQtc2l6ZToxOXB4fS5tYXJrZG93biBoNHtmb250LXNpemU6MThweH0ubWFya2Rvd24gaDV7Zm9udC1zaXplOjE2cHh9Lm1hcmtkb3duIGg2e2ZvbnQtc2l6ZToxNHB4fS5tYXJrZG93biBwe21hcmdpbi1ib3R0b206MTBweH0ubWFya2Rvd24gdWx7bGlzdC1zdHlsZTpkaXNjIGluc2lkZX0ubWFya2Rvd24gb2x7bGlzdC1zdHlsZTpkZWNpbWFsIGluc2lkZX0ubWFya2Rvd24gY29kZXtmb250LWZhbWlseTpDb25zb2xhcywiQ291cmllciBOZXciLEFyaWFsfS5tYXJrZG93biBwIGNvZGV7Y29sb3I6I2M3MzgzYX0ubWFya2Rvd24gYmxvY2txdW90ZXtwYWRkaW5nOjhweCAxOHB4O2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjY2NjO2JhY2tncm91bmQtY29sb3I6I2ZiZmJmYn0ubWFya2Rvd24gYmxvY2txdW90ZSBwe21hcmdpbi1ib3R0b206MH0ubWFya2Rvd24gcHJlIGNvZGV7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MThweCAhaW1wb3J0YW50O3BhZGRpbmc6OHB4IDE4cHg7ZGlzcGxheTpibG9jazttYXJnaW46MTJweCAwIDE4cHggMH0ubWFya2Rvd24gb2wsLm1hcmtkb3duIHVse21hcmdpbjoxMnB4IDI0cHh9Lm1hcmtkb3duIHAgaW1ne21heC13aWR0aDo5OSU7aGVpZ2h0OmF1dG87bWFyZ2luOjAgYXV0bztkaXNwbGF5OmJsb2NrfS5tYXJrZG93biB0YWJsZXttYXJnaW46MTJweCAwO3dpZHRoOjk4JX0ubWFya2Rvd24gdGFibGUgdGgsLm1hcmtkb3duIHRhYmxlIHRke2JvcmRlcjoxcHggc29saWQgI2NjYztwYWRkaW5nOjRweCAxMnB4fS5tYXJrZG93biB0YWJsZSB0aGVhZHtiYWNrZ3JvdW5kOiNmNmY2ZjZ9Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo4cHg7bWFyZ2luLXJpZ2h0OjJweH06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNle2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXItbGVmdDoxcHggc29saWQgI2QyZDJkMn06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6IzlmYTA5Yzt3aWR0aDo4cHh9Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcntiYWNrZ3JvdW5kOiNiN2I4YWR9aHRtbCxib2R5e2JhY2tncm91bmQ6dXJsKCIuLi9pbWcvYmcucG5nIikgcmVwZWF0fSNoZWFkZXJ7YmFja2dyb3VuZDp1cmwoIi4uL2ltZy9oZWFkZXIuZ2lmIikgcmVwZWF0ICM0YzcyOTg7bWluLXdpZHRoOjEyMHB4O3BhZGRpbmc6MzBweCAwO2NvbG9yOiNmYmZiZmJ9I2hlYWRlci1pbWd7d2lkdGg6OTZweDtoZWlnaHQ6OTZweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6NTBweDstbW96LWJvcmRlci1yYWRpdXM6NTBweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NTBweH0jaGVhZGVyLWh7cGFkZGluZy10b3A6MjRweDtmb250LXNpemU6MzJweH0jaGVhZGVyLWggYXtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGR9I25hdntoZWlnaHQ6NTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmI7Ym94LXNoYWRvdzowIDAgMnB4ICNiYmI7LW1vei1ib3gtc2hhZG93OjAgMCAycHggI2JiYjstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCAjYmJiO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2N9I25hdiBsaXtsaW5lLWhlaWdodDo1MHB4O3BhZGRpbmc6MCAxOHB4fSNuYXYgbGkgYXtmb250LXNpemU6MTZweDtjb2xvcjojMzMzO3BhZGRpbmc6MCAzMnB4O2Rpc3BsYXk6YmxvY2t9I25hdiBsaSBhOmhvdmVye2JvcmRlci1ib3R0b206NHB4IHNvbGlkICMwMDc5YmN9I25hdi5maXhlZHtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO3RvcDowfSNtYWlue21hcmdpbjozMHB4IGF1dG99I2Zvb3Rlcntjb2xvcjojY2NjO2JhY2tncm91bmQtY29sb3I6IzFjMjQyOTtwYWRkaW5nOjI0cHggMH0jZm9vdGVyIGF7Y29sb3I6I2NjY30jZm9vdGVyIHB7bWFyZ2luLWJvdHRvbTo5cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsZXR0ZXItc3BhY2luZzoxcHh9I2Zvb3RlciBwIGF7bWFyZ2luOjAgMTZweH0jZm9vdGVyIHAgYTpob3Zlcntjb2xvcjojZmJmYmZifSNmb290ZXIgcCBhIC5mYXttYXJnaW4tcmlnaHQ6OHB4fSNnby10b3B7Ym90dG9tOjUwcHg7cmlnaHQ6NDBweDtwb3NpdGlvbjpmaXhlZDtjb2xvcjojZmZmO3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo4cHg7b3BhY2l0eTouNH0jYXJ0aWNsZS1jb250YWluZXIgLm1ldGF7d2lkdGg6MTA4cHg7bGluZS1oZWlnaHQ6MjRweH0jYXJ0aWNsZS1jb250YWluZXIgLm1ldGEgLmZhe21hcmdpbi1yaWdodDo4cHh9I2FydGljbGUtY29udGFpbmVyIC5tZXRhIC5jb21tZW50cywjYXJ0aWNsZS1jb250YWluZXIgLm1ldGEgLnZpZXdzLCNhcnRpY2xlLWNvbnRhaW5lciAubWV0YSAudGltZXtmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNhcnRpY2xlLWNvbnRhaW5lciAubWV0YSAudGltZXtjb2xvcjojZmZmfSNhcnRpY2xlLWNvbnRhaW5lciAubWV0YSBhe2NvbG9yOiNmZmZ9I2FydGljbGUtY29udGFpbmVyIC5tZXRhIGE6aG92ZXJ7Y29sb3I6I2ZmZn0jYXJ0aWNsZS1jb250YWluZXIgLm1haW57bWFyZ2luLWxlZnQ6MTQwcHh9I2FydGljbGUtY29udGFpbmVyIGgzLnRpdGxle3BhZGRpbmc6OHB4IDE2cHg7YmFja2dyb3VuZC1jb2xvcjojNGM3Mjk4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MnB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjJweH0jYXJ0aWNsZS1jb250YWluZXIgaDMudGl0bGUgYXtjb2xvcjojZWVlfSNhcnRpY2xlLWNvbnRhaW5lciBoMy50aXRsZSBhOmhvdmVye2NvbG9yOiNmZmZ9I2FydGljbGUtY29udGFpbmVyIC5jb250ZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXRvcDpub25lO3BhZGRpbmc6MThweCAyNHB4IDI0cHh9I2FydGljbGUtY29udGFpbmVyIC5pbmZve21hcmdpbi1ib3R0b206MDtiYWNrZ3JvdW5kLWNvbG9yOiNmYmZiZmI7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci10b3A6bm9uZTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjJweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czoycHg7Y29sb3I6Izk5OX0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8gLmZhe21hcmdpbi1yaWdodDo4cHh9I2FydGljbGUtY29udGFpbmVyIC5pbmZvIC5zaGFyZSAuZmF7bWFyZ2luLXJpZ2h0OjB9I2FydGljbGUtY29udGFpbmVyIC5pbmZvPip7cGFkZGluZzo2cHggMThweH0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8+c3Bhbntib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNjY2N9I2FydGljbGUtY29udGFpbmVyIC5pbmZvIC5yaWdodHtib3JkZXItbGVmdDoxcHggc29saWQgI2NjYztib3JkZXItcmlnaHQ6bm9uZX0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8gLnJlYWR7Y29sb3I6Izk5OX0jYXJ0aWNsZS1jb250YWluZXIgLmluZm8gLnJlYWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA3OWJjO2NvbG9yOiNmYmZiZmJ9I2FydGljbGUtY29udGFpbmVyIC5pbmZvIC50aW1lLCNhcnRpY2xlLWNvbnRhaW5lciAuaW5mbyAudmlld3Mgc3Bhbntmb250LWZhbWlseTpWZXJkYW5hLFRhaG9tYSwn5b6u6L2v6ZuF6buRJywn5a6L5L2TJyxzYW5zLXNlcmlmfSNhcnRpY2xlLWNvbnRhaW5lciAuaW5mbyAudGFnIGF7bWFyZ2luOjAgNHB4O2NvbG9yOiM5OTl9I2FydGljbGUtY29udGFpbmVyIC5pbmZvIC50YWcgYTpob3Zlcntjb2xvcjojMzMzfSNhcnRpY2xlLWNvbnRhaW5lciBhcnRpY2xle21hcmdpbi1ib3R0b206NDhweH0jYXJ0aWNsZS1jb250YWluZXIgLnRhZy1iYW5uZXJ7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjE4cHg7bWFyZ2luLWJvdHRvbTozMHB4fSNjb21tZW50e21hcmdpbi10b3A6LTI0cHg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDtwYWRkaW5nOjI0cHg7YmFja2dyb3VuZDojZmZmfSNjb21tZW50LWZvcm17d2lkdGg6ODAlO21hcmdpbjphdXRvfSNjb21tZW50LWZvcm0gLmMtaW5mb3t3aWR0aDoyNiV9I2NvbW1lbnQtZm9ybSAuYy1pbmZvIC5pcHR7d2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLXdpZHRoOjB9I2NvbW1lbnQtZm9ybSAuYy1jb250ZW50e3dpZHRoOjcwJX0jY29tbWVudC1mb3JtIC5jLWF2YXRhcnt3aWR0aDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHh9I2NvbW1lbnQtZm9ybSAucmVwbHktbWR7bWFyZ2luLWJvdHRvbToxNnB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Y29sb3I6IzY2Nn0jY29tbWVudC1mb3JtIC5jYW5jZWwtcmVwbHl7Ym9yZGVyOm5vbmU7bWFyZ2luLWxlZnQ6MThweDtkaXNwbGF5Om5vbmV9I2NvbW1lbnQtZm9ybSAuY2FuY2VsLXJlcGx5OmhvdmVye2N1cnNvcjpwb2ludGVyfSNjb21tZW50LWNvbnRlbnR7d2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjE4MHB4O3Jlc2l6ZTpub25lfSNjb21tZW50LWxpc3QgLmMtYXZhdGFye3dpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzoycHg7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDttYXJnaW4tcmlnaHQ6MThweH0jY29tbWVudC1saXN0IC5jb21tZW50e21hcmdpbi1ib3R0b206MThweDtwYWRkaW5nLWJvdHRvbToxOHB4O2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjZGRkfSNjb21tZW50LWxpc3QgLmMtbWV0YT4qe21hcmdpbi1yaWdodDoxNnB4fSNjb21tZW50LWxpc3QgLmMtdGltZXtjb2xvcjojOTk5O2ZvbnQtZmFtaWx5OlZlcmRhbmEsVGFob21hLCflvq7ova/pm4Xpu5EnLCflrovkvZMnLHNhbnMtc2VyaWZ9I2NvbW1lbnQtbGlzdCAuYy10aW1lIC5mYXttYXJnaW4tcmlnaHQ6NnB4fSNjb21tZW50LWxpc3QgLmMtcmVwbHl7Y29sb3I6Izk5OX0jY29tbWVudC1saXN0IC5jLXJlcGx5OmhvdmVye2NvbG9yOiMzMzN9I2NvbW1lbnQtbGlzdCAuYy1hdXRob3J7Zm9udC1zaXplOjEzcHh9I2NvbW1lbnQtbGlzdCAuYy1hdXRob3IuYWRtaW57YmFja2dyb3VuZC1jb2xvcjojZTY0MzQ2O2NvbG9yOiNmYmZiZmJ9I2NvbW1lbnQtbGlzdCAuYy1wLW1ke21hcmdpbi10b3A6MTJweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiM2NjZ9I2NvbW1lbnQtbGlzdCAuYy1zZWN0aW9ue21heC13aWR0aDo4MzBweH0jY29tbWVudC1saXN0IC5jLWNoZWNre2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiNlNjQzNDZ9I2NvbW1lbnQtbGlzdCAuYy1jaGVjayAuZmF7bWFyZ2luLXJpZ2h0OjZweH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTYwcHgpey5jb250YWluZXI5NjB7cGFkZGluZzowIDI0cHg7d2lkdGg6YXV0b319QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2MHB4KXsuY29udGFpbmVyOTYwe3BhZGRpbmc6MCAyNHB4O3dpZHRoOmF1dG99I2FydGljbGUtY29udGFpbmVyIC5tYWlue21hcmdpbi1sZWZ0OjB9I2FydGljbGUtY29udGFpbmVyIC5tZXRhLmxlZnR7ZGlzcGxheTpub25lfSNjb21tZW50LWZvcm0gLmMtaW5mbywjY29tbWVudC1mb3JtIC5jLWNvbnRlbnR7d2lkdGg6MTAwJTtmbG9hdDpsZWZ0fSNjb21tZW50LWZvcm0gLmMtaW5mb3t0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo1NjBweCl7LmNvbnRhaW5lcjk2MHtwYWRkaW5nOjA7d2lkdGg6YXV0b30jbmF2IGxpe3BhZGRpbmc6MCAxMHB4fSNoZWFkZXItaW1ne2Zsb2F0OmxlZnQ7d2lkdGg6NjRweDtoZWlnaHQ6NjRweDttYXJnaW4tbGVmdDoyNHB4fSNoZWFkZXItaHtwYWRkaW5nOjE3cHg7Zm9udC1zaXplOjI0cHg7ZmxvYXQ6bGVmdH0jaGVhZGVyLXN1YntkaXNwbGF5Om5vbmV9I2FydGljbGUtY29udGFpbmVyIC50YWcsI2FydGljbGUtY29udGFpbmVyIC50aW1le2Rpc3BsYXk6bm9uZX0jY29tbWVudC1mb3Jte3dpZHRoOjEwMCV9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7LmNvbnRhaW5lcjk2MHtwYWRkaW5nOjA7d2lkdGg6YXV0b30jaGVhZGVyLWh7ZmxvYXQ6bm9uZX0jaGVhZGVyLWltZ3tkaXNwbGF5Om5vbmV9I2hlYWRlci1zdWJ7ZGlzcGxheTpub25lfSNjb21tZW50LWxpc3QgLmMtYXZhdGFye2Rpc3BsYXk6bm9uZX0jbmF2IGxpIGF7cGFkZGluZzowIDE2cHh9fVBLBwivOz4d7ykAAO8pAABQSwMEFAAIAAAAAAAAAAAAAAAAAAAAAAAAABIAAABzdGF0aWNcZmF2aWNvbi5pY28AAAEAAQAgIAAAAQAgAKgQAAAWAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAEAAAEgsAABILAAAAAAAAAAAAALN+B9uzfQfbs30H27N9B9uzfQfbs30H27N9B9uzfQfbs30H27N9B9uzfQfbs30H27N9B9uzfQfbs34H27N+B9uzfgfbs34H27N+B9uzfgfbs30H27N+B9uzfgfbs30H27N+B9uzfgfbs34H27N+B9uyfAfWr3oHx61+GK21k0qQuoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoII/7qCCP+6ggj/uoMN/7qGF/+5gQj/uYEI/7mBCP+5gQj/uoEI/7mBCP+5gQj/uYEI/7mBCP+5gQj/uYEI/7qBCP+5gQj/uYEI/7mBCP+5gQj/uoEI/7mBCP+6gQj/uYEI/7mBCP+5gQj/uYEI/7mBCP+5gQj/uoEI/7qBCP+5gQj/uYII/7qBCP+6ggj/uoII/7mBCP+5gQj/uYII/7mBCP+5gQj/uYEI/7mBCP+5gQj/uYEI/7mBCP+5gQj/uoII/7mBCP+5gQj/uoEI/7qBCP+6ggj/uoII/7qBCP+6ggj/uoEI/7qCCP+6gQj/uoII/7qCCP+6gQj/uoII/7qBCP+6gQj/uYEI/7mBCP+5ggf/uYIH/7mCB/+5gQf/uYEH/7mBB/+5gQf/uYEH/7mBB/+5gQf/uYEH/7mBB/+5gQf/uYEH/7mCB/+6ggf/uoIH/7qCB/+6ggf/uoIH/7qCB/+6ggf/uoIH/7qCB/+6ggf/uoIH/7qCB/+6ggf/uoIH/7qCB/+6ggf/uoIH/7qCB/+8hAX/vIQF/7uDBf+8gwX/vIMF/7yDBf+8gwX/vIMF/7yDBf+8gwX/vIMF/7yDBf+8gwX/vIMF/7yEBf+8hAX/vIQF/7yEBf+8hAX/vIQF/7yEBf+8hAX/vIQF/7yEBf+8hAX/vIQF/7yDBf+8hAX/vIQF/7yDBf+8hAb/vIQG/8CHA//AhgP/wIcD/8CHA//AhwP/wIcD/8CHA//AhwP/wIcD/8CHA//AhwP/wIcD/8CHA//AhwP/wIcD/8CGA//AhgP/wIYD/8CGA//AhgP/wIYD/8CGA//AhgP/wIYD/8CGA//AhgP/wIYD/8CGA//AhwT/wIcE/8CGA//AhgL/xYkC/8WJAf/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYkC/8WJAv/FiQL/xYoC/8WJAf/FigP/x48O/8yaJ//JjAD/yYwA/8mMAP/JjAD/yYwA/8mMAP/JjAD/yYwA/8mMAP/JjAD/yYwA/8mMAP/JjAD/yYwA/8mNAP/JjQD/yY0A/8mNAP/JjQD/yY0A/8mNAP/JjQD/yY0A/8mNAP/JjQD/yY0A/8mNAP/Jkxf/1q9T/+HAdf/p0p//8+fN/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y40A/8ugPf/y693+/v36/v/////////+yo4A/sqNAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgD/y44A/8uOAP/LjgH/y44A/8uOAP/LjQD/yo4A/8uOAP/LjgD/y44B/8uOAf/LjgD/y44A/8uOAP/LjgD/y44B/8qNAP/Ljwb/2Llz//r59f7+///+/v7+//7+/v7KjgD+yo0A/8uOAP/LjgD/yo4A/8qOAP/KjgD/yo4A/8uOAP/LjgD/yo4A/8uOAP/LjgD/yo0A/8uNAP/LjgH/yY0B/8eNCP/KjgP/yo0A/8uNAP/KjQD/yo0A/8qNAP/LjwL/0Job/9++cf/17+D//v7+/v////7+/v7//v7+/suOAfrLjgD/yo0A/8uOAP/LjgH/yo4A/8qOAP/KjgD/y44A/8qOAP/KjgD/y44A/8uOAf/KjgD/yo0A/8mMAP/HmjT/wat5/6iLSP/Npk7/xZgw/8+fMf/Wpjn/2rBP/+LCd//w37n/+/jy//7+///+/v7////////////+/v7/vJIyvruKGf/Mkgz/yo4A/8qNAP/KjQD/yo0A/8qOAP/KjgD/yo4A/8qNAP/KjQD/yo0A/8uOAf/QmRj/yaNN/9DGrf/l5eb/pqWj/+nm3//EvrH/4drJ/vnz4/779uz//fz5//////7////+/v7+//7+/v////////////7+/v+Vk42UmY95/+bOmf/gvWr/2a1I/9SjMv/Rmx//z5YT/8+VEf/PlRH/z5cX/9OfKP/Zq0P/4b9x/+3bs//QzMT/w8PD/urq6v62trb+6Ojo/rS0tf7a29v+/f39/v7///7+/v7//////v////7+/v7//v7+//////7////+/////peWlpWSkpP/9vb1//379//59Of/9u3X//Lkxf/w37j/7tyy/+/cs//x4bv/9enO//nz5P/39fL/ycnK/6+vr/+lpKT/vb29/5SUlP+5ubn/p6en/7Gxsf/R0dH//Pz8///////+/v7//v7+//7+/v/+/v7////////////+/v7/qampmJGRkf/y8vL////+//7+/v/////////////////+/v7//v7+//7+///+/////////+Hh4P+6ubn/7+/v/+zs7P/X19f/xsbG/97e3v/19fX/6urr/7i4uP/x8fH///////7+/v7//////v7+//7+/v////////////7+/v+bm5tng4OD8O3t7f///////////v///v7+/v7//v7+/v/+/v7+/v7++fn5/vb29v76+vr+5+fo/7e3t//t7e3/+Pj4/t3d3f7Y2Nj+8vLy/v7+/v7Y2Nj+vr6+/vj4+P7//////////v////7+/v7//v7+//////7////+/////jU1NSNxcXHY5ubm//////7////+//////7+/v//////7+/v/tDQ0P++vr7+urq6/r6+vv/R0dH+z8/P/qysrP9nZ2f+Kysr/yMjI/9bW1v/q6ur/729vf7k5OT+5eXl/9ra2v/f39/+8PDw/v39/f/////+/v7+/v/////////+jY2NJ3V1ddrb29v//////v////7//////v7+/+Hh4f+1tbX+ysrK/+Pj4/7n5+f+4+Pj/8nJyf6+vr7+t7e3/ywsLP4AAAD/AAAA/wYGBv+Ghob/19fX/r6+vv68vLz/wcHB/76+vv65ubn+x8fH//Hx8f7////+//////////7g4OAkhISE2cXFxf///////////v/////n5+f/tbW1/+Tk5P///////////v/////////+/v7+/uDg4P+2trb/rq6u/25ubv9ZWVn/g4OD/7u7u/++vr7/5OTk/vr6+v/9/f3//Pz8/vDw8P/Kysr/t7e3//Dw8P///////////4eHh4BdXV3xo6Oj///////////++/v7/8HBwf/BwcH/ra2t/8bGxv/6+vr///////7+/v/+/v7+/////9bW1v/ExMT/9vb2//b29v/d3d3/vr6+/+Tk5P/x8fH//v7+//7+/v/+/v7+//////39/f/Nzc3/w8PD//v7+///////hoaG+JaWlv+Li4v/9/f3///////u7u7/q6ur/1JSUv8TExP/Z2dn/9HR0f/9/f3//v7+////////////8vLy/7i4uP/v7+//+vr6/8DAwP+cnJz/VFRU/25ubv/c3Nz//v7+//////7+/v7///////T09P+3t7f/6+vr///////v7+//7Ozs/3x8fP/Y2Nj+/////ufn5/+Tk5P/FhYW/wUFBf83Nzf/mZmZ//v7+//+/v7//////v/////6+vr/w8PD/+fn5//z8/P/rKys/zk5Of8AAAD/RUVF/piYmP/19fX//////v7+/v///////f39/8TExP/e3t7////////////R0dH/MzMz/5eXl///////5+fn/7Ozs/9oaGj/FxcX/zo6Ov/IyMj//v7+//7+/v////////////j4+P+9vb3/6+vr//Dw8P+zs7P/TExM/wAAAP8ODg7+goKC//r6+v/////+/v7+///////+/v7/x8fH/9zc3P///////////7i4uP8ZGRn/Pz8//t/f3/729vb+vb29/9vb2/7ExMT+29vb//39/f7+/v7+/////v////7////+5eXl/rm5uf729vb/8/Pz/76+vv/BwcH+cnJy/n5+fv7g4OD///////7+/v7+/v7+//////j4+P68vLz+5ubm//////7////+8fHx/7Kysv+FhYX+i4uL/vT09P/U1NT/vb29//n5+f7//////v7+/v////7//////////vb29v69vb3/1tbW///////9/f3/x8fH/87Ozv/5+fn+/Pz8/v///////////////v////7/////39/f/rm5uf74+Pj/7u7u/snJyf/4+Pj+//////Ly8v6IiIj+m5ub//T09P/IyMj/vb29/ufn5//6+vr+/Pz8/vr6+v/n5+f+vb29/snJyf/6+vr////////////w8PD/t7e3/9jY2P79/f3+///////////////+/////unp6f+3t7f+4uLi//Hx8f+Ojo7+c3Nz5ZCQkP6jo6P/oKCg/n5+fvpOTk7hnJyc++Hh4f/W1tb+vb29/8DAwP/BwcH/vr6+/7m5uf7W1tb++vr6///////////////////////p6en/ubm5/sPDw/7f39//6Ojo/+Tk5P7MzMz/tra2/93d3f7q6ur/g4OD/3BwcP+rq6s/cHBwZkVFRWlKSkpnhYWFX4yMjDhtbW2bd3d3662trf/Y2Nj/5OTk/uXl5f/p6en/9vb2/v////////////////7+/v/////////////////19fX/1tbW/8LCwv+9vb3/wcHB/9HR0f/k5OT/xsbG/319ffNjY2POa2tr0hEREQD///8A////ALy8vAAAAAAAAAAAAM7Ozgt2dnZFbW1to3t7e+uZmZn/t7e3/9fX1//o6Oj/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SwcIm6PU7/MrAADzKwAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAc3RhdGljXGltZ1xoZWFkZXIuZ2lmR0lGODlhZABkALMAAE10mkltkk51nEhskElukkxzmUpvlExymEpwlUtxlgAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMDE1QUFDMTUyNDQxMUUyOEYxM0EwNDlDOUFGQTk3QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCMDE1QUFDMjUyNDQxMUUyOEYxM0EwNDlDOUFGQTk3QyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMTVBQUJGNTI0NDExRTI4RjEzQTA0OUM5QUZBOTdDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkIwMTVBQUMwNTI0NDExRTI4RjEzQTA0OUM5QUZBOTdDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRh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YWRlcigpIHsNCiAgICB2YXIgJG5hdiA9ICQoJyNuYXYnKTsNCiAgICB2YXIgdG9wID0gJG5hdi5vZmZzZXQoKS50b3A7DQogICAgY29uc29sZS5sb2codG9wKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKHRvcCA8ICQodGhpcykuc2Nyb2xsVG9wKCkpIHsNCiAgICAgICAgICAgICRuYXYuYWRkQ2xhc3MoImZpeGVkIikucmVtb3ZlQ2xhc3MoInRleHQtY2VudGVyIik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbmF2LnJlbW92ZUNsYXNzKCJmaXhlZCIpLmFkZENsYXNzKCJ0ZXh0LWNlbnRlciIpOw0KICAgICAgICB9DQogICAgfSk7DQp9DQoNCmZ1bmN0aW9uIHRvcEJ1dHRvbigpIHsNCiAgICB2YXIgdG9wID0gJCgnI25hdicpLm9mZnNldCgpLnRvcDsNCiAgICB2YXIgJHRvcCA9ICQoJyNnby10b3AnKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKHRvcCA8ICQodGhpcykuc2Nyb2xsVG9wKCkpIHsNCiAgICAgICAgICAgICR0b3AucmVtb3ZlQ2xhc3MoImhpZGUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0b3AuYWRkQ2xhc3MoJ2hpZGUnKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgICR0b3Aub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAkKCdib2R5LGh0bWwnKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCA1MDApOw0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSkNCn0NCg0KZnVuY3Rpb24gcmVuZGVyTWFya2Rvd24oKSB7DQogICAgdmFyICRtZCA9ICQoJy5tYXJrZG93bicpOw0KICAgICRtZC5lYWNoKGZ1bmN0aW9uIChpLCBpdGVtKSB7DQogICAgICAgICQoaXRlbSkuaHRtbChtYXJrZWQoJChpdGVtKS5odG1sKCkucmVwbGFjZSgvJmd0Oy9nLCAnPicpKSk7DQogICAgfSk7DQogICAgdmFyIGNvZGUgPSAkbWQuZmluZCgncHJlIGNvZGUnKTsNCiAgICBpZiAoY29kZS5sZW5ndGgpIHsNCiAgICAgICAgJCgiPGxpbms+IikuYXR0cih7IHJlbDogInN0eWxlc2hlZXQiLCB0eXBlOiAidGV4dC9jc3MiLCBocmVmOiAiL3N0YXRpYy9jc3MvaGlnaGxpZ2h0LmNzcyJ9KS5hcHBlbmRUbygiaGVhZCIpOw0KICAgICAgICAkLmdldFNjcmlwdCgiL3N0YXRpYy9saWIvaGlnaGxpZ2h0Lm1pbi5qcyIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGNvZGUuZWFjaChmdW5jdGlvbiAoaSwgaXRlbSkgew0KICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0QmxvY2soaXRlbSkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGluaXRDb21tZW50KCkgew0KICAgIHZhciAkbGlzdCA9ICQoJyNjb21tZW50LWxpc3QnKTsNCiAgICBpZiAoISRsaXN0Lmxlbmd0aCkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY29tbWVudC1hdXRob3IiKSkgew0KICAgICAgICAkKCcjY29tbWVudC1hdXRob3InKS52YWwobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbW1lbnQtYXV0aG9yIikpOw0KICAgICAgICAkKCcjY29tbWVudC1lbWFpbCcpLnZhbChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY29tbWVudC1lbWFpbCIpKTsNCiAgICAgICAgJCgnI2NvbW1lbnQtdXJsJykudmFsKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb21tZW50LXVybCIpKTsNCiAgICAgICAgJCgnI2NvbW1lbnQtYXZhdGFyJykuYXR0cigic3JjIiwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbW1lbnQtYXZhdGFyIikpOw0KICAgICAgICAkKCcuYy1hdmF0YXInKS5yZW1vdmVDbGFzcygibnVsbCIpOw0KICAgIH0NCiAgICAkKCcjY29tbWVudC1jb250ZW50Jykub24oImZvY3VzIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICBpZiAoJCgnLmMtYXZhdGFyJykuaGFzQ2xhc3MoIm51bGwiKSkgew0KICAgICAgICAgICAgJCgnLmMtYXZhdGFyLWZpZWxkJykucmVtb3ZlKCk7DQogICAgICAgICAgICAkKCcuYy1pbmZvLWZpZWxkcycpLnJlbW92ZUNsYXNzKCJoaWRlIik7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICAkKCcubm90LW1lJykub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAkKCcuYy1hdmF0YXItZmllbGQnKS5yZW1vdmUoKTsNCiAgICAgICAgJCgnLmMtaW5mby1maWVsZHMnKS5yZW1vdmVDbGFzcygiaGlkZSIpOw0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSk7DQogICAgJCgnI2NvbW1lbnQtc2hvdycpLm9uKCJjbGljayIsICIuZW5hYmxlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAkKCIjY29tbWVudC1zaG93IikucmVtb3ZlKCk7DQogICAgICAgICQoJyNjb21tZW50LWZvcm0nKS5yZW1vdmVDbGFzcygiaGlkZSIpOw0KICAgIH0pOw0KICAgICQoJyNjb21tZW50LWZvcm0nKS5hamF4Rm9ybShmdW5jdGlvbiAoanNvbikgew0KICAgICAgICBpZiAoanNvbi5yZXMpIHsNCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb21tZW50LWF1dGhvciIsICQoJyNjb21tZW50LWF1dGhvcicpLnZhbCgpKTsNCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb21tZW50LWVtYWlsIiwgJCgnI2NvbW1lbnQtZW1haWwnKS52YWwoKSk7DQogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29tbWVudC11cmwiLCAkKCcjY29tbWVudC11cmwnKS52YWwoKSk7DQogICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29tbWVudC1hdmF0YXIiLCBqc29uLmNvbW1lbnQuYXZhdGFyKTsNCiAgICAgICAgICAgIHZhciB0cGwgPSAkKCQoJyNjb21tZW50LXRwbCcpLmh0bWwoKSk7DQogICAgICAgICAgICB0cGwuZmluZCgiLmMtYXZhdGFyIikuYXR0cigic3JjIiwganNvbi5jb21tZW50LmF2YXRhcikuYXR0cigiYWx0IiwganNvbi5jb21tZW50LmF1dGhvcik7DQogICAgICAgICAgICB0cGwuZmluZCgiLmMtYXV0aG9yIikuYXR0cigiaHJlZiIsIGpzb24uY29tbWVudC51cmwpLnRleHQoanNvbi5jb21tZW50LmF1dGhvcik7DQogICAgICAgICAgICB0cGwuZmluZCgiLmMtcmVwbHkiKS5hdHRyKCJyZWwiLCBqc29uLmNvbW1lbnQuaWQpOw0KICAgICAgICAgICAgdHBsLmZpbmQoIi5jLWNvbnRlbnQiKS5odG1sKGpzb24uY29tbWVudC5jb250ZW50KTsNCiAgICAgICAgICAgIGlmIChqc29uLmNvbW1lbnQucGFyZW50X21kKSB7DQogICAgICAgICAgICAgICAgdHBsLmZpbmQoIi5jLXAtbWQiKS5odG1sKG1hcmtlZChqc29uLmNvbW1lbnQucGFyZW50X21kKSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRwbC5maW5kKCIuYy1wLW1kIikucmVtb3ZlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0cGwuYXR0cigiaWQiLCAiY29tbWVudC0iICsganNvbi5jb21tZW50LmlkKTsNCiAgICAgICAgICAgIGlmIChqc29uLmNvbW1lbnQuc3RhdHVzID09ICJhcHByb3ZlZCIpIHsNCiAgICAgICAgICAgICAgICB0cGwuZmluZCgiLmMtY2hlY2siKS5yZW1vdmUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRsaXN0LmFwcGVuZCh0cGwpOw0KICAgICAgICAgICAgJCgnLmNhbmNlbC1yZXBseScpLnRyaWdnZXIoImNsaWNrIik7DQogICAgICAgICAgICAkKCcjY29tbWVudC1jb250ZW50JykudmFsKCIiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGFsZXJ0KCLmj5DkuqTlpLHotKUhIik7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICAkbGlzdC5vbigiY2xpY2siLCAiLmMtcmVwbHkiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICQoJy5yZXBseS1tZCcpLnJlbW92ZSgpOw0KICAgICAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoInJlbCIpOw0KICAgICAgICB2YXIgcGMgPSAkKCcjY29tbWVudC0nICsgaWQpOw0KICAgICAgICB2YXIgbWQgPSAiPiBAIiArIHBjLmZpbmQoIi5jLWF1dGhvciIpLnRleHQoKSArICJcblxuIjsNCiAgICAgICAgbWQgKz0gIj4gIiArIHBjLmZpbmQoIi5jLWNvbnRlbnQiKS5odG1sKCkgKyAiXG4iOw0KICAgICAgICAkKCcjY29tbWVudC1jb250ZW50JykuYmVmb3JlKCc8ZGl2IGNsYXNzPSJyZXBseS1tZCBtYXJrZG93biI+JyArIG1hcmtlZChtZCkgKyAnPC9kaXY+Jyk7DQogICAgICAgICQoJyNjb21tZW50LXBhcmVudCcpLnZhbChpZCk7DQogICAgICAgIGlmICgkKCcjY29tbWVudC1zaG93JykubGVuZ3RoKSB7DQogICAgICAgICAgICAkKCcjY29tbWVudC1zaG93IC5lbmFibGUnKS50cmlnZ2VyKCJjbGljayIpOw0KICAgICAgICB9DQogICAgICAgICQoJy5jYW5jZWwtcmVwbHknKS5zaG93KCk7DQogICAgICAgIHZhciB0b3AgPSAkKCcjY29tbWVudC1mb3JtJykub2Zmc2V0KCkudG9wOw0KICAgICAgICAkKCdib2R5LGh0bWwnKS5hbmltYXRlKHtzY3JvbGxUb3A6IHRvcH0sIDUwMCk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9KTsNCiAgICAkKCcuY2FuY2VsLXJlcGx5Jykub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAkKCcucmVwbHktbWQnKS5yZW1vdmUoKTsNCiAgICAgICAgJCgnI2NvbW1lbnQtcGFyZW50JykudmFsKDApOw0KICAgICAgICAkKHRoaXMpLmhpZGUoKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0pOw0KfQ0KUEsHCB7hHnJ1EgAAdRIAAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAHN0YXRpY1xqc1xob21lLm1pbi5qc2Z1bmN0aW9uIGZpeEhlYWRlcigpe3ZhciB0PSQoIiNuYXYiKSxlPXQub2Zmc2V0KCkudG9wO2NvbnNvbGUubG9nKGUpLCQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKXtlPCQodGhpcykuc2Nyb2xsVG9wKCk/dC5hZGRDbGFzcygiZml4ZWQiKS5yZW1vdmVDbGFzcygidGV4dC1jZW50ZXIiKTp0LnJlbW92ZUNsYXNzKCJmaXhlZCIpLmFkZENsYXNzKCJ0ZXh0LWNlbnRlciIpfSl9ZnVuY3Rpb24gdG9wQnV0dG9uKCl7dmFyIHQ9JCgiI25hdiIpLm9mZnNldCgpLnRvcCxlPSQoIiNnby10b3AiKTskKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCl7dDwkKHRoaXMpLnNjcm9sbFRvcCgpP2UucmVtb3ZlQ2xhc3MoImhpZGUiKTplLmFkZENsYXNzKCJoaWRlIil9KSxlLm9uKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gJCgiYm9keSxodG1sIikuYW5pbWF0ZSh7c2Nyb2xsVG9wOjB9LDUwMCksITF9KX1mdW5jdGlvbiByZW5kZXJNYXJrZG93bigpe3ZhciB0PSQoIi5tYXJrZG93biIpO3QuZWFjaChmdW5jdGlvbih0LGUpeyQoZSkuaHRtbChtYXJrZWQoJChlKS5odG1sKCkucmVwbGFjZSgvJmd0Oy9nLCI+IikpKX0pO3ZhciBlPXQuZmluZCgicHJlIGNvZGUiKTtlLmxlbmd0aCYmKCQoIjxsaW5rPiIpLmF0dHIoe3JlbDoic3R5bGVzaGVldCIsdHlwZToidGV4dC9jc3MiLGhyZWY6Ii9zdGF0aWMvY3NzL2hpZ2hsaWdodC5jc3MifSkuYXBwZW5kVG8oImhlYWQiKSwkLmdldFNjcmlwdCgiL3N0YXRpYy9saWIvaGlnaGxpZ2h0Lm1pbi5qcyIsZnVuY3Rpb24oKXtlLmVhY2goZnVuY3Rpb24odCxlKXtobGpzLmhpZ2hsaWdodEJsb2NrKGUpfSl9KSl9ZnVuY3Rpb24gaW5pdENvbW1lbnQoKXt2YXIgdD0kKCIjY29tbWVudC1saXN0Iik7dC5sZW5ndGgmJihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY29tbWVudC1hdXRob3IiKSYmKCQoIiNjb21tZW50LWF1dGhvciIpLnZhbChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY29tbWVudC1hdXRob3IiKSksJCgiI2NvbW1lbnQtZW1haWwiKS52YWwobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbW1lbnQtZW1haWwiKSksJCgiI2NvbW1lbnQtdXJsIikudmFsKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb21tZW50LXVybCIpKSwkKCIjY29tbWVudC1hdmF0YXIiKS5hdHRyKCJzcmMiLGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb21tZW50LWF2YXRhciIpKSwkKCIuYy1hdmF0YXIiKS5yZW1vdmVDbGFzcygibnVsbCIpKSwkKCIjY29tbWVudC1jb250ZW50Iikub24oImZvY3VzIixmdW5jdGlvbigpeyQoIi5jLWF2YXRhciIpLmhhc0NsYXNzKCJudWxsIikmJigkKCIuYy1hdmF0YXItZmllbGQiKS5yZW1vdmUoKSwkKCIuYy1pbmZvLWZpZWxkcyIpLnJlbW92ZUNsYXNzKCJoaWRlIikpfSksJCgiLm5vdC1tZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gJCgiLmMtYXZhdGFyLWZpZWxkIikucmVtb3ZlKCksJCgiLmMtaW5mby1maWVsZHMiKS5yZW1vdmVDbGFzcygiaGlkZSIpLCExfSksJCgiI2NvbW1lbnQtc2hvdyIpLm9uKCJjbGljayIsIi5lbmFibGUiLGZ1bmN0aW9uKCl7JCgiI2NvbW1lbnQtc2hvdyIpLnJlbW92ZSgpLCQoIiNjb21tZW50LWZvcm0iKS5yZW1vdmVDbGFzcygiaGlkZSIpfSksJCgiI2NvbW1lbnQtZm9ybSIpLmFqYXhGb3JtKGZ1bmN0aW9uKGUpe2lmKGUucmVzKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29tbWVudC1hdXRob3IiLCQoIiNjb21tZW50LWF1dGhvciIpLnZhbCgpKSxsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29tbWVudC1lbWFpbCIsJCgiI2NvbW1lbnQtZW1haWwiKS52YWwoKSksbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbW1lbnQtdXJsIiwkKCIjY29tbWVudC11cmwiKS52YWwoKSksbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbW1lbnQtYXZhdGFyIixlLmNvbW1lbnQuYXZhdGFyKTt2YXIgbz0kKCQoIiNjb21tZW50LXRwbCIpLmh0bWwoKSk7by5maW5kKCIuYy1hdmF0YXIiKS5hdHRyKCJzcmMiLGUuY29tbWVudC5hdmF0YXIpLmF0dHIoImFsdCIsZS5jb21tZW50LmF1dGhvciksby5maW5kKCIuYy1hdXRob3IiKS5hdHRyKCJocmVmIixlLmNvbW1lbnQudXJsKS50ZXh0KGUuY29tbWVudC5hdXRob3IpLG8uZmluZCgiLmMtcmVwbHkiKS5hdHRyKCJyZWwiLGUuY29tbWVudC5pZCksby5maW5kKCIuYy1jb250ZW50IikuaHRtbChlLmNvbW1lbnQuY29udGVudCksZS5jb21tZW50LnBhcmVudF9tZD9vLmZpbmQoIi5jLXAtbWQiKS5odG1sKG1hcmtlZChlLmNvbW1lbnQucGFyZW50X21kKSk6by5maW5kKCIuYy1wLW1kIikucmVtb3ZlKCksby5hdHRyKCJpZCIsImNvbW1lbnQtIitlLmNvbW1lbnQuaWQpLCJhcHByb3ZlZCI9PWUuY29tbWVudC5zdGF0dXMmJm8uZmluZCgiLmMtY2hlY2siKS5yZW1vdmUoKSx0LmFwcGVuZChvKSwkKCIuY2FuY2VsLXJlcGx5IikudHJpZ2dlcigiY2xpY2siKSwkKCIjY29tbWVudC1jb250ZW50IikudmFsKCIiKX1lbHNlIGFsZXJ0KCLmj5DkuqTlpLHotKUhIil9KSx0Lm9uKCJjbGljayIsIi5jLXJlcGx5IixmdW5jdGlvbigpeyQoIi5yZXBseS1tZCIpLnJlbW92ZSgpO3ZhciB0PSQodGhpcykuYXR0cigicmVsIiksZT0kKCIjY29tbWVudC0iK3QpLG89Ij4gQCIrZS5maW5kKCIuYy1hdXRob3IiKS50ZXh0KCkrIlxuXG4iO28rPSI+ICIrZS5maW5kKCIuYy1jb250ZW50IikuaHRtbCgpKyJcbiIsJCgiI2NvbW1lbnQtY29udGVudCIpLmJlZm9yZSgnPGRpdiBjbGFzcz0icmVwbHktbWQgbWFya2Rvd24iPicrbWFya2VkKG8pKyI8L2Rpdj4iKSwkKCIjY29tbWVudC1wYXJlbnQiKS52YWwodCksJCgiI2NvbW1lbnQtc2hvdyIpLmxlbmd0aCYmJCgiI2NvbW1lbnQtc2hvdyAuZW5hYmxlIikudHJpZ2dlcigiY2xpY2siKSwkKCIuY2FuY2VsLXJlcGx5Iikuc2hvdygpO3ZhciBuPSQoIiNjb21tZW50LWZvcm0iKS5vZmZzZXQoKS50b3A7cmV0dXJuICQoImJvZHksaHRtbCIpLmFuaW1hdGUoe3Njcm9sbFRvcDpufSw1MDApLCExfSksJCgiLmNhbmNlbC1yZXBseSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gJCgiLnJlcGx5LW1kIikucmVtb3ZlKCksJCgiI2NvbW1lbnQtcGFyZW50IikudmFsKDApLCQodGhpcykuaGlkZSgpLCExfSkpfSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7dG9wQnV0dG9uKCkscmVuZGVyTWFya2Rvd24oKSxpbml0Q29tbWVudCgpfSk7UEsHCIHF9j9NDAAATQwAAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAEwAAAHN0YXRpY1xqc1x1cGxvYWQuanNmdW5jdGlvbiBpbml0VXBsb2FkKHApIHsNCiAgICAkKCcjYXR0YWNoLXNob3cnKS5vbigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICQoJyNhdHRhY2gtdXBsb2FkJykudHJpZ2dlcigiY2xpY2siKTsNCiAgICB9KTsNCiAgICAkKCcjYXR0YWNoLXVwbG9hZCcpLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIGlmIChjb25maXJtKCLnq4vljbPkuIrkvKA/IikpIHsNCiAgICAgICAgICAgIHZhciBiYXIgPSAkKCc8cCBjbGFzcz0iZmlsZS1wcm9ncmVzcyBpbmxpbmUtYmxvY2siPjAlPC9wPicpOw0KICAgICAgICAgICAgJCgnI2F0dGFjaC1mb3JtJykuYWpheFN1Ym1pdCh7DQogICAgICAgICAgICAgICAgImJlZm9yZVN1Ym1pdCI6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgJChwKS5iZWZvcmUoYmFyKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICJ1cGxvYWRQcm9ncmVzcyI6IGZ1bmN0aW9uIChldmVudCwgcG9zaXRpb24sIHRvdGFsLCBwZXJjZW50Q29tcGxldGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnRWYWwgPSBwZXJjZW50Q29tcGxldGUgKyAnJSc7DQogICAgICAgICAgICAgICAgICAgIGJhci5jc3MoIndpZHRoIiwgcGVyY2VudFZhbCkuaHRtbChwZXJjZW50VmFsKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICJzdWNjZXNzIjogZnVuY3Rpb24gKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFqc29uLnJlcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYmFyLmh0bWwoanNvbi5tc2cpLmFkZENsYXNzKCJlcnIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhci5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMDApOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgYmFyLmh0bWwoIi8iICsganNvbi5maWxlLlVybCArICImbmJzcDsmbmJzcDsmbmJzcDsoQCIgKyBqc29uLmZpbGUuTmFtZSArICIpIik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJCgnI2F0dGFjaC11cGxvYWQnKS52YWwoIiIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJCh0aGlzKS52YWwoIiIpOw0KICAgICAgICB9DQogICAgfSk7DQp9UEsHCIiJF/v2BAAA9gQAAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAHN0YXRpY1xqc1x1cGxvYWQubWluLmpzZnVuY3Rpb24gaW5pdFVwbG9hZCh0KXskKCIjYXR0YWNoLXNob3ciKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7JCgiI2F0dGFjaC11cGxvYWQiKS50cmlnZ2VyKCJjbGljayIpfSksJCgiI2F0dGFjaC11cGxvYWQiKS5vbigiY2hhbmdlIixmdW5jdGlvbigpe2lmKGNvbmZpcm0oIueri+WNs+S4iuS8oD8iKSl7dmFyIGE9JCgnPHAgY2xhc3M9ImZpbGUtcHJvZ3Jlc3MgaW5saW5lLWJsb2NrIj4wJTwvcD4nKTskKCIjYXR0YWNoLWZvcm0iKS5hamF4U3VibWl0KHtiZWZvcmVTdWJtaXQ6ZnVuY3Rpb24oKXskKHQpLmJlZm9yZShhKX0sdXBsb2FkUHJvZ3Jlc3M6ZnVuY3Rpb24odCxpLG4sbyl7dmFyIGM9bysiJSI7YS5jc3MoIndpZHRoIixjKS5odG1sKGMpfSxzdWNjZXNzOmZ1bmN0aW9uKHQpe3QucmVzP2EuaHRtbCgiLyIrdC5maWxlLlVybCsiJm5ic3A7Jm5ic3A7Jm5ic3A7KEAiK3QuZmlsZS5OYW1lKyIpIik6KGEuaHRtbCh0Lm1zZykuYWRkQ2xhc3MoImVyciIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnJlbW92ZSgpfSw1ZTMpKSwkKCIjYXR0YWNoLXVwbG9hZCIpLnZhbCgiIil9fSl9ZWxzZSAkKHRoaXMpLnZhbCgiIil9KX1QSwcIp2KpZUgCAABIAgAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAc3RhdGljXGxpYi9QSwcIAAAAAAAAAAAAAAAAUEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAc3RhdGljXGxpYlxjb2RlbWlycm9yLW1vZGUubWluLmpzIWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PS9eKFxzKikoWyorLV18KFxkKylcLikoXHMqKS8sZT0iKistIjtDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdD1mdW5jdGlvbihyKXt2YXIgbixpPXIuZ2V0Q3Vyc29yKCksbz1yLmdldFN0YXRlQWZ0ZXIoaS5saW5lKS5saXN0IT09ITE7aWYoIW98fCEobj1yLmdldExpbmUoaS5saW5lKS5tYXRjaCh0KSkpcmV0dXJuIHIuZXhlY0NvbW1hbmQoIm5ld2xpbmVBbmRJbmRlbnQiKSx2b2lkIDA7dmFyIGw9blsxXSxhPW5bNF0scz1lLmluZGV4T2YoblsyXSk+PTA/blsyXTpwYXJzZUludChuWzNdLDEwKSsxKyIuIjtyLnJlcGxhY2VTZWxlY3Rpb24oIlxuIitsK3MrYSwiZW5kIil9fSgpLENvZGVNaXJyb3IuZGVmaW5lTW9kZSgibWFya2Rvd24iLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUscil7cmV0dXJuIGUuZj1lLmlubGluZT1yLHIodCxlKX1mdW5jdGlvbiBuKHQsZSxyKXtyZXR1cm4gZS5mPWUuYmxvY2s9cixyKHQsZSl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5saW5rVGl0bGU9ITEsdC5lbT0hMSx0LnN0cm9uZz0hMSx0LnF1b3RlPTAsZ3x8dC5mIT1sfHwodC5mPWMsdC5ibG9jaz1vKSx0LnRyYWlsaW5nU3BhY2U9MCx0LnRyYWlsaW5nU3BhY2VOZXdMaW5lPSExLHQudGhpc0xpbmVIYXNDb250ZW50PSExLG51bGx9ZnVuY3Rpb24gbyh0LGkpe3ZhciBvPWkubGlzdCE9PSExO2kubGlzdCE9PSExJiZpLmluZGVudGF0aW9uRGlmZj49MD8oaS5pbmRlbnRhdGlvbkRpZmY8NCYmKGkuaW5kZW50YXRpb24tPWkuaW5kZW50YXRpb25EaWZmKSxpLmxpc3Q9bnVsbCk6aS5saXN0IT09ITEmJmkuaW5kZW50YXRpb24+MD8oaS5saXN0PW51bGwsaS5saXN0RGVwdGg9TWF0aC5mbG9vcihpLmluZGVudGF0aW9uLzQpKTppLmxpc3QhPT0hMSYmKGkubGlzdD0hMSxpLmxpc3REZXB0aD0wKTt2YXIgbD1udWxsO2lmKGkuaW5kZW50YXRpb25EaWZmPj00KXJldHVybiBpLmluZGVudGF0aW9uLT00LHQuc2tpcFRvRW5kKCksaztpZih0LmVhdFNwYWNlKCkpcmV0dXJuIG51bGw7aWYobD10Lm1hdGNoKFIpKWkuaGVhZGVyPWxbMF0ubGVuZ3RoPD02P2xbMF0ubGVuZ3RoOjY7ZWxzZSBpZihpLnByZXZMaW5lSGFzQ29udGVudCYmKGw9dC5tYXRjaChHKSkpaS5oZWFkZXI9Ij0iPT1sWzBdLmNoYXJBdCgwKT8xOjI7ZWxzZSBpZih0LmVhdCgiPiIpKWZvcihpLmluZGVudGF0aW9uKyssaS5xdW90ZT0xLHQuZWF0U3BhY2UoKTt0LmVhdCgiPiIpOyl0LmVhdFNwYWNlKCksaS5xdW90ZSsrO2Vsc2V7aWYoIlsiPT09dC5wZWVrKCkpcmV0dXJuIHIodCxpLGgpO2lmKHQubWF0Y2goSSwhMCkpcmV0dXJuIEE7aWYoaS5wcmV2TGluZUhhc0NvbnRlbnQmJiFvfHwhdC5tYXRjaChQLCEwKSYmIXQubWF0Y2goRiwhMCkpe2lmKGUuZmVuY2VkQ29kZUJsb2NrcyYmdC5tYXRjaCgvXmBgYChbXHcrI10qKS8sITApKXJldHVybiBpLmxvY2FsTW9kZT14KFJlZ0V4cC4kMSksaS5sb2NhbE1vZGUmJihpLmxvY2FsU3RhdGU9aS5sb2NhbE1vZGUuc3RhcnRTdGF0ZSgpKSxuKHQsaSxhKSxrfWVsc2UgaS5pbmRlbnRhdGlvbis9NCxpLmxpc3Q9ITAsaS5saXN0RGVwdGgrKyxlLnRhc2tMaXN0cyYmdC5tYXRjaChCLCExKSYmKGkudGFza0xpc3Q9ITApfXJldHVybiByKHQsaSxpLmlubGluZSl9ZnVuY3Rpb24gbCh0LGUpe3ZhciByPXYudG9rZW4odCxlLmh0bWxTdGF0ZSk7cmV0dXJuIGcmJiJ0YWciPT09ciYmIm9wZW5UYWciIT09ZS5odG1sU3RhdGUudHlwZSYmIWUuaHRtbFN0YXRlLmNvbnRleHQmJihlLmY9YyxlLmJsb2NrPW8pLGUubWRfaW5zaWRlJiYtMSE9dC5jdXJyZW50KCkuaW5kZXhPZigiPiIpJiYoZS5mPWMsZS5ibG9jaz1vLGUuaHRtbFN0YXRlLmNvbnRleHQ9dm9pZCAwKSxyfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5zb2woKSYmdC5tYXRjaCgvXmBgYC8sITApPyhlLmxvY2FsTW9kZT1lLmxvY2FsU3RhdGU9bnVsbCxlLmY9YyxlLmJsb2NrPW8sayk6ZS5sb2NhbE1vZGU/ZS5sb2NhbE1vZGUudG9rZW4odCxlLmxvY2FsU3RhdGUpOih0LnNraXBUb0VuZCgpLGspfWZ1bmN0aW9uIHModCl7dmFyIGU9W107aWYodC50YXNrT3BlbilyZXR1cm4ibWV0YSI7aWYodC50YXNrQ2xvc2VkKXJldHVybiJwcm9wZXJ0eSI7aWYodC5zdHJvbmcmJmUucHVzaCh6KSx0LmVtJiZlLnB1c2goRSksdC5saW5rVGV4dCYmZS5wdXNoKE8pLHQuY29kZSYmZS5wdXNoKGspLHQuaGVhZGVyJiYoZS5wdXNoKEMpLGUucHVzaChDK3QuaGVhZGVyKSksdC5xdW90ZSYmZS5wdXNoKHQucXVvdGUlMj93OkwpLHQubGlzdCE9PSExKXt2YXIgcj0odC5saXN0RGVwdGgtMSklMztyPzE9PT1yP2UucHVzaChNKTplLnB1c2goVCk6ZS5wdXNoKFMpfXJldHVybiB0LnRyYWlsaW5nU3BhY2VOZXdMaW5lP2UucHVzaCgidHJhaWxpbmctc3BhY2UtbmV3LWxpbmUiKTp0LnRyYWlsaW5nU3BhY2UmJmUucHVzaCgidHJhaWxpbmctc3BhY2UtIisodC50cmFpbGluZ1NwYWNlJTI/ImEiOiJiIikpLGUubGVuZ3RoP2Uuam9pbigiICIpOm51bGx9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0Lm1hdGNoKF8sITApP3MoZSk6dm9pZCAwfWZ1bmN0aW9uIGModCxpKXt2YXIgbz1pLnRleHQodCxpKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG8pcmV0dXJuIG87aWYoaS5saXN0KXJldHVybiBpLmxpc3Q9bnVsbCxzKGkpO2lmKGkudGFza0xpc3Qpe3ZhciBhPSJ4IiE9PXQubWF0Y2goQiwhMClbMV07cmV0dXJuIGE/aS50YXNrT3Blbj0hMDppLnRhc2tDbG9zZWQ9ITAsaS50YXNrTGlzdD0hMSxzKGkpfWkudGFza09wZW49ITEsaS50YXNrQ2xvc2VkPSExO3ZhciB1PXQuc29sKCksYz10Lm5leHQoKTtpZigiXFwiPT09YylyZXR1cm4gdC5uZXh0KCkscyhpKTtpZihpLmxpbmtUaXRsZSl7aS5saW5rVGl0bGU9ITE7dmFyIGg9YzsiKCI9PT1jJiYoaD0iKSIpLGg9KGgrIiIpLnJlcGxhY2UoLyhbLj8qK14kW1xdXFwoKXt9fC1dKS9nLCJcXCQxIik7dmFyIGQ9Il5cXHMqKD86W14iK2grIlxcXFxdK3xcXFxcXFxcXHxcXFxcLikiK2g7aWYodC5tYXRjaChuZXcgUmVnRXhwKGQpLCEwKSlyZXR1cm4gV31pZigiYCI9PT1jKXt2YXIgcD1zKGkpLGc9dC5wb3M7dC5lYXRXaGlsZSgiYCIpO3ZhciB2PTErdC5wb3MtZztyZXR1cm4gaS5jb2RlP3Y9PT1iPyhpLmNvZGU9ITEscCk6cyhpKTooYj12LGkuY29kZT0hMCxzKGkpKX1pZihpLmNvZGUpcmV0dXJuIHMoaSk7aWYoIiEiPT09YyYmdC5tYXRjaCgvXFtbXlxdXSpcXSA/KD86XCh8XFspLywhMSkpcmV0dXJuIHQubWF0Y2goL1xbW15cXV0qXF0vKSxpLmlubGluZT1pLmY9ZixOO2lmKCJbIj09PWMmJnQubWF0Y2goLy4qXF0oXCh8ID9cWykvLCExKSlyZXR1cm4gaS5saW5rVGV4dD0hMCxzKGkpO2lmKCJdIj09PWMmJmkubGlua1RleHQpe3ZhciB5PXMoaSk7cmV0dXJuIGkubGlua1RleHQ9ITEsaS5pbmxpbmU9aS5mPWYseX1pZigiPCI9PT1jJiZ0Lm1hdGNoKC9eKGh0dHBzP3xmdHBzPyk6XC9cLyg/OlteXFw+XXxcXC4pKz4vLCExKSlyZXR1cm4gcih0LGksbShILCI+IikpO2lmKCI8Ij09PWMmJnQubWF0Y2goL15bXj4gXFxdK0AoPzpbXlxcPl18XFwuKSs+LywhMSkpcmV0dXJuIHIodCxpLG0oRCwiPiIpKTtpZigiPCI9PT1jJiZ0Lm1hdGNoKC9eXHcvLCExKSl7aWYoLTEhPXQuc3RyaW5nLmluZGV4T2YoIj4iKSl7dmFyIHg9dC5zdHJpbmcuc3Vic3RyaW5nKDEsdC5zdHJpbmcuaW5kZXhPZigiPiIpKTsvbWFya2Rvd25ccyo9XHMqKCd8Iil7MCwxfTEoJ3wiKXswLDF9Ly50ZXN0KHgpJiYoaS5tZF9pbnNpZGU9ITApfXJldHVybiB0LmJhY2tVcCgxKSxuKHQsaSxsKX1pZigiPCI9PT1jJiZ0Lm1hdGNoKC9eXC9cdyo/Pi8pKXJldHVybiBpLm1kX2luc2lkZT0hMSwidGFnIjt2YXIgQz0hMTtpZighZS51bmRlcnNjb3Jlc0JyZWFrV29yZHMmJiJfIj09PWMmJiJfIiE9PXQucGVlaygpJiZ0Lm1hdGNoKC8oXHcpLywhMSkpe3ZhciBrPXQucG9zLTI7aWYoaz49MCl7dmFyIHc9dC5zdHJpbmcuY2hhckF0KGspOyJfIiE9PXcmJncubWF0Y2goLyhcdykvLCExKSYmKEM9ITApfX12YXIgcD1zKGkpO2lmKCIqIj09PWN8fCJfIj09PWMmJiFDKWlmKHUmJiIgIj09PXQucGVlaygpKTtlbHNle2lmKGkuc3Ryb25nPT09YyYmdC5lYXQoYykpcmV0dXJuIGkuc3Ryb25nPSExLHA7aWYoIWkuc3Ryb25nJiZ0LmVhdChjKSlyZXR1cm4gaS5zdHJvbmc9YyxzKGkpO2lmKGkuZW09PT1jKXJldHVybiBpLmVtPSExLHA7aWYoIWkuZW0pcmV0dXJuIGkuZW09YyxzKGkpfWVsc2UgaWYoIiAiPT09YyYmKHQuZWF0KCIqIil8fHQuZWF0KCJfIikpKXtpZigiICI9PT10LnBlZWsoKSlyZXR1cm4gcyhpKTt0LmJhY2tVcCgxKX1yZXR1cm4iICI9PT1jJiYodC5tYXRjaCgvICskLywhMSk/aS50cmFpbGluZ1NwYWNlKys6aS50cmFpbGluZ1NwYWNlJiYoaS50cmFpbGluZ1NwYWNlTmV3TGluZT0hMCkpLHMoaSl9ZnVuY3Rpb24gZih0LGUpe2lmKHQuZWF0U3BhY2UoKSlyZXR1cm4gbnVsbDt2YXIgbj10Lm5leHQoKTtyZXR1cm4iKCI9PT1ufHwiWyI9PT1uP3IodCxlLG0oVywiKCI9PT1uPyIpIjoiXSIpKToiZXJyb3IifWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gdC5tYXRjaCgvXlteXF1dKlxdOi8sITApPyhlLmY9ZCxPKTpyKHQsZSxjKX1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIHQuZWF0U3BhY2UoKT9udWxsOih0Lm1hdGNoKC9eW15cc10rLywhMCksdm9pZCAwPT09dC5wZWVrKCk/ZS5saW5rVGl0bGU9ITA6dC5tYXRjaCgvXig/OlxzKyg/OiIoPzpbXiJcXF18XFxcXHxcXC4pKyJ8Jyg/OlteJ1xcXXxcXFxcfFxcLikrJ3xcKCg/OlteKVxcXXxcXFxcfFxcLikrXCkpKT8vLCEwKSxlLmY9ZS5pbmxpbmU9YyxXKX1mdW5jdGlvbiBwKHQpe3JldHVybiBWW3RdfHwodD0odCsiIikucmVwbGFjZSgvKFsuPyorXiRbXF1cXCgpe318LV0pL2csIlxcJDEiKSxWW3RdPW5ldyBSZWdFeHAoIl4oPzpbXlxcXFxdfFxcXFwuKSo/KCIrdCsiKSIpKSxWW3RdfWZ1bmN0aW9uIG0odCxlLHIpe3JldHVybiByPXJ8fGMsZnVuY3Rpb24obixpKXtyZXR1cm4gbi5tYXRjaChwKGUpKSxpLmlubGluZT1pLmY9cix0fX12YXIgZz1Db2RlTWlycm9yLm1vZGVzLmhhc093blByb3BlcnR5KCJ4bWwiKSx2PUNvZGVNaXJyb3IuZ2V0TW9kZSh0LGc/e25hbWU6InhtbCIsaHRtbE1vZGU6ITB9OiJ0ZXh0L3BsYWluIikseT17aHRtbDoiaHRtbG1peGVkIixqczoiamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiIsYzoidGV4dC94LWNzcmMiLCJjKysiOiJ0ZXh0L3gtYysrc3JjIixqYXZhOiJ0ZXh0L3gtamF2YSIsY3NoYXJwOiJ0ZXh0L3gtY3NoYXJwIiwiYyMiOiJ0ZXh0L3gtY3NoYXJwIixzY2FsYToidGV4dC94LXNjYWxhIn0seD1mdW5jdGlvbigpe3ZhciBlLHIsbj17fSxpPXt9LG89W107Zm9yKHZhciBsIGluIENvZGVNaXJyb3IubW9kZXMpQ29kZU1pcnJvci5tb2Rlcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShsKSYmby5wdXNoKGwpO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKyspbltvW2VdXT1vW2VdO3ZhciBhPVtdO2Zvcih2YXIgbCBpbiBDb2RlTWlycm9yLm1pbWVNb2RlcylDb2RlTWlycm9yLm1pbWVNb2Rlcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShsKSYmYS5wdXNoKHttaW1lOmwsbW9kZTpDb2RlTWlycm9yLm1pbWVNb2Rlc1tsXX0pO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspcj1hW2VdLm1pbWUsaVtyXT1hW2VdLm1pbWU7Zm9yKHZhciBzIGluIHkpKHlbc11pbiBufHx5W3NdaW4gaSkmJihuW3NdPXlbc10pO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXT9Db2RlTWlycm9yLmdldE1vZGUodCxuW2VdKTpudWxsfX0oKTt2b2lkIDA9PT1lLnVuZGVyc2NvcmVzQnJlYWtXb3JkcyYmKGUudW5kZXJzY29yZXNCcmVha1dvcmRzPSEwKSx2b2lkIDA9PT1lLmZlbmNlZENvZGVCbG9ja3MmJihlLmZlbmNlZENvZGVCbG9ja3M9ITEpLHZvaWQgMD09PWUudGFza0xpc3RzJiYoZS50YXNrTGlzdHM9ITEpO3ZhciBiPTAsQz0iaGVhZGVyIixrPSJjb21tZW50Iix3PSJhdG9tIixMPSJudW1iZXIiLFM9InZhcmlhYmxlLTIiLE09InZhcmlhYmxlLTMiLFQ9ImtleXdvcmQiLEE9ImhyIixOPSJ0YWciLEg9ImxpbmsiLEQ9ImxpbmsiLE89ImxpbmsiLFc9InN0cmluZyIsRT0iZW0iLHo9InN0cm9uZyIsST0vXihbKlwtPV9dKSg/OlxzKlwxKXsyLH1ccyokLyxQPS9eWypcLStdXHMrLyxGPS9eWzAtOV0rXC5ccysvLEI9L15cWyh4fCApXF0oPz1ccykvLFI9L14jKy8sRz0vXig/Olw9ezEsfXwtezEsfSkkLyxfPS9eW14hXFtcXSpfXFw8PmAgIicoXSsvLFY9W107cmV0dXJue3N0YXJ0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm57ZjpvLHByZXZMaW5lSGFzQ29udGVudDohMSx0aGlzTGluZUhhc0NvbnRlbnQ6ITEsYmxvY2s6byxodG1sU3RhdGU6Q29kZU1pcnJvci5zdGFydFN0YXRlKHYpLGluZGVudGF0aW9uOjAsaW5saW5lOmMsdGV4dDp1LGxpbmtUZXh0OiExLGxpbmtUaXRsZTohMSxlbTohMSxzdHJvbmc6ITEsaGVhZGVyOjAsdGFza0xpc3Q6ITEsbGlzdDohMSxsaXN0RGVwdGg6MCxxdW90ZTowLHRyYWlsaW5nU3BhY2U6MCx0cmFpbGluZ1NwYWNlTmV3TGluZTohMX19LGNvcHlTdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm57Zjp0LmYscHJldkxpbmVIYXNDb250ZW50OnQucHJldkxpbmVIYXNDb250ZW50LHRoaXNMaW5lSGFzQ29udGVudDp0LnRoaXNMaW5lSGFzQ29udGVudCxibG9jazp0LmJsb2NrLGh0bWxTdGF0ZTpDb2RlTWlycm9yLmNvcHlTdGF0ZSh2LHQuaHRtbFN0YXRlKSxpbmRlbnRhdGlvbjp0LmluZGVudGF0aW9uLGxvY2FsTW9kZTp0LmxvY2FsTW9kZSxsb2NhbFN0YXRlOnQubG9jYWxNb2RlP0NvZGVNaXJyb3IuY29weVN0YXRlKHQubG9jYWxNb2RlLHQubG9jYWxTdGF0ZSk6bnVsbCxpbmxpbmU6dC5pbmxpbmUsdGV4dDp0LnRleHQsbGlua1RpdGxlOnQubGlua1RpdGxlLGVtOnQuZW0sc3Ryb25nOnQuc3Ryb25nLGhlYWRlcjp0LmhlYWRlcix0YXNrTGlzdDp0LnRhc2tMaXN0LGxpc3Q6dC5saXN0LGxpc3REZXB0aDp0Lmxpc3REZXB0aCxxdW90ZTp0LnF1b3RlLHRyYWlsaW5nU3BhY2U6dC50cmFpbGluZ1NwYWNlLHRyYWlsaW5nU3BhY2VOZXdMaW5lOnQudHJhaWxpbmdTcGFjZU5ld0xpbmUsbWRfaW5zaWRlOnQubWRfaW5zaWRlfX0sdG9rZW46ZnVuY3Rpb24odCxlKXtpZih0LnNvbCgpKXtpZih0Lm1hdGNoKC9eXHMqJC8sITApKXJldHVybiBlLnByZXZMaW5lSGFzQ29udGVudD0hMSxpKGUpO2UucHJldkxpbmVIYXNDb250ZW50PWUudGhpc0xpbmVIYXNDb250ZW50LGUudGhpc0xpbmVIYXNDb250ZW50PSEwLGUuaGVhZGVyPTAsZS50YXNrTGlzdD0hMSxlLmNvZGU9ITEsZS50cmFpbGluZ1NwYWNlPTAsZS50cmFpbGluZ1NwYWNlTmV3TGluZT0hMSxlLmY9ZS5ibG9jazt2YXIgcj10Lm1hdGNoKC9eXHMqLywhMClbMF0ucmVwbGFjZSgvXHQvZywiICAgICIpLmxlbmd0aCxuPTQqTWF0aC5mbG9vcigoci1lLmluZGVudGF0aW9uKS80KTtuPjQmJihuPTQpO3ZhciBvPWUuaW5kZW50YXRpb24rbjtpZihlLmluZGVudGF0aW9uRGlmZj1vLWUuaW5kZW50YXRpb24sZS5pbmRlbnRhdGlvbj1vLHI+MClyZXR1cm4gbnVsbH1yZXR1cm4gZS5mKHQsZSl9LGJsYW5rTGluZTppLGdldFR5cGU6c319LCJ4bWwiKSxDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1tYXJrZG93biIsIm1hcmtkb3duIiksQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4bWwiLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUpe2Z1bmN0aW9uIHIocil7cmV0dXJuIGUudG9rZW5pemU9cixyKHQsZSl9dmFyIGk9dC5uZXh0KCk7aWYoIjwiPT1pKXtpZih0LmVhdCgiISIpKXJldHVybiB0LmVhdCgiWyIpP3QubWF0Y2goIkNEQVRBWyIpP3IobygiYXRvbSIsIl1dPiIpKTpudWxsOnQubWF0Y2goIi0tIik/cihvKCJjb21tZW50IiwiLS0+IikpOnQubWF0Y2goIkRPQ1RZUEUiLCEwLCEwKT8odC5lYXRXaGlsZSgvW1x3XC5fXC1dLykscihsKDEpKSk6bnVsbDtpZih0LmVhdCgiPyIpKXJldHVybiB0LmVhdFdoaWxlKC9bXHdcLl9cLV0vKSxlLnRva2VuaXplPW8oIm1ldGEiLCI/PiIpLCJtZXRhIjt2YXIgYT10LmVhdCgiLyIpO3g9IiI7Zm9yKHZhciBzO3M9dC5lYXQoL1teXHNcdTAwYTA9PD5cIlwnXC8/XS8pOyl4Kz1zO3JldHVybiB4PyhiPWE/ImNsb3NlVGFnIjoib3BlblRhZyIsZS50b2tlbml6ZT1uLCJ0YWciKToidGFnIGVycm9yIn1pZigiJiI9PWkpe3ZhciB1O3JldHVybiB1PXQuZWF0KCIjIik/dC5lYXQoIngiKT90LmVhdFdoaWxlKC9bYS1mQS1GXGRdLykmJnQuZWF0KCI7Iik6dC5lYXRXaGlsZSgvW1xkXS8pJiZ0LmVhdCgiOyIpOnQuZWF0V2hpbGUoL1tcd1wuXC06XS8pJiZ0LmVhdCgiOyIpLHU/ImF0b20iOiJlcnJvciJ9cmV0dXJuIHQuZWF0V2hpbGUoL1teJjxdLyksbnVsbH1mdW5jdGlvbiBuKHQsZSl7dmFyIG49dC5uZXh0KCk7aWYoIj4iPT1ufHwiLyI9PW4mJnQuZWF0KCI+IikpcmV0dXJuIGUudG9rZW5pemU9cixiPSI+Ij09bj8iZW5kVGFnIjoic2VsZmNsb3NlVGFnIiwidGFnIjtpZigiPSI9PW4pcmV0dXJuIGI9ImVxdWFscyIsbnVsbDtpZigiPCI9PW4pe2UudG9rZW5pemU9cjt2YXIgbz1lLnRva2VuaXplKHQsZSk7cmV0dXJuIG8/bysiIGVycm9yIjoiZXJyb3IifXJldHVybi9bXCdcIl0vLnRlc3Qobik/KGUudG9rZW5pemU9aShuKSxlLnN0cmluZ1N0YXJ0Q29sPXQuY29sdW1uKCksZS50b2tlbml6ZSh0LGUpKToodC5lYXRXaGlsZSgvW15cc1x1MDBhMD08PlwiXCddLyksIndvcmQiKX1mdW5jdGlvbiBpKHQpe3ZhciBlPWZ1bmN0aW9uKGUscil7Zm9yKDshZS5lb2woKTspaWYoZS5uZXh0KCk9PXQpe3IudG9rZW5pemU9bjticmVha31yZXR1cm4ic3RyaW5nIn07cmV0dXJuIGUuaXNJbkF0dHJpYnV0ZT0hMCxlfWZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXtmb3IoOyFuLmVvbCgpOyl7aWYobi5tYXRjaChlKSl7aS50b2tlbml6ZT1yO2JyZWFrfW4ubmV4dCgpfXJldHVybiB0fX1mdW5jdGlvbiBsKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2Zvcih2YXIgaTtudWxsIT0oaT1lLm5leHQoKSk7KXtpZigiPCI9PWkpcmV0dXJuIG4udG9rZW5pemU9bCh0KzEpLG4udG9rZW5pemUoZSxuKTtpZigiPiI9PWkpe2lmKDE9PXQpe24udG9rZW5pemU9cjticmVha31yZXR1cm4gbi50b2tlbml6ZT1sKHQtMSksbi50b2tlbml6ZShlLG4pfX1yZXR1cm4ibWV0YSJ9fWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aC0xO3Q+PTA7dC0tKUMuY2MucHVzaChhcmd1bWVudHNbdF0pfWZ1bmN0aW9uIHMoKXtyZXR1cm4gYS5hcHBseShudWxsLGFyZ3VtZW50cyksITB9ZnVuY3Rpb24gdSh0LGUpe3ZhciByPVQuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodCl8fEMuY29udGV4dCYmQy5jb250ZXh0Lm5vSW5kZW50O0MuY29udGV4dD17cHJldjpDLmNvbnRleHQsdGFnTmFtZTp0LGluZGVudDpDLmluZGVudGVkLHN0YXJ0T2ZMaW5lOmUsbm9JbmRlbnQ6cn19ZnVuY3Rpb24gYygpe0MuY29udGV4dCYmKEMuY29udGV4dD1DLmNvbnRleHQucHJldil9ZnVuY3Rpb24gZih0KXtpZigib3BlblRhZyI9PXQpcmV0dXJuIEMudGFnTmFtZT14LEMudGFnU3RhcnQ9ay5jb2x1bW4oKSxzKG0saChDLnN0YXJ0T2ZMaW5lKSk7aWYoImNsb3NlVGFnIj09dCl7dmFyIGU9ITE7cmV0dXJuIEMuY29udGV4dD9DLmNvbnRleHQudGFnTmFtZSE9eCYmKFQuaW1wbGljaXRseUNsb3NlZC5oYXNPd25Qcm9wZXJ0eShDLmNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSYmYygpLGU9IUMuY29udGV4dHx8Qy5jb250ZXh0LnRhZ05hbWUhPXgpOmU9ITAsZSYmKHc9ImVycm9yIikscyhkKGUpKX1yZXR1cm4gcygpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPUMudGFnTmFtZTtyZXR1cm4gQy50YWdOYW1lPUMudGFnU3RhcnQ9bnVsbCwic2VsZmNsb3NlVGFnIj09ZXx8ImVuZFRhZyI9PWUmJlQuYXV0b1NlbGZDbG9zZXJzLmhhc093blByb3BlcnR5KHIudG9Mb3dlckNhc2UoKSk/KHAoci50b0xvd2VyQ2FzZSgpKSxzKCkpOiJlbmRUYWciPT1lPyhwKHIudG9Mb3dlckNhc2UoKSksdShyLHQpLHMoKSk6cygpfX1mdW5jdGlvbiBkKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCYmKHc9ImVycm9yIiksImVuZFRhZyI9PWU/KGMoKSxzKCkpOih3PSJlcnJvciIscyhhcmd1bWVudHMuY2FsbGVlKSl9fWZ1bmN0aW9uIHAodCl7Zm9yKHZhciBlOzspe2lmKCFDLmNvbnRleHQpcmV0dXJuO2lmKGU9Qy5jb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSwhVC5jb250ZXh0R3JhYmJlcnMuaGFzT3duUHJvcGVydHkoZSl8fCFULmNvbnRleHRHcmFiYmVyc1tlXS5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm47YygpfX1mdW5jdGlvbiBtKHQpe3JldHVybiJ3b3JkIj09dD8odz0iYXR0cmlidXRlIixzKGcsbSkpOiJlbmRUYWciPT10fHwic2VsZmNsb3NlVGFnIj09dD9hKCk6KHc9ImVycm9yIixzKG0pKX1mdW5jdGlvbiBnKHQpe2lmKCJlcXVhbHMiPT10KXJldHVybiBzKHYsbSk7aWYoVC5hbGxvd01pc3Npbmcpe2lmKCJ3b3JkIj09dClyZXR1cm4gdz0iYXR0cmlidXRlIixzKGcsbSl9ZWxzZSB3PSJlcnJvciI7cmV0dXJuImVuZFRhZyI9PXR8fCJzZWxmY2xvc2VUYWciPT10P2EoKTpzKCl9ZnVuY3Rpb24gdih0KXtyZXR1cm4ic3RyaW5nIj09dD9zKHkpOiJ3b3JkIj09dCYmVC5hbGxvd1VucXVvdGVkPyh3PSJzdHJpbmciLHMoKSk6KHc9ImVycm9yIiwiZW5kVGFnIj09dHx8InNlbGZDbG9zZVRhZyI9PXQ/YSgpOnMoKSl9ZnVuY3Rpb24geSh0KXtyZXR1cm4ic3RyaW5nIj09dD9zKHkpOmEoKX12YXIgeCxiLEMsayx3LEw9dC5pbmRlbnRVbml0LFM9ZS5tdWx0aWxpbmVUYWdJbmRlbnRGYWN0b3J8fDEsTT1lLm11bHRpbGluZVRhZ0luZGVudFBhc3RUYWd8fCEwLFQ9ZS5odG1sTW9kZT97YXV0b1NlbGZDbG9zZXJzOnthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGNvbW1hbmQ6ITAsZW1iZWQ6ITAsZnJhbWU6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0saW1wbGljaXRseUNsb3NlZDp7ZGQ6ITAsbGk6ITAsb3B0Z3JvdXA6ITAsb3B0aW9uOiEwLHA6ITAscnA6ITAscnQ6ITAsdGJvZHk6ITAsdGQ6ITAsdGZvb3Q6ITAsdGg6ITAsdHI6ITB9LGNvbnRleHRHcmFiYmVyczp7ZGQ6e2RkOiEwLGR0OiEwfSxkdDp7ZGQ6ITAsZHQ6ITB9LGxpOntsaTohMH0sb3B0aW9uOntvcHRpb246ITAsb3B0Z3JvdXA6ITB9LG9wdGdyb3VwOntvcHRncm91cDohMH0scDp7YWRkcmVzczohMCxhcnRpY2xlOiEwLGFzaWRlOiEwLGJsb2NrcXVvdGU6ITAsZGlyOiEwLGRpdjohMCxkbDohMCxmaWVsZHNldDohMCxmb290ZXI6ITAsZm9ybTohMCxoMTohMCxoMjohMCxoMzohMCxoNDohMCxoNTohMCxoNjohMCxoZWFkZXI6ITAsaGdyb3VwOiEwLGhyOiEwLG1lbnU6ITAsbmF2OiEwLG9sOiEwLHA6ITAscHJlOiEwLHNlY3Rpb246ITAsdGFibGU6ITAsdWw6ITB9LHJwOntycDohMCxydDohMH0scnQ6e3JwOiEwLHJ0OiEwfSx0Ym9keTp7dGJvZHk6ITAsdGZvb3Q6ITB9LHRkOnt0ZDohMCx0aDohMH0sdGZvb3Q6e3Rib2R5OiEwfSx0aDp7dGQ6ITAsdGg6ITB9LHRoZWFkOnt0Ym9keTohMCx0Zm9vdDohMH0sdHI6e3RyOiEwfX0sZG9Ob3RJbmRlbnQ6e3ByZTohMH0sYWxsb3dVbnF1b3RlZDohMCxhbGxvd01pc3Npbmc6ITB9OnthdXRvU2VsZkNsb3NlcnM6e30saW1wbGljaXRseUNsb3NlZDp7fSxjb250ZXh0R3JhYmJlcnM6e30sZG9Ob3RJbmRlbnQ6e30sYWxsb3dVbnF1b3RlZDohMSxhbGxvd01pc3Npbmc6ITF9LEE9ZS5hbGlnbkNEQVRBO3JldHVybntzdGFydFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJue3Rva2VuaXplOnIsY2M6W10saW5kZW50ZWQ6MCxzdGFydE9mTGluZTohMCx0YWdOYW1lOm51bGwsdGFnU3RhcnQ6bnVsbCxjb250ZXh0Om51bGx9fSx0b2tlbjpmdW5jdGlvbih0LGUpe2lmKCFlLnRhZ05hbWUmJnQuc29sKCkmJihlLnN0YXJ0T2ZMaW5lPSEwLGUuaW5kZW50ZWQ9dC5pbmRlbnRhdGlvbigpKSx0LmVhdFNwYWNlKCkpcmV0dXJuIG51bGw7dz1iPXg9bnVsbDt2YXIgcj1lLnRva2VuaXplKHQsZSk7aWYoZS50eXBlPWIsKHJ8fGIpJiYiY29tbWVudCIhPXIpZm9yKEM9ZSxrPXQ7Oyl7dmFyIG49ZS5jYy5wb3AoKXx8ZjtpZihuKGJ8fHIpKWJyZWFrfXJldHVybiBlLnN0YXJ0T2ZMaW5lPSExLHcmJihyPSJlcnJvciI9PXc/cisiIGVycm9yIjp3KSxyfSxpbmRlbnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQuY29udGV4dDtpZih0LnRva2VuaXplLmlzSW5BdHRyaWJ1dGUpcmV0dXJuIHQuc3RyaW5nU3RhcnRDb2wrMTtpZih0LnRva2VuaXplIT1uJiZ0LnRva2VuaXplIT1yfHxvJiZvLm5vSW5kZW50KXJldHVybiBpP2kubWF0Y2goL14oXHMqKS8pWzBdLmxlbmd0aDowO2lmKHQudGFnTmFtZSlyZXR1cm4gTT90LnRhZ1N0YXJ0K3QudGFnTmFtZS5sZW5ndGgrMjp0LnRhZ1N0YXJ0K0wqUztpZihBJiYvPCFcW0NEQVRBXFsvLnRlc3QoZSkpcmV0dXJuIDA7Zm9yKG8mJi9ePFwvLy50ZXN0KGUpJiYobz1vLnByZXYpO28mJiFvLnN0YXJ0T2ZMaW5lOylvPW8ucHJldjtyZXR1cm4gbz9vLmluZGVudCtMOjB9LGVsZWN0cmljQ2hhcnM6Ii8iLGJsb2NrQ29tbWVudFN0YXJ0OiI8IS0tIixibG9ja0NvbW1lbnRFbmQ6Ii0tPiIsY29uZmlndXJhdGlvbjplLmh0bWxNb2RlPyJodG1sIjoieG1sIixoZWxwZXJUeXBlOmUuaHRtbE1vZGU/Imh0bWwiOiJ4bWwifX0pLENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94bWwiLCJ4bWwiKSxDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3htbCIsInhtbCIpLENvZGVNaXJyb3IubWltZU1vZGVzLmhhc093blByb3BlcnR5KCJ0ZXh0L2h0bWwiKXx8Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2h0bWwiLHtuYW1lOiJ4bWwiLGh0bWxNb2RlOiEwfSk7UEsHCJPWD12IMgAAiDIAAFBLAwQUAAgAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAHN0YXRpY1xsaWJcY29kZW1pcnJvci5taW4uanN3aW5kb3cuQ29kZU1pcnJvcj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KHIsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KHIsbik7dGhpcy5vcHRpb25zPW49bnx8e307Zm9yKHZhciBpIGluIGFvKSFuLmhhc093blByb3BlcnR5KGkpJiZhby5oYXNPd25Qcm9wZXJ0eShpKSYmKG5baV09YW9baV0pO2gobik7dmFyIG89InN0cmluZyI9PXR5cGVvZiBuLnZhbHVlPzA6bi52YWx1ZS5maXJzdCxsPXRoaXMuZGlzcGxheT1lKHIsbyk7bC53cmFwcGVyLkNvZGVNaXJyb3I9dGhpcyx1KHRoaXMpLG4uYXV0b2ZvY3VzJiYhVmkmJnBlKHRoaXMpLHRoaXMuc3RhdGU9e2tleU1hcHM6W10sb3ZlcmxheXM6W10sbW9kZUdlbjowLG92ZXJ3cml0ZTohMSxmb2N1c2VkOiExLHN1cHByZXNzRWRpdHM6ITEscGFzdGVJbmNvbWluZzohMSxkcmFnZ2luZ1RleHQ6ITEsaGlnaGxpZ2h0Om5ldyAkbn0scyh0aGlzKSxuLmxpbmVXcmFwcGluZyYmKHRoaXMuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSs9IiBDb2RlTWlycm9yLXdyYXAiKTt2YXIgYT1uLnZhbHVlOyJzdHJpbmciPT10eXBlb2YgYSYmKGE9bmV3IHdvKG4udmFsdWUsbi5tb2RlKSksbGUodGhpcyxwbikodGhpcyxhKSxBaSYmc2V0VGltZW91dChpaShkZSx0aGlzLCEwKSwyMCksbWUodGhpcyk7dmFyIGM7dHJ5e2M9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09bC5pbnB1dH1jYXRjaChmKXt9Y3x8bi5hdXRvZm9jdXMmJiFWaT9zZXRUaW1lb3V0KGlpKEVlLHRoaXMpLDIwKTp6ZSh0aGlzKSxsZSh0aGlzLGZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHNvKXNvLnByb3BlcnR5SXNFbnVtZXJhYmxlKHQpJiZzb1t0XSh0aGlzLG5bdF0sdW8pO2Zvcih2YXIgZT0wO2U8cG8ubGVuZ3RoOysrZSlwb1tlXSh0aGlzKX0pKCl9ZnVuY3Rpb24gZSh0LGUpe3ZhciByPXt9LG49ci5pbnB1dD1zaSgidGV4dGFyZWEiLG51bGwsbnVsbCwicG9zaXRpb246IGFic29sdXRlOyBwYWRkaW5nOiAwOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFlbTsgb3V0bGluZTogbm9uZTsgZm9udC1zaXplOiA0cHg7Iik7cmV0dXJuIFdpP24uc3R5bGUud2lkdGg9IjEwMDBweCI6bi5zZXRBdHRyaWJ1dGUoIndyYXAiLCJvZmYiKSxHaSYmKG4uc3R5bGUuYm9yZGVyPSIxcHggc29saWQgYmxhY2siKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NvcnJlY3QiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsImZhbHNlIiksci5pbnB1dERpdj1zaSgiZGl2Iixbbl0sbnVsbCwib3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogM3B4OyBoZWlnaHQ6IDBweDsiKSxyLnNjcm9sbGJhckg9c2koImRpdiIsW3NpKCJkaXYiLG51bGwsbnVsbCwiaGVpZ2h0OiAxcHgiKV0sIkNvZGVNaXJyb3ItaHNjcm9sbGJhciIpLHIuc2Nyb2xsYmFyVj1zaSgiZGl2Iixbc2koImRpdiIsbnVsbCxudWxsLCJ3aWR0aDogMXB4IildLCJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKSxyLnNjcm9sbGJhckZpbGxlcj1zaSgiZGl2IixudWxsLCJDb2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIiKSxyLmd1dHRlckZpbGxlcj1zaSgiZGl2IixudWxsLCJDb2RlTWlycm9yLWd1dHRlci1maWxsZXIiKSxyLmxpbmVEaXY9c2koImRpdiIsbnVsbCwiQ29kZU1pcnJvci1jb2RlIiksci5zZWxlY3Rpb25EaXY9c2koImRpdiIsbnVsbCxudWxsLCJwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDEiKSxyLmN1cnNvcj1zaSgiZGl2IiwiwqAiLCJDb2RlTWlycm9yLWN1cnNvciIpLHIub3RoZXJDdXJzb3I9c2koImRpdiIsIsKgIiwiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3IiKSxyLm1lYXN1cmU9c2koImRpdiIsbnVsbCwiQ29kZU1pcnJvci1tZWFzdXJlIiksci5saW5lU3BhY2U9c2koImRpdiIsW3IubWVhc3VyZSxyLnNlbGVjdGlvbkRpdixyLmxpbmVEaXYsci5jdXJzb3Isci5vdGhlckN1cnNvcl0sbnVsbCwicG9zaXRpb246IHJlbGF0aXZlOyBvdXRsaW5lOiBub25lIiksci5tb3Zlcj1zaSgiZGl2Iixbc2koImRpdiIsW3IubGluZVNwYWNlXSwiQ29kZU1pcnJvci1saW5lcyIpXSxudWxsLCJwb3NpdGlvbjogcmVsYXRpdmUiKSxyLnNpemVyPXNpKCJkaXYiLFtyLm1vdmVyXSwiQ29kZU1pcnJvci1zaXplciIpLHIuaGVpZ2h0Rm9yY2VyPXNpKCJkaXYiLG51bGwsbnVsbCwicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6ICIrVG8rInB4OyB3aWR0aDogMXB4OyIpLHIuZ3V0dGVycz1zaSgiZGl2IixudWxsLCJDb2RlTWlycm9yLWd1dHRlcnMiKSxyLmxpbmVHdXR0ZXI9bnVsbCxyLnNjcm9sbGVyPXNpKCJkaXYiLFtyLnNpemVyLHIuaGVpZ2h0Rm9yY2VyLHIuZ3V0dGVyc10sIkNvZGVNaXJyb3Itc2Nyb2xsIiksci5zY3JvbGxlci5zZXRBdHRyaWJ1dGUoInRhYkluZGV4IiwiLTEiKSxyLndyYXBwZXI9c2koImRpdiIsW3IuaW5wdXREaXYsci5zY3JvbGxiYXJILHIuc2Nyb2xsYmFyVixyLnNjcm9sbGJhckZpbGxlcixyLmd1dHRlckZpbGxlcixyLnNjcm9sbGVyXSwiQ29kZU1pcnJvciIpLEhpJiYoci5ndXR0ZXJzLnN0eWxlLnpJbmRleD0tMSxyLnNjcm9sbGVyLnN0eWxlLnBhZGRpbmdSaWdodD0wKSx0LmFwcGVuZENoaWxkP3QuYXBwZW5kQ2hpbGQoci53cmFwcGVyKTp0KHIud3JhcHBlciksR2kmJihuLnN0eWxlLndpZHRoPSIwcHgiKSxXaXx8KHIuc2Nyb2xsZXIuZHJhZ2dhYmxlPSEwKSxGaT8oci5pbnB1dERpdi5zdHlsZS5oZWlnaHQ9IjFweCIsci5pbnB1dERpdi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiKTpIaSYmKHIuc2Nyb2xsYmFySC5zdHlsZS5taW5XaWR0aD1yLnNjcm9sbGJhclYuc3R5bGUubWluV2lkdGg9IjE4cHgiKSxyLnZpZXdPZmZzZXQ9ci5sYXN0U2l6ZUM9MCxyLnNob3dpbmdGcm9tPXIuc2hvd2luZ1RvPWUsci5saW5lTnVtV2lkdGg9ci5saW5lTnVtSW5uZXJXaWR0aD1yLmxpbmVOdW1DaGFycz1udWxsLHIucHJldklucHV0PSIiLHIuYWxpZ25XaWRnZXRzPSExLHIucG9sbGluZ0Zhc3Q9ITEsci5wb2xsPW5ldyAkbixyLmNhY2hlZENoYXJXaWR0aD1yLmNhY2hlZFRleHRIZWlnaHQ9bnVsbCxyLm1lYXN1cmVMaW5lQ2FjaGU9W10sci5tZWFzdXJlTGluZUNhY2hlUG9zPTAsci5pbmFjY3VyYXRlU2VsZWN0aW9uPSExLHIubWF4TGluZT1udWxsLHIubWF4TGluZUxlbmd0aD0wLHIubWF4TGluZUNoYW5nZWQ9ITEsci53aGVlbERYPXIud2hlZWxEWT1yLndoZWVsU3RhcnRYPXIud2hlZWxTdGFydFk9bnVsbCxyfWZ1bmN0aW9uIHIoZSl7ZS5kb2MubW9kZT10LmdldE1vZGUoZS5vcHRpb25zLGUuZG9jLm1vZGVPcHRpb24pLGUuZG9jLml0ZXIoZnVuY3Rpb24odCl7dC5zdGF0ZUFmdGVyJiYodC5zdGF0ZUFmdGVyPW51bGwpLHQuc3R5bGVzJiYodC5zdHlsZXM9bnVsbCl9KSxlLmRvYy5mcm9udGllcj1lLmRvYy5maXJzdCxXKGUsMTAwKSxlLnN0YXRlLm1vZGVHZW4rKyxlLmN1ck9wJiZ1ZShlKX1mdW5jdGlvbiBuKHQpe3Qub3B0aW9ucy5saW5lV3JhcHBpbmc/KHQuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSs9IiBDb2RlTWlycm9yLXdyYXAiLHQuZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aD0iIik6KHQuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZT10LmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgiIENvZGVNaXJyb3Itd3JhcCIsIiIpLGYodCkpLG8odCksdWUodCksXyh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZCh0KX0sMTAwKX1mdW5jdGlvbiBpKHQpe3ZhciBlPXJlKHQuZGlzcGxheSkscj10Lm9wdGlvbnMubGluZVdyYXBwaW5nLG49ciYmTWF0aC5tYXgoNSx0LmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgvbmUodC5kaXNwbGF5KS0zKTtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIFZyKHQuZG9jLGkpPzA6cj8oTWF0aC5jZWlsKGkudGV4dC5sZW5ndGgvbil8fDEpKmU6ZX19ZnVuY3Rpb24gbyh0KXt2YXIgZT10LmRvYyxyPWkodCk7ZS5pdGVyKGZ1bmN0aW9uKHQpe3ZhciBlPXIodCk7ZSE9dC5oZWlnaHQmJnluKHQsZSl9KX1mdW5jdGlvbiBsKHQpe3ZhciBlPXZvW3Qub3B0aW9ucy5rZXlNYXBdLHI9ZS5zdHlsZTt0LmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWU9dC5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKmNtLWtleW1hcC1cUysvZywiIikrKHI/IiBjbS1rZXltYXAtIityOiIiKSx0LnN0YXRlLmRpc2FibGVJbnB1dD1lLmRpc2FibGVJbnB1dH1mdW5jdGlvbiBzKHQpe3QuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZT10LmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgvXHMqY20tcy1cUysvZywiIikrdC5vcHRpb25zLnRoZW1lLnJlcGxhY2UoLyhefFxzKVxzKi9nLCIgY20tcy0iKSxfKHQpfWZ1bmN0aW9uIGEodCl7dSh0KSx1ZSh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zyh0KX0sMjApfWZ1bmN0aW9uIHUodCl7dmFyIGU9dC5kaXNwbGF5Lmd1dHRlcnMscj10Lm9wdGlvbnMuZ3V0dGVyczthaShlKTtmb3IodmFyIG49MDtuPHIubGVuZ3RoOysrbil7dmFyIGk9cltuXSxvPWUuYXBwZW5kQ2hpbGQoc2koImRpdiIsbnVsbCwiQ29kZU1pcnJvci1ndXR0ZXIgIitpKSk7IkNvZGVNaXJyb3ItbGluZW51bWJlcnMiPT1pJiYodC5kaXNwbGF5LmxpbmVHdXR0ZXI9byxvLnN0eWxlLndpZHRoPSh0LmRpc3BsYXkubGluZU51bVdpZHRofHwxKSsicHgiKX1lLnN0eWxlLmRpc3BsYXk9bj8iIjoibm9uZSJ9ZnVuY3Rpb24gYyh0LGUpe2lmKDA9PWUuaGVpZ2h0KXJldHVybiAwO2Zvcih2YXIgcixuPWUudGV4dC5sZW5ndGgsaT1lO3I9UnIoaSk7KXt2YXIgbz1yLmZpbmQoKTtpPWduKHQsby5mcm9tLmxpbmUpLG4rPW8uZnJvbS5jaC1vLnRvLmNofWZvcihpPWU7cj1CcihpKTspe3ZhciBvPXIuZmluZCgpO24tPWkudGV4dC5sZW5ndGgtby5mcm9tLmNoLGk9Z24odCxvLnRvLmxpbmUpLG4rPWkudGV4dC5sZW5ndGgtby50by5jaH1yZXR1cm4gbn1mdW5jdGlvbiBmKHQpe3ZhciBlPXQuZGlzcGxheSxyPXQuZG9jO2UubWF4TGluZT1nbihyLHIuZmlyc3QpLGUubWF4TGluZUxlbmd0aD1jKHIsZS5tYXhMaW5lKSxlLm1heExpbmVDaGFuZ2VkPSEwLHIuaXRlcihmdW5jdGlvbih0KXt2YXIgbj1jKHIsdCk7bj5lLm1heExpbmVMZW5ndGgmJihlLm1heExpbmVMZW5ndGg9bixlLm1heExpbmU9dCl9KX1mdW5jdGlvbiBoKHQpe3ZhciBlPXRpKHQuZ3V0dGVycywiQ29kZU1pcnJvci1saW5lbnVtYmVycyIpOy0xPT1lJiZ0LmxpbmVOdW1iZXJzP3QuZ3V0dGVycz10Lmd1dHRlcnMuY29uY2F0KFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyJdKTplPi0xJiYhdC5saW5lTnVtYmVycyYmKHQuZ3V0dGVycz10Lmd1dHRlcnMuc2xpY2UoMCksdC5ndXR0ZXJzLnNwbGljZShlLDEpKX1mdW5jdGlvbiBkKHQpe3ZhciBlPXQuZGlzcGxheSxyPXQuZG9jLmhlaWdodCxuPXIrRihlKTtlLnNpemVyLnN0eWxlLm1pbkhlaWdodD1lLmhlaWdodEZvcmNlci5zdHlsZS50b3A9bisicHgiLGUuZ3V0dGVycy5zdHlsZS5oZWlnaHQ9TWF0aC5tYXgobixlLnNjcm9sbGVyLmNsaWVudEhlaWdodC1UbykrInB4Ijt2YXIgaT1NYXRoLm1heChuLGUuc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0KSxvPWUuc2Nyb2xsZXIuc2Nyb2xsV2lkdGg+ZS5zY3JvbGxlci5jbGllbnRXaWR0aCsxLGw9aT5lLnNjcm9sbGVyLmNsaWVudEhlaWdodCsxO2w/KGUuc2Nyb2xsYmFyVi5zdHlsZS5kaXNwbGF5PSJibG9jayIsZS5zY3JvbGxiYXJWLnN0eWxlLmJvdHRvbT1vP2RpKGUubWVhc3VyZSkrInB4IjoiMCIsZS5zY3JvbGxiYXJWLmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0PWktZS5zY3JvbGxlci5jbGllbnRIZWlnaHQrZS5zY3JvbGxiYXJWLmNsaWVudEhlaWdodCsicHgiKTooZS5zY3JvbGxiYXJWLnN0eWxlLmRpc3BsYXk9IiIsZS5zY3JvbGxiYXJWLmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0PSIwIiksbz8oZS5zY3JvbGxiYXJILnN0eWxlLmRpc3BsYXk9ImJsb2NrIixlLnNjcm9sbGJhckguc3R5bGUucmlnaHQ9bD9kaShlLm1lYXN1cmUpKyJweCI6IjAiLGUuc2Nyb2xsYmFySC5maXJzdENoaWxkLnN0eWxlLndpZHRoPWUuc2Nyb2xsZXIuc2Nyb2xsV2lkdGgtZS5zY3JvbGxlci5jbGllbnRXaWR0aCtlLnNjcm9sbGJhckguY2xpZW50V2lkdGgrInB4Iik6KGUuc2Nyb2xsYmFySC5zdHlsZS5kaXNwbGF5PSIiLGUuc2Nyb2xsYmFySC5maXJzdENoaWxkLnN0eWxlLndpZHRoPSIwIiksbyYmbD8oZS5zY3JvbGxiYXJGaWxsZXIuc3R5bGUuZGlzcGxheT0iYmxvY2siLGUuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmhlaWdodD1lLnNjcm9sbGJhckZpbGxlci5zdHlsZS53aWR0aD1kaShlLm1lYXN1cmUpKyJweCIpOmUuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXk9IiIsbyYmdC5vcHRpb25zLmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyJiZ0Lm9wdGlvbnMuZml4ZWRHdXR0ZXI/KGUuZ3V0dGVyRmlsbGVyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixlLmd1dHRlckZpbGxlci5zdHlsZS5oZWlnaHQ9ZGkoZS5tZWFzdXJlKSsicHgiLGUuZ3V0dGVyRmlsbGVyLnN0eWxlLndpZHRoPWUuZ3V0dGVycy5vZmZzZXRXaWR0aCsicHgiKTplLmd1dHRlckZpbGxlci5zdHlsZS5kaXNwbGF5PSIiLFBpJiYwPT09ZGkoZS5tZWFzdXJlKSYmKGUuc2Nyb2xsYmFyVi5zdHlsZS5taW5XaWR0aD1lLnNjcm9sbGJhckguc3R5bGUubWluSGVpZ2h0PVJpPyIxOHB4IjoiMTJweCIsZS5zY3JvbGxiYXJWLnN0eWxlLnBvaW50ZXJFdmVudHM9ZS5zY3JvbGxiYXJILnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiKX1mdW5jdGlvbiBwKHQsZSxyKXt2YXIgbj10LnNjcm9sbGVyLnNjcm9sbFRvcCxpPXQud3JhcHBlci5jbGllbnRIZWlnaHQ7Im51bWJlciI9PXR5cGVvZiByP249cjpyJiYobj1yLnRvcCxpPXIuYm90dG9tLXIudG9wKSxuPU1hdGguZmxvb3Iobi1JKHQpKTt2YXIgbz1NYXRoLmNlaWwobitpKTtyZXR1cm57ZnJvbTp4bihlLG4pLHRvOnhuKGUsbyl9fWZ1bmN0aW9uIGcodCl7dmFyIGU9dC5kaXNwbGF5O2lmKGUuYWxpZ25XaWRnZXRzfHxlLmd1dHRlcnMuZmlyc3RDaGlsZCYmdC5vcHRpb25zLmZpeGVkR3V0dGVyKXtmb3IodmFyIHI9eShlKS1lLnNjcm9sbGVyLnNjcm9sbExlZnQrdC5kb2Muc2Nyb2xsTGVmdCxuPWUuZ3V0dGVycy5vZmZzZXRXaWR0aCxpPXIrInB4IixvPWUubGluZURpdi5maXJzdENoaWxkO287bz1vLm5leHRTaWJsaW5nKWlmKG8uYWxpZ25hYmxlKWZvcih2YXIgbD0wLHM9by5hbGlnbmFibGU7bDxzLmxlbmd0aDsrK2wpc1tsXS5zdHlsZS5sZWZ0PWk7dC5vcHRpb25zLmZpeGVkR3V0dGVyJiYoZS5ndXR0ZXJzLnN0eWxlLmxlZnQ9cituKyJweCIpfX1mdW5jdGlvbiBtKHQpe2lmKCF0Lm9wdGlvbnMubGluZU51bWJlcnMpcmV0dXJuITE7dmFyIGU9dC5kb2Mscj12KHQub3B0aW9ucyxlLmZpcnN0K2Uuc2l6ZS0xKSxuPXQuZGlzcGxheTtpZihyLmxlbmd0aCE9bi5saW5lTnVtQ2hhcnMpe3ZhciBpPW4ubWVhc3VyZS5hcHBlbmRDaGlsZChzaSgiZGl2Iixbc2koImRpdiIscildLCJDb2RlTWlycm9yLWxpbmVudW1iZXIgQ29kZU1pcnJvci1ndXR0ZXItZWx0IikpLG89aS5maXJzdENoaWxkLm9mZnNldFdpZHRoLGw9aS5vZmZzZXRXaWR0aC1vO3JldHVybiBuLmxpbmVHdXR0ZXIuc3R5bGUud2lkdGg9IiIsbi5saW5lTnVtSW5uZXJXaWR0aD1NYXRoLm1heChvLG4ubGluZUd1dHRlci5vZmZzZXRXaWR0aC1sKSxuLmxpbmVOdW1XaWR0aD1uLmxpbmVOdW1Jbm5lcldpZHRoK2wsbi5saW5lTnVtQ2hhcnM9bi5saW5lTnVtSW5uZXJXaWR0aD9yLmxlbmd0aDotMSxuLmxpbmVHdXR0ZXIuc3R5bGUud2lkdGg9bi5saW5lTnVtV2lkdGgrInB4IiwhMH1yZXR1cm4hMX1mdW5jdGlvbiB2KHQsZSl7cmV0dXJuIFN0cmluZyh0LmxpbmVOdW1iZXJGb3JtYXR0ZXIoZSt0LmZpcnN0TGluZU51bWJlcikpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIGZpKHQuc2Nyb2xsZXIpLmxlZnQtZmkodC5zaXplcikubGVmdH1mdW5jdGlvbiBiKHQsZSxyLG4pe2Zvcih2YXIgaSxvPXQuZGlzcGxheS5zaG93aW5nRnJvbSxsPXQuZGlzcGxheS5zaG93aW5nVG8scz1wKHQuZGlzcGxheSx0LmRvYyxyKSxhPSEwOzthPSExKXt2YXIgdT10LmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGg7aWYoIXgodCxlLHMsbikpYnJlYWs7aWYoaT0hMCxlPVtdLEEodCksZCh0KSxhJiZ0Lm9wdGlvbnMubGluZVdyYXBwaW5nJiZ1IT10LmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgpbj0hMDtlbHNlIGlmKG49ITEsciYmKHI9TWF0aC5taW4odC5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbEhlaWdodC10LmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LCJudW1iZXIiPT10eXBlb2Ygcj9yOnIudG9wKSkscz1wKHQuZGlzcGxheSx0LmRvYyxyKSxzLmZyb20+PXQuZGlzcGxheS5zaG93aW5nRnJvbSYmcy50bzw9dC5kaXNwbGF5LnNob3dpbmdUbylicmVha31yZXR1cm4gaSYmKFVuKHQsInVwZGF0ZSIsdCksKHQuZGlzcGxheS5zaG93aW5nRnJvbSE9b3x8dC5kaXNwbGF5LnNob3dpbmdUbyE9bCkmJlVuKHQsInZpZXdwb3J0Q2hhbmdlIix0LHQuZGlzcGxheS5zaG93aW5nRnJvbSx0LmRpc3BsYXkuc2hvd2luZ1RvKSksaX1mdW5jdGlvbiB4KHQsZSxyLG4pe3ZhciBpPXQuZGlzcGxheSxvPXQuZG9jO2lmKCFpLndyYXBwZXIuY2xpZW50V2lkdGgpcmV0dXJuIGkuc2hvd2luZ0Zyb209aS5zaG93aW5nVG89by5maXJzdCxpLnZpZXdPZmZzZXQ9MCx2b2lkIDA7aWYoISghbiYmMD09ZS5sZW5ndGgmJnIuZnJvbT5pLnNob3dpbmdGcm9tJiZyLnRvPGkuc2hvd2luZ1RvKSl7bSh0KSYmKGU9W3tmcm9tOm8uZmlyc3QsdG86by5maXJzdCtvLnNpemV9XSk7dmFyIGw9aS5zaXplci5zdHlsZS5tYXJnaW5MZWZ0PWkuZ3V0dGVycy5vZmZzZXRXaWR0aCsicHgiO2kuc2Nyb2xsYmFySC5zdHlsZS5sZWZ0PXQub3B0aW9ucy5maXhlZEd1dHRlcj9sOiIwIjt2YXIgcz0xLzA7aWYodC5vcHRpb25zLmxpbmVOdW1iZXJzKWZvcih2YXIgYT0wO2E8ZS5sZW5ndGg7KythKWVbYV0uZGlmZiYmZVthXS5mcm9tPHMmJihzPWVbYV0uZnJvbSk7dmFyIHU9by5maXJzdCtvLnNpemUsYz1NYXRoLm1heChyLmZyb20tdC5vcHRpb25zLnZpZXdwb3J0TWFyZ2luLG8uZmlyc3QpLGY9TWF0aC5taW4odSxyLnRvK3Qub3B0aW9ucy52aWV3cG9ydE1hcmdpbik7aWYoaS5zaG93aW5nRnJvbTxjJiZjLWkuc2hvd2luZ0Zyb208MjAmJihjPU1hdGgubWF4KG8uZmlyc3QsaS5zaG93aW5nRnJvbSkpLGkuc2hvd2luZ1RvPmYmJmkuc2hvd2luZ1RvLWY8MjAmJihmPU1hdGgubWluKHUsaS5zaG93aW5nVG8pKSxRaSlmb3IoYz1ibihHcihvLGduKG8sYykpKTt1PmYmJlZyKG8sZ24obyxmKSk7KSsrZjt2YXIgaD1be2Zyb206TWF0aC5tYXgoaS5zaG93aW5nRnJvbSxvLmZpcnN0KSx0bzpNYXRoLm1pbihpLnNob3dpbmdUbyx1KX1dO2lmKGg9aFswXS5mcm9tPj1oWzBdLnRvP1tdOkwoaCxlKSxRaSlmb3IodmFyIGE9MDthPGgubGVuZ3RoOysrYSlmb3IodmFyIGQscD1oW2FdO2Q9QnIoZ24obyxwLnRvLTEpKTspe3ZhciBnPWQuZmluZCgpLmZyb20ubGluZTtpZighKGc+cC5mcm9tKSl7aC5zcGxpY2UoYS0tLDEpO2JyZWFrfXAudG89Z31mb3IodmFyIHY9MCxhPTA7YTxoLmxlbmd0aDsrK2Epe3ZhciBwPWhbYV07cC5mcm9tPGMmJihwLmZyb209YykscC50bz5mJiYocC50bz1mKSxwLmZyb20+PXAudG8/aC5zcGxpY2UoYS0tLDEpOnYrPXAudG8tcC5mcm9tfWlmKCFuJiZ2PT1mLWMmJmM9PWkuc2hvd2luZ0Zyb20mJmY9PWkuc2hvd2luZ1RvKXJldHVybiB3KHQpLHZvaWQgMDtoLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5mcm9tLWUuZnJvbX0pO3RyeXt2YXIgeT1kb2N1bWVudC5hY3RpdmVFbGVtZW50fWNhdGNoKGIpe30uNyooZi1jKT52JiYoaS5saW5lRGl2LnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxTKHQsYyxmLGgscyksaS5saW5lRGl2LnN0eWxlLmRpc3BsYXk9IiIseSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9eSYmeS5vZmZzZXRIZWlnaHQmJnkuZm9jdXMoKTt2YXIgeD1jIT1pLnNob3dpbmdGcm9tfHxmIT1pLnNob3dpbmdUb3x8aS5sYXN0U2l6ZUMhPWkud3JhcHBlci5jbGllbnRIZWlnaHQ7cmV0dXJuIHgmJihpLmxhc3RTaXplQz1pLndyYXBwZXIuY2xpZW50SGVpZ2h0LFcodCw0MDApKSxpLnNob3dpbmdGcm9tPWMsaS5zaG93aW5nVG89ZixDKHQpLHcodCksITB9fWZ1bmN0aW9uIEModCl7Zm9yKHZhciBlLHI9dC5kaXNwbGF5LG49ci5saW5lRGl2Lm9mZnNldFRvcCxpPXIubGluZURpdi5maXJzdENoaWxkO2k7aT1pLm5leHRTaWJsaW5nKWlmKGkubGluZU9iail7aWYoSGkpe3ZhciBvPWkub2Zmc2V0VG9wK2kub2Zmc2V0SGVpZ2h0O2U9by1uLG49b31lbHNle3ZhciBsPWZpKGkpO2U9bC5ib3R0b20tbC50b3B9dmFyIHM9aS5saW5lT2JqLmhlaWdodC1lO2lmKDI+ZSYmKGU9cmUocikpLHM+LjAwMXx8LS4wMDE+cyl7eW4oaS5saW5lT2JqLGUpO3ZhciBhPWkubGluZU9iai53aWRnZXRzO2lmKGEpZm9yKHZhciB1PTA7dTxhLmxlbmd0aDsrK3UpYVt1XS5oZWlnaHQ9YVt1XS5ub2RlLm9mZnNldEhlaWdodH19fWZ1bmN0aW9uIHcodCl7dmFyIGU9dC5kaXNwbGF5LnZpZXdPZmZzZXQ9Q24odCxnbih0LmRvYyx0LmRpc3BsYXkuc2hvd2luZ0Zyb20pKTt0LmRpc3BsYXkubW92ZXIuc3R5bGUudG9wPWUrInB4In1mdW5jdGlvbiBMKHQsZSl7Zm9yKHZhciByPTAsbj1lLmxlbmd0aHx8MDtuPnI7KytyKXtmb3IodmFyIGk9ZVtyXSxvPVtdLGw9aS5kaWZmfHwwLHM9MCxhPXQubGVuZ3RoO2E+czsrK3Mpe3ZhciB1PXRbc107aS50bzw9dS5mcm9tJiZpLmRpZmY/by5wdXNoKHtmcm9tOnUuZnJvbStsLHRvOnUudG8rbH0pOmkudG88PXUuZnJvbXx8aS5mcm9tPj11LnRvP28ucHVzaCh1KTooaS5mcm9tPnUuZnJvbSYmby5wdXNoKHtmcm9tOnUuZnJvbSx0bzppLmZyb219KSxpLnRvPHUudG8mJm8ucHVzaCh7ZnJvbTppLnRvK2wsdG86dS50bytsfSkpfXQ9b31yZXR1cm4gdH1mdW5jdGlvbiBrKHQpe2Zvcih2YXIgZT10LmRpc3BsYXkscj17fSxuPXt9LGk9ZS5ndXR0ZXJzLmZpcnN0Q2hpbGQsbz0wO2k7aT1pLm5leHRTaWJsaW5nLCsrbylyW3Qub3B0aW9ucy5ndXR0ZXJzW29dXT1pLm9mZnNldExlZnQsblt0Lm9wdGlvbnMuZ3V0dGVyc1tvXV09aS5vZmZzZXRXaWR0aDtyZXR1cm57Zml4ZWRQb3M6eShlKSxndXR0ZXJUb3RhbFdpZHRoOmUuZ3V0dGVycy5vZmZzZXRXaWR0aCxndXR0ZXJMZWZ0OnIsZ3V0dGVyV2lkdGg6bix3cmFwcGVyV2lkdGg6ZS53cmFwcGVyLmNsaWVudFdpZHRofX1mdW5jdGlvbiBTKHQsZSxyLG4s
gitextract_0hi50ltt/
├── LICENSE
├── README.md
├── app/
│ ├── admin.go
│ ├── app.go
│ ├── cmd/
│ │ ├── backup.go
│ │ ├── init.go
│ │ ├── install.go
│ │ ├── log.go
│ │ ├── monitor.go
│ │ ├── reboot.go
│ │ ├── theme.go
│ │ ├── upgrade.go
│ │ └── zip.go
│ ├── cmd.go
│ ├── handler/
│ │ ├── admin.go
│ │ ├── cmd.go
│ │ ├── func.go
│ │ ├── home.go
│ │ ├── rss.go
│ │ └── upload.go
│ ├── log.go
│ ├── model/
│ │ ├── article.go
│ │ ├── comment.go
│ │ ├── content.go
│ │ ├── file.go
│ │ ├── locker.go
│ │ ├── message.go
│ │ ├── page.go
│ │ ├── setting.go
│ │ ├── statis.go
│ │ ├── storage.go
│ │ ├── timer.go
│ │ ├── token.go
│ │ ├── user.go
│ │ └── version.go
│ ├── plugin/
│ │ ├── email.go
│ │ ├── hello.go
│ │ └── plugin.go
│ ├── upgrade/
│ │ ├── v20140130.go
│ │ ├── v20140131.go
│ │ ├── v20140209.go
│ │ └── v20140228.go
│ └── utils/
│ ├── avatar.go
│ ├── crypto.go
│ ├── date.go
│ ├── file.go
│ ├── html.go
│ ├── pager.go
│ ├── sorter.go
│ └── validator.go
├── main.go
├── static/
│ ├── css/
│ │ ├── admin.css
│ │ ├── cmd.css
│ │ ├── codemirror.css
│ │ ├── common.css
│ │ ├── highlight.css
│ │ ├── ling.css
│ │ ├── saber.css
│ │ ├── sitemap.xsl
│ │ └── style.css
│ ├── js/
│ │ ├── home.js
│ │ └── upload.js
│ ├── koala-config.json
│ └── less/
│ ├── admin.less
│ ├── cmd.less
│ ├── common/
│ │ ├── base.less
│ │ ├── form.less
│ │ ├── grid.less
│ │ ├── label.less
│ │ ├── markdown.less
│ │ ├── pager.less
│ │ ├── reset.less
│ │ └── var.less
│ ├── common.less
│ ├── ling.less
│ ├── saber.less
│ └── style.less
└── view/
├── admin/
│ ├── admin.layout
│ ├── articles.html
│ ├── cmd/
│ │ ├── backup.html
│ │ ├── log.html
│ │ ├── message.html
│ │ ├── monitor.html
│ │ ├── reader.html
│ │ └── theme.html
│ ├── cmd.layout
│ ├── comments.html
│ ├── edit_article.html
│ ├── edit_page.html
│ ├── files.html
│ ├── home.html
│ ├── login.html
│ ├── pages.html
│ ├── password.html
│ ├── plugin.html
│ ├── plugin_setting.html
│ ├── profile.html
│ ├── setting.html
│ ├── write_article.html
│ └── write_page.html
├── default/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ └── page.html
├── ling/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ └── page.html
├── rss.xml
├── saber/
│ ├── article.html
│ ├── comment.html
│ ├── error/
│ │ ├── error.html
│ │ └── notfound.html
│ ├── home.layout
│ ├── index.html
│ ├── page.html
│ └── sidebar.html
└── sitemap.xml
SYMBOL INDEX (307 symbols across 50 files)
FILE: app/admin.go
function registerAdminHandler (line 5) | func registerAdminHandler() {
FILE: app/app.go
function init (line 29) | func init() {
function catchExit (line 125) | func catchExit() {
function Init (line 143) | func Init() {
function registerHomeHandler (line 171) | func registerHomeHandler() {
function Run (line 190) | func Run() {
FILE: app/cmd.go
function Cmd (line 13) | func Cmd() {
function registerCmdHandler (line 44) | func registerCmdHandler() {
FILE: app/cmd/backup.go
function init (line 16) | func init() {
function DoBackup (line 23) | func DoBackup(app *GoInk.App, withData bool) (string, error) {
function RemoveBackupFile (line 68) | func RemoveBackupFile(file string) {
function GetBackupFileAbsPath (line 74) | func GetBackupFileAbsPath(name string) string {
function GetBackupFiles (line 79) | func GetBackupFiles() ([]os.FileInfo, error) {
function StartBackupTimer (line 94) | func StartBackupTimer(app *GoInk.App, t int) {
FILE: app/cmd/init.go
function Init (line 5) | func Init(app *GoInk.App) {
FILE: app/cmd/install.go
function CheckInstall (line 18) | func CheckInstall() bool {
function ExtractBundleBytes (line 23) | func ExtractBundleBytes() {
function DoInstall (line 41) | func DoInstall() {
function DoUpdateZipBytes (line 47) | func DoUpdateZipBytes(file string) error {
FILE: app/cmd/log.go
type logItem (line 10) | type logItem struct
function GetLogs (line 16) | func GetLogs(app *GoInk.App) []*logItem {
function RemoveLogFile (line 43) | func RemoveLogFile(app *GoInk.App, file string) {
FILE: app/cmd/monitor.go
type monitorStats (line 10) | type monitorStats struct
function ReadMemStats (line 21) | func ReadMemStats() *monitorStats {
FILE: app/cmd/theme.go
type themeItem (line 12) | type themeItem struct
function SetThemeCache (line 19) | func SetThemeCache(ctx *GoInk.Context, cache bool) {
function GetThemes (line 30) | func GetThemes(dir string) map[string]*themeItem {
function createThemeItem (line 49) | func createThemeItem(dir string) (*themeItem, error) {
FILE: app/cmd/upgrade.go
function init (line 12) | func init() {
function SetUpgradeScript (line 16) | func SetUpgradeScript(v int, script func(app *GoInk.App) bool) {
function CheckUpgrade (line 20) | func CheckUpgrade(v int, print bool) bool {
function DoUpgrade (line 30) | func DoUpgrade(v int, app *GoInk.App) {
FILE: app/cmd/zip.go
constant zipBytes (line 2) | zipBytes="UEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAc3RhdGljL1BLBwgAAAAAAA...
FILE: app/handler/admin.go
function Admin (line 12) | func Admin(context *GoInk.Context) {
function AdminProfile (line 24) | func AdminProfile(context *GoInk.Context) {
function AdminPassword (line 52) | func AdminPassword(context *GoInk.Context) {
function AdminArticle (line 73) | func AdminArticle(context *GoInk.Context) {
function ArticleWrite (line 83) | func ArticleWrite(context *GoInk.Context) {
function ArticleEdit (line 119) | func ArticleEdit(context *GoInk.Context) {
function PageWrite (line 159) | func PageWrite(context *GoInk.Context) {
function AdminPage (line 195) | func AdminPage(context *GoInk.Context) {
function PageEdit (line 205) | func PageEdit(context *GoInk.Context) {
function AdminSetting (line 245) | func AdminSetting(context *GoInk.Context) {
function CustomSetting (line 269) | func CustomSetting(context *GoInk.Context) {
function NavigatorSetting (line 284) | func NavigatorSetting(context *GoInk.Context) {
function AdminComments (line 295) | func AdminComments(context *GoInk.Context) {
function AdminPlugin (line 347) | func AdminPlugin(context *GoInk.Context) {
function PluginSetting (line 379) | func PluginSetting(context *GoInk.Context) {
function AdminMessageRead (line 403) | func AdminMessageRead(context *GoInk.Context) {
FILE: app/handler/cmd.go
function CmdBackup (line 9) | func CmdBackup(context *GoInk.Context) {
function CmdBackupFile (line 40) | func CmdBackupFile(context *GoInk.Context) {
function CmdMessage (line 46) | func CmdMessage(context *GoInk.Context) {
function CmdLogs (line 54) | func CmdLogs(context *GoInk.Context) {
function CmdMonitor (line 67) | func CmdMonitor(ctx *GoInk.Context) {
function CmdTheme (line 75) | func CmdTheme(ctx *GoInk.Context) {
function CmdReader (line 100) | func CmdReader(ctx *GoInk.Context) {
FILE: app/handler/func.go
type jsonContext (line 10) | type jsonContext struct
method Set (line 24) | func (jc *jsonContext) Set(key string, v interface{}) *jsonContext {
method End (line 29) | func (jc *jsonContext) End() {
function Json (line 16) | func Json(context *GoInk.Context, res bool) *jsonContext {
type themeContext (line 33) | type themeContext struct
method Layout (line 49) | func (tc *themeContext) Layout(layout string) *themeContext {
method Render (line 58) | func (tc *themeContext) Render(tpl string, data map[string]interface{}) {
method Tpl (line 62) | func (tc *themeContext) Tpl(tpl string, data map[string]interface{}) s...
method Has (line 66) | func (tc *themeContext) Has(tpl string) bool {
function Theme (line 39) | func Theme(context *GoInk.Context) *themeContext {
function CommentHtml (line 72) | func CommentHtml(context *GoInk.Context, c *model.Content) string {
function SidebarHtml (line 84) | func SidebarHtml(context *GoInk.Context) string {
FILE: app/handler/home.go
function Login (line 12) | func Login(context *GoInk.Context) {
function Auth (line 39) | func Auth(context *GoInk.Context) {
function Logout (line 54) | func Logout(context *GoInk.Context) {
function TagArticles (line 60) | func TagArticles(ctx *GoInk.Context) {
function Home (line 79) | func Home(context *GoInk.Context) {
function Article (line 94) | func Article(context *GoInk.Context) {
function Page (line 114) | func Page(context *GoInk.Context) {
function TopPage (line 134) | func TopPage(context *GoInk.Context) {
function Comment (line 152) | func Comment(context *GoInk.Context) {
function validateComment (line 184) | func validateComment(data map[string]string) string {
function getArticleListSize (line 197) | func getArticleListSize() int {
FILE: app/handler/rss.go
function SiteMap (line 11) | func SiteMap(ctx *GoInk.Context) {
function Rss (line 56) | func Rss(ctx *GoInk.Context) {
FILE: app/handler/upload.go
function AdminFiles (line 14) | func AdminFiles(context *GoInk.Context) {
function FileUpload (line 31) | func FileUpload(context *GoInk.Context) {
FILE: app/log.go
function LogError (line 11) | func LogError(bytes []byte) {
FILE: app/model/article.go
function generatePublishArticleIndex (line 5) | func generatePublishArticleIndex() {
function GetPublishArticleList (line 17) | func GetPublishArticleList(page, size int) ([]*Content, *utils.Pager) {
function GetArticleList (line 34) | func GetArticleList(page, size int) ([]*Content, *utils.Pager) {
function GetPopularArticleList (line 52) | func GetPopularArticleList(size int) []*Content {
function GetTaggedArticleList (line 70) | func GetTaggedArticleList(tag string, page, size int) ([]*Content, *util...
FILE: app/model/comment.go
type Reader (line 19) | type Reader struct
method Inc (line 29) | func (r *Reader) Inc() {
method Dec (line 37) | func (r *Reader) Dec() {
type Comment (line 45) | type Comment struct
method ParentMd (line 65) | func (c *Comment) ParentMd() string {
method ToJson (line 80) | func (c *Comment) ToJson() map[string]interface{} {
method IsValid (line 99) | func (c *Comment) IsValid() bool {
method IsRemovable (line 113) | func (c *Comment) IsRemovable() bool {
method GetReader (line 126) | func (c *Comment) GetReader() *Reader {
method GetContent (line 136) | func (c *Comment) GetContent() *Content {
function CreateReader (line 141) | func CreateReader(c *Comment) {
function CreateComment (line 154) | func CreateComment(cid int, c *Comment) {
function SaveComment (line 190) | func SaveComment(c *Comment) {
function removeOneComment (line 196) | func removeOneComment(cid int, id int) {
function RemoveComment (line 216) | func RemoveComment(cid int, id int) {
function GetCommentById (line 226) | func GetCommentById(id int) *Comment {
function GetCommentList (line 232) | func GetCommentList(page, size int) ([]*Comment, *utils.Pager) {
function GetCommentRecentList (line 248) | func GetCommentRecentList(size int) []*Comment {
function SyncReaders (line 264) | func SyncReaders() {
function LoadReaders (line 269) | func LoadReaders() {
function GetReaders (line 275) | func GetReaders() []*Reader {
function RemoveReader (line 285) | func RemoveReader(email string) {
function LoadComments (line 291) | func LoadComments() {
function UpdateCommentAdmin (line 312) | func UpdateCommentAdmin(user *User) {
function RecycleComments (line 324) | func RecycleComments() {
function startCommentsTimer (line 349) | func startCommentsTimer() {
FILE: app/model/content.go
type Content (line 22) | type Content struct
method TagString (line 58) | func (cnt *Content) TagString() string {
method GetTags (line 63) | func (cnt *Content) GetTags() []*Tag {
method Link (line 74) | func (cnt *Content) Link() string {
method Content (line 86) | func (cnt *Content) Content() string {
method Summary (line 100) | func (cnt *Content) Summary() string {
method CommentNum (line 110) | func (cnt *Content) CommentNum() int {
method ChangeSlug (line 122) | func (cnt *Content) ChangeSlug(slug string) bool {
method User (line 136) | func (cnt *Content) User() *User {
type Tag (line 141) | type Tag struct
method Link (line 147) | func (t *Tag) Link() string {
function GetContentById (line 152) | func GetContentById(id int) *Content {
function GetContentBySlug (line 157) | func GetContentBySlug(slug string) *Content {
function CreateContent (line 168) | func CreateContent(c *Content, t string) (*Content, error) {
function SaveContent (line 191) | func SaveContent(c *Content) {
function RemoveContent (line 202) | func RemoveContent(c *Content) {
function SyncContent (line 216) | func SyncContent(c *Content) {
function SyncContents (line 222) | func SyncContents() {
function LoadContents (line 229) | func LoadContents() {
function startContentSyncTimer (line 270) | func startContentSyncTimer() {
function generateContentTmpIndexes (line 277) | func generateContentTmpIndexes() {
function GetContentTags (line 327) | func GetContentTags() []*Tag {
function startContentTmpIndexesTimer (line 331) | func startContentTmpIndexesTimer() {
FILE: app/model/file.go
type File (line 15) | type File struct
function CreateFile (line 28) | func CreateFile(f *File) *File {
function CreateFilePath (line 39) | func CreateFilePath(dir string, f *File) string {
function GetFileList (line 46) | func GetFileList(page, size int) ([]*File, *utils.Pager) {
function RemoveFile (line 58) | func RemoveFile(id int) {
function SyncFiles (line 68) | func SyncFiles() {
function LoadFiles (line 72) | func LoadFiles() {
FILE: app/model/locker.go
function init (line 7) | func init() {
FILE: app/model/message.go
function init (line 14) | func init() {
type Message (line 20) | type Message struct
function CreateMessage (line 28) | func CreateMessage(tp string, data interface{}) *Message {
function SetMessageGenerator (line 45) | func SetMessageGenerator(name string, fn func(v interface{}) string) {
function GetMessage (line 49) | func GetMessage(id int) *Message {
function GetUnreadMessages (line 58) | func GetUnreadMessages() []*Message {
function GetMessages (line 69) | func GetMessages() []*Message {
function GetTypedMessages (line 73) | func GetTypedMessages(tp string, unread bool) []*Message {
function SaveMessageRead (line 89) | func SaveMessageRead(m *Message) {
function SyncMessages (line 94) | func SyncMessages() {
function LoadMessages (line 98) | func LoadMessages() {
function RecycleMessages (line 109) | func RecycleMessages() {
function generateCommentMessage (line 118) | func generateCommentMessage(co interface{}) string {
function generateBackupMessage (line 138) | func generateBackupMessage(co interface{}) string {
function startMessageTimer (line 146) | func startMessageTimer() {
FILE: app/model/page.go
function GetPageList (line 7) | func GetPageList(page, size int) ([]*Content, *utils.Pager) {
FILE: app/model/setting.go
type navItem (line 8) | type navItem struct
function GetSetting (line 20) | func GetSetting(key string) string {
function GetCustomSettings (line 24) | func GetCustomSettings() map[string]string {
function SetSetting (line 34) | func SetSetting(key string, v string) {
function SyncSettings (line 38) | func SyncSettings() {
function LoadSettings (line 42) | func LoadSettings() {
function SortNavigators (line 47) | func SortNavigators() {
function LoadNavigators (line 58) | func LoadNavigators() {
function SetNavigators (line 64) | func SetNavigators(order []string, text []string, title []string, link [...
function DefaultNavigators (line 78) | func DefaultNavigators() {
function SyncNavigators (line 98) | func SyncNavigators() {
function GetNavigators (line 103) | func GetNavigators() []*navItem {
FILE: app/model/statis.go
type Statis (line 3) | type Statis struct
function NewStatis (line 12) | func NewStatis() *Statis {
FILE: app/model/storage.go
type jsonStorage (line 20) | type jsonStorage struct
method Init (line 24) | func (jss *jsonStorage) Init(dir string) {
method Has (line 28) | func (jss *jsonStorage) Has(key string) bool {
method Get (line 34) | func (jss *jsonStorage) Get(key string, v interface{}) {
method Set (line 47) | func (jss *jsonStorage) Set(key string, v interface{}) {
method Dir (line 63) | func (jss *jsonStorage) Dir(name string) {
method TimeInc (line 235) | func (jss *jsonStorage) TimeInc(d int) int {
function writeDefaultData (line 67) | func writeDefaultData() {
function writeDefaultTmpData (line 217) | func writeDefaultTmpData() {
function loadAllData (line 221) | func loadAllData() {
function Init (line 242) | func Init(v int) {
function All (line 258) | func All() {
function SyncIndexes (line 266) | func SyncIndexes() {
function SyncAll (line 273) | func SyncAll() {
FILE: app/model/timer.go
type timerFunc (line 7) | type timerFunc struct
function init (line 17) | func init() {
function SetTimerFunc (line 25) | func SetTimerFunc(name string, ticker int, fn func()) {
function ChangeTimerFunc (line 34) | func ChangeTimerFunc(name string, ticker int, fn func()) {
function DelTimerFunc (line 44) | func DelTimerFunc(name string) {
function GetTimerFuncs (line 49) | func GetTimerFuncs() map[string]int {
function StartModelTimer (line 59) | func StartModelTimer() {
function doTimers (line 70) | func doTimers(c <-chan time.Time) {
FILE: app/model/token.go
type Token (line 11) | type Token struct
method IsValid (line 19) | func (t *Token) IsValid() bool {
function CreateToken (line 27) | func CreateToken(u *User, context *GoInk.Context, expire int64) *Token {
function GetTokenByValue (line 39) | func GetTokenByValue(v string) *Token {
function GetTokensByUser (line 44) | func GetTokensByUser(u *User) []*Token {
function RemoveToken (line 55) | func RemoveToken(v string) {
function CleanTokens (line 62) | func CleanTokens() {
function SyncTokens (line 72) | func SyncTokens() {
function LoadTokens (line 78) | func LoadTokens() {
FILE: app/model/user.go
type User (line 13) | type User struct
method CheckPassword (line 28) | func (u *User) CheckPassword(pwd string) bool {
method ChangeEmail (line 34) | func (u *User) ChangeEmail(email string) bool {
method ChangePassword (line 44) | func (u *User) ChangePassword(pwd string) {
function GetUserById (line 49) | func GetUserById(id int) *User {
function GetUserByName (line 59) | func GetUserByName(name string) *User {
function GetUserByEmail (line 69) | func GetUserByEmail(email string) *User {
function GetUsersByRole (line 79) | func GetUsersByRole(role string) []*User {
function CreateUser (line 90) | func CreateUser(u *User) error {
function RemoveUser (line 104) | func RemoveUser(u *User) {
function SyncUsers (line 115) | func SyncUsers() {
function LoadUsers (line 119) | func LoadUsers() {
FILE: app/model/version.go
type version (line 5) | type version struct
function loadVersion (line 12) | func loadVersion() {
function GetVersion (line 17) | func GetVersion() *version {
function SyncVersion (line 24) | func SyncVersion() {
FILE: app/plugin/email.go
type EmailPlugin (line 43) | type EmailPlugin struct
method Name (line 71) | func (p *EmailPlugin) Name() string {
method Key (line 76) | func (p *EmailPlugin) Key() string {
method Desc (line 81) | func (p *EmailPlugin) Desc() string {
method ToStorage (line 86) | func (p *EmailPlugin) ToStorage() map[string]interface{} {
method Activate (line 97) | func (p *EmailPlugin) Activate() {
method Deactivate (line 139) | func (p *EmailPlugin) Deactivate() {
method IsActive (line 144) | func (p *EmailPlugin) IsActive() bool {
method Version (line 149) | func (p *EmailPlugin) Version() string {
method HasSetting (line 154) | func (p *EmailPlugin) HasSetting() bool {
method Form (line 159) | func (p *EmailPlugin) Form() string {
method SetSetting (line 183) | func (p *EmailPlugin) SetSetting(settings map[string]string) {
method sendEmail (line 188) | func (p *EmailPlugin) sendEmail(co *model.Comment, isCreate bool) {
method sendSmtp (line 281) | func (p *EmailPlugin) sendSmtp(from mail.Address, to mail.Address, tit...
function init (line 50) | func init() {
FILE: app/plugin/hello.go
type HelloPlugin (line 9) | type HelloPlugin struct
method Name (line 21) | func (p *HelloPlugin) Name() string {
method Key (line 25) | func (p *HelloPlugin) Key() string {
method Desc (line 29) | func (p *HelloPlugin) Desc() string {
method ToStorage (line 33) | func (p *HelloPlugin) ToStorage() map[string]interface{} {
method Activate (line 41) | func (p *HelloPlugin) Activate() {
method Deactivate (line 65) | func (p *HelloPlugin) Deactivate() {
method IsActive (line 69) | func (p *HelloPlugin) IsActive() bool {
method Version (line 73) | func (p *HelloPlugin) Version() string {
method HasSetting (line 77) | func (p *HelloPlugin) HasSetting() bool {
method Form (line 81) | func (p *HelloPlugin) Form() string {
method SetSetting (line 85) | func (p *HelloPlugin) SetSetting(settings map[string]string) {
function init (line 14) | func init() {
FILE: app/plugin/plugin.go
type PluginInterface (line 8) | type PluginInterface interface
type pluginRoute (line 25) | type pluginRoute struct
function init (line 40) | func init() {
function Init (line 55) | func Init() {
function register (line 85) | func register(plugin PluginInterface) {
function Handler (line 92) | func Handler(name string, h GoInk.Handler, inter bool) {
function Route (line 100) | func Route(name string, method string, pattern string, handler GoInk.Han...
function Handlers (line 108) | func Handlers() (map[string]map[string]GoInk.Handler, map[string]pluginR...
function GetPlugins (line 115) | func GetPlugins() map[string]PluginInterface {
function GetPluginByKey (line 119) | func GetPluginByKey(key string) PluginInterface {
function Activate (line 123) | func Activate(name string) {
function Deactivate (line 135) | func Deactivate(name string) {
function Update (line 147) | func Update(app *GoInk.App) {
FILE: app/upgrade/v20140130.go
function init (line 12) | func init() {
function upgrade_20140130 (line 16) | func upgrade_20140130(app *GoInk.App) bool {
FILE: app/upgrade/v20140131.go
function init (line 10) | func init() {
function upgrade_20140131 (line 14) | func upgrade_20140131(app *GoInk.App) bool {
FILE: app/upgrade/v20140209.go
function init (line 11) | func init() {
function upgrade_20140209 (line 15) | func upgrade_20140209(app *GoInk.App) bool {
FILE: app/upgrade/v20140228.go
function init (line 9) | func init() {
function upgrade_20140228 (line 13) | func upgrade_20140228(_ *GoInk.App) bool {
FILE: app/utils/avatar.go
function Gravatar (line 9) | func Gravatar(email string, size string) string {
function encodeAvatarEmail (line 16) | func encodeAvatarEmail(email string) string {
FILE: app/utils/crypto.go
function Sha1 (line 9) | func Sha1(raw string) string {
FILE: app/utils/date.go
function DateInt64 (line 11) | func DateInt64(ti int64, format string) string {
function DateString (line 17) | func DateString(ts string, format string) string {
function DateTime (line 37) | func DateTime(t time.Time, format string) string {
function Now (line 56) | func Now() int64 {
FILE: app/utils/file.go
function FileSize (line 8) | func FileSize(size int64) string {
function IsFile (line 19) | func IsFile(path string) bool {
function IsDir (line 30) | func IsDir(path string) bool {
FILE: app/utils/html.go
function Html2str (line 10) | func Html2str(html string) string {
function Markdown2Html (line 36) | func Markdown2Html(text string) string {
function Markdown2HtmlTemplate (line 40) | func Markdown2HtmlTemplate(text string) template.HTML {
FILE: app/utils/pager.go
type Pager (line 3) | type Pager struct
function NewPager (line 17) | func NewPager(page, size, total int) *Pager {
FILE: app/utils/sorter.go
type intSorter (line 6) | type intSorter
method Len (line 8) | func (is intSorter) Len() int {
method Swap (line 12) | func (is intSorter) Swap(i, j int) {
method Less (line 16) | func (is intSorter) Less(i,j int)bool{
function SortInt (line 21) | func SortInt(s [][2]int){
FILE: app/utils/validator.go
function init (line 15) | func init() {
function IsEmptyString (line 22) | func IsEmptyString(str string) bool {
function IsEmail (line 26) | func IsEmail(str string) bool {
function IsURL (line 30) | func IsURL(str string) bool {
function IsLonger (line 34) | func IsLonger(str string, length int) bool {
function IsShorter (line 38) | func IsShorter(str string, length int) bool {
function IsASCII (line 42) | func IsASCII(str string) bool {
function IsEnglish (line 46) | func IsEnglish(str string) bool {
function IsContain (line 50) | func IsContain(str string, contain string) bool {
FILE: main.go
function main (line 5) | func main() {
FILE: static/js/home.js
function fixHeader (line 8) | function fixHeader() {
function topButton (line 21) | function topButton() {
function renderMarkdown (line 37) | function renderMarkdown() {
function initComment (line 53) | function initComment() {
FILE: static/js/upload.js
function initUpload (line 1) | function initUpload(p) {
Condensed preview — 124 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (854K chars).
[
{
"path": "LICENSE",
"chars": 1069,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 傅小黑\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
},
{
"path": "README.md",
"chars": 2840,
"preview": "### Notice: this project is deprecated. Please try my new blog engine [pugo](https://github.com/go-xiaohei/pugo).\n\n#Fxh."
},
{
"path": "app/admin.go",
"chars": 1491,
"preview": "package app\n\nimport \"github.com/fuxiaohei/GoBlog/app/handler\"\n\nfunc registerAdminHandler() {\n\t// add admin handlers\n\tApp"
},
{
"path": "app/app.go",
"chars": 4956,
"preview": "package app\n\nimport (\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoBlog/app/handler\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"githu"
},
{
"path": "app/cmd/backup.go",
"chars": 2896,
"preview": "package cmd\n\nimport (\n\t\"github.com/Unknwon/cae/zip\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoBl"
},
{
"path": "app/cmd/init.go",
"chars": 107,
"preview": "package cmd\n\nimport \"github.com/fuxiaohei/GoInk\"\n\nfunc Init(app *GoInk.App) {\n\tStartBackupTimer(app, 24)\n}\n"
},
{
"path": "app/cmd/install.go",
"chars": 1404,
"preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/Unknwon/cae/zip\"\n\t\"github.com/fuxiaohei/GoBlog/app"
},
{
"path": "app/cmd/log.go",
"chars": 881,
"preview": "package cmd\n\nimport (\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\ntype logItem struct {\n\tName "
},
{
"path": "app/cmd/monitor.go",
"chars": 842,
"preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"runtime\"\n\t\"time\"\n)\n\ntype monitorStats struct {\n\t"
},
{
"path": "app/cmd/reboot.go",
"chars": 12,
"preview": "package cmd\n"
},
{
"path": "app/cmd/theme.go",
"chars": 1830,
"preview": "package cmd\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"io/ioutil\"\n\t\"path/filepat"
},
{
"path": "app/cmd/upgrade.go",
"chars": 1218,
"preview": "package cmd\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"sort\"\n\t\"strconv\"\n)\n\nvar u"
},
{
"path": "app/cmd/zip.go",
"chars": 522401,
"preview": "package cmd\nconst zipBytes=\"UEsDBBQACAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAc3RhdGljL1BLBwgAAAAAAAAAAAAAAABQSwMEFAAIAAAAAAAAAAAA"
},
{
"path": "app/cmd.go",
"chars": 1376,
"preview": "package app\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoBlog/app/handler\"\n\t_ \"github.com/f"
},
{
"path": "app/handler/admin.go",
"chars": 10389,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoBlog/app/plugin\"\n\t\"github.co"
},
{
"path": "app/handler/cmd.go",
"chars": 2618,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/f"
},
{
"path": "app/handler/func.go",
"chars": 2360,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"path\"\n\t\"strconv\"\n)\n\nt"
},
{
"path": "app/handler/home.go",
"chars": 5023,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"github.com"
},
{
"path": "app/handler/rss.go",
"chars": 2446,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"github.com"
},
{
"path": "app/handler/upload.go",
"chars": 1729,
"preview": "package handler\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"io/ioutil\"\n\t\"net/http"
},
{
"path": "app/log.go",
"chars": 336,
"preview": "package app\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n)\n\n// LogErrors logs error byt"
},
{
"path": "app/model/article.go",
"chars": 2300,
"preview": "package model\n\nimport \"github.com/fuxiaohei/GoBlog/app/utils\"\n\nfunc generatePublishArticleIndex() {\n\tarr := make([]int, "
},
{
"path": "app/model/comment.go",
"chars": 7765,
"preview": "package model\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"html/template\"\n\t\"sort\"\n\t\"strings\"\n)\n\nvar (\n\treaders "
},
{
"path": "app/model/content.go",
"chars": 7792,
"preview": "package model\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"so"
},
{
"path": "app/model/file.go",
"chars": 1472,
"preview": "package model\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"os\"\n\t\"path\"\n\t\"strconv\"\n)\n\nvar (\n\tfiles []*File\n\tf"
},
{
"path": "app/model/locker.go",
"chars": 92,
"preview": "package model\n\nimport \"sync\"\n\nvar locker sync.Mutex\n\nfunc init() {\n\tlocker = sync.Mutex{}\n}\n"
},
{
"path": "app/model/message.go",
"chars": 2934,
"preview": "package model\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"strings\"\n)\n\nvar (\n\tmessages []*Message\n\tmessa"
},
{
"path": "app/model/page.go",
"chars": 588,
"preview": "package model\n\nimport \"github.com/fuxiaohei/GoBlog/app/utils\"\n\n// GetPageList gets pages list and pager no matter page s"
},
{
"path": "app/model/setting.go",
"chars": 1844,
"preview": "package model\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\ntype navItem struct {\n\tOrder int\n\tText string\n\tTitle string\n\tLink str"
},
{
"path": "app/model/statis.go",
"chars": 382,
"preview": "package model\n\ntype Statis struct {\n\tComments int\n\tArticles int\n\tPages int\n\tFiles int\n\tVersion int\n\tReaders int\n"
},
{
"path": "app/model/storage.go",
"chars": 6417,
"preview": "package model\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"strconv\"\n"
},
{
"path": "app/model/timer.go",
"chars": 1773,
"preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype timerFunc struct {\n\tFn func()\n\tTicker int\n}\n\nvar (\n\ttimerCount int\n\ttimerFun"
},
{
"path": "app/model/token.go",
"chars": 1559,
"preview": "package model\n\nimport (\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n\t\"github.com/fuxiaohei/GoInk\"\n)\n\nvar tokens map["
},
{
"path": "app/model/user.go",
"chars": 2152,
"preview": "package model\n\nimport (\n\t\"errors\"\n\t\"github.com/fuxiaohei/GoBlog/app/utils\"\n)\n\nvar (\n\tusers []*User\n\tuserMaxId int\n)\n"
},
{
"path": "app/model/version.go",
"chars": 348,
"preview": "package model\n\nvar ver *version\n\ntype version struct {\n\tName string\n\tBuildTime int64\n\tVersion int\n"
},
{
"path": "app/plugin/email.go",
"chars": 10968,
"preview": "package plugin\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiao"
},
{
"path": "app/plugin/hello.go",
"chars": 1666,
"preview": "package plugin\n\nimport (\n\t\"fmt\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"time\"\n)\n\ntype HelloPlugin struct {\n\tisActive "
},
{
"path": "app/plugin/plugin.go",
"chars": 4128,
"preview": "package plugin\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/fuxiaohei/GoInk\"\n)\n\ntype PluginInterface "
},
{
"path": "app/upgrade/v20140130.go",
"chars": 1422,
"preview": "package upgrade\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/f"
},
{
"path": "app/upgrade/v20140131.go",
"chars": 549,
"preview": "package upgrade\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoInk\"\n\t\"os\"\n\t\"path\"\n)\n\nfunc ini"
},
{
"path": "app/upgrade/v20140209.go",
"chars": 577,
"preview": "package upgrade\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/f"
},
{
"path": "app/upgrade/v20140228.go",
"chars": 514,
"preview": "package upgrade\n\nimport (\n\t\"github.com/fuxiaohei/GoBlog/app/cmd\"\n\t\"github.com/fuxiaohei/GoBlog/app/model\"\n\t\"github.com/f"
},
{
"path": "app/utils/avatar.go",
"chars": 429,
"preview": "package utils\n\nimport (\n\t\"crypto/md5\"\n\t\"fmt\"\n)\n\n// generate gravatar link by email.\nfunc Gravatar(email string, size str"
},
{
"path": "app/utils/crypto.go",
"chars": 167,
"preview": "package utils\n\nimport (\n\t\"crypto/sha1\"\n\t\"fmt\"\n\t\"io\"\n)\n\nfunc Sha1(raw string) string {\n\tt := sha1.New()\n\tio.WriteString(t"
},
{
"path": "app/utils/date.go",
"chars": 1608,
"preview": "package utils\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Format unix time int64 to string\nfunc DateInt64(ti in"
},
{
"path": "app/utils/file.go",
"chars": 500,
"preview": "package utils\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc FileSize(size int64) string {\n\ts := float64(size)\n\tif s > 1024*1024 {\n\t\tret"
},
{
"path": "app/utils/html.go",
"chars": 920,
"preview": "package utils\n\nimport (\n\t\"github.com/russross/blackfriday\"\n\t\"html/template\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nfunc Html2str(html s"
},
{
"path": "app/utils/pager.go",
"chars": 892,
"preview": "package utils\n\ntype Pager struct {\n\tCurrent int\n\tSize int\n\tTotal int\n\tPages int\n\tPageSlice []int\n\tBegin "
},
{
"path": "app/utils/sorter.go",
"chars": 346,
"preview": "\npackage utils\n\nimport \"sort\"\n\ntype intSorter [][2]int\n\nfunc (is intSorter) Len() int {\n\treturn len(is)\n}\n\nfunc (is intS"
},
{
"path": "app/utils/validator.go",
"chars": 1074,
"preview": "package utils\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar (\n\tregexEmail *regexp.Regexp\n\tregexASCII *regexp.Regexp\n\tregexEn"
},
{
"path": "main.go",
"chars": 106,
"preview": "package main\n\nimport \"github.com/fuxiaohei/GoBlog/app\"\n\nfunc main() {\n\tapp.Cmd()\n\tapp.Init()\n\tapp.Run()\n}\n"
},
{
"path": "static/css/admin.css",
"chars": 12943,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/css/cmd.css",
"chars": 7364,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/css/codemirror.css",
"chars": 8270,
"preview": "/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: Conso"
},
{
"path": "static/css/common.css",
"chars": 5481,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/css/highlight.css",
"chars": 2234,
"preview": "/*\n\nSunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\npre code {\n display: block; padding: 0.5em;\n "
},
{
"path": "static/css/ling.css",
"chars": 11160,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/css/saber.css",
"chars": 10218,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/css/sitemap.xsl",
"chars": 3800,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"2.0\" \n xmlns:html=\"http://www.w3.org/TR/R"
},
{
"path": "static/css/style.css",
"chars": 10699,
"preview": "body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;pa"
},
{
"path": "static/js/home.js",
"chars": 4588,
"preview": "$(document).ready(function () {\n //fixHeader();\n topButton();\n renderMarkdown();\n initComment();\n});\n\nfuncti"
},
{
"path": "static/js/upload.js",
"chars": 1231,
"preview": "function initUpload(p) {\n $('#attach-show').on(\"click\", function () {\n $('#attach-upload').trigger(\"click\");\n "
},
{
"path": "static/koala-config.json",
"chars": 278,
"preview": "{\n\t\"mappings\": [\n\t\t{\n\t\t\t\"src\": \"less\",\n\t\t\t\"dest\": \"css\"\n\t\t}\n\t],\n\n\t\"ignores\": [\"*.css\"],\n\n\t\"options\": {\n\n\t\t\"outputStyle\":"
},
{
"path": "static/less/admin.less",
"chars": 7548,
"preview": "@import \"common\";\n\n#header {\n height: 39px;\n background-color: @white0;\n border-bottom: 1px solid @black3;\n line-hei"
},
{
"path": "static/less/cmd.less",
"chars": 1896,
"preview": "@import \"common\";\n\n.cmd {\n margin: 24px 48px\n}\n\n.cmd-header {\n .bottom-line(12px);\n}\n\n#backup-btn,#theme-cache-btn{\n "
},
{
"path": "static/less/common/base.less",
"chars": 1156,
"preview": "@import \"var\";\n\n// ------------- basic ui -------------------\nhtml, body {\n font-family: Ubuntu, Consolas, \"Microsoft Y"
},
{
"path": "static/less/common/form.less",
"chars": 1628,
"preview": "@import \"base\";\n\ninput,textarea,select,button{\n font-family: Ubuntu, Consolas, \"Microsoft YaHei\", Verdana, Tahoma, Aria"
},
{
"path": "static/less/common/grid.less",
"chars": 432,
"preview": "@import \"base\";\n\n.container {\n max-width: 1200px;\n margin: auto;\n}\n\n.container960 {\n max-width: 960px;\n margin: auto"
},
{
"path": "static/less/common/label.less",
"chars": 575,
"preview": "@import \"base\";\n\n.lbl {\n padding: 4px 12px;\n background-color: @gray1;\n color: @black1;\n .border-radius(2px);\n}\n\n.lb"
},
{
"path": "static/less/common/markdown.less",
"chars": 1113,
"preview": "@import \"var\";\n.markdown{\n h1,h2,h3,h4,h5,h6{\n padding:18px 0 9px 0;\n font-weight: bold;\n }\n h1{\n font-size:"
},
{
"path": "static/less/common/pager.less",
"chars": 489,
"preview": "@import \"var\";\n\n.pager {\n .item {\n padding: 2px 8px;\n margin: 0 6px;\n color: @black1;\n display: inline-bloc"
},
{
"path": "static/less/common/reset.less",
"chars": 960,
"preview": "body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockq"
},
{
"path": "static/less/common/var.less",
"chars": 1008,
"preview": "@black0: #000;\n@black1: #333;\n@black2: #666;\n@black3: #999;\n@black4: #BBB;\n\n@white0: #FFFFFF;\n@white1: #FBFBFB;\n@white2:"
},
{
"path": "static/less/common.less",
"chars": 437,
"preview": "@import \"common/var\";\n@import \"common/reset\";\n@import \"common/base\";\n@import \"common/grid\";\n@import \"common/form\";\n@impo"
},
{
"path": "static/less/ling.less",
"chars": 5918,
"preview": "@import \"common\";\n\nhtml, body {\n background: @white4;\n}\n\n#header {\n background: #0093C4;\n min-width: 120px;\n padding"
},
{
"path": "static/less/saber.less",
"chars": 5313,
"preview": "@import \"common\";\n\nhtml, body {\n background: @white2;\n}\n\n#header {\n background: #FFF;\n box-shadow: 0 0 4px @black2;\n "
},
{
"path": "static/less/style.less",
"chars": 5783,
"preview": "@import \"common\";\n\nhtml,body{\n background: url(\"../img/bg.png\") repeat;\n}\n\n#header{\n background: url(\"../img/header.gi"
},
{
"path": "view/admin/admin.layout",
"chars": 1882,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>{{.Title}} - Fxh.Go</title>\n <link rel=\"styleshe"
},
{
"path": "view/admin/articles.html",
"chars": 1561,
"preview": "<ul id=\"article-list\" class=\"container960 admin\">\n <li>\n <a class=\"lbl lbl-blue\" href=\"/admin/article/write/\">"
},
{
"path": "view/admin/cmd/backup.html",
"chars": 1721,
"preview": "<header class=\"cmd-header clear\">\n <h1 class=\"cmd-title left\">备份数据</h1>\n <button class=\"btn btn-blue left\" id=\"bac"
},
{
"path": "view/admin/cmd/log.html",
"chars": 975,
"preview": "<header class=\"cmd-header\">\n <h1 class=\"cmd-title\">错误日志</h1>\n</header>\n<ul class=\"cmd-list\" id=\"log-list\">{{range .Lo"
},
{
"path": "view/admin/cmd/message.html",
"chars": 310,
"preview": "<header class=\"cmd-header\">\n <h1 class=\"cmd-title\">消息记录</h1>\n</header>\n<ul class=\"cmd-list\" id=\"message-list\">{{range"
},
{
"path": "view/admin/cmd/monitor.html",
"chars": 463,
"preview": "<header class=\"cmd-header\">\n <h1 class=\"cmd-title\">系统监控</h1>\n</header>\n<ul class=\"cmd-list\" id=\"monitor-list\">\n <l"
},
{
"path": "view/admin/cmd/reader.html",
"chars": 905,
"preview": "<header class=\"cmd-header clear\">\n <h1 class=\"cmd-title left\">读者</h1>\n</header>\n<ul class=\"cmd-list\" id=\"reader-list\""
},
{
"path": "view/admin/cmd/theme.html",
"chars": 1731,
"preview": "<header class=\"cmd-header clear\">\n <h1 class=\"cmd-title left\">主题风格</h1>\n <button class=\"btn left {{Setting `theme_"
},
{
"path": "view/admin/cmd.layout",
"chars": 449,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>{{.Title}} - Fxh.Go</title>\n <link rel=\"styleshe"
},
{
"path": "view/admin/comments.html",
"chars": 3748,
"preview": "<div id=\"comment-list\" class=\"admin container960\">{{range .Comments}}\n <div class=\"comment clear\" id=\"comment-{{.Id}}"
},
{
"path": "view/admin/edit_article.html",
"chars": 3714,
"preview": "<style>\n @import \"/static/css/codemirror.css\";\n @import \"/static/css/highlight.css\";\n</style>\n<form id=\"article-fo"
},
{
"path": "view/admin/edit_page.html",
"chars": 3827,
"preview": "<style>\n @import \"/static/css/codemirror.css\";\n @import \"/static/css/highlight.css\";\n</style>\n<form id=\"article-fo"
},
{
"path": "view/admin/files.html",
"chars": 1623,
"preview": "<ul id=\"files-list\" class=\"admin container960 pager\">\n <li class=\"file\" id=\"files-btn-li\">\n <button class=\"btn"
},
{
"path": "view/admin/home.html",
"chars": 2156,
"preview": "<div class=\"admin container clear\" id=\"dashboard\">\n <div class=\"grid-1-5 left\">\n <div class=\"welcome\">\n "
},
{
"path": "view/admin/login.html",
"chars": 2114,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>登录 - Fxh.Go</title>\n <link rel=\"stylesheet\" href"
},
{
"path": "view/admin/pages.html",
"chars": 1543,
"preview": "<ul id=\"article-list\" class=\"container960 admin\">\n <li>\n <a class=\"lbl lbl-blue\" href=\"/admin/page/write/\">添加页"
},
{
"path": "view/admin/password.html",
"chars": 1741,
"preview": "<form id=\"password\" class=\"form form-align clear\" action=\"#\" name=\"password-form\" method=\"post\">\n <p class=\"field\">\n "
},
{
"path": "view/admin/plugin.html",
"chars": 1548,
"preview": "<ul id=\"plugin-list\" class=\"container960 admin\">{{range .Plugins}}\n <li class=\"clear\">{{if .IsActive}}\n <span "
},
{
"path": "view/admin/plugin_setting.html",
"chars": 289,
"preview": "<form id=\"plugin-setting-form\" class=\"form container960 admin\" action=\"#\" method=\"post\">\n {{Html .Form}}\n</form>\n<scr"
},
{
"path": "view/admin/profile.html",
"chars": 2846,
"preview": "<form id=\"profile\" class=\"admin form clear form-align\" action=\"#\" method=\"post\" name=\"profile-form\">\n <div class=\"ava"
},
{
"path": "view/admin/setting.html",
"chars": 6397,
"preview": "<ul id=\"setting-nav\" class=\"container text-center\">\n <li><a href=\"#general\">基本</a></li>\n <li><a href=\"#content\">内容"
},
{
"path": "view/admin/write_article.html",
"chars": 3386,
"preview": "<style>\n @import \"/static/css/codemirror.css\";\n @import \"/static/css/highlight.css\";\n</style>\n<form id=\"article-fo"
},
{
"path": "view/admin/write_page.html",
"chars": 3460,
"preview": "<style>\n @import \"/static/css/codemirror.css\";\n @import \"/static/css/highlight.css\";\n</style>\n<form id=\"article-fo"
},
{
"path": "view/default/article.html",
"chars": 884,
"preview": "<div id=\"article-container\" class=\"clear\">\n <article class=\"clear {{.Article.Status}}\" id=\"article-{{.Article.Id}}\">{"
},
{
"path": "view/default/comment.html",
"chars": 3171,
"preview": "<div id=\"comment\">\n <div id=\"comment-list\">{{range .Comments}}{{if .IsValid}}\n <div class=\"comment clear\" id=\""
},
{
"path": "view/default/error/error.html",
"chars": 295,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/default/error/notfound.html",
"chars": 294,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/default/home.layout",
"chars": 2363,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n "
},
{
"path": "view/default/index.html",
"chars": 1493,
"preview": "<div id=\"article-container\" class=\"clear\">{{if .Tag}}\n <div class=\"tag-banner\">标签:{{.Tag}}</div>{{end}}{{range .Artic"
},
{
"path": "view/default/page.html",
"chars": 663,
"preview": "<div id=\"article-container\" class=\"clear\">\n <article class=\"clear\" id=\"article-Id\">{{with .Page}}\n <h3 class=\""
},
{
"path": "view/ling/article.html",
"chars": 844,
"preview": "<div id=\"article-container\" class=\"clear\">\n <article class=\"clear article-single relative {{.Article.Status}}\" id=\"ar"
},
{
"path": "view/ling/comment.html",
"chars": 3320,
"preview": "<div id=\"comment\" class=\"relative\">\n <h4 id=\"comment-title\">文章评论</h4>\n <div class=\"meta absolute text-center\">\n "
},
{
"path": "view/ling/error/error.html",
"chars": 295,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/ling/error/notfound.html",
"chars": 294,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/ling/home.layout",
"chars": 2190,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n "
},
{
"path": "view/ling/index.html",
"chars": 1264,
"preview": "<div id=\"article-container\" class=\"clear\">{{range .Articles}}\n <article class=\"clear {{.Status}}\" id=\"article-{{.Id}}"
},
{
"path": "view/ling/page.html",
"chars": 668,
"preview": "<div id=\"article-container\" class=\"clear\">\n <article class=\"clear article-single relative\" id=\"article-{{.Page.Id}}\">"
},
{
"path": "view/rss.xml",
"chars": 520,
"preview": "{{Html `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`}}\n<rss version=\"2.0\">\n <channel>\n <title>{{.Title}}</title>\n "
},
{
"path": "view/saber/article.html",
"chars": 869,
"preview": "<div id=\"article-container\" class=\"clear container960\">\n <article class=\"clear article-single relative {{.Article.Sta"
},
{
"path": "view/saber/comment.html",
"chars": 3279,
"preview": "<div id=\"comment\" class=\"relative clear\">\n <span class=\"right lbl lbl-red comments\"><a href=\"{{.Link}}#comment\">{{.Co"
},
{
"path": "view/saber/error/error.html",
"chars": 295,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/saber/error/notfound.html",
"chars": 294,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>错误提示</title>\n <link rel=\"stylesheet\" href=\"/stat"
},
{
"path": "view/saber/home.layout",
"chars": 2064,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n "
},
{
"path": "view/saber/index.html",
"chars": 1352,
"preview": "<div id=\"article-container\" class=\"clear grid-3-4 left\">{{if .Tag}}\n <div class=\"tag-banner\">标签:{{.Tag}}</div>{{end}}"
},
{
"path": "view/saber/page.html",
"chars": 714,
"preview": "<div id=\"article-container\" class=\"clear container960\">\n <article class=\"clear article-single relative\" id=\"article-{"
},
{
"path": "view/saber/sidebar.html",
"chars": 1058,
"preview": "<div id=\"article-sidebar\" class=\"grid-1-5 right\">\n <div class=\"sidebar\" id=\"pop-article-sidebar\">\n <h5 class=\""
},
{
"path": "view/sitemap.xml",
"chars": 914,
"preview": "{{Html `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`}}{{Html `<?xml-stylesheet type=\"text/xsl\" href=\"/static/css/sitemap.xsl\""
}
]
About this extraction
This page contains the full source code of the fuxiaohei/GoBlog GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 124 files (802.6 KB), approximately 426.9k tokens, and a symbol index with 307 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.