diff --git a/internal/database/database.go b/internal/database/database.go index 1afd0e1..1f17c83 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -46,12 +46,18 @@ type DB interface { // GetBookmark fetchs bookmark based on its ID or URL. GetBookmark(id int, url string) (model.Bookmark, bool) - // GetAccounts fetch list of accounts with matching keyword. + // SaveAccount saves new account in database + SaveAccount(username, password string) error + + // GetAccounts fetch list of account (without its password) with matching keyword. GetAccounts(keyword string) ([]model.Account, error) // GetAccount fetch account with matching username. GetAccount(username string) (model.Account, bool) + // DeleteAccounts removes all record with matching usernames + DeleteAccounts(usernames ...string) error + // GetTags fetch list of tags and its frequency from database. GetTags() ([]model.Tag, error) diff --git a/internal/database/sqlite.go b/internal/database/sqlite.go index c6645d0..c588549 100644 --- a/internal/database/sqlite.go +++ b/internal/database/sqlite.go @@ -8,6 +8,7 @@ import ( "github.com/go-shiori/shiori/internal/model" "github.com/jmoiron/sqlx" + "golang.org/x/crypto/bcrypt" ) // SQLiteDatabase is implementation of Database interface @@ -422,11 +423,29 @@ func (db *SQLiteDatabase) GetBookmark(id int, url string) (model.Bookmark, bool) return book, book.ID != 0 } -// GetAccounts fetch list of accounts with matching keyword. +// SaveAccount saves new account to database. Returns error if any happened. +func (db *SQLiteDatabase) SaveAccount(username, password string) (err error) { + // Hash password with bcrypt + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 10) + if err != nil { + return err + } + + // Insert account to database + _, err = db.Exec(`INSERT INTO account + (username, password) VALUES (?, ?) + ON CONFLICT(username) DO UPDATE SET + password = ?`, + username, hashedPassword, hashedPassword) + + return err +} + +// GetAccounts fetch list of account (without its password) with matching keyword. func (db *SQLiteDatabase) GetAccounts(keyword string) ([]model.Account, error) { // Create query args := []interface{}{} - query := `SELECT id, username, password FROM account WHERE 1` + query := `SELECT id, username FROM account WHERE 1` if keyword != "" { query += " AND username LIKE ?" @@ -456,6 +475,37 @@ func (db *SQLiteDatabase) GetAccount(username string) (model.Account, bool) { return account, account.ID != 0 } +// DeleteAccounts removes all record with matching usernames. +func (db *SQLiteDatabase) DeleteAccounts(usernames ...string) (err error) { + // Begin transaction + tx, err := db.Beginx() + if err != nil { + return err + } + + // Make sure to rollback if panic ever happened + defer func() { + if r := recover(); r != nil { + panicErr, _ := r.(error) + tx.Rollback() + + err = panicErr + } + }() + + // Delete account + stmtDelete, _ := tx.Preparex(`DELETE FROM account WHERE username = ?`) + for _, username := range usernames { + stmtDelete.MustExec(username) + } + + // Commit transaction + err = tx.Commit() + checkError(err) + + return err +} + // GetTags fetch list of tags and their frequency. func (db *SQLiteDatabase) GetTags() ([]model.Tag, error) { tags := []model.Tag{} diff --git a/internal/model/model.go b/internal/model/model.go index 3d48fc3..4762f38 100644 --- a/internal/model/model.go +++ b/internal/model/model.go @@ -27,7 +27,7 @@ type Bookmark struct { type Account struct { ID int `db:"id" json:"id"` Username string `db:"username" json:"username"` - Password string `db:"password" json:"password"` + Password string `db:"password" json:"password,omitempty"` } // LoginRequest is request from user to access web interface. diff --git a/internal/view/css/stylesheet.css b/internal/view/css/stylesheet.css index 783ed69..17c6ee5 100644 --- a/internal/view/css/stylesheet.css +++ b/internal/view/css/stylesheet.css @@ -1 +1 @@ -:root{--bg:#EEE;--sidebarBg:#292929;--sidebarHoverBg:#232323;--headerBg:#FFF;--contentBg:#FFF;--border:#E5E5E5;--color:#232323;--colorLink:#999;--colorSidebar:#FFF;--main:#F44336;--errorColor:#F44336;--selectedBg:#ffe7e5}.night{--bg:#1F1F1F;--headerBg:#292929;--contentBg:#292929;--border:#191919;--color:#FFF;--selectedBg:#261918}*{border-width:0;box-sizing:border-box;font-family:"Source Sans Pro",sans-serif;margin:0;padding:0;text-decoration:none}a{cursor:pointer}.spacer{-webkit-box-flex:1;flex:1}body{overflow:hidden}#login-scene{height:100vh;padding:16px;overflow:auto;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;background-color:var(--bg)}#login-scene>.error-message{width:100%;max-width:400px;font-size:.9em;background-color:var(--contentBg);border:1px solid var(--border);padding:16px;margin-top:auto;margin-bottom:16px;text-align:center;color:var(--errorColor)}#login-scene #login-box{width:100%;max-width:400px;margin-bottom:auto;background-color:var(--contentBg);display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border:1px solid var(--border);flex-shrink:0}#login-scene #login-box:first-child{margin-top:auto}#login-scene #login-box #logo-area{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding:16px;background-color:var(--main);border-bottom:1px solid var(--border);flex-shrink:0}#login-scene #login-box #logo-area #logo{font-size:3em;font-weight:100;color:var(--contentBg)}#login-scene #login-box #logo-area #logo span{margin-right:8px}#login-scene #login-box #logo-area #tagline{font-weight:500;margin-top:4px;color:var(--contentBg);text-align:center}#login-scene #login-box #input-area{padding:16px;display:grid;grid-gap:16px;grid-template-columns:auto 1fr;-webkit-box-pack:baseline;justify-content:baseline;-webkit-box-align:center;align-items:center;border-bottom:1px solid var(--border)}#login-scene #login-box #input-area>label{color:var(--color)}#login-scene #login-box #input-area>input{color:var(--color);padding:8px;background-color:var(--contentBg);border:1px solid var(--border);min-width:0;font-size:1em}#login-scene #login-box #input-area .checkbox-field{grid-column:1 / span 2;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;cursor:pointer}#login-scene #login-box #input-area .checkbox-field:hover,#login-scene #login-box #input-area .checkbox-field:focus{text-decoration:underline;-webkit-text-decoration-color:var(--main);text-decoration-color:var(--main)}#login-scene #login-box #input-area .checkbox-field>input[type="checkbox"]{margin-right:8px}#login-scene #login-box #button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px;-webkit-box-pack:center;justify-content:center}#login-scene #login-box #button-area a{color:var(--color);text-transform:uppercase;text-align:center;font-weight:600;cursor:default}#login-scene #login-box #button-area a.button{cursor:pointer}#login-scene #login-box #button-area a.button:hover,#login-scene #login-box #button-area a.button:focus{color:var(--main)}#main-scene{display:grid;grid-template-rows:minmax(0, 1fr);grid-template-columns:60px minmax(0, 1fr);background-color:var(--bg);width:100vw;height:100vh}#main-scene #main-sidebar{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;background-color:var(--sidebarBg)}#main-scene #main-sidebar a{flex-shrink:0;display:block;width:60px;line-height:60px;text-align:center;font-size:1em;color:var(--colorSidebar)}#main-scene #main-sidebar a.active{cursor:default}#main-scene #main-sidebar a:hover,#main-scene #main-sidebar a:focus{color:var(--main);background-color:var(--sidebarHoverBg)}#main-scene #main-sidebar a.active{color:var(--colorSidebar);background-color:var(--main)}#main-scene h1.page-header{display:block;color:var(--color);background-color:var(--headerBg);border-bottom:1px solid var(--border);line-height:60px;font-size:1.3em;font-weight:600;padding:0 16px}#main-scene div.page-header{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;background-color:var(--headerBg);border-bottom:1px solid var(--border);padding:0 16px;grid-row-end:1;grid-row-start:1;grid-column-end:-1;grid-column-start:1}#main-scene div.page-header p{-webkit-box-flex:1;flex:1 0;font-size:1.3em;font-weight:600;line-height:60px;color:var(--color)}#main-scene div.page-header input[type="text"]{-webkit-box-flex:1;flex:1 0;min-width:0;margin-right:8px;font-size:1.1em;font-weight:500;line-height:60px;color:var(--color);background-color:var(--contentBg)}#main-scene div.page-header input[type="text"]::-webkit-input-placeholder{color:var(--colorLink)}#main-scene div.page-header input[type="text"]::placeholder{color:var(--colorLink)}#main-scene div.page-header a{display:block;width:24px;line-height:24px;color:var(--colorLink);text-align:center}#main-scene div.page-header a:not(:last-child){margin-right:8px}#main-scene div.page-header a:hover{color:var(--main)}#main-scene .loading-overlay{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;overflow:hidden;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:10001;background-color:rgba(0,0,0,0.6)}#main-scene .loading-overlay i{color:var(--colorSidebar);font-size:4em;text-align:center;width:80px;line-height:80px;position:absolute}@media (max-width:600px){#main-scene{grid-template-rows:minmax(0, 1fr);grid-template-columns:minmax(0, 1fr)}#main-scene .home-sidebar{display:none;overflow-x:auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:center;justify-content:center}#main-scene .home-sidebar .spacer{display:none}#main-scene h1.page-header{text-align:center;font-size:1em;line-height:1.2em;padding:8px}#main-scene div.page-header{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap}#main-scene div.page-header p{-webkit-box-flex:1;flex:1 0;font-size:1em;font-weight:500;line-height:3em;padding:0}#main-scene div.page-header input[type="text"]{-webkit-box-flex:1;flex:1 0;font-size:1em;font-weight:500;line-height:3em}#main-scene div.page-header a{display:block;width:24px;line-height:100%}}#page-home{display:grid;grid-template-columns:1fr;grid-template-rows:auto minmax(0, 1fr)}#page-home #edit-box{background-color:var(--selectedBg);border-bottom:1px solid var(--main)}#page-home #bookmarks-grid{display:grid;grid-template-rows:min-content;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-gap:16px;padding:16px;overflow:auto}#page-home #bookmarks-grid::after{content:"";display:block;min-height:1px;grid-column-end:-1;grid-column-start:1}#page-home #bookmarks-grid .bookmark{align-self:start}#page-home #bookmarks-grid .pagination-box{grid-column-end:-1;grid-column-start:1;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;align-self:start}#page-home #bookmarks-grid .pagination-box a{padding:8px;color:var(--colorLink)}#page-home #bookmarks-grid .pagination-box a:hover,#page-home #bookmarks-grid .pagination-box a:focus{color:var(--main)}#page-home #bookmarks-grid .pagination-box input{width:40px;padding:8px;text-align:center;font-size:.9em;color:var(--color);border:1px solid var(--border);background-color:var(--contentBg);margin:0 8px}#page-home #bookmarks-grid .pagination-box p{font-size:.9em;color:var(--colorLink);line-height:37px;font-weight:600}#page-home #bookmarks-grid .pagination-box p:last-of-type::before{content:"/";margin-right:8px}#page-home #bookmarks-grid.list{grid-gap:0;grid-template-columns:minmax(0, 1000px)}#page-home #bookmarks-grid.list .pagination-box{padding:16px 0}#page-home #bookmarks-grid.list .pagination-box:first-child{padding-top:0}@media (max-width:600px){#page-home #bookmarks-grid.list{padding:0}#page-home #bookmarks-grid.list .pagination-box{padding:16px}}#page-home #dialog-tags .custom-dialog-body{grid-template-columns:repeat(2, minmax(0, 1fr))}@media (max-width:600px){#page-home #dialog-tags .custom-dialog-body{grid-template-columns:minmax(0, 1fr)}}#page-home #dialog-tags .custom-dialog-body a{font-size:1em}#page-home #dialog-tags .custom-dialog-body a span:last-child{font-size:1em;color:var(--colorLink);margin-left:4px}#page-home #dialog-tags .custom-dialog-body a span:last-child::before{content:"(";margin-right:2px}#page-home #dialog-tags .custom-dialog-body a span:last-child::after{content:")";margin-left:2px}#page-home #dialog-tags .custom-dialog-body a:hover,#page-home #dialog-tags .custom-dialog-body a:focus{color:var(--main)}#page-setting{min-height:0;max-height:100%;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap}#page-setting .setting-container{padding:8px;display:-webkit-box;display:flex;overflow:auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-flex:1;flex:1 0}#page-setting .setting-container::after{content:"";display:block;min-height:1px}#page-setting .setting-container details.setting-group{margin:8px;display:block;max-width:350px;color:var(--color);background-color:var(--contentBg);border:1px solid var(--border)}@media (max-width:600px){#page-setting .setting-container details.setting-group{max-width:100%}}#page-setting .setting-container details.setting-group summary{list-style:none;font-weight:600;width:100%;padding:12px 8px;font-size:1.1em;cursor:pointer}#page-setting .setting-container details.setting-group summary:hover{color:var(--main)}#page-setting .setting-container details.setting-group summary::-webkit-details-marker{display:none}#page-setting .setting-container details.setting-group summary::after{content:"+";margin-left:8px;font-weight:600}#page-setting .setting-container details.setting-group[open] summary{border-bottom:1px solid var(--border)}#page-setting .setting-container details.setting-group[open] summary ::after{content:"-"}#page-setting .setting-container details.setting-group div.setting-group-footer{padding:4px 8px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:end;align-items:flex-end;border-top:1px solid var(--border)}#page-setting .setting-container details.setting-group div.setting-group-footer>a{text-transform:uppercase;padding:8px 4px;font-size:.9em;font-weight:600}#page-setting .setting-container details.setting-group div.setting-group-footer>a:hover{color:var(--mainDark)}#page-setting .setting-container details.setting-group div.setting-group-footer>a:focus{outline:none;color:var(--mainDark);border-bottom:1px dashed var(--mainDark)}#page-setting #setting-display{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding-bottom:8px}#page-setting #setting-display summary{margin-bottom:8px}#page-setting #setting-display label{padding:4px 8px;color:var(--color);display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;cursor:pointer}#page-setting #setting-display label:hover,#page-setting #setting-display label:focus{text-decoration:underline;-webkit-text-decoration-color:var(--main);text-decoration-color:var(--main)}#page-setting #setting-display label>input[type="checkbox"]{margin-right:8px} \ No newline at end of file +:root{--bg:#EEE;--sidebarBg:#292929;--sidebarHoverBg:#232323;--headerBg:#FFF;--contentBg:#FFF;--border:#E5E5E5;--color:#232323;--colorLink:#999;--colorSidebar:#FFF;--main:#F44336;--errorColor:#F44336;--selectedBg:#ffe7e5}.night{--bg:#1F1F1F;--headerBg:#292929;--contentBg:#292929;--border:#191919;--color:#FFF;--selectedBg:#261918}*{border-width:0;box-sizing:border-box;font-family:"Source Sans Pro",sans-serif;margin:0;padding:0;text-decoration:none}a{cursor:pointer}.spacer{-webkit-box-flex:1;flex:1}body{overflow:hidden}#login-scene{height:100vh;padding:16px;overflow:auto;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;background-color:var(--bg)}#login-scene>.error-message{width:100%;max-width:400px;font-size:1em;background-color:var(--contentBg);border:1px solid var(--border);padding:16px;margin-top:auto;margin-bottom:16px;text-align:center;color:var(--errorColor)}#login-scene #login-box{width:100%;max-width:400px;margin-bottom:auto;background-color:var(--contentBg);display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;border:1px solid var(--border);flex-shrink:0}#login-scene #login-box:first-child{margin-top:auto}#login-scene #login-box #logo-area{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding:16px;background-color:var(--main);border-bottom:1px solid var(--border);flex-shrink:0}#login-scene #login-box #logo-area #logo{font-size:3em;font-weight:100;color:var(--contentBg)}#login-scene #login-box #logo-area #logo span{margin-right:8px}#login-scene #login-box #logo-area #tagline{font-weight:500;margin-top:4px;color:var(--contentBg);text-align:center}#login-scene #login-box #input-area{padding:16px;display:grid;grid-gap:16px;grid-template-columns:auto 1fr;-webkit-box-pack:baseline;justify-content:baseline;-webkit-box-align:center;align-items:center;border-bottom:1px solid var(--border)}#login-scene #login-box #input-area>label{color:var(--color)}#login-scene #login-box #input-area>input{color:var(--color);padding:8px;background-color:var(--contentBg);border:1px solid var(--border);min-width:0;font-size:1em}#login-scene #login-box #input-area .checkbox-field{grid-column:1 / span 2;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;cursor:pointer}#login-scene #login-box #input-area .checkbox-field:hover,#login-scene #login-box #input-area .checkbox-field:focus{text-decoration:underline;-webkit-text-decoration-color:var(--main);text-decoration-color:var(--main)}#login-scene #login-box #input-area .checkbox-field>input[type="checkbox"]{margin-right:8px}#login-scene #login-box #button-area{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;padding:16px;-webkit-box-pack:center;justify-content:center}#login-scene #login-box #button-area a{color:var(--color);text-transform:uppercase;text-align:center;font-weight:600;cursor:default}#login-scene #login-box #button-area a.button{cursor:pointer}#login-scene #login-box #button-area a.button:hover,#login-scene #login-box #button-area a.button:focus{color:var(--main)}#main-scene{display:grid;grid-template-rows:minmax(0, 1fr);grid-template-columns:60px minmax(0, 1fr);background-color:var(--bg);width:100vw;height:100vh}#main-scene #main-sidebar{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;background-color:var(--sidebarBg)}#main-scene #main-sidebar a{flex-shrink:0;display:block;width:60px;line-height:60px;text-align:center;font-size:1em;color:var(--colorSidebar)}#main-scene #main-sidebar a.active{cursor:default}#main-scene #main-sidebar a:hover,#main-scene #main-sidebar a:focus{color:var(--main);background-color:var(--sidebarHoverBg)}#main-scene #main-sidebar a.active{color:var(--colorSidebar);background-color:var(--main)}#main-scene h1.page-header{display:block;color:var(--color);background-color:var(--headerBg);border-bottom:1px solid var(--border);line-height:60px;font-size:1.3em;font-weight:600;padding:0 16px}#main-scene div.page-header{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;background-color:var(--headerBg);border-bottom:1px solid var(--border);padding:0 16px;grid-row-end:1;grid-row-start:1;grid-column-end:-1;grid-column-start:1}#main-scene div.page-header p{-webkit-box-flex:1;flex:1 0;font-size:1.3em;font-weight:600;line-height:60px;color:var(--color)}#main-scene div.page-header input[type="text"]{-webkit-box-flex:1;flex:1 0;min-width:0;margin-right:8px;font-size:1.1em;font-weight:500;line-height:60px;color:var(--color);background-color:var(--contentBg)}#main-scene div.page-header input[type="text"]::-webkit-input-placeholder{color:var(--colorLink)}#main-scene div.page-header input[type="text"]::placeholder{color:var(--colorLink)}#main-scene div.page-header a{display:block;width:24px;line-height:24px;color:var(--colorLink);text-align:center}#main-scene div.page-header a:not(:last-child){margin-right:8px}#main-scene div.page-header a:hover{color:var(--main)}#main-scene .loading-overlay{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;overflow:hidden;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:10001;background-color:rgba(0,0,0,0.6)}#main-scene .loading-overlay i{color:var(--colorSidebar);font-size:4em;text-align:center;width:80px;line-height:80px;position:absolute}@media (max-width:600px){#main-scene{grid-template-rows:minmax(0, 1fr);grid-template-columns:minmax(0, 1fr)}#main-scene .home-sidebar{display:none;overflow-x:auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-pack:center;justify-content:center}#main-scene .home-sidebar .spacer{display:none}#main-scene h1.page-header{text-align:center;font-size:1em;line-height:1.2em;padding:8px}#main-scene div.page-header{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap}#main-scene div.page-header p{-webkit-box-flex:1;flex:1 0;font-size:1em;font-weight:500;line-height:3em;padding:0}#main-scene div.page-header input[type="text"]{-webkit-box-flex:1;flex:1 0;font-size:1em;font-weight:500;line-height:3em}#main-scene div.page-header a{display:block;width:24px;line-height:100%}}#page-home{display:grid;grid-template-columns:1fr;grid-template-rows:auto minmax(0, 1fr)}#page-home #edit-box{background-color:var(--selectedBg);border-bottom:1px solid var(--main)}#page-home #bookmarks-grid{display:grid;grid-template-rows:min-content;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-gap:16px;padding:16px;overflow:auto}#page-home #bookmarks-grid::after{content:"";display:block;min-height:1px;grid-column-end:-1;grid-column-start:1}#page-home #bookmarks-grid .bookmark{align-self:start}#page-home #bookmarks-grid .pagination-box{grid-column-end:-1;grid-column-start:1;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;align-self:start}#page-home #bookmarks-grid .pagination-box a{padding:8px;color:var(--colorLink)}#page-home #bookmarks-grid .pagination-box a:hover,#page-home #bookmarks-grid .pagination-box a:focus{color:var(--main)}#page-home #bookmarks-grid .pagination-box input{width:40px;padding:8px;text-align:center;font-size:.9em;color:var(--color);border:1px solid var(--border);background-color:var(--contentBg);margin:0 8px}#page-home #bookmarks-grid .pagination-box p{font-size:.9em;color:var(--colorLink);line-height:37px;font-weight:600}#page-home #bookmarks-grid .pagination-box p:last-of-type::before{content:"/";margin-right:8px}#page-home #bookmarks-grid.list{grid-gap:0;grid-template-columns:minmax(0, 1000px)}#page-home #bookmarks-grid.list .pagination-box{padding:16px 0}#page-home #bookmarks-grid.list .pagination-box:first-child{padding-top:0}@media (max-width:600px){#page-home #bookmarks-grid.list{padding:0}#page-home #bookmarks-grid.list .pagination-box{padding:16px}}#page-home #dialog-tags .custom-dialog-body{grid-template-columns:repeat(2, minmax(0, 1fr))}@media (max-width:600px){#page-home #dialog-tags .custom-dialog-body{grid-template-columns:minmax(0, 1fr)}}#page-home #dialog-tags .custom-dialog-body a{font-size:1em}#page-home #dialog-tags .custom-dialog-body a span:last-child{font-size:1em;color:var(--colorLink);margin-left:4px}#page-home #dialog-tags .custom-dialog-body a span:last-child::before{content:"(";margin-right:2px}#page-home #dialog-tags .custom-dialog-body a span:last-child::after{content:")";margin-left:2px}#page-home #dialog-tags .custom-dialog-body a:hover,#page-home #dialog-tags .custom-dialog-body a:focus{color:var(--main)}#page-setting{min-height:0;max-height:100%;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap}#page-setting .setting-container{padding:8px;display:-webkit-box;display:flex;overflow:auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-flex:1;flex:1 0}#page-setting .setting-container::after{content:"";display:block;min-height:1px}#page-setting .setting-container details.setting-group{margin:8px;display:block;max-width:350px;color:var(--color);background-color:var(--contentBg);border:1px solid var(--border)}@media (max-width:600px){#page-setting .setting-container details.setting-group{max-width:100%}}#page-setting .setting-container details.setting-group summary{list-style:none;font-weight:600;width:100%;padding:12px 8px;font-size:1.1em;cursor:pointer}#page-setting .setting-container details.setting-group summary:hover{color:var(--main)}#page-setting .setting-container details.setting-group summary::-webkit-details-marker{display:none}#page-setting .setting-container details.setting-group summary::after{content:"+";margin-left:8px;font-weight:600}#page-setting .setting-container details.setting-group[open] summary{border-bottom:1px solid var(--border)}#page-setting .setting-container details.setting-group[open] summary ::after{content:"-"}#page-setting .setting-container details.setting-group div.setting-group-footer{padding:4px 8px;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;-webkit-box-align:end;align-items:flex-end;border-top:1px solid var(--border)}#page-setting .setting-container details.setting-group div.setting-group-footer>a{text-transform:uppercase;padding:8px 4px;font-size:.9em;font-weight:600}#page-setting .setting-container details.setting-group div.setting-group-footer>a:hover{color:var(--main)}#page-setting .setting-container details.setting-group div.setting-group-footer>a:focus{outline:none;color:var(--main);border-bottom:1px dashed var(--main)}#page-setting #setting-display{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap;padding-bottom:8px}#page-setting #setting-display summary{margin-bottom:8px}#page-setting #setting-display label{padding:4px 8px;color:var(--color);display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center;cursor:pointer}#page-setting #setting-display label:hover,#page-setting #setting-display label:focus{text-decoration:underline;-webkit-text-decoration-color:var(--main);text-decoration-color:var(--main)}#page-setting #setting-display label>input[type="checkbox"]{margin-right:8px}#page-setting #setting-accounts summary{margin-bottom:0}#page-setting #setting-accounts ul{list-style:none}#page-setting #setting-accounts ul li{padding:8px;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap;-webkit-box-align:center;align-items:center}#page-setting #setting-accounts ul li:not(:last-child){border-bottom:1px solid var(--border)}#page-setting #setting-accounts ul li span{font-size:1em;color:var(--color);-webkit-box-flex:1;flex:1 0}#page-setting #setting-accounts ul li a{margin-left:8px;color:var(--colorLink)}#page-setting #setting-accounts ul li a:hover{color:var(--main)} \ No newline at end of file diff --git a/internal/view/js/page/setting.js b/internal/view/js/page/setting.js index 65398bf..fb80dff 100644 --- a/internal/view/js/page/setting.js +++ b/internal/view/js/page/setting.js @@ -1,11 +1,6 @@ var template = `
- +

Settings

Display @@ -22,6 +17,25 @@ var template = ` Use dark theme
+
+ Accounts +
    +
  • No accounts registered
  • +
  • + {{account.username}} + + + + + + +
  • +
+ +
@@ -39,6 +53,7 @@ export default { data() { return { loading: false, + accounts: [] } }, methods: { @@ -48,6 +63,214 @@ export default { listMode: this.displayOptions.listMode, nightMode: this.displayOptions.nightMode, }); - } + }, + loadAccounts() { + if (this.loading) return; + + this.loading = true; + fetch("/api/accounts") + .then(response => { + if (!response.ok) throw response; + return response.json(); + }) + .then(json => { + this.loading = false; + this.accounts = json; + }) + .catch(err => { + this.loading = false; + err.text().then(msg => { + this.showErrorDialog(msg, err.status); + }) + }); + }, + showDialogNewAccount() { + this.showDialog({ + title: "New Account", + content: "Input new account's data :", + fields: [{ + name: "username", + label: "Username", + value: "", + }, { + name: "password", + label: "Password", + type: "password", + value: "", + }, { + name: "repeat", + label: "Repeat password", + type: "password", + value: "", + }], + mainText: "OK", + secondText: "Cancel", + mainClick: (data) => { + if (data.username === "") { + this.showErrorDialog("Username must not empty"); + return; + } + + if (data.password === "") { + this.showErrorDialog("Password must not empty"); + return; + } + + if (data.password !== data.repeat) { + this.showErrorDialog("Password does not match"); + return; + } + + var request = { + username: data.username, + password: data.password + } + + this.dialog.loading = true; + fetch("/api/accounts", { + method: "post", + body: JSON.stringify(request), + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (!response.ok) throw response; + return response; + }) + .then(() => { + this.dialog.loading = false; + this.dialog.visible = false; + + this.accounts.push({ username: data.username }); + this.accounts.sort((a, b) => { + var nameA = a.username.toLowerCase(), + nameB = b.username.toLowerCase(); + + if (nameA < nameB) { + return -1; + } + + if (nameA > nameB) { + return 1; + } + + return 0; + }); + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(msg, err.status); + }) + }); + } + }); + }, + showDialogChangePassword(account) { + this.showDialog({ + title: "Change Password", + content: "Input new password :", + fields: [{ + name: "oldPassword", + label: "Old password", + type: "password", + value: "", + }, { + name: "password", + label: "New password", + type: "password", + value: "", + }, { + name: "repeat", + label: "Repeat password", + type: "password", + value: "", + }], + mainText: "OK", + secondText: "Cancel", + mainClick: (data) => { + if (data.oldPassword === "") { + this.showErrorDialog("Old password must not empty"); + return; + } + + if (data.password === "") { + this.showErrorDialog("New password must not empty"); + return; + } + + if (data.password !== data.repeat) { + this.showErrorDialog("Password does not match"); + return; + } + + var request = { + username: account.username, + oldPassword: data.oldPassword, + newPassword: data.password + } + + this.dialog.loading = true; + fetch("/api/accounts", { + method: "put", + body: JSON.stringify(request), + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (!response.ok) throw response; + return response; + }) + .then(() => { + this.dialog.loading = false; + this.dialog.visible = false; + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(msg, err.status); + }) + }); + } + }); + }, + showDialogDeleteAccount(account, idx) { + this.showDialog({ + title: "Delete Account", + content: `Delete account "${account.username}" ?`, + mainText: "Yes", + secondText: "No", + mainClick: () => { + this.dialog.loading = true; + fetch(`/api/accounts`, { + method: "delete", + body: JSON.stringify([account.username]), + headers: { + "Content-Type": "application/json", + }, + }) + .then(response => { + if (!response.ok) throw response; + return response; + }) + .then(() => { + this.dialog.loading = false; + this.dialog.visible = false; + this.accounts.splice(idx, 1); + }) + .catch(err => { + this.dialog.loading = false; + err.text().then(msg => { + this.showErrorDialog(msg, err.status); + }) + }); + } + }); + }, + }, + mounted() { + this.loadAccounts(); } } \ No newline at end of file diff --git a/internal/view/less/stylesheet.less b/internal/view/less/stylesheet.less index aa9bc5a..5e6113d 100644 --- a/internal/view/less/stylesheet.less +++ b/internal/view/less/stylesheet.less @@ -55,7 +55,7 @@ body { >.error-message { width: 100%; max-width: 400px; - font-size: 0.9em; + font-size: 1em; background-color: var(--contentBg); border: 1px solid var(--border); padding: 16px; @@ -557,13 +557,13 @@ body { font-weight: 600; &:hover { - color: var(--mainDark); + color: var(--main); } &:focus { outline: none; - color: var(--mainDark); - border-bottom: 1px dashed var(--mainDark); + color: var(--main); + border-bottom: 1px dashed var(--main); } } } @@ -598,4 +598,40 @@ body { } } } + + #setting-accounts { + summary { + margin-bottom: 0; + } + + ul { + list-style: none; + + li { + padding: 8px; + display: flex; + flex-flow: row nowrap; + align-items: center; + + &:not(:last-child) { + border-bottom: 1px solid var(--border); + } + + span { + font-size: 1em; + color: var(--color); + flex: 1 0; + } + + a { + margin-left: 8px; + color: var(--colorLink); + + &:hover { + color: var(--main); + } + } + } + } + } } \ No newline at end of file diff --git a/internal/webserver/assets-prod.go b/internal/webserver/assets-prod.go index 9e77941..1d5920e 100644 --- a/internal/webserver/assets-prod.go +++ b/internal/webserver/assets-prod.go @@ -149,14 +149,14 @@ var assets = func() http.FileSystem { }, "/css/stylesheet.css": &vfsgen۰CompressedFileInfo{ name: "stylesheet.css", - modTime: time.Date(2019, 5, 31, 9, 31, 16, 100597839, time.UTC), - uncompressedSize: 11991, + modTime: time.Date(2019, 5, 31, 14, 20, 33, 149785798, time.UTC), + uncompressedSize: 12632, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x5b\x6f\xe3\xb8\x15\xfe\x2b\x82\x83\x05\xe2\x36\xf4\x4a\x49\x26\x9b\x48\xe8\xa0\x68\x3b\x41\x1f\xf6\xa1\xc0\x3c\x2e\xe6\x81\x96\x8e\x64\xd6\x12\x29\x90\x74\xe2\x8c\xe0\xff\xbe\x20\x29\xc9\xa2\xac\xab\xe3\xcc\x0e\x0c\x24\x16\x4d\xf2\x5c\xf8\x9d\x2b\xe5\x73\xc6\x64\x81\xd0\x3a\xf1\xaf\xbe\x7c\xf9\x12\x20\x24\x48\x04\x6b\xcc\xff\x95\xf8\x57\xb7\x4f\xea\x73\x1c\xfb\x2f\x7b\x01\xf3\xc3\x9d\xfa\x04\x08\x6d\x00\x47\x66\xe8\xf9\xf9\x39\x40\x28\x64\x54\x02\x95\xc7\x81\x35\xe3\x11\x70\xff\xea\xcb\x27\xf5\xd1\x33\x52\xc6\x1b\x3b\xe8\xe7\xdf\x09\xdd\xfa\x57\x4f\x4f\x4f\xd5\xc0\x57\x43\xb0\xda\x25\xc3\x84\xfa\x57\xcf\xf7\xf7\x77\x77\x0f\x01\x42\xc0\x39\xe3\xff\x36\x1b\xd5\x83\x02\x52\x08\x25\x44\x8a\x76\x1c\xc3\x6f\xf0\xe9\xb0\xa2\x24\xd9\x54\xd2\x79\xcf\xea\x63\xf1\x5c\xcb\xd7\x60\xbb\x1e\xab\x38\xf7\x9e\xd4\xe7\xc8\xb9\xe1\xa8\x49\xed\xf6\xc1\x7b\xf2\x1e\x0f\x7f\x2b\xcc\x12\xf4\x4a\x22\xb9\xf1\xdd\x60\xcd\xf6\x48\x90\xef\x84\x26\x7e\xf9\xcb\x9a\xed\x83\x98\x51\x89\x62\x9c\x91\xf4\xcd\x5f\x7c\x65\x3b\x1e\x82\xf3\x15\x53\xe1\xfc\x8f\xb3\xc5\x8d\xc0\x54\x20\x01\x9c\xc4\x41\x86\x79\x42\xa8\xef\x06\x39\x8e\x22\xb5\x89\x1b\x48\xd8\x4b\x14\x41\xc8\x38\x96\x84\x51\x9f\x32\x0a\x07\x5c\x84\x3b\x2e\x18\xf7\x73\x46\xa8\x04\x7e\x58\x89\x1c\x87\xc0\x0b\xf4\x0a\xeb\x2d\x91\x8a\x2a\x8a\x53\xd8\xfb\x5e\x60\xfe\x1d\xd6\x2c\x7a\x2b\xd4\x61\xc6\x29\x7b\xf5\x37\x24\x8a\x80\x1e\xae\x52\x96\x10\x8a\x44\x08\x14\x8a\x0d\x28\xd5\xf9\x9e\xeb\xbe\x6c\x6a\x06\xbc\x87\x7c\x1f\xd4\xcb\xf0\x4e\xb2\x20\x22\x22\x4f\xf1\x9b\xdf\xa0\x55\x8f\x29\x62\x41\x93\x09\x9c\x92\x84\xfa\x21\x28\x2e\x03\xfd\x80\x88\x84\x4c\x54\x43\xcd\xb9\x8c\x13\xa0\xd2\x7f\x01\x2e\x49\x88\x53\xeb\xb7\x88\x70\x08\x4b\x05\xf0\x0c\xa7\x5a\x2c\xa4\x99\x0a\x59\xba\xcb\xa8\x43\xd9\x2b\xc7\x79\xb0\xc6\xe1\x36\xe1\x6c\x47\xa3\xf2\xf4\x5e\x30\xbf\x56\x70\x58\x5a\xd2\x7e\x5e\x69\x44\xa1\x0c\x84\xc0\x09\x14\xe6\x00\x3d\xd7\xfd\x25\xc8\xf0\xbe\x3c\xcf\x7b\xd7\xcd\xcb\xd3\x13\xe4\x3b\xf8\xab\x27\xc8\xfa\x08\xd4\x78\x5a\x06\x25\x8c\xbc\x7c\xef\x08\x96\x92\xc8\x29\x59\xd0\xc3\x4b\x5b\xb5\xe6\xc4\x91\x64\xb9\x51\x6e\xf9\xbc\x66\x52\xb2\xcc\x4c\xd1\x08\xb0\xf4\xd8\xa4\x7b\x34\x0c\x5b\x40\xa7\x7c\x58\xb3\xfd\x90\x70\x36\x3d\xcd\xc2\xb8\x80\xb3\x10\x70\x99\x53\x1d\x56\xa9\x5e\x26\x36\x5c\xf9\x14\xb7\x4f\x0d\x7e\x4c\xb8\x90\x28\xdc\x90\x34\x2a\x5a\x7a\xef\x5b\xa3\xbf\x32\x84\x39\xe0\xe2\xe7\xc6\xbd\x85\xaa\x9e\x23\x54\x3e\xb5\x82\x67\x0d\xb1\xf7\xa8\xb4\xa1\x1e\xf3\xb5\x38\x1a\xcb\x1d\x64\xc6\x74\x5e\x6b\xbf\x12\x74\xe3\x69\xf2\xee\x8e\xc8\x31\xad\x8e\x8e\xeb\x5d\x1f\xf3\xfd\xa4\xe5\x12\x27\x29\xa1\x50\x34\x39\xfa\xe4\xba\x4d\xfb\xbb\xcf\xf7\x3d\x0c\x9e\x9a\x60\x3f\x4d\x42\xf3\x9d\x34\x80\xb1\x8e\xa4\x42\x4a\xc2\x49\x14\xa8\x3f\x28\xc1\xb9\xf9\x49\x3f\x49\xc8\xf2\x14\x4b\x40\xe6\x58\x85\x86\xa5\xe3\xc5\x36\x54\x72\x1c\x6e\xfd\x35\x16\xa0\x84\x09\xfe\xbf\x13\x92\xc4\x6f\x15\xa7\xc7\x1f\xe6\x20\x71\x12\x1c\xa6\xc8\xfb\x39\xc5\x6b\x48\x0b\x5b\x85\x43\x7e\xc9\x5a\xac\xbf\x76\x2c\xae\x81\xfd\xd8\x8f\xeb\xe9\xbe\x37\x23\xb4\x8e\xd5\x47\xa8\x7a\x90\x4d\xe1\xd1\x59\x85\x1b\x08\xb7\x3a\xb6\x12\x48\xa3\x42\x1f\x9c\x39\x2f\xdf\x73\x7e\xd5\xf0\x74\x6e\xcf\x72\x8f\x1b\xc6\xc9\x77\x46\xe5\x74\xf3\xe7\xec\xb5\xb2\xfd\x73\x1d\x8f\x46\x53\x39\xde\xc6\x52\x15\x6a\xec\x3c\xe3\x0c\x2d\xf9\x1b\x95\x3e\xdc\x9c\xb3\x32\x66\xe1\x4e\x14\xed\x0c\x68\x47\x23\xe0\x16\xcc\x5b\x33\x3a\x7c\xde\xe8\x8c\x73\x24\x33\x98\xfd\x43\xbe\xe5\xf0\x8f\x45\xf5\xd3\xe2\xdb\x0c\x07\xb5\xde\x49\xc9\xe8\x19\xe1\xe5\x12\xa8\xb1\xdc\xd3\x3c\x58\x4c\x92\xc8\xc1\x5d\xe6\xac\x4f\x42\x72\x4c\x45\xcc\x78\xe6\xef\xf2\x1c\x78\x88\x05\x74\xa4\x39\x4d\x5f\xfd\xa0\xa2\x87\xc1\x62\x04\x31\xde\xa5\x72\x22\x0f\x2b\xf3\xd4\x4e\x98\x67\x2d\x1e\x83\x70\xe7\x1a\x03\xde\x0e\xa0\xa9\x7f\x65\xca\x7d\x1a\x14\xea\x30\xc0\xd9\xab\xf0\x33\x42\x33\xbc\xbf\x76\x6f\x54\x20\x58\xf6\x04\x8a\x07\x37\xdf\x3b\xad\x99\xfd\x59\x70\x50\x27\x83\x2f\xaf\x41\x33\xe5\x6f\x32\xe6\x94\xdf\x4d\x49\x76\x16\x34\x3f\x24\x8b\xaf\x0b\xd5\x65\x3f\xb7\x0e\x2e\xac\xdc\xa5\xe6\x74\x9d\xb2\x70\x5b\x8a\xaf\x74\x16\x28\x1f\x82\x36\x15\xbe\x3a\x33\x6d\x2b\x46\x04\x27\x70\x2e\x6b\xd6\x41\x6e\x56\x38\x94\xe4\x05\x8a\x36\x7a\xfb\x57\x54\x70\x1b\x98\xd1\x03\xae\x11\xbd\x95\xc5\xfc\x34\x76\xfb\x64\x1d\x4c\x2e\xad\x9d\x37\xde\x2a\xc7\x09\x94\xd5\x77\x61\x9f\x43\x87\x6b\xe8\xd9\xb8\x2a\xde\xa7\x66\xae\x27\xc7\xda\x38\xc4\x55\x3b\x2b\x55\x7e\xa5\x2e\xb6\x1d\xe5\x0a\x2d\x11\x22\xf2\xd2\x29\xc3\x4f\x19\xda\x2f\xa4\x3f\x5b\x1d\xc6\xe9\x70\xf6\x8a\x80\x46\xbe\x77\x7c\x14\x12\x73\x59\x0d\x18\xeb\xd5\x53\x90\x3d\x54\x4e\x1b\xd2\xaa\x93\xf7\xf7\x2d\x1c\x77\xf4\xf8\x4e\xce\xbb\x2b\x03\x1d\xa0\xde\x8c\xe2\xca\x03\x2c\xbe\x0d\xb2\xd3\x4c\x21\xdb\x91\xde\xe2\xd5\x6b\xf1\xfa\x69\x1a\xaf\xe3\x49\xee\x4c\x69\xfc\x1a\xad\x26\x95\xc9\x53\x1c\xc2\x86\xa5\x0a\xcf\x27\xe4\x7f\x27\x74\x3b\x9f\xc0\x3b\xb7\xc4\x45\x97\x8f\xbe\xbd\x6f\xf9\xe8\xdb\xd3\x0a\xad\xda\xbe\xab\x42\x1b\x22\xe8\x53\x26\xaf\xfd\x14\x57\xfd\x80\x65\x47\xd2\x36\xb8\x5e\xbb\xe8\xe1\xe8\xee\xac\x52\x86\x95\x25\x21\x35\x37\xc5\x6f\x7f\x41\x1c\xfd\xc0\xca\xa0\xd5\x4b\x0c\x72\x26\x88\x66\x29\x26\x7b\x88\x02\x55\x51\xbb\x41\x0a\xb1\xf4\xdd\xde\x9c\x23\xf8\x8e\x08\x8d\x94\x61\xb9\xae\xeb\x9d\x22\x9f\x27\x6b\x7c\xed\xde\xe8\xcf\xea\x61\x58\xbb\x0e\x19\x88\x59\x47\xbb\xbc\x87\xac\x23\xce\x1b\x06\x1f\xdb\x59\x81\x1e\xa8\x05\xc3\x6b\xc1\xd2\x9d\x84\xc3\x3f\x33\x88\x08\x76\xae\x8f\xcd\xb4\x07\xd7\xcd\xf7\xcb\xa2\x99\xdb\x9d\x9b\xce\xd9\x93\x6c\x91\x37\x2c\x83\x93\xac\x8c\x32\x0a\xf5\x69\xa0\xbd\x69\xe2\x7d\x64\x1c\x9a\x52\x1f\xf4\x71\xed\x54\x9d\xea\x26\xf7\x43\x59\xc3\x58\x4e\xd6\x3c\x2e\x6f\x75\x0b\x59\xb3\x61\x30\x18\xcb\x2f\xa6\x22\xa5\xa0\xcb\xc4\xb7\x91\x88\x71\xd7\x90\xce\xbd\x64\x4c\x9b\xc5\xc2\x25\x5c\xb9\xe7\xba\xbf\x1c\x0e\x57\x66\x25\xcb\x06\x2b\xa1\xca\x30\xbc\x98\x77\xd5\x48\xba\x4f\xd6\x36\x9a\x7a\x63\xe7\x0a\x22\x23\x74\xd1\x97\x1b\xd7\xd7\x3a\x63\x09\x52\xe9\xe1\x1b\x7b\xaf\x19\xdb\x66\x98\x6f\x05\x52\x8c\x4d\x29\xe7\x2a\x43\xe9\x91\x91\x43\x0e\x58\x5e\x2b\x99\x50\x4c\xd2\xf4\xa6\x92\xec\x4e\x39\x18\x23\xdd\xb2\xd5\x3e\xec\xbf\xaa\x19\xe0\xd5\xf7\x71\x2c\x75\x04\x33\x76\xbb\x58\xb4\xea\x24\xc5\x6b\x75\x58\x55\x16\x38\x21\xcb\xeb\x25\xe8\xac\xaa\xe7\xc2\xc4\x1e\x01\x69\xec\xeb\x75\x83\xab\x72\x9c\x10\x6a\x9a\x36\xea\x10\xa7\xf1\xf1\xe3\x5b\x70\xef\x90\xc9\x39\x76\x8a\x1f\x7b\x13\x9c\x59\xfb\x55\x05\xe4\x9c\x25\xbd\xed\x8a\xe9\x9b\x98\x16\x6e\x75\xbb\xd4\x40\xe6\xe3\x48\x6d\xad\xef\xd5\xba\x32\xe1\xe1\x66\xee\x78\x37\xb8\xba\x4f\x75\x74\x2c\x98\x2e\x49\x5e\x8c\x31\x67\xb2\x4e\xcb\x33\xfe\x56\xe5\xff\xc7\xda\x64\x16\x4d\x93\x8e\xb2\x18\x29\xb7\xed\xfb\x6b\x88\x19\x87\xa3\x81\xfe\xba\x38\x29\x37\x06\xb6\x5f\xa5\x44\xc8\xa2\x76\x14\xee\x78\xb2\xe1\xea\x14\x66\x6c\xcb\x13\x83\x6c\x7a\x1f\x67\x48\xe0\xce\xe5\xd6\x9d\x5c\xb9\x95\xbe\x8c\x71\x07\x92\xac\x11\xa1\x1b\x11\xf2\x1d\xb2\x1c\xac\xd5\x11\xc1\x29\x4b\x90\xc4\x89\x70\x56\xe1\x4e\x48\x96\xa1\x72\x4c\x5f\xac\x0f\x7a\xf3\xdb\x9b\x56\x7c\x5a\x4e\x13\xee\x3c\xa2\xad\x50\x38\x47\x0c\x07\x17\xad\x4b\x91\x39\x6b\xf5\xf5\x47\xa3\xa6\x2a\x46\x9a\x67\xc6\x84\x4a\x4c\xeb\x42\xe1\xbe\x05\xe9\xd9\x24\x4f\xad\xe6\xba\x65\x35\xb7\xef\x27\xd1\x0a\x9c\xcb\x85\x25\xc3\x6c\x02\x1d\xce\x7a\x7c\xcd\xb0\xb7\x16\x20\x25\xa1\x49\xd1\x88\xe1\xae\xbe\xf9\x6f\x64\x5f\x3f\xfe\x12\xdf\x66\xce\x59\x95\x5f\xb4\xbf\xc6\x84\x02\xb7\xc2\xe0\x28\x7b\xf6\x4b\x29\x1f\x5a\x39\xb7\xd2\xe5\x51\x41\x66\x26\x57\xa3\xfb\x39\x11\x48\x4c\x52\x51\xff\xa2\xa2\x5e\x5e\xb6\x2c\x2c\x6d\x95\xdb\xd7\x5e\xe5\xee\xd3\xb9\x4d\xa6\x91\xe0\x3b\xe6\xc1\xce\x10\xa6\xda\xa7\x59\x1b\xcc\xdd\xc6\x11\xbb\x2c\xc3\xfc\xad\x50\xfe\x1d\x09\xf9\x96\x82\xa9\x8f\xdb\x4d\xc3\xc6\x2b\x31\xb5\xd7\xbf\xcd\xf7\x4e\x57\x13\xaf\x7d\x75\xf4\x2e\xce\xfa\x3b\x47\xef\xdb\xb6\x36\x94\x72\x1a\x52\xc1\xee\xa4\xce\x7e\x27\x8d\x16\xac\xff\x6e\xbb\xbe\xc7\xde\x04\x68\x2e\xc5\x3f\x58\x0e\xf4\x5b\x7d\x98\x13\x5f\x51\xb8\x00\x29\xe7\x44\x46\xb4\x38\x57\x6b\xaa\x34\xb6\x46\x50\xcc\x98\x6c\xb8\xb9\xfb\x12\x6f\x3f\x43\x5b\x10\x68\x64\xf5\x04\xf5\x4a\x35\x58\xea\x5e\xe5\x64\x97\x55\x7c\xaf\x7e\x3e\xe3\xa2\xf7\x92\xb8\x11\x21\x9c\xfb\xd3\x77\xf3\x2e\x83\xbe\x01\xce\x7a\xac\xf7\x3f\x98\x6f\x3f\x40\x0f\x65\x98\x67\x3b\xa9\x0a\x0d\xe3\xc8\x3a\x49\x77\x34\x2e\x22\x2c\x36\xd0\xec\x5c\x74\xf1\x78\x55\xd1\x2d\xe1\xf6\x17\x74\xa8\xab\xa4\xbf\x64\xfd\xf1\x24\x1c\xb6\x79\xac\xbd\x82\xfd\xea\xe2\x84\x85\xe6\xfd\xa4\xb6\xf5\x75\x04\xc7\x9f\xfa\x96\x6f\x30\x1a\x75\xcb\x6c\xa5\x98\x23\x53\x7f\xe8\x3b\x37\x13\x18\x9a\xfc\x92\xcd\x9f\x01\x00\x00\xff\xff\x9f\x5a\xf1\xb8\xd7\x2e\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x5b\x6f\xe3\xba\x11\xfe\x2b\x82\x83\x03\xc4\x6d\xe8\x23\xe5\x76\x12\x09\x5d\x14\x2d\x36\xe8\xc3\x79\x28\xb0\x8f\x07\xfb\x40\x4b\x23\x9b\x8d\x44\x0a\x24\x15\x3b\x2b\xf8\xbf\x17\x24\x25\x59\x94\x75\x75\xbc\x17\x18\x48\x2c\x9a\x1c\xce\x0c\xe7\xf2\xcd\x50\x3e\x67\x4c\x16\x08\xad\x37\xfe\xd5\xe7\xcf\x9f\x03\x84\x04\x89\x60\x8d\xf9\xbf\x36\xfe\xd5\xed\xb3\xfa\x1c\xc7\xfe\xc3\xde\xc0\xfc\x70\xa7\x3e\x01\x42\x5b\xc0\x91\x19\x7a\x79\x79\x09\x10\x0a\x19\x95\x40\xe5\x71\x60\xcd\x78\x04\xdc\xbf\xfa\xfc\xa0\x3e\x7a\x46\xc2\x78\x83\x82\x7e\xfe\x93\xd0\x57\xff\xea\xf9\xf9\xb9\x1a\xf8\x62\x36\xac\xa8\xa4\x98\x50\xff\xea\xe5\xfe\xfe\xee\xee\x31\x40\x08\x38\x67\xfc\xdf\x86\x50\x3d\x28\x20\x81\x50\x42\xa4\xf6\x8e\x63\xf8\x03\x1e\x0e\x2b\x4a\x36\xdb\x4a\x3a\xef\x45\x7d\x2c\x9e\x6b\xf9\x1a\x6c\xd7\x63\x15\xe7\xde\xb3\xfa\x1c\x39\x37\x1c\x35\x77\xbb\x7d\xf4\x9e\xbd\xa7\xc3\xdf\x0a\xb3\x04\xed\x48\x24\xb7\xbe\x1b\xac\xd9\x1e\x09\xf2\x8d\xd0\x8d\x5f\xfe\xb2\x66\xfb\x20\x66\x54\xa2\x18\xa7\x24\x79\xf7\x17\x5f\x58\xce\x43\x70\xbe\x60\x2a\x9c\xff\x72\xb6\xb8\x11\x98\x0a\x24\x80\x93\x38\x48\x31\xdf\x10\xea\xbb\x41\x86\xa3\x48\x11\x71\x03\x09\x7b\x89\x22\x08\x19\xc7\x92\x30\xea\x53\x46\xe1\x80\x8b\x30\xe7\x82\x71\x3f\x63\x84\x4a\xe0\x87\x95\xc8\x70\x08\xbc\x40\x3b\x58\xbf\x12\xa9\x76\x45\x71\x02\x7b\xdf\x0b\xcc\xbf\xc3\x9a\x45\xef\x85\x3a\xcc\x38\x61\x3b\x7f\x4b\xa2\x08\xe8\xe1\x2a\x61\x1b\x42\x91\x08\x81\x42\xb1\x05\xa5\x3a\xdf\x73\xdd\xb7\x6d\xcd\x80\xf7\x98\xed\x83\x7a\x19\xce\x25\x0b\x22\x22\xb2\x04\xbf\xfb\x8d\xbd\xea\x31\xb5\x59\xd0\x64\x02\x27\x64\x43\xfd\x10\x14\x97\x81\x7e\x40\x44\x42\x2a\xaa\xa1\xe6\x5c\xc6\x09\x50\xe9\xbf\x01\x97\x24\xc4\x89\xf5\x5b\x44\x38\x84\xa5\x02\x78\x8a\x13\x2d\x16\xd2\x4c\x85\x2c\xc9\x53\xea\x50\xb6\xe3\x38\x0b\xd6\x38\x7c\xdd\x70\x96\xd3\xa8\x3c\xbd\x37\xcc\xaf\x95\x39\x2c\x2d\x69\x3f\xad\xb4\x45\xa1\x14\x84\xc0\x1b\x28\xcc\x01\x7a\xae\xfb\x5b\x90\xe2\x7d\x79\x9e\xf7\xae\x9b\x95\xa7\x27\xc8\x37\xf0\x3d\x48\xfb\xe8\xd7\xe6\xb4\x0c\x4a\x2b\xf2\xb2\xbd\x23\x58\x42\x22\xa7\xe4\x40\x0f\x2f\x6d\xcd\x9a\x03\x47\x92\x65\x46\xb7\xe5\xf3\x9a\x49\xc9\x52\x33\x45\x1b\x80\xa5\xc6\xe6\xbe\x47\xbf\xb0\xe5\x73\xca\x87\x35\xdb\x0f\xc9\x66\xef\xa7\x59\x18\x17\x70\x96\x01\x5c\xe6\x50\x87\x55\xaa\x97\x89\x2d\x57\x21\xc5\xed\x53\x83\x1f\x13\x2e\x24\x0a\xb7\x24\x89\x8a\x96\xde\xfb\xd6\xe8\xaf\x0c\x61\x0e\xb8\xf8\xb5\xcd\xde\xb2\xaa\x9e\x23\x54\x21\xb5\x32\xcf\xda\xc4\x3e\xa2\xd2\x86\x7a\xcc\xd7\xe2\xe8\x2b\x77\x90\x1a\xcf\xd9\xd5\x61\x25\xe8\xb6\xa7\xc9\xd4\x1d\x91\x61\x5a\x1d\x1d\xd7\x54\x9f\xb2\xfd\xa4\xe5\x12\x6f\x12\x42\xa1\x68\x72\xf4\xe0\xba\x4d\xff\xbb\xcf\xf6\x3d\x0c\x9e\xba\x60\xff\x9e\x84\x66\xb9\x34\x06\x63\x1d\x49\x65\x29\x1b\x4e\xa2\x40\xfd\x41\x1b\x9c\x99\x9f\xf4\x93\x84\x34\x4b\xb0\x04\x64\x8e\x55\x68\xb3\x74\xbc\xd8\x36\x95\x0c\x87\xaf\xfe\x1a\x0b\x50\xc2\x04\xff\xcb\x85\x24\xf1\x7b\xc5\xe9\xf1\x87\x39\x96\x38\xc9\x1c\xa6\xc8\xfb\x29\xc1\x6b\x48\x0a\x5b\x85\x43\x71\xc9\x5a\xac\xbf\x76\x2c\xae\x0d\xfb\xa9\xdf\xae\xa7\xc7\xde\x94\xd0\x3a\x55\x5b\x61\x7d\x0a\x8f\xce\x2a\xdc\x42\xf8\xaa\x53\x2b\x81\x24\x2a\xf4\xc1\x99\xf3\xf2\x3d\xe7\x77\x6d\x9e\xce\xed\x59\xe1\x71\xcb\x38\xf9\xc6\xa8\x9c\xee\xfe\x9c\xed\x2a\xdf\x3f\x37\xf0\x68\x6b\x2a\xc7\xdb\xb6\x54\xa5\x1a\x1b\x66\x9c\xa1\x25\x7f\xab\xd0\xc3\xcd\x39\x2b\x63\x16\xe6\xa2\x68\x03\xa0\x9c\x46\xc0\x2d\x33\x6f\xcd\xe8\x88\x79\xa3\x33\xce\x91\xcc\xd8\xec\x5f\xf2\x3d\x83\x7f\x2c\xaa\x9f\x16\x5f\x67\x04\xa8\x75\x2e\x25\xa3\x67\xa4\x97\x4b\x58\x8d\x15\x9e\xe6\x99\xc5\x24\x89\x1c\xdc\xe5\xce\xfa\x24\x24\xc7\x54\xc4\x8c\xa7\x7e\x9e\x65\xc0\x43\x2c\xa0\x03\xe6\x34\x63\xf5\xa3\xca\x1e\xc6\x16\x23\x88\x71\x9e\xc8\x89\x3c\xac\xcc\x53\x1b\x2f\xcf\x5a\x3c\x66\xc2\x9d\x6b\x8c\xf1\x76\x18\x9a\xfa\x57\x22\xee\xd3\xa4\x50\xa7\x01\xce\x76\xc2\x4f\x09\x4d\xf1\xfe\xda\xbd\x51\x89\x60\xd9\x93\x28\x1e\xdd\x6c\xef\xb4\x66\xf6\x83\xe0\xa0\x06\x83\x6f\xbb\xa0\x89\xf8\x9b\x8c\x39\xe5\x77\x53\x91\x9d\x65\x9a\xdf\x05\xc4\xd7\x75\xea\xb2\x9f\x5b\x07\x17\x16\x76\xa9\x39\x5d\x27\x2c\x7c\x2d\xc5\x57\x3a\x0b\x54\x0c\x41\xdb\xca\xbe\x3a\x91\xb6\x0d\xfd\x4f\xcc\xb9\x2c\x59\x07\xb9\x59\xe1\x50\x92\x37\x28\xda\xd6\xdb\xbf\xa2\x32\xb7\x81\x19\x3d\xc6\x35\xa2\xb7\xb2\x96\x9f\xc6\x6e\x9f\xac\x83\xe0\xd2\xa2\xbc\xf5\x56\x19\xde\x40\x59\x7c\x17\xf6\x39\x74\x84\x86\x1e\xc2\x55\xed\x3e\x15\xb9\x9e\x1c\x6b\xe3\x10\x57\x6d\x54\xaa\xe2\x4a\x5d\x6b\x3b\x2a\x14\x5a\x22\x44\xe4\xad\x53\x86\x5f\x32\xb5\x5f\x48\x7f\xb6\x3a\x4c\xd0\xe1\x6c\x87\x80\x46\xbe\x77\x7c\x14\x12\x73\x59\x0d\x18\xef\xd5\x53\x90\x3d\x54\x4e\x1b\xd2\xaa\x93\xf5\xb7\x2d\x1c\x77\xf4\xf8\x4e\xce\xbb\x0b\x81\x0e\xec\xde\xcc\xe2\x2a\x02\x2c\xbe\x0e\xb2\xd3\x84\x90\xed\x4c\x6f\xf1\xea\xb5\x78\x7d\x98\xc6\xeb\x38\xc8\x9d\x29\x8d\x5f\x5b\xab\x81\x32\x59\x82\x43\xd8\xb2\x44\xd9\xf3\xc9\xf6\x7f\x12\xfa\x3a\x7f\x83\x0f\x92\xc4\x45\x57\x8c\xbe\xbd\x6f\xc5\xe8\xdb\xd3\x0a\xad\x22\xdf\x55\xa1\x0d\x6d\xe8\x53\x26\xaf\xfd\x04\x57\xfd\x80\x65\x07\x68\x1b\x5c\xaf\x43\xf4\x70\x76\x77\x56\x09\xc3\xca\x93\x90\x9a\x9b\xe0\xf7\x9f\x90\x47\xbf\x63\x65\xd0\x6a\x25\x06\x19\x13\x44\xb3\x14\x93\x3d\x44\x81\xaa\xa8\xdd\x20\x81\x58\xfa\x6e\x2f\xe6\x08\xbe\x21\x42\x23\xe5\x58\xae\xeb\x7a\xa7\x96\xcf\x37\x6b\x7c\xed\xde\xe8\xcf\xea\x71\x58\xbb\x0e\x19\xc8\x59\x47\xbf\xbc\x87\xb4\x23\xcf\x1b\x06\x9f\xda\xa8\x40\x0f\xd4\x82\xe1\xb5\x60\x49\x2e\xe1\xf0\xcf\x14\x22\x82\x9d\xeb\x63\x33\xed\xd1\x75\xb3\xfd\xb2\x68\x62\xbb\x73\xe1\x9c\x3d\xc9\x16\x79\xcb\x52\x38\x41\x65\x94\x51\xa8\x4f\x03\xed\x4d\x13\xef\x7b\xe6\xa1\x29\xf5\x41\x1f\xd7\x4e\xd5\xa8\x6e\x72\x3f\x84\x1a\xc6\x30\x59\xf3\xb8\xbc\xd5\x2d\xa4\xcd\x86\xc1\x60\x2e\xbf\x98\x8a\x94\x82\x2e\x93\xdf\x46\x32\xc6\x5d\x43\x3a\xf7\x92\x39\x6d\x16\x0b\x97\x08\xe5\x9e\xeb\xfe\x76\x38\x5c\x99\x95\x2c\x1d\xac\x84\x2a\xc7\xf0\x62\xde\x55\x23\xe9\x3e\x59\xdb\x69\x6a\xc2\xce\x15\x44\x46\xe8\xa2\x0f\x1b\xd7\xb7\x3a\x63\x00\xa9\x8c\xf0\x0d\xda\x6b\xc6\x5e\x53\xcc\x5f\x05\x52\x8c\x4d\x29\xe7\x2a\x47\xe9\x91\x91\x43\x06\x58\x5e\x2b\x99\x50\x4c\x92\xe4\xa6\x92\xec\x4e\x05\x18\x23\xdd\xb2\xd5\x3e\xec\xbf\xa9\x19\xe0\xd5\xf7\x71\x2c\x75\x06\x33\x7e\xbb\x58\xb4\xea\x24\xc5\x6b\x75\x58\x15\x0a\x9c\x80\xf2\x7a\x37\x74\x56\xd5\x73\x61\x72\x8f\x80\x24\xf6\xf5\xba\xc1\x55\x19\xde\x10\x6a\x9a\x36\xea\x10\xa7\xf1\xf1\xe3\x5b\x70\x1f\x90\xc9\x39\x76\x8a\x9f\x7a\x01\xce\x2c\x7a\x55\x01\x39\x67\x49\x6f\xbb\x62\x3a\x11\xd3\xc2\xad\x6e\x97\x1a\x96\xf9\x34\x52\x5b\xaf\x9e\xbb\x8a\xeb\xd1\x66\xee\x78\x37\xb8\xba\x4e\x75\x74\x2e\x98\x2e\x49\x56\x8c\x31\x67\x50\xa7\x15\x19\xff\xa8\xf0\xff\xb1\x36\x99\xb5\xa7\x81\xa3\x2c\x46\x2a\x6c\xfb\xfe\x1a\x62\xc6\xe1\xe8\xa0\xbf\x2f\x4e\xca\x8d\x01\xf2\xab\x84\x08\x59\xd4\x81\xc2\x1d\x07\x1b\xae\x86\x30\x63\x24\x4f\x1c\xb2\x19\x7d\x9c\x21\x81\x3b\x97\x5b\x77\x72\x25\x29\x7d\x19\xe3\x0e\x80\xac\x11\xa1\x1b\x19\xf2\x03\xb2\x1c\xac\xd5\x11\xc1\x09\xdb\x20\x89\x37\xc2\x59\x85\xb9\x90\x2c\x45\xe5\x98\xbe\x57\x1f\x8c\xe6\xb7\x37\xad\xfc\xb4\x9c\x26\xdc\x79\x9b\xb6\x52\xe1\x1c\x31\x1c\x5c\xb4\x2e\x45\xe6\xac\xd5\xd7\x1f\x8d\x9a\xaa\x18\x69\x9e\x19\x17\x2a\x6d\x5a\x17\x0a\xf7\x2d\x93\x9e\xbd\xe5\xa9\xd7\x5c\xb7\xbc\xe6\xf6\xe3\x5b\xb4\x12\xe7\x72\x61\xc9\x30\x7b\x83\x8e\x60\x3d\xbe\x66\x38\x5a\x0b\x90\x92\xd0\x4d\xd1\xc8\xe1\xae\xbe\xf9\x6f\xa0\xaf\x1f\x7f\x89\x6f\x33\xe7\xac\xca\x2f\x3a\x5e\x63\x42\x81\x5b\x69\x70\x94\x3d\xfb\x9d\x94\xef\x5a\x39\xb7\xe0\xf2\xa8\x20\x33\xc1\xd5\x28\x3d\x27\x02\x89\x49\x22\xea\x5f\x54\xd6\xcb\xca\x96\x85\xa5\xad\x92\x7c\x1d\x55\xee\x1e\xce\x6d\x32\x8d\x24\xdf\xb1\x08\x76\x86\x30\x15\x9d\x66\x6d\x30\x97\x8c\x23\xf2\x34\xc5\xfc\xbd\x50\xf1\x1d\x09\xf9\x9e\x80\xa9\x8f\xdb\x4d\xc3\xc6\x2b\x31\x75\xd4\xbf\xcd\xf6\x4e\x57\x13\xaf\x7d\x75\xf4\x21\xce\xfa\x3b\x47\x1f\x23\x5b\x3b\x4a\x39\x0d\xa9\x64\x77\x52\x67\x7f\x70\x8f\x96\x59\xff\xdd\x0e\x7d\x4f\xbd\x00\x68\xee\x8e\x7f\xb1\x0c\xe8\xd7\xfa\x30\x27\xbe\xa2\x70\x81\xad\x9c\x13\x19\xd1\xe2\x5c\xad\xa9\xd2\xd8\x1a\x41\x31\x63\xb2\x11\xe6\xee\x4b\x7b\xfb\x15\xda\x82\x40\x23\xab\x27\xa8\x57\xaa\xc1\x52\xf7\x0a\x93\x5d\x56\xf1\xbd\xfa\xf9\x84\x8b\xde\x4b\xe2\x46\x86\x70\xee\x2d\x57\xd5\x30\xfd\x32\xd6\x37\xc0\xd9\xa5\xbd\x77\x60\x27\x93\xe2\x59\x2e\x55\x91\x61\x82\xd8\x94\x77\xb9\x22\x2c\xb6\xd0\xd5\xb1\xa8\x78\xbb\xaa\xf6\x2b\x4d\xec\x27\x74\xa5\x2b\xa0\x5f\xb2\xfd\x74\x92\x02\xdb\x3c\xd6\x91\xc0\x7e\x5d\x71\xc2\x42\xf3\x4e\x52\xdb\xe3\x3a\x12\xe2\x2f\x7d\xb3\x37\x98\x81\xba\x65\xb6\x60\xe5\xc8\xd4\x1f\xfa\x9e\xcd\x04\x86\xa6\xbf\x58\xd3\x4d\x0c\x87\x21\xcb\xa9\x14\x3d\x66\xd3\x8e\x0b\xa7\xeb\xf2\xa4\x0d\x20\x26\x2c\x71\x12\x32\x0f\xc1\xfe\x44\x8b\x9a\x26\xce\xe9\x2d\xd9\x39\x99\xb8\x87\xb8\x79\x99\x73\xa4\x46\x5c\xce\xc0\xe1\x7d\xfb\xe0\xa2\x0d\x52\x06\x5b\x6c\xa3\xe4\x7a\x73\xc0\xff\x03\x00\x00\xff\xff\xc5\x64\x3b\x38\x58\x31\x00\x00"), }, "/index.html": &vfsgen۰CompressedFileInfo{ name: "index.html", - modTime: time.Date(2019, 5, 31, 9, 24, 23, 713949012, time.UTC), + modTime: time.Date(2019, 5, 31, 14, 38, 56, 536404663, time.UTC), uncompressedSize: 5638, compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x58\xff\x6f\xeb\xb6\x11\xff\x3d\x7f\xc5\x95\xaf\x40\x64\xc0\x92\xe2\xd7\xd7\x6e\x53\x4c\xb7\x5b\xdf\xdb\xda\x22\xef\x0b\x96\x74\x43\x51\x14\x28\x23\x9d\x25\x36\x12\x29\x90\x94\xed\x2c\xcf\xff\xfb\x40\x4a\xb2\x25\x5b\x72\x9c\x8d\x08\x62\x99\xf7\xed\x73\xc7\xbb\xe3\x59\xf3\x2f\xde\x7e\xfc\xfe\xee\x97\x4f\xef\x20\x33\x45\xbe\xb8\x98\xdb\x0f\xc8\x99\x48\x29\x41\x41\x16\x17\x17\xf3\x0c\x59\xb2\xb8\x00\x00\x98\x1b\x6e\x72\x5c\xdc\x66\x5c\x2a\x0e\x3e\xfc\x4d\xca\x87\x82\xa9\x07\x0d\xef\x99\x60\x29\xaa\x79\x58\x73\x5c\xd4\xec\x05\x1a\x06\x71\xc6\x94\x46\x43\xc9\xcf\x77\x7f\xf7\xff\x4c\x16\x1d\x92\x60\x05\x52\xb2\xe2\xb8\x2e\xa5\x32\x04\x62\x29\x0c\x0a\x43\xc9\x9a\x27\x26\xa3\x09\xae\x78\x8c\xbe\xfb\x32\x05\x2e\xb8\xe1\x2c\xf7\x75\xcc\x72\xa4\xb3\xe0\x8a\xb4\x66\x72\x2e\x1e\x40\x61\x4e\x09\x2b\xcb\x1c\x7d\x23\xab\x38\xf3\x79\x2c\x85\x5f\x2a\x8c\x65\x51\x4a\x8d\x09\x01\xcd\xff\x83\x9a\x92\xd9\xd7\xaf\x37\xb3\xaf\x5f\x13\xc8\x14\x2e\x29\x09\x15\xea\xf0\x48\xb0\x61\x0a\x4a\x91\xb6\x90\x5f\x6a\xe6\xcd\x9b\xcd\xec\xcd\x9b\x67\xcc\xd4\x4c\xc3\x66\x2c\x07\x01\xf3\x58\x22\x25\xbc\x60\x29\x86\x96\xad\xab\x6f\xc9\x56\x4e\xcd\x57\xaf\x37\x5f\xd5\x58\x5b\xeb\x6e\xe7\xff\x51\x39\xfb\x66\x33\xfb\xa6\xa7\xd2\xed\x9c\xa3\x72\xe3\xd7\x7b\xc7\x5a\x03\x1e\xcb\xfe\xb1\x35\x3c\xb1\xd6\xe1\x52\x0a\xc3\xd6\xa8\x65\x81\x41\xc1\x45\x10\x6b\x4d\x6a\x13\xda\x3c\xe6\xa8\x33\x44\xd3\x33\xdf\x91\xdd\x73\xbc\x48\x2c\xae\xb4\x91\x85\x9f\x70\x96\xcb\xf4\x45\x92\xf7\x4d\xea\xfb\xdc\x60\x31\x26\x59\x8b\xea\x58\xf1\xd2\x80\x56\x31\x25\xe1\x1f\x3a\x5c\x55\xb5\x7f\x7f\x68\xb2\x98\x87\x35\x75\x71\x31\x0f\xeb\x3a\xbb\x98\xdf\xcb\xe4\xb1\xb1\x9a\xf0\x15\xf0\x84\x92\x82\x71\xe1\xeb\x18\x05\x12\x88\xe2\x9c\x69\x4d\xc9\x93\xe0\x69\x66\x22\x48\xb8\x2e\x73\xf6\xf8\xb1\x34\x5c\x0a\x1d\xb8\xdd\xf7\x32\xc1\x6d\x03\x7d\x40\x11\x4f\xf0\x9e\xa9\x0e\xdd\xf1\x30\x58\xf9\x4b\xa9\x28\xb1\x2e\x01\x17\xd0\xf0\xfd\x68\xb0\xd0\x04\x22\x57\xda\x35\x35\x70\xcf\x1d\x2c\x2c\x36\x7c\x85\x11\xd4\x9f\x9f\x58\x8a\x40\x29\x05\xc7\x5b\xb2\x14\xb7\x04\xbe\x8b\x73\x1e\x3f\x50\xa2\xd7\xdc\xc4\x99\x65\xf1\x76\xe4\xc9\x01\x16\x87\x87\x43\xa3\x7d\xc9\x34\x2c\x99\xbf\x5c\xef\x0d\x3a\x49\x97\x65\x8b\x79\xc8\x0f\x1c\x09\xd9\xc1\x86\xf5\xbe\x11\xd4\x25\x8b\x51\x59\xa9\x84\xaf\x8e\x02\xd0\xb8\x78\x23\x53\x59\x99\x3d\xe4\xbc\xfe\x7e\x16\x46\xfb\x5f\xf3\x54\xf8\xb2\x32\x3e\xcb\xcd\x73\x00\x0f\x80\xcc\x1f\x10\x4b\x9f\xe5\x7c\x85\x07\x42\xae\xc1\x08\x14\x06\x22\xae\x29\xd9\x47\x9a\x40\xd4\xe4\x80\x2f\xeb\x24\xa0\xa4\x9f\x14\x04\xbe\xd3\x68\x0c\x17\xa9\x1f\x67\x4c\xa4\x98\x50\xa2\xd9\x0a\x6f\xeb\x4d\x0b\x71\xa7\xbd\x8b\x6c\x08\xcb\xbc\x57\x33\xb0\xf2\xef\xb9\x48\xac\x41\xfb\x95\x40\xd8\x64\x6e\xed\x55\xaf\x00\xea\x16\x51\xc8\xa4\xca\xb1\x13\x4b\x5e\xd8\xe6\x0f\xf7\x4c\xd7\x79\xb3\x54\xb2\x00\x12\xd8\x4a\xb1\xa9\x11\x5a\x82\xad\x95\xeb\x43\x09\x4b\xfd\x41\x16\xc7\x12\x99\xed\x20\x63\x12\x8d\xcf\x47\x42\x4d\x80\x06\xe5\x6a\x97\xdf\xd6\x1e\x77\x04\x77\x41\x0b\x9b\x0e\xe2\x84\x77\xd2\x2b\xa6\x80\x95\x25\x50\x10\xb8\x86\x7f\x55\xe8\x3d\xf5\x8e\x14\xf3\x08\x2e\x5f\xed\x6b\xfb\x72\xda\x23\x17\x7c\xc3\x85\x8e\xe0\xd7\x36\x34\xbf\xf5\xe9\x3b\xeb\x3a\x82\xa7\xa3\xd4\x6c\xa3\x33\x1d\xa4\x34\x51\x38\x26\x76\x5d\xed\x11\xb7\x7d\xde\x84\x19\x36\x64\x76\x9f\x96\x11\x10\x6b\xc9\xb7\xa7\x41\x8e\x0d\x75\x9b\x4b\x04\xbf\x1e\x6b\xb2\xcb\xd5\x63\x04\xe4\x87\x61\x1d\x76\xd9\x26\x10\x01\x59\xb2\x31\x43\xad\xcb\xcf\xe0\xd9\x4e\x4f\x43\x68\x6b\xe5\x39\x14\xb1\x1c\xe3\xe9\x82\xd0\xa3\xda\xb6\xbf\x1d\xef\x65\x5c\x1b\xa9\x1e\x6f\x0d\x33\x18\xc1\xd3\xc1\x51\x1c\x7c\x2d\xd0\x64\x32\x19\xcc\x89\x4e\xeb\x75\x5d\x77\x80\x05\x9a\xbc\xb5\xf4\x0f\xac\x40\xa0\xee\x31\x50\x58\xe6\x2c\x46\xaf\x86\x4f\xa6\x40\xc8\x64\xd8\x4d\x67\xc8\x22\x05\x0a\x4f\xdd\x74\x70\xf7\x40\xa7\x3c\xba\xcb\x64\x5c\x07\xdd\xcb\xc3\x71\x5f\x0f\xf2\x36\xd1\x08\xca\x4a\x67\x2e\x24\x9e\x33\x37\x75\x22\x53\xf8\xfd\xd5\x97\x4f\x2d\xfa\xed\xef\x93\x63\x1d\xdb\x63\xdc\x75\x83\xf7\xc6\x02\xe2\xd0\xe9\x4c\xae\xeb\xba\xf0\x86\xb9\xa0\x93\x2d\x37\x32\x85\x8f\x95\x19\xc9\x04\x70\xd5\xeb\x66\xdd\x08\xc8\x5f\x15\xc2\xa3\xac\x40\x57\xcd\xc3\x9a\x09\x03\x46\x5a\x54\x20\x2b\x03\xdf\x9e\x50\x63\xbb\xc7\x1d\x6e\xac\x9e\x5f\x50\x9f\x60\xd4\x18\x4b\x91\x34\xac\x1f\xe4\x33\x2a\xbf\xb7\x17\x5f\x04\xde\x04\xe8\x62\x24\x28\x3b\x97\x6d\x70\x9a\xfe\x97\x4b\x96\xd8\xe6\x4a\xc1\xa8\x6a\xe4\xf8\xda\xb5\x44\x13\x67\x1e\x09\x59\xc9\xc3\xe6\x82\x9d\xc2\x53\x93\xbe\xb6\x4e\xa4\x36\x04\xb6\x93\x93\x4a\xec\x0a\x4c\x86\xc2\x53\xa8\x4b\x29\x34\x3e\x0f\xb8\x5d\x7c\x09\xde\x17\xad\x58\x20\x1f\x26\x60\x32\x25\xd7\xd0\x6e\x9d\x86\xdf\x2e\x85\xa6\x52\xe2\x05\x42\x67\x7b\x74\x4e\xf0\xdb\x95\xc8\xb8\x2a\x50\x98\x20\x96\xf2\x81\xdb\xfa\x21\x1a\xb5\xe6\x52\xf8\x3c\xa1\xd7\xf0\x89\x99\x8c\x86\xd7\xf0\x6e\x53\x72\x85\x9a\xde\x65\xd5\x14\xae\x66\xf0\x13\x13\x30\xfb\xcb\x9f\xae\xe0\xea\x2a\xb2\x7f\x33\xf8\xc7\xfb\xbb\x6b\x72\x9e\xeb\xb9\x8c\x99\x9d\x2f\x02\x3b\x17\x5b\x93\xf6\x1c\xb9\x38\x43\xfa\x9c\x18\xc4\xcc\xe6\x07\x2a\x75\x7e\x14\x86\x53\x71\xc9\xf2\x73\x0f\x13\x95\x0a\x0c\x6e\x8c\x37\xa9\x8f\xa0\xd0\xe9\xf9\xd6\xa1\xdb\x29\xde\x29\x25\x55\xd3\x2e\x0a\x9d\x4e\x9d\x6a\xdb\xa7\x2a\x3d\xd0\x92\x86\xd6\x19\x31\xda\x9e\x50\xb5\x1d\xa4\x0c\x49\x0c\xf4\xc3\xce\x70\xe8\xc9\xd2\xe8\xb1\xc6\x68\x33\x20\xbf\x35\x52\xd9\x2b\x42\xa3\xb1\xb7\xb9\x47\xb4\x7b\x3f\xb0\xbf\xe3\xe0\xa7\xdb\x8f\x1f\x02\x6d\x14\x17\x29\x5f\x3e\xd6\x1a\x47\xa0\x37\x47\xd8\x9d\x5e\x81\x82\x95\x38\xb3\x91\xb3\xa4\x05\x7e\xea\x7a\xb3\x0a\x81\xd6\xc0\x4a\xa6\x34\x7a\x3d\x57\xd2\x11\x57\x26\x13\xf8\xfc\xf9\xe8\x02\xee\x45\x2e\x93\xeb\x1f\x13\xa0\xe0\xd9\x71\x57\x2e\x9d\xa5\xa0\xdd\xa5\x14\xc8\xbd\x94\x39\x32\x41\x26\xf0\x6d\x8f\x18\xd5\x89\x3a\xae\x3a\xe7\xda\xfd\xb0\x3b\x54\xbe\xdf\x1f\x54\xbf\x23\x3f\x6b\x60\xf7\xd3\xf1\xd0\x42\x87\x30\x68\x62\x4f\x8f\x0e\xab\xed\x05\x87\x3c\x5e\x65\x75\x84\xa2\xe6\xf3\xf9\x08\x45\xbb\xa7\x33\x9c\x8d\xf6\x8f\xc3\xdc\xdb\x81\xcc\x3b\x39\x80\xc9\x4a\x18\x4c\x06\xf3\x2f\x0c\xe1\x46\xb2\x04\x9a\x84\x3a\xa2\xbb\xc8\xf4\x92\x78\x60\x60\x0a\x43\xf8\xa4\xb0\x64\x0a\xdb\x59\xa8\x19\xb8\xd6\xb6\x65\xa2\x3a\x12\xb0\x19\xef\x38\xfe\x5d\x33\xd8\xf3\xc5\x13\xb7\xcb\x8e\x1f\x28\x60\x50\x3f\xb9\xbc\x3f\x51\xb3\xbd\xe1\xcd\x89\x74\xb7\x3e\x7f\xee\x4e\xdf\x43\x01\x3d\xda\x5a\x73\x91\xc8\x75\xc0\x92\xe4\xdd\x0a\x85\xb9\xe1\xda\xa0\x40\xe5\x5d\x96\xb2\x74\xfa\x2f\xa7\x3d\xa7\x06\x1a\x8a\x03\xf6\xa5\x14\x31\x7a\x97\x99\x94\x0f\xd1\x3d\x2e\xa5\xc2\xb7\xa8\x8d\x92\x8f\x97\x53\x58\x56\x22\xb6\xe9\x07\xa3\xcd\xa2\x41\xa1\xb0\x90\x2b\xfc\x9f\x81\x6c\x27\x83\xa7\x78\x8b\xa6\x7d\xad\x09\x3f\xff\xf3\x66\x6c\xee\x6f\x87\xef\x7a\xd8\x15\x55\x9e\x4f\x7b\xbf\x65\x80\xbc\x72\x0f\x07\x86\xf7\x49\xda\x5c\x25\xdd\x97\x4d\xf5\x4b\xa6\x8b\x79\xe8\x5e\xfb\xfe\x37\x00\x00\xff\xff\xc7\xce\x11\x08\x06\x16\x00\x00"), @@ -210,10 +210,10 @@ var assets = func() http.FileSystem { }, "/js/page/setting.js": &vfsgen۰CompressedFileInfo{ name: "setting.js", - modTime: time.Date(2019, 5, 31, 9, 3, 22, 720670249, time.UTC), - uncompressedSize: 1603, + modTime: time.Date(2019, 5, 31, 14, 28, 38, 449764773, time.UTC), + uncompressedSize: 10276, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x54\x4d\x6b\xdb\x40\x10\xbd\xeb\x57\x0c\xdb\x42\x13\x88\xac\xbb\x63\x99\x1e\x72\xc9\xa1\xb4\x34\xf4\x54\x0a\x19\x6b\x47\xd2\xd6\xab\xdd\x65\x67\xad\xc4\x94\xfc\xf7\xa2\xd5\x47\x25\xdb\x0d\x2d\x94\xea\xe0\x8f\x37\xef\xcd\x7b\x1a\x66\xb7\x45\x0f\x81\x1a\xa7\x31\x10\xe4\xf0\x98\x6c\xa4\x6a\x41\xc9\x5c\x38\xac\x28\x65\x0a\x41\x99\x4a\x6c\x13\x00\x80\x58\x2b\x34\x32\x0f\xe5\x9a\x50\x92\x1f\xaa\x91\xe1\xb6\x0f\xbd\x84\x37\x99\x9b\xe1\x08\xb5\xa7\x32\x17\x6f\x04\x04\x15\x34\xe5\xe2\x33\x95\x9e\xb8\x86\xa5\xc5\x24\x50\xa3\x51\x89\x0c\x25\xa6\xe5\x53\xf7\xc9\x47\x53\xa4\xa8\x83\xd8\x6e\x32\x35\x6b\x9f\xe1\x90\x30\x93\xaa\x3d\x0f\x3b\x78\xa4\x85\x35\x01\x95\x59\x46\x96\x14\x50\x69\x06\xeb\xc8\x9c\x0a\x2a\x6f\x0f\x4e\xc4\x79\x8c\x90\x54\xec\x34\x1e\x4f\xf3\xf2\xa1\x69\xd0\x1f\xb7\x77\x7d\x79\x93\x8d\xc0\x92\xa6\x71\x47\x7a\x89\xf5\xaf\x6b\xdc\x21\x40\x38\x3a\xca\x45\x51\x53\xb1\xdf\xd9\x67\x01\x6d\xda\x58\x49\x3a\x17\x83\xe9\x47\x17\x94\x35\xbc\xe2\xda\x3e\xdd\x4b\x01\xef\x8b\x1a\x4d\x45\xb9\x60\x6c\xe9\xe1\xe2\x20\xbb\xe7\xa1\xb6\x4f\xb0\xb3\x76\xdf\xa0\xdf\xbf\x63\xb8\xbf\x5b\x86\xca\x2e\xa4\xfa\x47\x49\xb5\xe2\xf0\xc1\x4a\xfa\xe3\xac\xc3\xfc\xa6\xb8\x0c\xc8\xd0\x75\xf9\x6f\x91\x8d\xaa\xea\xbf\xcb\xfc\x85\x09\x24\xfa\x3d\x84\x9a\x1a\x7a\x3d\xe8\x26\x1b\xf6\xed\xd5\x85\xd5\x16\x65\xb7\x6c\xb6\x25\xdf\x2d\x1b\xb4\xa9\x2a\x27\x58\x6c\x7f\x77\x3c\x9c\x32\xe3\x77\xdc\xf2\xee\x94\xcc\x2d\x8a\x03\x07\xdb\xa4\x52\xa1\xb6\x15\xb4\xe9\x4e\x19\xd9\x0d\xa0\xfb\x2b\xb2\x6d\xd2\x73\x1f\x6f\x93\x44\x35\xce\xfa\x00\xbd\xe0\xae\xe7\x97\xde\x36\x20\x56\xab\xac\xb0\x8d\xb3\x86\x4c\xc8\x7a\xe9\xea\x3b\x8b\xdb\x51\xb2\x43\xa6\x4f\x58\xd1\x48\xcf\x3a\xa0\x67\x24\xf4\x1c\x29\x92\x4a\x3c\xe8\x00\x3f\x62\xaa\xf1\xfe\x59\x4f\xbf\x6e\x22\xde\xa8\x67\x65\x78\x0d\x5f\xc7\x8e\xdf\x7a\x7c\x72\xe7\xf5\xd0\x21\xa2\xb3\xa4\x11\x7c\xe9\xd9\x12\x03\x5e\x5d\xcf\x88\x9e\xc2\xc1\x9b\x19\xd0\x3d\xc3\x64\xd7\x50\xa2\xe6\xc1\x3f\x36\x99\xb7\x6a\x28\xd4\x56\x2e\x5c\x67\x8b\xb1\x30\x89\xef\x55\x2b\x5e\xbd\xa5\x46\x85\xab\x5f\x37\x50\x5c\x28\x29\x6e\x4e\xb8\xb1\x57\x3c\xd5\xeb\x5e\x77\xf1\xc4\xdf\x9c\x69\xc6\xf3\x75\x59\x35\x56\xcf\x75\xd3\x92\x5f\x16\x4e\xe5\xa5\xf2\xe5\xfa\xf6\x74\x32\xc9\xcb\xcf\x00\x00\x00\xff\xff\xd2\x0a\x40\xa6\x43\x06\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x5f\x6f\xdb\x38\x12\x7f\xf7\xa7\x98\x25\x16\x58\x19\x88\xad\xed\xab\x63\xf9\xae\x97\xde\x43\xef\x4f\x5a\x6c\x77\x1f\x0e\x45\x80\xd0\xd6\xd8\xe2\x46\x12\x75\x24\x65\xc7\x08\xfc\xdd\x0f\xa4\x48\x59\xb2\x29\xd9\x71\x73\x8b\x2d\x60\x3e\xb4\x31\x39\x33\xfc\x71\x38\x33\xfc\x51\x5c\x53\x01\x0a\xb3\x22\xa5\x0a\x21\x82\xc7\xc1\x34\x66\x6b\x60\x71\x44\x0a\xba\xc2\x91\x44\xa5\x58\xbe\x22\xb3\x01\x00\xc0\x34\x79\x07\x8b\x94\x4a\x69\x47\x13\xa4\x31\x0a\x32\xfb\x52\x49\xc9\x69\x98\xbc\xb3\x92\xda\x8a\x15\xb5\x36\x46\x0b\x9e\x2b\xca\x72\xad\x60\x64\x2a\x39\x54\x94\xa5\x12\x78\x81\xf9\xa1\xc2\x4a\xf0\xb2\x20\x06\x8c\xeb\x8a\x99\x2c\x52\xba\x6d\x58\x30\x56\x64\x99\x65\x54\x6c\x67\x1f\xaa\xe1\x69\xe8\x3a\xda\x62\x29\x9d\x63\xda\xee\x33\xfd\x2c\x2f\x4a\x05\x6a\x5b\x60\x44\x16\x09\x2e\x9e\xe6\xfc\x99\xc0\x7a\x94\xf1\x18\xd3\x88\xd8\x49\x3f\x15\x8a\xf1\x5c\x8e\x65\xc2\x37\x1f\x63\x02\x7f\x5d\x24\x34\x5f\x61\x44\x24\x5d\xe3\x97\x96\xa3\x9a\xed\x4b\xc2\x37\x30\xe7\xfc\x29\xa3\xe2\xe9\x27\x09\x1f\x3f\xb4\x41\x85\x1e\x54\x6f\x84\x34\x65\x52\xfd\x9b\xc7\x78\x36\x56\xeb\xbf\x1a\xae\x04\x2a\x41\x5b\xf9\xc3\x20\xe7\x6c\x95\xbc\x0e\xf3\x6f\x12\x21\xa6\xe2\x09\x54\x82\x19\xf6\x03\x9d\x86\x36\xde\x2e\x8f\x40\xba\x58\xf0\x32\x57\xb2\x2b\x04\xdf\xdb\xf1\xae\x18\x2c\x7d\x3e\x4a\x19\xac\x47\x6c\x19\x11\x67\x7d\x9c\x62\xbe\x52\x09\x44\x51\x04\x3f\x93\xd9\x3d\x07\x37\x02\x02\x57\x4c\x2a\x14\x18\x4f\xc3\x94\x75\x19\x5b\x72\x11\x91\xc0\x2a\xdd\x00\x8b\x9f\x87\xc0\x72\xe8\x40\xbf\x5f\x45\x41\xf3\xd9\xcb\x8b\x15\x1b\x97\x12\x45\x4e\x33\xdc\xed\xa6\xa1\x19\xf2\x6b\x51\x50\x4c\xa5\x18\x91\x3b\xb3\x63\x50\x50\x29\x37\x5c\x98\x1c\x49\xd9\xe2\x29\x22\x3a\x67\x3e\x30\x9a\xf2\x55\x25\xf2\xd9\x4a\x38\x84\xc3\x0e\x40\xc6\x3c\x73\xdb\xb2\xa4\xb0\xa4\x12\x96\x74\xb4\xdc\xe8\x7f\x9f\x70\x4b\x66\xd3\xd0\xe3\x84\x6a\xb3\xe9\x29\xbc\x1f\x30\x45\x85\xce\x2b\x3e\xb8\x95\x84\xdd\xd4\xb6\x3f\x2f\x82\xac\x04\x95\xc9\x88\xa6\xea\xb5\xc0\x8f\x37\x7b\x1a\x1e\xc6\x92\xaf\xea\x9a\x10\x1e\x2d\x39\x57\xad\xc2\xdb\xf0\x85\x5b\x74\xca\x69\xfc\xbe\x8e\x8f\x5f\x70\x29\x50\x26\x75\xc4\xf8\x41\x51\x8f\xcb\xee\x71\x63\xcd\x90\xd9\xfb\x38\x86\x1c\x37\xce\xca\x91\x91\x69\x18\xb3\x75\x67\x7e\x36\x46\x9b\x4b\xd3\x40\xf5\xd2\xf8\x1a\x85\x3e\x0c\x6c\xee\xd8\x6e\x32\x6b\x7a\xbf\xe1\x7a\x59\xb0\xdc\xfd\x6f\x4e\x21\xbd\x01\xcd\x29\x16\xa5\x54\x3c\x1b\xc5\x66\x15\xb0\x1e\xcd\x59\x1e\xeb\x02\xa5\x7f\x92\x70\x36\xa8\x64\x1f\x6f\x07\x03\x96\x15\x5c\x28\xa8\x14\xaa\x55\xc3\x52\xf0\x0c\xc8\x78\x1c\x2e\x78\x56\xf0\x1c\x73\x15\x56\xaa\xe3\xdf\x25\xb9\x75\x2a\x73\x2a\xf1\x33\x5d\xa1\x13\x0f\x75\x47\x25\x31\xc0\x67\x23\x12\xe3\x92\x96\xa9\x82\x17\x83\xca\x1d\xce\x93\xfa\xaf\x1b\xd3\x9f\xb1\x67\x96\xcb\x09\x7c\x75\x16\x1f\xaa\xfe\x7a\x76\x39\xb1\x16\x4c\x6f\x03\xa9\xe9\xdc\x55\xd2\x31\x55\x34\x18\x36\x04\x05\xaa\x52\xe4\x8d\x0e\xdd\xac\x67\x27\xb0\xa4\xa9\xb4\xf3\xbb\xe6\xe2\x63\x02\x5f\x1f\xea\x81\x5d\x73\x8e\x0c\x55\xc2\xe3\x16\x9c\x46\x45\x6f\xcd\x6e\x16\x9c\x30\x39\xfe\x11\x33\xa6\x82\x3d\x75\x30\x45\x23\x26\x37\x07\xb2\xc6\x96\x39\x8e\x27\x95\x9e\xf7\xa8\xbe\x39\xd2\x71\x07\xa3\x5f\xcb\x8d\x1e\xeb\xd5\xa7\x93\x5f\xb1\x1e\x6e\x6b\xee\x86\xb7\x7b\xcf\xec\x87\x9a\xf9\x76\xe4\x05\xb6\x84\xc0\x4c\x61\x7d\x3f\xb4\x3b\x73\x3b\x38\x76\x96\x15\x81\x08\x94\x28\xf1\xb6\x25\xb0\x44\xb5\x48\x02\x12\xd2\x82\x85\x75\xf1\x1f\x1e\x2d\x6c\xac\x12\xcc\x03\x81\xb2\xe0\xb9\x44\x88\x66\x1e\x47\x3b\x58\x3f\x38\xb1\x31\x7f\x1a\x82\x4a\x04\xdf\x80\xeb\xba\xf5\x6a\xd9\xa0\xaa\xf5\x7e\x97\x3c\x0f\x86\xc7\xb2\xbb\x2e\x60\x5a\xa1\x1b\xd4\x81\x13\x4c\x90\xfa\x81\x18\xc9\xfa\x24\x8d\x40\xdb\x3d\x0f\xc6\x82\x6a\x3f\xa2\x10\x6f\x01\x03\x85\x18\x2b\x7c\x56\xc1\xb0\x5a\x5e\x26\x57\xdd\x66\x6b\xd3\x3a\x98\xff\x2e\x04\x17\x55\x1a\x6b\xad\x1b\x63\x4a\x2a\xaa\x4a\xe9\xf1\x67\xc7\x62\x3a\xe2\xd1\x57\xc1\xfd\xd9\xb9\x97\x0c\x8e\x31\x9b\xa3\x75\x02\xe4\x1e\x37\xe0\xce\x81\xe3\x4c\xd2\x97\x01\xcc\xd5\x04\xc8\x47\xc3\x0f\x1b\x87\xc4\x4f\xd2\x94\x25\x98\x78\xd4\x96\x0c\x53\x5d\x4a\xbe\xfa\x7d\xa5\xb9\xca\x04\x88\xa3\x2d\x1e\x03\xba\x19\x52\x38\x01\xf2\x5b\xbf\xd8\x9a\xa6\xa5\xb6\xe6\x19\xde\xf9\x0a\x51\x03\x40\x4d\x80\xfa\x01\x7c\xee\x17\xd3\x9c\xf9\xb4\xb1\x6f\x80\x29\xb0\x40\xea\xdb\x9d\x26\xc8\x5f\x8c\x10\x9c\x40\xf1\xed\x58\x1f\x8e\xfb\x32\xca\xf2\x5f\xf1\x59\x47\xc9\xa7\x7f\x7a\x74\x24\x2e\x78\x1e\x5b\x89\x3b\x9a\x2f\x30\xf5\x48\x69\x2b\x77\x9a\xa4\x4c\x20\xd0\x81\x35\xec\x2f\x6f\x5a\xa4\x26\xbe\x86\x80\x13\x72\x98\x05\xad\x95\xfb\x72\xb3\x8e\x2d\xc8\x4a\xa9\x20\xe7\x0a\x30\x2b\xd4\x96\x74\x64\x29\xd4\x55\xb2\x23\x8b\x07\xfd\x78\x9d\xdf\x2f\xc6\xeb\x42\xf1\x8f\xc6\xfb\x43\x14\x99\x6c\x1f\x57\xb1\xf8\x0d\xc0\x63\x8e\xd2\x00\xcf\x74\xa9\x7e\x63\xe0\x6b\x2a\x40\xe0\x7f\x4b\x94\x0a\xa2\x1e\x8c\x2e\x6e\x26\xd0\x0a\x23\x7f\x36\xe8\xe6\x1c\x61\x15\xdc\xcf\xd7\x60\xb3\x4c\xc4\x50\xcd\x3e\x2a\xe0\x9a\x97\x12\x74\x55\x0a\xd7\x2a\x12\xa7\x33\x9c\xcb\xae\x8a\xe1\xda\x9c\xc7\xdb\x09\xfc\xe3\xcb\xa7\xfb\xb1\x54\x82\xe5\x2b\xb6\xdc\x06\xd6\x7b\xc3\x7e\xd5\xea\x8b\x52\x8b\x2b\x76\x35\x72\x57\x1d\x21\xa3\x5f\xb7\x05\x92\x09\x10\x5a\x14\x29\x5b\x50\x4d\xc5\x42\x7d\xb0\x9f\x40\xb9\xeb\x1e\xf6\x9c\x99\xae\x9d\x4b\x94\x5c\xbb\x8c\x30\xb9\x76\x40\x9c\xba\x85\x4f\x22\x0e\x7a\xaa\x9e\x6b\xfe\x40\xea\xe1\x31\x3e\xc5\x35\x93\x6c\x9e\xe2\x5e\xf1\xb4\x66\xfd\xd1\xa3\x28\x65\x12\xbc\x74\x25\x51\x8b\xb7\x9c\x36\x26\xb9\x50\x41\x40\x6f\x60\x7e\xc6\xd2\xc1\xe6\xb8\x9e\xe7\x3d\x44\xb0\x9f\x75\xac\xf8\xbf\xf8\x06\xc5\x1d\x95\x18\x9c\x88\x5e\xd7\xb4\xde\xdf\x20\x82\x79\x87\x95\x13\x4e\x01\x1b\x37\x15\x98\x69\x65\xae\xaf\x32\x36\x9b\x0d\x99\xd1\xbb\x7e\x5f\x41\x77\x3d\xf1\xc3\x98\x5d\x04\xe3\x6d\x50\x58\x63\x3f\xf7\x1b\xeb\x0b\x8f\xbe\xfc\x38\x83\xda\xbb\x76\x71\x86\xbc\x9a\xf1\xb7\x66\xbc\x8c\xf9\x9f\xb1\x76\x9f\xcb\x76\xe7\xdc\x5d\x4f\x7e\xcf\xbb\xf8\xda\x60\x3f\x21\xf6\x50\x63\xdf\xd5\xa1\xe6\x13\x97\x5f\x1a\x78\x1a\x9f\xe0\xe3\x8e\x11\x7f\x4a\xe3\xff\x3f\x1d\x7e\x9b\x1b\xc6\x7d\xc3\x37\xd7\x5b\xc6\x9f\xed\x96\xd1\x08\xb9\x8b\x89\x7b\x33\x18\xbf\x97\xcb\x46\x33\x2a\xaf\x17\x8e\x37\xba\x70\x1c\xbe\xd9\x74\x53\x95\x46\xd8\x59\x8a\xd5\xe8\xe9\x56\xcb\x71\xf3\xf9\xbb\xbb\xad\x94\xd7\xcb\xca\xf5\xb2\xd2\xa9\x78\x74\x59\xb9\x04\xf2\x95\x3f\xb6\xfb\x5e\xc7\x1f\x7b\x1e\x58\x2f\xe6\x90\xf6\x59\xf7\x8c\xaf\xcf\x8f\xed\x17\x60\x20\x3f\x1e\xbf\x7d\x13\xf8\xcb\x63\x2f\x6b\xf8\x0f\xca\x53\xb4\xe1\x9e\x9f\xa0\x0c\x3d\x11\x7f\x59\xc5\x7c\x6c\x55\xcc\xc7\xb3\x2b\x66\x6c\x1c\x72\x49\xd1\xfc\x7a\xe8\xb9\x87\x6b\xfd\xbc\xd6\xcf\x03\xc5\xfd\xe7\x19\xbd\x7f\x18\xb0\xf8\xf9\x06\xde\x5d\x6f\xee\xaf\x5d\xfb\x45\x95\xd7\x3d\xc8\xeb\x1d\xc0\xb8\xf5\xb6\x57\x3f\x5e\xee\x5f\xa4\x2b\xf5\xdd\x60\xf7\xbf\x00\x00\x00\xff\xff\x8a\x2f\x44\x13\x24\x28\x00\x00"), }, "/js/vue.js": &vfsgen۰CompressedFileInfo{ name: "vue.js", @@ -249,10 +249,10 @@ var assets = func() http.FileSystem { }, "/less/stylesheet.less": &vfsgen۰CompressedFileInfo{ name: "stylesheet.less", - modTime: time.Date(2019, 5, 31, 9, 31, 16, 110597838, time.UTC), - uncompressedSize: 14006, + modTime: time.Date(2019, 5, 31, 14, 20, 32, 983119138, time.UTC), + uncompressedSize: 14789, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5a\x5f\x6f\xe3\xb8\x11\x7f\xcf\xa7\x20\x12\x34\x48\xda\x95\x4f\x4e\xb2\xb9\x8d\x82\x2e\x8a\xb6\xbb\xe8\xc3\x3d\x14\xd8\xc7\xc3\x3d\xd0\x16\x65\xb3\x91\x44\x81\xa4\x13\x67\x8b\x7c\xf7\x82\x12\x25\xf3\xcf\x90\xa2\xbd\xb9\xab\xbc\x58\xc4\x1c\x9a\x9a\x19\xce\xfc\xe6\x0f\x59\x70\xc6\x24\xfa\xef\x19\x42\x08\x65\xd9\x6a\x53\xa0\x8b\x2f\x5f\xbe\x3c\xea\xef\x82\x96\x64\x85\xf9\xdf\xd5\xf0\xcd\x83\xfa\x38\x94\x7f\xb1\x67\xa2\xc9\xb7\xea\x33\x92\xb7\x04\x97\x9a\xf0\xf5\xeb\xd7\x71\x74\xcd\x5a\x49\x5a\xe9\x0e\xaf\x18\x2f\x09\x57\x6f\xfe\xa8\x3e\x87\xd9\x35\xe3\xde\xca\xfd\xe8\x2f\xb4\x7d\x2a\xd0\xc5\xc3\xc3\x83\x35\xfc\x6d\x60\xca\x5e\xbd\xc1\xb4\x55\x23\x77\x77\xb7\xb7\xf7\xe3\x20\xe1\x9c\xf1\x7f\xe8\x17\xd8\x24\x41\x6a\xb2\x96\xa4\xec\xb9\xac\x2a\xf2\x33\xf9\xf8\x78\xf6\x76\x76\x76\xb9\x68\xe9\x66\xeb\xe8\x6a\xf9\x55\x7d\x00\xa9\x6d\x6d\x99\x82\xdb\x94\x49\xf6\xe5\x83\xfa\xb8\xb2\x1b\x72\x58\x7c\xdd\xdc\x2f\x1f\x96\x9f\x7a\xbe\xfe\xac\x39\x1a\x56\xca\x5e\x68\x29\xb7\x05\xca\x1f\xf5\xe0\x3e\x13\xf4\x3b\x6d\x37\xc5\x38\x61\xc5\xf6\x03\xad\x62\xad\xcc\x2a\xdc\xd0\xfa\xb5\x40\xe7\xdf\xd8\x8e\xaf\x09\xfa\x86\x5b\x81\xfe\xcd\xd9\xf9\x07\x24\x70\x2b\x32\x41\x38\xad\x86\xf9\x0d\xe6\x1b\xa5\x4a\xbd\x74\x87\xcb\xb2\x5f\x57\x7f\x97\x64\x2f\xb3\x92\xac\x19\xc7\x92\xb2\xb6\x40\x2d\x6b\x49\xcf\x21\xd6\x1c\xae\x77\x5c\x28\xa9\x3a\x46\x5b\x49\x78\x4f\x5b\x88\x0e\xaf\x09\xd7\x33\xaa\x9a\xec\x0b\xb4\xec\x29\x2b\x56\xbe\xea\x61\x65\x64\x55\xcd\x5e\x0a\xb4\xa5\x65\x49\xda\x9e\x7e\x51\xb3\x0d\x6d\x33\xb1\x26\x2d\xd1\xf3\xb6\x44\xed\x50\x81\x96\x79\xfe\xbc\x75\xb8\x5c\xde\x77\x5a\xee\xc3\x6a\x78\x27\xd9\x30\x56\x52\xd1\xd5\xf8\xb5\xe8\x39\x18\x86\x70\x4d\x37\x6d\x46\x25\x69\x44\x81\xd6\x64\xe0\x78\x64\x32\x1b\x16\x58\xb3\x7a\xd7\xb4\xa8\x65\x2f\x1c\x77\x5a\xe3\x78\xfd\xb4\xe1\x6c\xd7\x96\xe3\x26\x3e\x63\x7e\xa5\xcc\xe5\xfa\xf1\xac\x9f\xf1\x79\xd1\x5b\x5f\xd6\x10\x21\xf0\x66\xe4\x5d\x3d\x7a\xef\x96\x79\xfe\xa7\xc7\x69\xb0\xc1\xfb\x71\x53\xef\xf2\x7c\x14\x62\xda\x40\x41\xbf\x93\x02\xe5\x8b\x07\xd2\x1c\x28\x21\x26\x26\x3b\xbc\x36\xe6\x6a\x0b\x5c\x76\x7b\x24\x58\x4d\xcb\x91\xe1\x7e\xdc\x98\x08\xa8\xf2\x60\x16\x99\x64\x9d\xa9\x50\x83\xb2\x62\x52\xb2\xc6\xfd\x59\x6f\x2e\xbd\x8e\x6d\xed\xf6\x86\x62\xf2\x7c\x70\x55\xcd\xcb\xdb\xa0\x46\xbd\xff\x2b\xb6\x3f\x5d\x83\x0e\x87\x36\xfb\xc7\x28\x11\xb0\x9f\x79\x53\x39\x4a\xfb\xfd\x52\x62\xcb\x7b\xe4\xcb\xb5\x29\xa9\xe7\xb2\xa8\x28\x17\x32\x5b\x6f\x69\x5d\x1a\xaa\x88\xef\xcd\xdb\x61\x01\xa5\x48\x96\x61\x4e\xb0\xf3\xeb\x80\x50\x28\xe6\x1c\xe9\x92\x47\x4c\x2a\xa6\x7d\x05\xe7\xd7\xce\xd4\x11\xd8\xb4\x9d\xcd\xa9\x32\xaa\xce\x49\x23\x8e\x32\x90\xed\x70\xb7\xa6\xbb\x59\xf4\x97\x03\x08\xf9\x33\x82\x86\xe4\xcd\x14\x1d\x6e\x01\x16\xd0\x61\x57\xf9\xf0\x9e\x4f\xae\xe6\x50\xbf\xbd\xf6\x37\x5b\x3c\x89\x37\x35\x6d\x49\x48\xc2\x51\x82\x8f\x90\x04\xa6\x49\xdd\x41\xaf\x9e\xf5\x95\xf1\x89\x21\x80\x2d\x83\x69\xac\xb4\xed\x76\x12\xb2\xd6\x88\x2d\x4d\x86\xbc\xe1\xb4\xb4\x49\x6a\x24\xdb\xe0\x0e\xfa\x59\x4f\x93\xa4\xe9\x6a\x2c\x49\x36\x98\xb1\x18\x1c\x09\x2d\x2b\x87\xdb\xff\xec\x84\xa4\xd5\xeb\x28\x71\x81\x56\x58\x10\xa5\xe5\x23\x1d\x27\xd5\x98\xad\x1f\x7d\xae\xf1\x8a\xd4\xc0\x7e\x3a\x9b\x71\x00\x51\x40\xb5\xfd\x42\xbd\x7a\x4f\x59\xc8\xda\x02\xd0\x26\x8f\xc1\x53\x5b\x1b\x89\x3e\xad\x9e\x86\xb6\x4e\x0a\x64\x3e\x86\x03\x2f\x5d\x07\x76\x34\xb1\x58\x6f\xc9\xfa\x49\xe5\x4f\x15\x25\x1e\xb0\xa2\xd1\x3c\x06\xab\x28\xd0\x12\xfd\x34\xb8\xec\x8d\xff\xd6\x08\x8e\x22\x1b\x2a\x39\x7b\x01\x71\x12\xa5\x58\x0e\x82\xac\x30\x34\xd1\xcb\xc5\xbc\x19\x97\xc5\x56\x65\x4a\x1f\x00\x42\xc5\xd6\x3b\x11\x00\x27\x2f\x0d\xdc\xb5\x25\xe1\xbe\x23\x04\xe6\xcf\x82\x3d\xf2\xb7\x0a\x4d\x86\xfb\xab\x7c\xed\xc8\x5f\xcf\xc7\xad\x3b\xff\xed\xfd\x10\x14\x78\xf7\xc5\x6a\x27\x25\x6b\x8f\x0c\x9d\x09\xdb\x1d\x81\xb2\xe0\x06\xdb\x28\x73\xaa\x07\xf7\xbb\x21\x39\x6e\x45\xc5\x78\x53\xa0\x5d\xd7\x11\xbe\xc6\x02\xd8\xbc\x39\xf8\x46\x6e\x38\xb9\x07\x03\xa2\xb6\xc3\x92\x54\x78\x57\x4b\xc8\x0e\x17\x83\x9a\x03\x5b\x39\x6f\xc8\x28\x66\xcc\x68\xd6\xa0\x91\xab\xbb\x80\x51\x22\xcf\x68\xfc\x11\xd3\x8c\x86\xff\x55\x21\xa3\x16\xb4\xea\x18\x20\x5e\xd9\xb1\x88\xb3\x17\x51\x28\xac\x6b\xf0\xfe\x2a\xff\xa0\xa2\xd1\x35\x34\x6f\x8a\x59\xf7\x79\xb7\x07\xe7\x47\xcb\x15\x64\x65\xd4\xcf\x2f\x8f\x50\x95\x35\x24\xe3\x83\x0c\x43\xfd\x6d\x28\xf2\xf4\xbc\x38\xc0\xd7\xd4\x91\x30\x43\xa0\x6b\xee\x6e\x72\x67\xd2\x26\x8e\x56\x35\x5b\x3f\xd9\x34\x2d\xeb\x7d\xee\x7a\x9d\x82\xaf\x6c\x3b\xd9\xb1\x4b\x9e\x73\x85\x58\xd8\xf1\xdd\x52\x77\x31\xdc\x18\x7f\xb9\xc0\x6b\x49\x9f\xa1\xac\xcd\x73\x22\xdb\xe6\xec\x65\x20\x4f\x08\x7b\x40\x8a\xe5\xcf\xec\x95\xee\x11\xc5\x13\x8f\x98\x74\x11\x0d\xa5\xb2\x02\x70\xee\xfb\xe2\x60\xdd\xcb\x45\x87\x37\x44\xf7\x72\x20\x53\x76\x0c\x27\x8a\xab\x21\x7e\xc6\x4e\x91\x57\x87\xa7\x57\x31\x11\x9b\x34\xed\x6d\x61\x55\x2a\x61\x40\x3e\xb4\x73\x8c\xa8\xa3\x75\x52\xd2\xe7\x39\xa5\x04\xfd\x1b\x8a\x71\xd1\x54\xe6\x77\x54\x19\x28\x23\x1a\x51\x93\xb3\x97\x8c\xb4\x65\xdf\x7f\xf2\x08\x42\x62\x2e\x7d\xd2\x80\x5e\xc3\xcf\xb2\x00\xf1\xf0\xd3\x03\x23\x00\x60\xa9\x1c\x32\x0f\xe3\xc6\xc2\xab\x38\xe3\xc1\x75\x06\xb2\xa2\x56\x6b\xf8\xa6\x99\x56\x29\x98\xf3\x52\xaa\x00\xeb\xe1\x3c\x7c\x26\xf7\xb2\x64\xf6\xd0\x32\x5e\x9f\xfe\x88\xcc\x28\xb1\x42\x71\x70\xb3\xe8\x6a\xbc\x26\x5b\x56\xdb\x7e\x11\x7e\xe5\x2f\xb4\x7d\x8a\x20\x51\x30\xa6\x25\xc4\xad\x1b\xaf\x1e\xb7\x14\xe2\x93\x93\xb8\x83\x82\x9b\xa3\x84\x96\xc9\xab\xa2\xc6\x63\x13\xea\x1a\x50\xc4\xcc\xae\xc3\x41\xea\x84\x78\x14\x40\xf5\x45\xcd\xb0\x72\xfd\x4c\x2d\x5b\xe3\xd7\xf7\x48\x51\xa2\x28\x36\x5b\x88\xf9\x3d\xed\x91\xd2\x31\x41\x87\xd2\xa9\xa2\x7b\x62\xf4\x2b\xfa\x9e\x8b\x61\xf2\x35\xa9\xa4\x35\xe0\xe7\x6a\x08\xee\x8a\xab\xe7\x7b\x46\xdb\xb2\xf7\xdd\x3c\xcf\x97\x31\xfc\xe5\x9b\x15\x56\x59\xa3\xfe\xb7\xb8\x37\xdd\x80\x3a\x9b\x94\x1a\xad\x0d\x3f\xbf\x73\xbd\x7c\x2e\x9f\xd2\x72\x7e\x8a\xe7\x69\x3e\xf9\xa0\x59\xbc\x12\xac\xde\x49\xf2\x08\x9b\xcb\xdf\x1a\x52\x52\x8c\xae\x8c\xce\xf1\x7d\x9e\x77\x7b\xd3\xb2\x53\x33\x72\x7f\xee\x94\x95\xbb\xd3\xa7\xf9\x8b\x2d\x6b\x08\x90\x4e\x23\xd3\x5e\x87\xf3\x15\x93\x34\xda\x54\xb6\x77\xdb\xbd\x28\xad\xf0\x4c\xab\x2e\xed\x33\x9b\x44\xde\x40\x90\x0b\x26\x5b\xe8\x07\xb3\x6a\xcb\x10\x96\x8b\x1b\x97\x0e\x77\xaa\x0c\xce\xc2\x29\x0f\xa0\xca\x41\x91\xf6\x0b\xa0\xe6\x2a\x1c\x2a\xe7\x64\x41\x49\x7d\x59\x4b\x62\xb0\x3b\xed\x1e\xd8\x01\x52\xa3\x94\x88\xff\x7f\x16\xe5\x6d\xbe\xd5\x11\x8b\x95\x28\x16\x2f\xbd\xb7\xdb\x07\x49\x28\x58\xc2\x0f\xa6\xc2\x9a\xe4\x0a\x7e\xc2\x80\xa9\x91\x0c\xe1\x49\xdf\x6a\x06\x51\xe2\x82\x94\x54\x3a\x87\x5f\xc1\x3a\x6c\x3a\x39\x4e\xcf\x9d\x8d\xd0\x3a\x9e\xb7\xad\x18\x7b\x6a\x30\x7f\x12\x99\x62\x15\x8a\xa0\x76\x7b\x3d\x00\x90\x23\xb8\xcc\xa2\x23\x27\x1d\xc1\xf2\x4a\xe9\x20\xab\x68\x5d\x7f\x18\x35\x71\xab\xa0\x78\xd0\x86\x8b\xb1\x40\x27\x3f\xd0\x4c\x73\x4f\x81\x27\xc2\x65\x51\xe0\x4a\x7a\x2e\x3f\x41\xe2\xf9\x79\x7a\x43\x41\x89\x3b\x99\x12\x78\xbc\x10\x2a\x20\xdc\x09\x7e\xfd\x61\xf8\xc1\x62\xdc\x1a\x87\xe7\x21\x43\x11\xa4\xae\x0a\xd4\x2f\x00\xff\xba\xc3\x1b\xda\x0e\xdd\x57\xdb\xa0\xde\x81\x4b\xf4\xc3\xcd\x50\x40\x88\x59\x00\x88\x1f\x44\x04\xd3\x5e\x6f\xe6\x89\x3d\xf0\xb4\x1e\xb6\xfd\xcd\xc7\x60\x60\xf1\xe9\x14\x1b\x12\x2b\x2e\x74\x72\xbb\x16\xbc\x50\x00\x4a\x16\x6a\x22\x1f\x7d\x68\x73\xca\xc9\xd0\x74\x1b\x65\xb6\x98\x00\x43\xf1\x09\x92\x02\xb5\x11\xf2\xa2\xd5\xcf\x90\xee\xfd\x4a\x1d\x30\xa8\xbe\x7e\x62\x55\xa6\x22\x6f\x51\xac\x48\xc5\x38\xd4\x0d\x43\x16\x16\xfd\x74\x0e\x37\xa2\xdf\xe7\x80\xe3\x72\x51\x53\xe1\xda\xe1\x01\x67\x73\x00\x08\xa2\x49\x6e\xde\xe7\xd0\x6e\x36\x19\x85\x1f\xe4\x22\xb8\x77\x58\x8f\x66\xee\x40\x38\xab\x64\x6e\x15\x15\xd2\x87\xf5\x35\xa5\x20\xf0\xd8\x85\x38\x9d\x97\xd6\x93\xf8\x98\xad\x33\x58\xbf\x28\x29\xae\xd9\x26\x93\x78\x63\xe2\xd4\x62\xbd\x13\x92\x35\x99\xa6\x1a\xb7\xac\xc6\x27\x1e\x8e\x6f\x3e\x38\x09\x89\xbb\x9f\xc7\xa8\x2a\xb1\x2e\x8a\x6c\x0c\x84\xfe\x6e\x06\xea\x4d\x88\xdc\xad\xb8\x34\xfa\x18\x91\x03\xa1\xb9\x24\x77\x7c\x92\x51\x64\x7c\xb4\xe3\x0e\xa5\x7d\x9f\x9f\x06\xa7\x5e\xce\xa0\xc4\x81\x87\x11\x2d\xae\x02\x68\xe1\xbc\x5c\xa3\xc6\x0d\x64\x7a\xe3\x03\x1c\xc1\x1a\x7c\x41\x09\x54\x98\xad\xeb\x34\xb6\x06\x9d\xcc\x70\x95\x36\x0a\x70\xff\x07\x86\x7a\xfb\x2f\xa3\x80\x10\x44\x4a\xda\x6e\xf4\xab\xcc\xe4\x51\xe3\x95\xf2\x29\xbf\x34\x01\xf2\xab\x70\xf7\xaa\x27\x2f\xf4\x9b\xfa\x08\x8b\x69\x6b\x6d\x16\x9c\x47\x04\x92\x38\xe8\x32\x65\x9c\x01\x73\x86\x2e\x21\xff\xd8\xdc\xdb\xac\xf2\x89\xc4\xb4\x16\x93\x3a\x54\x12\xe2\xa6\x0b\x63\xa2\xe1\x05\xd1\xe8\xcb\x0f\xe0\x77\xfb\xf1\xf7\x69\x44\x5b\xf3\xe7\x32\xae\x93\x11\xda\x98\x03\xd5\xc2\xd6\x57\xb1\x6b\x1a\xcc\xdd\x70\x82\xfa\x1c\x49\xc8\x4c\xc8\xd7\x9a\x40\xad\x21\x94\x74\x53\x20\xc8\x05\xb2\x02\xe6\x4d\xb7\x87\xf3\x1d\xff\x60\xc1\xcf\xf9\x52\x2f\xc5\x24\x83\x41\x1a\xf2\x14\xd9\x0b\x59\x3d\x51\x99\x69\x7b\xcc\x54\x2d\x17\x7c\x4b\xa4\xc9\x16\x7e\x43\x0c\x91\x0f\xee\xf5\x97\x78\x3a\x39\x20\x30\xa8\x5d\x94\xb4\x87\xd1\x1c\xeb\xf2\x57\xd6\x91\xf6\xb7\x88\x19\x9d\x74\x37\x4e\x3d\xa9\xf2\x67\x80\xfc\x51\x9e\x4b\xfa\x6c\x83\x47\x56\x31\x06\xbf\x69\x32\xd1\xbb\x90\x85\xa6\xdf\x13\x8b\x5c\xa9\x45\xee\xc9\x44\xff\x33\xd2\x96\xa1\x3a\x6d\x48\x88\xd3\x75\xf9\x19\x4a\xb9\xd0\x71\x77\x87\x90\x13\x66\xe0\x9b\xa4\x28\xa9\x50\x43\x69\x05\x16\x9a\xf5\x5e\x04\x79\xf0\x3f\x31\x0f\xa5\x6b\x81\x14\x68\xfe\x36\x11\xdb\x49\x55\x34\x86\x1c\xf8\x14\x5e\x10\xec\x1d\x25\x16\x5b\x52\xa6\x8a\x13\x1f\x09\x95\x19\xa3\xf9\x6b\xeb\x7d\x8f\x93\xb5\xb1\x54\x1b\x45\xf9\x64\xe5\xc1\x30\x3e\x38\x57\xf9\x43\x7d\x7d\xe8\xa2\x6c\xdc\x33\x67\x83\xf5\x7b\xb4\xb7\x22\xd7\x3a\xe3\x41\xe9\xc8\xeb\x3c\xc7\xdc\xce\x3c\xf6\x66\x26\x78\x95\x38\xe5\x46\xe6\xec\xd9\xb0\xfd\xd7\xdb\xd9\xdb\xff\x02\x00\x00\xff\xff\x3c\x5f\x59\x73\xb6\x36\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5d\x6f\xe3\xb8\xd5\xbe\xcf\xaf\x20\x12\xbc\x41\xf2\x36\xf2\xca\x49\x26\x3b\x51\xd0\x41\xd1\x62\x06\xbd\xd8\x8b\x02\x73\xb9\xd8\x0b\x5a\xa2\x6c\x36\x92\x28\x88\x54\xe2\x4c\x31\xff\xbd\xa0\x44\xc9\xfc\x38\xa4\x68\x4f\x66\x2b\x2f\x16\x31\x49\x8b\xe7\x1c\x3e\x7c\xce\x07\x39\x59\xc7\x98\x40\xff\x39\x43\x08\xa1\x24\xd9\x6c\x33\x74\xf1\xf9\xf3\xe7\x27\xf5\x9d\xd3\x82\x6c\x70\xf7\x77\xd9\x7c\xfb\x28\x3f\x56\xcf\x3f\xd9\x0b\x51\xdd\x77\xf2\x33\x75\xef\x08\x2e\x54\xc7\x97\x2f\x5f\xa6\xd6\x9c\x35\x82\x34\xc2\x6e\xde\xb0\xae\x20\x9d\x9c\xf9\x83\xfc\x1c\x46\x57\xac\x73\xde\x3c\xb4\xfe\x46\x9b\xe7\x0c\x5d\x3c\x3e\x3e\x1a\xcd\x5f\x47\xa1\xcc\xb7\xd7\x98\x36\xb2\xe5\xfe\xfe\xee\xee\x61\x6a\x24\x5d\xc7\xba\x7f\xa8\x09\xcc\x2e\x4e\x2a\x92\x0b\x52\x0c\x52\x96\x25\xf9\x95\x7c\x78\x3a\xfb\x7e\x76\x76\xb9\x6a\xe8\x76\x67\xd9\x6a\xfd\x45\x7e\x00\xad\x4d\x6b\xe9\x8a\x9b\x3d\xb3\xee\xeb\x47\xf9\xb1\x75\xd7\xf4\x30\xe4\xba\x7d\x58\x3f\xae\x3f\x0e\x72\xfd\xbf\x92\x68\x7c\x53\xf2\x4a\x0b\xb1\xcb\x50\xfa\xa4\x1a\xf7\x09\xa7\xdf\x68\xb3\xcd\xa6\x01\x1b\xb6\x1f\xfb\x4a\xd6\x88\xa4\xc4\x35\xad\xde\x32\x74\xfe\x95\xf5\x5d\x4e\xd0\x57\xdc\x70\xf4\xaf\x8e\x9d\xdf\x20\x8e\x1b\x9e\x70\xd2\xd1\x72\x1c\x5f\xe3\x6e\x2b\x4d\xa9\x5e\xdd\xe2\xa2\x18\xde\xab\xbe\x0b\xb2\x17\x49\x41\x72\xd6\x61\x41\x59\x93\xa1\x86\x35\x64\x90\x10\x2b\x09\xf3\xbe\xe3\x52\xab\x96\xd1\x46\x90\x6e\xe8\x5b\xf1\x16\xe7\xa4\x53\x23\xca\x8a\xec\x33\xb4\x1e\x7a\x36\xac\x78\x53\xcd\x12\x64\x65\xc5\x5e\x33\xb4\xa3\x45\x41\x9a\xa1\xff\xa2\x62\x5b\xda\x24\x3c\x27\x0d\x51\xe3\x76\x44\xae\x50\x86\xd6\x69\xfa\xb2\xb3\xa4\x5c\x3f\xb4\x4a\xef\xc3\xdb\x70\x2f\xd8\xd8\x56\x50\xde\x56\xf8\x2d\x1b\x24\x18\x9b\x70\x45\xb7\x4d\x42\x05\xa9\x79\x86\x72\x32\x4a\x3c\x09\x99\x8c\x2f\xc8\x59\xd5\xd7\x0d\x6a\xd8\x6b\x87\x5b\x65\x71\x9c\x3f\x6f\x3b\xd6\x37\xc5\xb4\x88\x2f\xb8\xbb\x92\x70\xb9\x7e\x3a\x1b\x46\x7c\x5a\x0d\xe8\x4b\x6a\xc2\x39\xde\x4e\xb2\xcb\x47\xad\xdd\x3a\x4d\xff\xef\x69\x6e\xac\xf1\x7e\x5a\xd4\xfb\x34\x9d\x94\x98\x17\x90\xd3\x6f\x24\x43\x6b\x52\x1f\xda\x7d\x22\xcc\x28\xbc\xd6\xc6\x2a\xfc\xad\xdb\x3d\xe2\xac\xa2\xc5\x24\xee\xd0\xae\x0d\x04\x0c\x79\x00\x45\x22\x58\xab\x9b\x53\xeb\xd9\x30\x21\x58\x6d\xff\x6c\x00\xcb\x60\x61\xd3\xb6\x03\x4c\x74\x99\x0f\x1b\x55\xc9\xf2\x7d\x34\xa2\x5a\xfd\x0d\xdb\x9f\x6e\x3f\x4b\x42\x53\xfc\x63\x8c\x08\xa0\x67\x19\x28\x47\x59\x7f\x78\x15\xdf\x75\x03\xef\xa5\x0a\x48\xf2\xb9\xcc\x4a\xda\x71\x91\xe4\x3b\x5a\x15\x9a\x29\xc2\x6b\xf3\xfd\xf0\x02\x69\x48\x96\xe0\x8e\x60\xeb\xd7\x1e\xa5\x50\x68\x6b\xc4\x6b\x1e\x80\x54\xc8\xfa\x92\xcc\xaf\xad\xa1\x13\xad\x29\x9c\x2d\x99\x32\x68\xce\xd9\x22\x96\x31\x90\xb9\xdd\xee\xf4\xed\x66\xf4\xbf\x1e\x28\xc8\x1d\xe1\x05\x92\x33\x92\xb7\xb8\x01\x44\x40\x87\x55\xed\xc6\x79\x3e\xda\x96\x43\xc3\xf2\x9a\xdf\x4c\xf5\x04\xde\x56\xb4\x21\x3e\x0d\x27\x0d\x3e\x40\x1a\xe8\x90\xba\x87\xa6\x5e\xdc\x2b\xd3\x13\x62\x00\x53\x07\x1d\xac\xb4\x69\x7b\x01\xa1\x35\x80\xa5\x19\xc8\xdb\x8e\x16\x66\x97\x6c\x49\xb6\xb8\x85\x7e\x36\xf4\x09\x52\xb7\x15\x16\x24\x19\x61\xcc\xc7\x8d\x84\xd6\xa5\x25\xed\xbf\x7b\x2e\x68\xf9\x36\x69\x9c\xa1\x0d\xe6\x44\x5a\xf9\xc8\x8d\x13\x0b\x66\xe3\x47\x9f\x2a\xbc\x21\x15\xb0\x9e\xd6\x62\x1c\x48\x14\x30\xed\xf0\xa2\xc1\xbc\xa7\xbc\xc8\x58\x02\x10\x93\xc7\xf0\xa9\x69\x8d\xc8\x3d\x2d\x9f\x9a\x36\x56\x00\xa4\x3f\x3e\x7f\x09\x58\x62\x95\xef\x48\xfe\x2c\xa3\xa7\x92\x12\x87\x58\xd1\x04\x8f\x11\x15\x19\x5a\xa3\x5f\xc6\x2d\x7b\xeb\xce\x1a\xe0\x51\x64\x52\x65\xc7\x5e\x41\x9e\x44\x31\xc8\x41\x10\x0a\x7d\x03\x9d\x48\xcc\x19\x71\x99\xed\x64\x9c\x74\x03\x74\x94\x2c\xef\xb9\x87\x9c\x9c\x20\xb0\x6f\x0a\xd2\xb9\x1b\xc1\x33\x7e\x91\xec\x91\xbb\x54\x68\x06\xee\xef\xe2\xad\x25\x7f\x3d\x9f\x96\xee\xfc\x8f\xf7\x63\x50\x60\xee\x8b\x4d\x2f\x04\x6b\x8e\x74\x9d\x11\xcb\x1d\xa0\x32\xef\x02\x9b\x2c\x73\xea\x0e\x1e\x56\x43\x74\xb8\xe1\x25\xeb\xea\x0c\xf5\x6d\x4b\xba\x1c\x73\x60\xf1\x96\xe8\x1b\xd9\xee\xe4\x01\x74\x88\x0a\x87\x05\x29\x71\x5f\x09\x08\x87\xab\xd1\xcc\x9e\xa5\x5c\x06\x32\x0a\x81\x19\x2d\x02\x1a\xd9\xb6\xf3\x80\x12\x39\xa0\x71\x5b\x74\x18\x8d\xff\x97\x69\x8c\x7c\xa1\x91\xc5\x00\xfe\xca\xf4\x45\x1d\x7b\xe5\x99\xe4\xba\x1a\xef\xaf\xd2\x1b\xe9\x8d\xae\xa1\x71\xb3\xcf\x7a\x48\xdb\x3d\x38\x3e\x98\xac\x20\x23\xa2\x7e\x79\x7d\x82\x72\xac\x31\x18\x1f\x75\x18\xb3\x6f\xcd\x90\xa7\xc7\xc5\x1e\xb9\xe6\x7a\x84\xee\x02\x6d\xb8\xdb\xc1\x9d\xde\x37\x4b\xb4\xa9\x58\xfe\x6c\xf6\x29\x5d\x1f\x52\x7b\xd7\x49\xfa\x4a\x76\x33\x8e\xed\xee\xa5\xad\x10\x72\x3b\xee\xb6\x54\x35\x0c\xdb\xc7\x5f\xae\x70\x2e\xe8\x0b\x14\xb5\x39\x9b\xc8\xc4\x9c\xf9\x1a\x68\x27\xf8\x77\x40\x0c\xf2\x17\xd6\x4a\x55\x88\xc2\x81\x47\x48\xbb\x80\x85\x62\x45\x01\x24\x77\xf7\xe2\x88\xee\xf5\xaa\xc5\x5b\xa2\x2a\x39\x10\x94\x2d\xe0\x04\x79\xd5\x27\xcf\x54\x27\x72\xf2\xf0\xf8\x2c\x26\x80\x49\x1d\x6f\x2b\x23\x53\xf1\x13\xf2\xa1\x98\xa3\x79\x1d\x65\x93\x82\xbe\x2c\x19\xc5\xbb\xbf\x21\x1f\x17\x0c\x65\x7e\xa2\xc9\x40\x1d\xd1\xc4\x9a\x1d\x7b\x4d\x48\x53\x0c\xd5\x27\xa7\x83\x0b\xdc\x09\xb7\x6b\x64\xaf\xf1\x67\x89\xa7\xf3\xf0\xd3\x83\x20\x00\x61\xc9\x18\x32\xf5\xf3\xc6\xca\xc9\x38\xc3\xce\x75\x81\xb2\x82\xa8\xd5\xf6\xa6\x1e\x56\x49\x9a\x73\x42\x2a\x8f\xe8\xfe\x38\x7c\x21\xf6\x32\x74\x76\xd8\x32\x9c\x9f\xfe\x88\xce\x28\x32\x43\xb1\x78\x33\x6b\x2b\x9c\x93\x1d\xab\xcc\x7d\xe1\x9f\xf2\x37\xda\x3c\x07\x98\xc8\xeb\xd3\x22\xfc\xd6\xad\x93\x8f\x1b\x06\x71\xbb\xa3\xa4\x83\x9c\x9b\x65\x84\x86\x89\xab\xac\xc2\x53\x11\xea\x1a\x30\xc4\xc2\xaa\xc3\x4e\xea\x04\x7f\xe4\x61\xf5\x55\xc5\xb0\xdc\xfa\x89\x7c\x6d\x85\xdf\xde\x23\x44\x09\xb2\xd8\x62\x22\xe6\x56\xb4\xa7\x9e\x96\x71\x3a\xa6\x4e\x25\xdd\x13\xad\x5e\x31\xd4\x5c\x34\xc8\x57\xa4\x14\x46\x83\x1b\xab\x21\xb8\x26\x2e\x9f\x6f\x09\x6d\x8a\x61\xef\xa6\x69\xba\x0e\xf1\x6f\xb7\xdd\x60\x19\x35\xaa\xff\x56\x0f\xfa\x36\xa0\xd6\x22\xc5\x7a\x6b\x6d\x9f\xdf\xdb\xbb\x7c\x29\x9e\x52\x7a\x7e\x0c\xc7\x69\x6e\xf7\xc1\xb2\x78\xc3\x59\xd5\x0b\xf2\x04\xc3\xe5\x6f\x35\x29\x28\x46\x57\x5a\xe5\xf8\x21\x4d\xdb\xbd\x8e\xec\xd8\x88\xdc\x1d\x3b\x47\xe5\xf6\xf0\x79\xfc\x6a\xc7\x6a\x02\x84\xd3\x48\xc7\xeb\x78\xba\xa2\x77\x4d\x98\x4a\xf6\x76\xb9\x17\xc5\x25\x9e\x71\xd9\xa5\x79\x62\x13\x29\x1b\x48\x72\xde\x60\x0b\xfd\x60\x54\x6d\x00\x61\xbd\xba\xb5\xfb\xe1\x4a\x95\x26\x99\x3f\xe4\x01\x4c\x39\x1a\xd2\x9c\x00\x2a\xae\xc2\xae\x72\x49\x17\x14\x55\x97\x35\x34\x06\xab\xd3\xf6\x71\x1d\xa0\x35\x8a\xf1\xf8\xff\x63\x55\xbe\x2f\x97\x3a\x42\xbe\x12\x85\xfc\xa5\x33\xbb\x79\x90\x84\xbc\x29\xfc\x08\x15\x56\x47\x67\xf0\x33\x07\xcc\x85\x64\x88\x4f\x86\x52\x33\xc8\x12\x17\xa4\xa0\xc2\x3a\xfc\xf2\xe6\x61\xf3\xb9\x71\x7c\xec\xac\xb9\xd6\xe9\xbc\x6d\xc3\xd8\x73\x8d\xbb\x67\x9e\x48\x51\x21\x0f\x6a\x96\xd7\x3d\x04\x39\x91\xcb\x22\x3b\x76\xa4\x25\x58\x5c\x49\x1b\x24\x25\xad\xaa\x9b\xc9\x12\x77\x92\x8a\x47\x6b\xd8\x1c\x0b\x54\xf2\x3d\xc5\x34\xfb\x0c\x78\xee\xb8\xcc\x32\x5c\x0a\x67\xcb\xcf\x94\x78\x7e\x1e\x5f\x50\x90\xea\xce\x50\x02\x8f\x17\x7c\x09\x84\x3d\xc0\xcd\x3f\xb4\x7d\xb0\x9a\x96\xc6\x92\x79\x8c\x50\x38\xa9\xca\x0c\x0d\x2f\x80\x7f\xdd\xe2\x2d\x6d\xc6\xea\xab\x09\xa8\x77\x90\x12\xfd\x70\x31\x14\x50\x62\x91\x00\xc2\x07\x11\xde\xb0\xd7\x19\x79\x62\x0d\x3c\xae\x86\x6d\x7e\x73\x39\x18\x78\xf9\x7c\x8a\x0d\xa9\x15\x56\x3a\xba\x5c\x3b\x52\x77\xba\x7a\x84\xc8\x3b\xaa\x88\x7c\xf4\xa1\xcd\x29\x27\x43\xf3\x5d\x94\xc5\x64\x02\x74\xc5\x27\x68\x0a\xe4\x46\xc8\xf1\x56\xbf\x42\xb6\x77\x33\x75\x00\x50\x43\xfe\xc4\xca\x44\x7a\xde\x2c\xdb\x90\x92\x75\x50\x35\x0c\x19\x5c\xf4\xcb\x39\x5c\x88\x7e\x9f\x03\x8e\xcb\x55\x45\xb9\x8d\xc3\x03\xcf\xa6\x00\x11\x04\x83\xdc\x74\x88\xa1\xed\x68\x32\x48\x3f\xc8\x66\x70\xe7\xb0\x1e\x2d\xdc\x81\xb0\xde\x92\xd8\x59\x94\xcf\x1e\xc6\xd7\x98\x84\xc0\x11\x17\x92\x74\x59\x5b\x47\xe3\x63\x96\x4e\x13\xfd\xa2\xa0\xb8\x62\xdb\x44\xe0\xad\xce\x53\xab\xbc\xe7\x82\xd5\x89\xea\xd5\xee\x58\x4d\x4f\xd8\x1d\xdf\xde\x58\x01\x89\xbd\x9e\xc7\x98\x2a\x32\x2f\x0a\x2c\x0c\xc4\xfe\x76\x04\xea\x0c\x08\xdc\xad\xb8\xd4\xea\x18\x81\x03\xa1\xa5\x20\x77\x7a\xa2\x59\x64\x7a\xd4\xc6\x1d\x53\xfb\x21\x3e\xf5\x0e\xbd\x5c\x60\x89\x83\x0c\x13\x5b\x5c\x79\xd8\xc2\x9a\x5c\xb1\xc6\x2d\x04\xbd\xe9\x01\x8e\x60\x35\xb9\xa0\x00\xca\x2f\xd6\x75\x9c\x58\xa3\x4d\x16\xa4\x8a\x6b\x05\xa4\xff\x13\x5d\xbd\xf9\x97\x96\x40\x70\x22\x04\x6d\xb6\x6a\x2a\x3d\x78\x54\x7c\x25\xf7\x94\x9b\x9a\x00\xf1\x95\xbf\x7a\x35\x74\xaf\xd4\x4c\x83\x87\xc5\xb4\x31\x16\x0b\x8e\x23\x3c\x41\x1c\x74\x95\x32\x2c\x80\x3e\x42\xa5\x90\x7f\x6e\xec\xad\x67\xf9\x44\x60\x5a\xf1\xd9\x1c\x32\x08\xb1\xc3\x85\x29\xd0\x70\x9c\x68\x70\xf2\x03\xf9\xdd\x7d\xf8\x39\x85\x68\x63\xfc\x52\xc4\x75\x32\x43\x6b\x63\xa0\x5c\xd8\xf8\xca\xfb\xba\xc6\x9d\xed\x4e\xd0\x10\x23\x71\x91\x70\xf1\x56\x11\xa8\x34\x84\xa2\x6e\x0a\x78\xa5\x40\x86\xc3\xbc\x6d\xf7\x70\xbc\xe3\x1e\x2c\xb8\x31\x5f\xec\xa5\x98\x68\x32\x88\x63\x9e\x2c\x79\x25\x9b\x67\x2a\x12\x85\xc7\x44\xe6\x72\xde\x59\x02\x45\x36\xff\x0c\x21\x46\x3e\x6c\xaf\xbf\x84\xc3\xc9\x91\x81\x41\xeb\xa2\xa8\x35\x0c\xc6\x58\x97\xbf\xb3\x96\x34\x7f\x04\x60\x74\xd2\xdd\x38\xf9\xc4\xea\x9f\x00\xfa\x07\x65\x2e\xe8\x8b\x49\x1e\x49\xc9\x18\x3c\xd3\x0c\xd1\x7b\x1f\x42\xe3\xef\x89\x05\xae\xd4\x22\xfb\x64\x62\xf8\x19\x69\x0a\x5f\x9e\x36\x06\xc4\xf1\xb6\xfc\x04\x85\x5c\xe8\xb8\xbb\x43\xc8\x72\x33\xf0\x4d\x52\x14\x95\xa8\xa1\xb8\x04\x0b\x2d\xee\x5e\x74\xd4\x45\x1f\xcf\x04\x4b\x37\x89\x58\x2f\x64\xc2\xe8\xdb\xbc\xc7\xca\x81\xe0\x5d\x51\x60\xbe\x23\x40\x29\xcf\x55\x23\xdc\xe2\x4b\x2d\x26\xc8\x2b\xc4\xbe\xc7\x69\xda\x94\x9e\x4d\x6a\x7c\x34\x62\x5f\x98\x13\xac\xeb\xfb\xbe\x5a\x3e\x74\x39\x36\xbc\x1b\x17\x1d\xf4\x7b\x94\xb4\x02\x57\x39\xc3\x8e\xe8\xc8\x2b\x3c\xc7\xdc\xc8\x3c\xf6\x36\x26\x78\x7d\x38\xe6\x16\xe6\xe2\x79\xb0\xf9\x97\x0d\x3c\x9c\xe7\xac\x6f\x84\xae\x6e\x14\x44\x52\x10\x20\xbd\x8d\x0e\x37\x5e\xb1\xba\x8f\xae\x39\xfe\xc4\x3b\xc0\x80\xbb\x8f\x38\x90\x47\x27\xfe\xc3\x09\x04\xb3\x5f\x20\xa5\x8e\xc9\x95\xa3\xea\x8a\x28\x7c\xf0\x04\x48\xe5\x73\x55\x71\xf1\x4c\x7c\x9d\x18\xbd\xb3\x73\x09\xb7\x00\x19\xe4\x7f\x03\x00\x00\xff\xff\x23\x47\x1f\xcf\xc5\x39\x00\x00"), }, "/login.html": &vfsgen۰CompressedFileInfo{ name: "login.html", diff --git a/internal/webserver/handler-api.go b/internal/webserver/handler-api.go index 8a6927e..e9d4e8a 100644 --- a/internal/webserver/handler-api.go +++ b/internal/webserver/handler-api.go @@ -571,3 +571,112 @@ func (h *handler) apiUpdateBookmarkTags(w http.ResponseWriter, r *http.Request, err = json.NewEncoder(w).Encode(&bookmarks) checkError(err) } + +// apiGetAccounts is handler for GET /api/accounts +func (h *handler) apiGetAccounts(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Get list of usernames from database + accounts, err := h.DB.GetAccounts("") + checkError(err) + + w.Header().Set("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(&accounts) + checkError(err) +} + +// apiInsertAccount is handler for POST /api/accounts +func (h *handler) apiInsertAccount(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Decode request + var account model.Account + err = json.NewDecoder(r.Body).Decode(&account) + checkError(err) + + // Save account to database + err = h.DB.SaveAccount(account.Username, account.Password) + checkError(err) + + fmt.Fprint(w, 1) +} + +// apiUpdateAccount is handler for PUT /api/accounts +func (h *handler) apiUpdateAccount(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Decode request + request := struct { + Username string `json:"username"` + OldPassword string `json:"oldPassword"` + NewPassword string `json:"newPassword"` + }{} + + err = json.NewDecoder(r.Body).Decode(&request) + checkError(err) + + // Get existing account data from database + account, exist := h.DB.GetAccount(request.Username) + if !exist { + panic(fmt.Errorf("username doesn't exist")) + } + + // Compare old password with database + err = bcrypt.CompareHashAndPassword([]byte(account.Password), []byte(request.OldPassword)) + if err != nil { + panic(fmt.Errorf("old password doesn't match")) + } + + // Save new password to database + err = h.DB.SaveAccount(request.Username, request.NewPassword) + checkError(err) + + // Delete user's sessions + if val, found := h.UserCache.Get(request.Username); found { + userSessions := val.([]string) + for _, session := range userSessions { + h.SessionCache.Delete(session) + } + + h.UserCache.Delete(request.Username) + } + + fmt.Fprint(w, 1) +} + +// apiDeleteAccount is handler for DELETE /api/accounts +func (h *handler) apiDeleteAccount(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + // Make sure session still valid + err := h.validateSession(r) + checkError(err) + + // Decode request + usernames := []string{} + err = json.NewDecoder(r.Body).Decode(&usernames) + checkError(err) + + // Delete accounts + err = h.DB.DeleteAccounts(usernames...) + checkError(err) + + // Delete user's sessions + userSessions := []string{} + for _, username := range usernames { + if val, found := h.UserCache.Get(username); found { + userSessions = val.([]string) + for _, session := range userSessions { + h.SessionCache.Delete(session) + } + + h.UserCache.Delete(username) + } + } + + fmt.Fprint(w, 1) +} diff --git a/internal/webserver/server.go b/internal/webserver/server.go index 0d392cb..f7f820b 100644 --- a/internal/webserver/server.go +++ b/internal/webserver/server.go @@ -45,6 +45,11 @@ func ServeApp(DB database.DB, dataDir string, port int) error { router.PUT("/api/archive", hdl.apiUpdateArchive) router.PUT("/api/bookmarks/tags", hdl.apiUpdateBookmarkTags) + router.GET("/api/accounts", hdl.apiGetAccounts) + router.PUT("/api/accounts", hdl.apiUpdateAccount) + router.POST("/api/accounts", hdl.apiInsertAccount) + router.DELETE("/api/accounts", hdl.apiDeleteAccount) + // Route for panic router.PanicHandler = func(w http.ResponseWriter, r *http.Request, arg interface{}) { http.Error(w, fmt.Sprint(arg), 500)