diff options
85 files changed, 5338 insertions, 3491 deletions
@@ -14,7 +14,7 @@ watch_dirs = [ watch_exts = [".go", ".ini"] build_delay = 1500 cmds = [ - ["go", "install", "-tags", "sqlite redis cert"], - ["go", "build", "-tags", "sqlite redis cert"], + ["go", "install", "-tags", "sqlite cert"],# redis memcache + ["go", "build", "-tags", "sqlite cert"], ["./gogs", "web"] ]
\ No newline at end of file diff --git a/.gobuild.yml b/.gobuild.yml index 3a2f361d..f1b9b691 100644 --- a/.gobuild.yml +++ b/.gobuild.yml @@ -10,6 +10,7 @@ filesets: - README_ZH.md excludes: - \.git + depth: 5 settings: build: | if test "$GOOS" = "windows" -a "$GOARCH" = "386" @@ -11,9 +11,9 @@ github.com/Unknwon/i18n = github.com/Unknwon/macaron = github.com/codegangsta/cli = commit:7381bc4e62 github.com/go-sql-driver/mysql = commit:8111ee3ec3 -github.com/go-xorm/core = commit:750aae0fa5 -github.com/go-xorm/xorm = commit:2d8b3135b1 -github.com/gogits/gfm = commit:40f747a9c0 +github.com/go-xorm/core = +github.com/go-xorm/xorm = +github.com/gogits/go-gogs-client = github.com/gogits/oauth2 = commit:99cbec870a github.com/lib/pq = commit:b021d0ef20 github.com/macaron-contrib/binding = @@ -2,6 +2,7 @@ targets: ubuntu-14.04: ubuntu-12.04: debian-7: + centos6: build_dependencies: - mercurial - bzr @@ -1,27 +1,19 @@ -Copyright (c) 2014 -All rights reserved. +Copyright (c) 2014 All Gogs Contributors -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.
\ No newline at end of file @@ -5,7 +5,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.  -##### Current version: 0.5.6 Beta +##### Current version: 0.5.7 Beta ### NOTICES @@ -35,7 +35,7 @@ The goal of this project is to make the easiest, fastest and most painless way t - Reverse proxy suburl support - Register/delete/rename account - Create/manage/delete organization with team management -- Create/migrate/mirror/delete/watch/rename/transfer public/private repository +- Create/fork/migrate/mirror/delete/watch/rename/transfer public/private repository - Repository viewer/release/issue tracker - Repository and Organization level webhooks - Repository Git hooks diff --git a/README_ZH.md b/README_ZH.md index 83addc0f..cb5e5a1a 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。  -##### 当前版本:0.5.6 Beta +##### 当前版本:0.5.7 Beta ## 开发目的 @@ -26,7 +26,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自 - 支持反向代理子路径 - 支持 注册/删除/重命名 用户 - 支持 创建/管理/删除 组织以及团队管理功能 -- 支持 创建/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库 +- 支持 创建/派生/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库 - 支持仓库 浏览/发布/工单管理 - 支持仓库和组织级别 Web 钩子 - 支持仓库 Git 钩子 diff --git a/cmd/serve.go b/cmd/serve.go index c18bf3ad..15d48dcb 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -96,7 +96,7 @@ func runServ(k *cli.Context) { println("Gogs: you are not the owner of SSH key") log.GitLogger.Fatal(2, "Invalid owner of SSH key: %d", keyId) } - println("Gogs: internal error:", err) + println("Gogs: internal error:", err.Error()) log.GitLogger.Fatal(2, "Fail to get user by key ID(%d): %v", keyId, err) } @@ -125,7 +125,7 @@ func runServ(k *cli.Context) { println("Gogs: given repository owner are not registered") log.GitLogger.Fatal(2, "Unregistered owner: %s", repoUserName) } - println("Gogs: internal error:", err) + println("Gogs: internal error:", err.Error()) log.GitLogger.Fatal(2, "Fail to get repository owner(%s): %v", repoUserName, err) } @@ -134,7 +134,7 @@ func runServ(k *cli.Context) { case isWrite: has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.WRITABLE) if err != nil { - println("Gogs: internal error:", err) + println("Gogs: internal error:", err.Error()) log.GitLogger.Fatal(2, "Fail to check write access:", err) } else if !has { println("You have no right to write this repository") @@ -147,7 +147,7 @@ func runServ(k *cli.Context) { println("Gogs: given repository does not exist") log.GitLogger.Fatal(2, "Repository does not exist: %s/%s", repoUser.Name, repoName) } - println("Gogs: internal error:", err) + println("Gogs: internal error:", err.Error()) log.GitLogger.Fatal(2, "Fail to get repository: %v", err) } @@ -157,7 +157,7 @@ func runServ(k *cli.Context) { has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.READABLE) if err != nil { - println("Gogs: internal error:", err) + println("Gogs: internal error:", err.Error()) log.GitLogger.Fatal(2, "Fail to check read access:", err) } else if !has { println("You have no right to access this repository") @@ -9,6 +9,7 @@ import ( "html/template" "io/ioutil" "net/http" + "net/http/fcgi" "os" "path" "strings" @@ -63,7 +64,7 @@ func checkVersion() { // Check dependency version. macaronVer := git.MustParseVersion(strings.Join(strings.Split(macaron.Version(), ".")[:3], ".")) - if macaronVer.LessThan(git.MustParseVersion("0.2.3")) { + if macaronVer.LessThan(git.MustParseVersion("0.4.2")) { log.Fatal(4, "Package macaron version is too old, did you forget to update?(github.com/Unknwon/macaron)") } i18nVer := git.MustParseVersion(i18n.Version()) @@ -71,7 +72,7 @@ func checkVersion() { log.Fatal(4, "Package i18n version is too old, did you forget to update?(github.com/macaron-contrib/i18n)") } sessionVer := git.MustParseVersion(session.Version()) - if sessionVer.LessThan(git.MustParseVersion("0.0.3")) { + if sessionVer.LessThan(git.MustParseVersion("0.0.5")) { log.Fatal(4, "Package session version is too old, did you forget to update?(github.com/macaron-contrib/session)") } } @@ -84,6 +85,9 @@ func newMacaron() *macaron.Macaron { if setting.EnableGzip { m.Use(macaron.Gziper()) } + if setting.Protocol == setting.FCGI { + m.SetURLPrefix(setting.AppSubUrl) + } m.Use(macaron.Static( path.Join(setting.StaticRootPath, "public"), macaron.StaticOptions{ @@ -144,6 +148,7 @@ func runWeb(*cli.Context) { ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true}) reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true}) + bind := binding.Bind bindIgnErr := binding.BindIgnErr // Routers. @@ -156,7 +161,8 @@ func runWeb(*cli.Context) { m.Get("/issues", user.Issues) }, reqSignIn) - // API routers. + // API. + // FIXME: custom form error response. m.Group("/api", func() { m.Group("/v1", func() { // Miscellaneous. @@ -169,18 +175,25 @@ func runWeb(*cli.Context) { }) // Repositories. + m.Get("/user/repos", middleware.ApiReqToken(), v1.ListMyRepos) m.Group("/repos", func() { m.Get("/search", v1.SearchRepos) m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.Migrate) + + m.Group("/:username/:reponame", func() { + m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(v1.CreateRepoHookForm{}), v1.CreateRepoHook) + m.Patch("/hooks/:id:int", bind(v1.EditRepoHookForm{}), v1.EditRepoHook) + m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile) + }, middleware.ApiRepoAssignment(), middleware.ApiReqToken()) }) m.Any("/*", func(ctx *middleware.Context) { - ctx.JSON(404, &base.ApiJsonErr{"Not Found", v1.DOC_URL}) + ctx.JSON(404, &base.ApiJsonErr{"Not Found", base.DOC_URL}) }) }) }) - // User routers. + // User. m.Group("/user", func() { m.Get("/login", user.SignIn) m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) @@ -198,6 +211,7 @@ func runWeb(*cli.Context) { m.Get("/ssh", user.SettingsSSHKeys) m.Post("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost) m.Get("/social", user.SettingsSocial) + m.Combo("/applications").Get(user.SettingsApplications).Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) m.Route("/delete", "GET,POST", user.SettingsDelete) }, reqSignIn) m.Group("/user", func() { @@ -209,9 +223,6 @@ func runWeb(*cli.Context) { m.Get("/logout", user.SignOut) }) - // FIXME: Legacy - m.Get("/user/:username", ignSignIn, user.Profile) - // Gravatar service. avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg") os.MkdirAll("public/img/avatar/", os.ModePerm) @@ -264,7 +275,7 @@ func runWeb(*cli.Context) { reqTrueOwner := middleware.RequireTrueOwner() - // Organization routers. + // Organization. m.Group("/org", func() { m.Get("/create", org.Create) m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost) @@ -308,12 +319,14 @@ func runWeb(*cli.Context) { m.Get("/:org", org.Home) }, middleware.OrgAssignment(true)) - // Repository routers. + // Repository. m.Group("/repo", func() { m.Get("/create", repo.Create) m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) m.Get("/migrate", repo.Migrate) m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) + m.Get("/fork", repo.Fork) + m.Post("/fork", bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost) }, reqSignIn) m.Group("/:username/:reponame", func() { @@ -351,7 +364,6 @@ func runWeb(*cli.Context) { m.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) m.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) m.Post("/labels/delete", repo.DeleteLabel) - m.Get("/milestones", repo.Milestones) m.Get("/milestones/new", repo.NewMilestone) m.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) m.Get("/milestones/:index/edit", repo.UpdateMilestone) @@ -361,38 +373,35 @@ func runWeb(*cli.Context) { m.Post("/comment/:action", repo.Comment) m.Get("/releases/new", repo.NewRelease) - m.Get("/releases/edit/:tagname", repo.EditRelease) - }, reqSignIn, middleware.RepoAssignment(true)) - - m.Group("/:username/:reponame", func() { m.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) + m.Get("/releases/edit/:tagname", repo.EditRelease) m.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) - }, reqSignIn, middleware.RepoAssignment(true, true)) + }, reqSignIn, middleware.RepoAssignment(true)) m.Group("/:username/:reponame", func() { + m.Get("/releases", repo.Releases) m.Get("/issues", repo.Issues) m.Get("/issues/:index", repo.ViewIssue) + m.Get("/issues/milestones", repo.Milestones) m.Get("/pulls", repo.Pulls) m.Get("/branches", repo.Branches) m.Get("/archive/*", repo.Download) m.Get("/issues2/", repo.Issues2) - }, ignSignIn, middleware.RepoAssignment(true)) + m.Get("/pulls2/", repo.PullRequest2) + m.Get("/labels2/",repo.Labels2) + + m.Group("", func() { + m.Get("/src/*", repo.Home) + m.Get("/raw/*", repo.SingleDownload) + m.Get("/commits/*", repo.RefCommits) + m.Get("/commit/*", repo.Diff) + }, middleware.RepoRef()) - m.Group("/:username/:reponame", func() { - m.Get("/src/:branchname", repo.Home) - m.Get("/src/:branchname/*", repo.Home) - m.Get("/raw/:branchname/*", repo.SingleDownload) - m.Get("/commits/:branchname", repo.Commits) - m.Get("/commits/:branchname/search", repo.SearchCommits) - m.Get("/commits/:branchname/*", repo.FileHistory) - m.Get("/commit/:branchname", repo.Diff) - m.Get("/commit/:branchname/*", repo.Diff) - m.Get("/releases", repo.Releases) m.Get("/compare/:before([a-z0-9]+)...:after([a-z0-9]+)", repo.CompareDiff) - }, ignSignIn, middleware.RepoAssignment(true, true)) + }, ignSignIn, middleware.RepoAssignment(true)) m.Group("/:username", func() { - m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true, true), repo.Home) + m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef(), repo.Home) m.Any("/:reponame/*", ignSignInAndCsrf, repo.Http) }) @@ -416,6 +425,8 @@ func runWeb(*cli.Context) { err = http.ListenAndServe(listenAddr, m) case setting.HTTPS: err = http.ListenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile, m) + case setting.FCGI: + err = fcgi.Serve(nil, m) default: log.Fatal(4, "Invalid protocol: %s", setting.Protocol) } diff --git a/conf/app.ini b/conf/app.ini index ed4a1b62..dbae8a4f 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -163,14 +163,12 @@ ENABLE_SET_COOKIE = true GC_INTERVAL_TIME = 86400 ; Session life time, default is 86400 SESSION_LIFE_TIME = 86400 -; session id hash func, Either "sha1", "sha256" or "md5" default is sha1 -SESSION_ID_HASHFUNC = sha1 -; Session hash key, default is use random string -SESSION_ID_HASHKEY = [picture] ; The place to picture data, either "server" or "qiniu", default is "server" SERVICE = server +; Chinese users can choose "duoshuo" +GRAVATAR_SOURCE = gravatar DISABLE_GRAVATAR = false [attachment] diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 651fdac0..53e71d85 100644..100755 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -1,578 +1,679 @@ -app_desc = Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go. - -home = Home -dashboard = Dashboard -explore = Erkunden -help = Hilfe -sign_in = Anmelden -social_sign_in = Anmeldung über soziales Konto: zweiter Schritt <small>Konto verknüpfen</small> -sign_out = Abmelden -sign_up = Registrieren -register = Registrieren -website = Webseite -version = Version -page = Seite -template = Vorlage -language = Sprache - -username = Benutzername -email = E-Mail -password = Passwort -re_type = Passwort bestätigen -captcha = Captcha - -repository = Repository -organization = Organisation -mirror = Spiegel -new_repo = Neues Repository -new_migrate = Neue Migration -new_org = Neue Organisation -manage_org = Organisationen verwalten -admin_panel = Admin-Panel -account_settings = Kontoeinstellungen -settings = Einstellungen - -news_feed = News Feed -pull_requests = Pull Requests -issues = Issues - -cancel = Abbrechen - -[install] -install = Installation -title = Installation für erstmaligen Start -requite_db_desc = Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert. -db_type = Datenbanktyp -host = Host -user = Benutzer -password = Passwort -db_name = Datenbankname -db_helper = Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MySQL. -ssl_mode = SSL-Modus -path = Pfad -sqlite_helper = Der Dateipfad des SQLite3 Datenbank. -general_title = Allgemeine Einstellungen von Gogs -repo_path = Repository Root-Verzeichnispfad -repo_path_helper = Alle Git-Repositorys werden in diesem Verzeichnis gespeichert. -run_user = Ausführender Benutzer -run_user_helper = Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein. -domain = Domain -domain_helper = Dies hat Auswirkung auf die SSH clone URLs. -app_url = Anwendungs-URL -app_url_helper = Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails. -email_title = E-Mail-Service-Einstellungen (optional) -smtp_host = SMTP Host -mailer_user = Sender E-mail -mailer_password = Sender Passwort -notify_title = Benachrichtigungseinstellungen (optional) -register_confirm = Registrierungsbestätigung aktvieren -mail_notify = E-Mail-Benachrichtgung aktivieren -admin_title = Konto-Einstellungen für den Administrator -admin_name = Benutzername -admin_password = Passwort -confirm_password = Passwort bestätigen -admin_email = E-Mail -install_gogs = Gogs installieren -test_git_failed = Fehler beim Test des 'git' Kommandos: %v -sqlite3_not_available = Deine Version unterstüzt nicht SQLite3, bitte downloade dir die offiziele binäre Version von http://gogs.io/docs/installation/install_from_binary.html, NICHT die gobuild Version. -invalid_db_setting = Datenbank-Einstellungen sind nicht korrekt: %v -invalid_repo_path = Repository Root-Verzeichnis ist ungültig: %v -run_user_not_match = Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s -save_config_failed = Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v -invalid_admin_setting = Admin-Konto Einstellungen sind ungültig: %v -install_success = Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit. - -[home] -uname_holder = Benutzername oder E-Mail -password_holder = Passwort -switch_dashboard_context = Dashboard Kontext wechseln -my_repos = Meine Repositorys -collaborative_repos = Gemeinschaftliche Repositorys -my_orgs = Meine Organisationen -my_mirrors = Meine Spiegel - -[explore] -repos = Repositorys - -[auth] -create_new_account = Neues Konto erstellen -register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden! -social_register_hepler_msg = Du hast schon ein soziales Konto? Jetzt verknüpfen! -disable_register_prompt = Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator. -disable_register_mail = Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert. -remember_me = angemeldet bleiben -forgot_password= Passwort vergessen -forget_password = Passwort vergessen? -sign_up_now = Du willst ein Konto? Jetzt registrieren! -confirmation_mail_sent_prompt = Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Kontrolliere dein Postfach innerhalb der nächsten %d Stunden, um die Registrierung abzuschließen. -sign_in_email = Melde dich mit deiner E-Mail-Adresse an -active_your_account = Aktiviere dein Konto -resent_limit_prompt = Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten. -has_unconfirmed_mail = Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button. -resend_mail = Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden -email_not_associate = Diese E-Mail-Adresse ist mit keinem Konto verknüpft. -send_reset_mail = Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden -reset_password = Passwort zurücksetzen -invalid_code = Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. -reset_password_helper = Hier klicken, um das Passwort zurückzusetzen -password_too_short = Das Passwort muss mindenstens 6 Zeichen lang sein - -[form] -UserName = Benutzername -RepoName = Repository-Name -Email = E-Mail-Adresse -Password = Passwort -Retype = Passwort bestätigen -SSHTitle = SSH-Schlüsselname -HttpsUrl = HTTPS-URL -PayloadUrl = Payload-URL -TeamName = Teamname -AuthName = Authentifizierungsname -AdminEmail = Admin E-mail - -require_error = ` darf nicht leer sein.` -alpha_dash_error = ` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.` -alpha_dash_dot_error = ` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.` -min_size_error = ` muss mindestens %s Zeichen enthalten.` -max_size_error = ` darf höchstens %s Zeichen enthalten.` -email_error = ` ist keine gültige E-Mail-Adresse.` -url_error = ` ist keine gültige URL.` -unknown_error = Unbekannter Fehler: -captcha_incorrect = Captcha stimmt nicht überein. -password_not_match = Die Passwörter stimmen nicht überein. - -username_been_taken = Benutzername ist bereits vergeben. -repo_name_been_taken = Repository-Name ist bereits vergeben. -org_name_been_taken = Organisationsname ist bereits vergeben. -team_name_been_taken = Teamname ist bereits vergeben. -email_been_used = E-Mail-Adresse wird bereits verwendet. -ssh_key_been_used = SSH-Schlüsselname wird bereits verwendet. -illegal_username = Benutzername enthält ungültige Zeichen. -illegal_repo_name = Repository-Name enthält ungültige Zeichen. -illegal_org_name = Organisationsname enthält ungültige Zeichen. -illegal_team_name = Teamname enthält ungültige Zeichen. -username_password_incorrect = Benutzername oder Passwort ist nicht korrekt. -enterred_invalid_repo_name = Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist. -enterred_invalid_owner_name = Bitte stelle sicher, dass der eingegeben Besitzername richtig ist. -enterred_invalid_password = Bitte stelle sicher, dass das eingegebene Passwort richtig ist. -user_not_exist = Angegebener Benutzer existiert nicht. -last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben. - -invalid_ssh_key = Leider sind wir nicht in der Lage, deinen SSH-Schlüssel zu überprüfen: %s -auth_failed = Authentifizierung fehlgeschlagen: %v - -still_own_repo = Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. -org_still_own_repo = Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. - -still_own_user = Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut. - -[user] -change_avatar = Ändere dein Profilbild auf gravatar.com -join_on = Registriert -repositories = Repositorys -activity = Öffentliche Aktivität -followers = Folgen -starred = Markiert -following = Folgt - -[settings] -profile = Profil -password = Passwort -ssh_keys = SSH-Schlüssel -social = Soziale Konten -orgs = Organisationen -delete = Konto löschen -uid = Uid - -public_profile = Öffentliches Profil -profile_desc = Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. -full_name = Vollständiger Name -website = Webseite -location = Standort -update_profile = Profil aktualisieren -update_profile_success = Profil aktualisiert - -change_password = Passwort ändern -old_password = Aktuelles Passwort -new_password = Neues Passwort -password_incorrect = Aktuelles Passwort ist nicht korrekt. -change_password_success = Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden. - -manage_ssh_keys = SSH-Schlüssel verwalten -add_key = SSH-Schlüssel hinzufügen -ssh_desc = Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst. -ssh_helper = <strong>Du brauchst Hilfe?</strong> Hier ist eine Anleitung zum <a href="https://help.github.com/articles/generating-ssh-keys">Erzeugen von SSH-Schlüsseln</a> oder <a href="https://help.github.com/ssh-issues/">Problemlösen einfacher SSH-Probleme</a>. -add_new_key = SSH-Schlüssel hinzufügen -key_name = Schlüsselname -key_content = Inhalt -add_key_success = SSH-Schlüssel hinzugefügt -delete_key = SSH-Schlüssel löschen -add_on = Hinzugefügt am -last_used = Zuletzt verwendet auf -no_activity = Keine neuen Aktivitäten - -manage_social = Verknüpfte soziale Konten verwalten -social_desc = Dies ist eine Liste verknüpfter sozialer Konten. Entferne alle Verknüpfungen, die du nicht kennst. -unbind = Verknüpfung entfernen -unbind_success = Die Verknüpfung zum sozialen Konto wurde entfernt. - -delete_account = Konto löschen -delete_prompt = Diese Aktion wird dein Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden! -confirm_delete_account = Löschen - -[repo] -owner = Besitzer -repo_name = Repository-Name -repo_name_helper = Gute Repository-Namen sind kurz, einprägsam und <strong>einzigartig</strong>. -visibility = Sichtbarkeit -visiblity_helper = Dieses Repository ist <span class="label label-red label-radius">Privat</span> -repo_desc = Beschreibung -repo_lang = Sprache -repo_lang_helper = Wähle eine .gitignore Datei -license = Lizenz -license_helper = Wähle eine Lizenz aus -init_readme = Repository mit README.md initialisieren -create_repo = Repository erstellen -default_branch = Standard-Branch -mirror_interval = Spiegel-Intervall (in Stunden) -goget_meta = Go-Get Meta -goget_meta_helper = Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können. - -need_auth = Authorisierung benötigt -migrate_type = Migrationstyp -migrate_type_helper = Dieses Repository wird ein <span class="label label-blue label-radius">Spiegel</span> -migrate_repo = Repository migrieren - -copy_link = Klonen -clone_helper = Du brauchst Hilfe beim Klonen? Hier gibt es <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">Hilfe</a>! -unwatch = Beobachtung beenden -watch = Beobachtung -unstar = Markierung aufheben -star = Markierung -fork = Abspaltung - -quick_guide = Kurzanleitung -clone_this_repo = Dieses Repository klonen -create_new_repo_command = Erstelle ein neues Repository mittels der Kommandozeile -push_exist_repo = Übertrage ein existierendes Repository von der Kommandozeile - -settings = Einstellungen -settings.options = Optionen -settings.collaboration = Zusammenarbeit -settings.hooks = Webhooks -settings.deploy_keys = Deploy-Keys -settings.basic_settings = Grundeinstellungen -settings.danger_zone = Gefahrenzone -settings.site = Offizielle Webseite -settings.update_settings = Aktualisierungseinstellungen -settings.transfer = Besitz übertragen -settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation. -settings.new_owner_has_same_repo = Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen. -settings.delete = Repository löschen -settings.delete_desc = Wenn dieses Repository gelöscht ist, gibt es keinen Weg zurück. Sei dir sicher! -settings.update_settings_success = Repository-Optionen aktualisiert -settings.transfer_owner = Neuer Besitzer -settings.make_transfer = übertragen -settings.transfer_succeed = Repository-Eigentum wurde erfolgreich übertragen. -settings.confirm_delete = Löschen -settings.add_collaborator = Mitarbeiter hinzufügen -settings.add_collaborator_success = Mitarbeiter hinzugefügt -settings.remove_collaborator_success = Mitarbeiter entfernt -settings.add_webhook = Webhook hinzufügen -settings.hooks_desc = Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>. -settings.remove_hook_success = Webhook entfernt -settings.add_webhook_desc = GoGS sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>. -settings.payload_url = Payload-URL -settings.content_type = Inhaltstyp -settings.secret = Secret -settings.event_desc = Welche Ereignisse sollen diesen Webhook auslösen? -settings.event_push_only = Nur das <code>push</code>-Ereignis. -settings.active = Aktiv -settings.active_helper = Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird. -settings.add_hook_success = Webhook hinzugefügt -settings.update_webhook = Webhook aktualisieren -settings.update_hook_success = Webhook aktualisiert -settings.delete_webhook = Webhook löschen -settings.recent_deliveries = letzte Zustellungen -settings.hook_type = Hook Typ -settings.add_slack_hook_desc = Add <a href="http://slack.com">Slack</a> integration to your repository. -settings.slack_token = Token -settings.slack_domain = Domain -settings.slack_channel = Channel - -[org] -org_name_holder = Name der Organisation -org_name_helper = Gute Namen von Organisationen sind kurz und einprägsam. -org_email_helper = Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen. -create_org = Organisation erstellen -repo_updated = Aktualisiert -people = Personen -invite_someone = Benutzer einladen -teams = Teams -lower_members = Mitglieder -lower_repositories = Repositorys -create_new_team = Neues Team erstellen -org_desc = Beschreibung -team_name = Teamname -team_desc = Beschreibung -team_name_helper = Verwende diesen Namen, um dich auf dieses Team zu beziehen. -team_desc_helper = Was hat es mit diesem Team auf sich? -team_permission_desc = Welche Berechtigungsstufe soll das Team haben? - -settings = Einstellungen -settings.options = Optionen -settings.full_name = Vollständiger Name -settings.website = Webseite -settings.location = Standort -settings.update_settings = Aktualisierungseinstellungen -settings.update_setting_success = Organisationseinstellungen aktualisiert -settings.delete = Organisation löschen -settings.delete_account = Diese Organisation löschen -settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden! -settings.confirm_delete_account = Löschen -settings.hooks_desc = Füge Webhooks hinzu, die für <strong>alle</strong> Repositorys dieser Organisation ausgelöst werden. - -members.public = Öffentlich -members.public_helper = Privat machen -members.private = Privat -members.private_helper = Öffentlich machen -members.owner = Besitzer -members.member = Mitglied -members.conceal = Verbergen -members.remove = Entfernen -members.leave = Verlassen -members.invite_desc = Benutzernamen eingeben, um ihn als neues Mitglied in %s einzuladen: -members.invite_now = Jetzt einladen - -teams.join = Beitreten -teams.leave = Verlassen -teams.read_access = Lesezugriff -teams.read_access_helper = Dieses Team wird Repositorys einsehen und klonen können. -teams.write_access = Schreibzugriff -teams.write_access_helper = Dieses Team wird die Repositorys einsehen und in sie hinein pushen können. -teams.admin_access = Adminzugriff -teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können. -teams.no_desc = Dieses Team hat keine Beschreibung -teams.settings = Einstellungen -teams.owners_permission_desc = Besitzer haben vollen Zugriff auf <strong>alle Repositorys</strong> und <strong>Admin Rechte</strong> für diese Organisation. -teams.members = Teammitglieder -teams.update_settings = Einstellungen aktualisieren -teams.delete_team = Dieses Team löschen -teams.add_team_member = Teammitglied hinzufügen -teams.delete_team_success = Team gelöscht -teams.read_permission_desc = Dieses Team erlaubt <strong>Lesezugriff</strong>: Mitglieder können Team-Repositorys einsehen und klonen. -teams.write_permission_desc = Dieses Team erlaubt <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositorys einsehen und hinein pushen. -teams.admin_permission_desc = Diese Team erlaubt <strong>Adminzugriff</strong>: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.repositories = Team-Repositorys -teams.add_team_repository = Team-Repository hinzufügen -teams.remove_repo = Entfernen - -[admin] -dashboard = Dashboard -users = Benutzer -organizations = Organisationen -repositories = Repositorys -authentication = Authentifizierung -config = Konfiguration -monitor = Monitoring -prev = zurück -next = vor - -dashboard.statistic = Statistik -dashboard.operations = Operationen -dashboard.system_status = System-Monitor-Status -dashboard.statistic_info = GoGS Datenbank hat <b>%d</b> Benutzer, <b>%d</b> Organisationen, <b>%d</b> öffentliche Schlüssel, <b>%d</b> Repositorys, <b>%d</b> Beobachtungen, <b>%d</b> Markierungen, <b>%d</b> Aktionen, <b>%d</b> Zugriffe, <b>%d</b> Issues, <b>%d</b> Kommentare, <b>%d</b> soziale Konten, <b>%d</b> Folgende, <b>%d</b> Spiegel, <b>%d</b> Releases, <b>%d</b> Login-Quellen, <b>%d</b> Webhooks, <b>%d</b> Milestones, <b>%d</b> Labels, <b>%d</b> Hook-Tasks, <b>%d</b> Teams, <b>%d</b> Aktualisierungs-Tasks, <b>%d</b> Anhänge. -dashboard.operation_name = Name der Operation -dashboard.operation_switch = Switch -dashboard.operation_run = Ausführen -dashboard.clean_unbind_oauth = ungebundene OAuths bereinigen -dashboard.delete_inactivate_accounts = inaktive Konten löschen -dashboard.server_uptime = Server-Uptime -dashboard.current_goroutine = Aktuelle Goroutines -dashboard.current_memory_usage = Aktuelle Speichernutzung -dashboard.total_memory_allocated = Zugeteilter Gesamtspeicher -dashboard.memory_obtained = Erhaltener Speicher -dashboard.pointer_lookup_times = Pointer Lookup Times -dashboard.memory_allocate_times = Memory Allocate Times -dashboard.memory_free_times = Memory Free Times -dashboard.current_heap_usage = Aktuelle Heap-Auslastung -dashboard.heap_memory_obtained = erhaltener Heap-Memory -dashboard.heap_memory_idle = unbenutzter Heap-Memory -dashboard.heap_memory_in_use = benutzter Heap-Memory -dashboard.heap_memory_released = freigegebener Heap-Memory -dashboard.heap_objects = Heap-Objekte -dashboard.bootstrap_stack_usage = Bootstrap-Stack-Auslastung -dashboard.stack_memory_obtained = erhaltener Stack-Memory -dashboard.mspan_structures_usage = MSpan-Structures-Auslastung -dashboard.mspan_structures_obtained = erhaltene MSpan-Structures -dashboard.mcache_structures_usage = MCache-Structures-Auslastung -dashboard.mcache_structures_obtained = erhaltene MCache-Structures -dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained -dashboard.gc_metadata_obtained = erhaltene GC-Metadata -dashboard.other_system_allocation_obtained = andere erhaltene System-Allokatoren -dashboard.next_gc_recycle = nächster GC-Zyklus -dashboard.last_gc_time = seit letztem GC-Zyklus -dashboard.total_gc_time = gesammte GC-Zeit -dashboard.total_gc_pause = gesammte GC-Pause -dashboard.last_gc_pause = letzte GC-Pause -dashboard.gc_times = GC-Takt - -users.user_manage_panel = Benutzer -users.new_account = Neues Konto erstellen -users.name = Name -users.activated = Aktiviert -users.admin = Admin -users.repos = Repositorys -users.created = Erzeugt -users.edit = Bearbeiten -users.auth_source = Auth-Quelle -users.local = Lokal -users.auth_login_name = Auth-Login-Name -users.update_profile_success = Kontoprofil aktualisiert -users.edit_account = Konto bearbeiten -users.is_activated = Dieses Konto ist aktiviert -users.is_admin = Dieses Konto hat Administratorrechte -users.update_profile = Kontoprofil aktualisieren -users.delete_account = Dieses Konto löschen -users.still_own_repo = Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. - -orgs.org_manage_panel = Organisationenverwaltung -orgs.name = Name -orgs.teams = Teams -orgs.members = Mitglieder - -repos.repo_manage_panel = Repositorys -repos.owner = Besitzer -repos.name = Name -repos.private = Privat -repos.watches = Beobachtungen -repos.stars = Markierungen -repos.issues = Issues - -auths.auth_manage_panel = Authentifizierung -auths.new = Neue Authentifizierungsquelle hinzufügen -auths.name = Name -auths.type = Typ -auths.enabled = aktiviert -auths.updated = aktualisiert -auths.auth_type = Authentifizierungstyp -auths.auth_name = Authentifizierungsname -auths.domain = Domain -auths.host = Host -auths.port = Port -auths.base_dn = Base DN -auths.attributes = Suchattribute -auths.filter = Suchfilter -auths.ms_ad_sa = Ms Ad SA -auths.smtp_auth = SMTP-Authentifizierungstyp -auths.smtphost = SMTP-Host -auths.smtpport = SMTP-Port -auths.enable_tls = TLS-Verschlüsselung aktivieren -auths.enable_auto_register = Automatische Registrierung aktivieren -auths.tips = Tipps -auths.edit = Authentifizierungseinstellungen bearbeiten -auths.activated = Diese Authentifizierung ist aktiviert -auths.update_success = Authentifizierungseinstellungen aktualisiert -auths.update = Authentifizierungseinstellungen aktualisieren -auths.delete = Authentifizierung löschen - -config.server_config = Server-Konfiguration -config.app_name = Anwendungsname -config.app_ver = Anwendungsversion -config.app_url = Anwendungs-URL -config.domain = Domain -config.offline_mode = Offline-Modus -config.disable_router_log = Router-Log deaktivieren -config.run_user = Laufzeit-Benutzer -config.run_mode = Laufzeit-Modus -config.repo_root_path = Repository-Verzeichnis -config.static_file_root_path = Verzeichnis für statische Dateien -config.log_file_root_path = Log-Verzeichnis -config.script_type = Skript-Typ -config.reverse_auth_user = Reverse Authentication User -config.db_config = Datenbankkonfiguration -config.db_type = Typ -config.db_host = Host -config.db_name = Name -config.db_user = Benutzer -config.db_ssl_mode = SSL-Modus -config.db_ssl_mode_helper = (nur für "postgres") -config.db_path = Verzeichnis -config.db_path_helper = (nur für "sqlite3") -config.service_config = Service-Einstellungen -config.register_email_confirm = E-Mail-Bestätigung bei Registrierung -config.disable_register = Registrierung deaktivieren -config.require_sign_in_view = Ansehen erfordert Registrierung -config.mail_notify = E-Mail-Benachrichtigung -config.enable_cache_avatar = Avatar-Cache aktivieren -config.active_code_lives = Aktivierungscode Lebensdauer -config.reset_password_code_lives = Passwortcode Lebensdauer -config.webhook_config = Webhook-Einstellungen -config.task_interval = Task-Intervall -config.deliver_timeout = Zeitlimit für Zustellung -config.mailer_config = Mailer-Einstellungen -config.mailer_enabled = Aktiviert -config.mailer_name = Name -config.mailer_host = Host -config.mailer_user = Benutzer -config.oauth_config = OAuth-Einstellungen -config.oauth_enabled = Aktiviert -config.cache_config = Cache-Einstellungen -config.cache_adapter = Cache-Adapter -config.cache_interval = Cache-Intervall -config.cache_conn = Cache-Anbindung -config.session_config = Session-Einstellungen -config.session_provider = Session-Provider -config.provider_config = Provider-Einstellungen -config.cookie_name = Cookie-Name -config.enable_set_cookie = Cookies einschalten -config.gc_interval_time = GC-Intervallzeit -config.session_life_time = Session-Lebensdauer -config.https_only = nur HTTPS -config.cookie_life_time = Cookie-Lebensdauer -config.session_hash_function = Session-ID-Hashfunktion -config.session_hash_key = Session-ID-Hashschlüssel -config.picture_config = Bildeinstellungen -config.picture_service = Bildservice -config.disable_gravatar = Gravatar deaktivieren -config.log_config = Log-Einstellungen -config.log_mode = Log-Modus - -monitor.cron = Cron-Tasks -monitor.name = Name -monitor.schedule = Zeitplan -monitor.next = nächste Ausführung -monitor.previous = letzte Ausführung -monitor.execute_times = Anzahl Ausführungen -monitor.process = Laufende Prozesse -monitor.desc = Beschreibung -monitor.start = Startzeit -monitor.execute_time = Ausführungszeit - -[action] -create_repo = hat Repository <a href="%s/%s">%s</a> erstellt -commit_repo = hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht -create_issue = hat Issue <a href="%s/%s/issues/%s">%s#%s</a> eröffnet -comment_issue = hat Issue <a href="%s/%s/issues/%s">%s#%s</a> kommentiert -transfer_repo = hat Repository <code>%s</code> transferiert an <a href="/%s%s">%s</a> - -[tool] -ago = vor -from_now = ab sofort -now = Jetzt -1s = 1 Sekunde %s -1m = 1 Minute %s -1h = 1 Stunde %s -1d = 1 Tag %s -1w = 1 Woche %s -1mon = 1 Monat %s -1y = 1 Jahr %s -seconds = %d Sekunden %s -minutes = %d Minuten %s -hours = %d Stunden %s -days = %d Tage %s -weeks = %d Wochen %s -months = %d Monate %s -years = %d Jahre %s -raw_seconds = Sekunden -raw_minutes = Minuten +app_desc=Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go
+
+home=Home
+dashboard=Übersicht
+explore=Erkunden
+help=Hilfe
+sign_in=Anmelden
+social_sign_in=Anmeldung über soziales Konto: zweiter Schritt <small>Konto verknüpfen</small>
+sign_out=Abmelden
+sign_up=Registrieren
+register=Registrieren
+website=Webseite
+version=Version
+page=Seite
+template=Vorlage
+language=Sprache
+
+username=Benutzername
+email=E-Mail
+password=Passwort
+re_type=Passwort bestätigen
+captcha=Captcha
+
+repository=Repository
+organization=Organisation
+mirror=Spiegel
+new_repo=Neues Repository
+new_migrate=Neue Migration
+new_fork=Neues abgespaltetes Repository
+new_org=Neue Organisation
+manage_org=Organisationen verwalten
+admin_panel=Admin-Panel
+account_settings=Kontoeinstellungen
+settings=Einstellungen
+
+news_feed=News Feed
+pull_requests=Pull Requests
+issues=Issues
+
+cancel=Abbrechen
+
+[install]
+install=Installation
+title=Installation für erstmaligen Start
+requite_db_desc=Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert.
+db_type=Datenbanktyp
+host=Host
+user=Benutzer
+password=Passwort
+db_name=Datenbankname
+db_helper=Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MySQL.
+ssl_mode=SSL-Modus
+path=Pfad
+sqlite_helper=Der Dateipfad des SQLite3 Datenbank.
+general_title=Allgemeine Einstellungen von Gogs
+repo_path=Repository Root-Verzeichnispfad
+repo_path_helper=Alle Git-Repositorys werden in diesem Verzeichnis gespeichert.
+run_user=Ausführender Benutzer
+run_user_helper=Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein.
+domain=Domain
+domain_helper=Dies hat Auswirkung auf die SSH clone URLs.
+app_url=Anwendungs-URL
+app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails.
+email_title=E-Mail-Service-Einstellungen (optional)
+smtp_host=SMTP Host
+mailer_user=Sender E-mail
+mailer_password=Sender Passwort
+notify_title=Benachrichtigungseinstellungen (optional)
+register_confirm=Registrierungsbestätigung aktvieren
+mail_notify=E-Mail-Benachrichtgung aktivieren
+admin_title=Konto-Einstellungen für den Administrator
+admin_name=Benutzername
+admin_password=Passwort
+confirm_password=Passwort bestätigen
+admin_email=E-Mail
+install_gogs=Gogs installieren
+test_git_failed=Fehler beim Test des 'git' Kommandos: %v
+sqlite3_not_available=Deine Version unterstützt SQLite3 nicht, bitte lade dir die offizielle binäre Version von %s herunter, NICHT die gobuild-Version.
+invalid_db_setting=Datenbank-Einstellungen sind nicht korrekt: %v
+invalid_repo_path=Repository Root-Verzeichnis ist ungültig: %v
+run_user_not_match=Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s
+save_config_failed=Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v
+invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v
+install_success=Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit.
+
+[home]
+uname_holder=Benutzername oder E-Mail
+password_holder=Passwort
+switch_dashboard_context=Dashboard Kontext wechseln
+my_repos=Meine Repositorys
+collaborative_repos=Gemeinschaftliche Repositorys
+my_orgs=Meine Organisationen
+my_mirrors=Meine Spiegel
+
+[explore]
+repos=Repositorys
+
+[auth]
+create_new_account=Neues Konto erstellen
+register_hepler_msg=Du hast schon ein Konto? Jetzt anmelden!
+social_register_hepler_msg=Du hast schon ein soziales Konto? Jetzt verknüpfen!
+disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator.
+disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
+remember_me=angemeldet bleiben
+forgot_password=Passwort vergessen
+forget_password=Passwort vergessen?
+sign_up_now=Du willst ein Konto? Jetzt registrieren!
+confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Kontrolliere dein Postfach innerhalb der nächsten %d Stunden, um die Registrierung abzuschließen.
+sign_in_email=Melde dich mit deiner E-Mail-Adresse an
+active_your_account=Aktiviere dein Konto
+resent_limit_prompt=Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten.
+has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button.
+resend_mail=Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden
+email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
+send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
+reset_password=Passwort zurücksetzen
+invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.
+reset_password_helper=Hier klicken, um das Passwort zurückzusetzen
+password_too_short=Das Passwort muss mindenstens 6 Zeichen lang sein
+
+[form]
+UserName=Benutzername
+RepoName=Repository-Name
+Email=E-Mail-Adresse
+Password=Passwort
+Retype=Passwort bestätigen
+SSHTitle=SSH-Schlüsselname
+HttpsUrl=HTTPS-URL
+PayloadUrl=Payload-URL
+TeamName=Teamname
+AuthName=Authentifizierungsname
+AdminEmail=Admin E-mail
+
+require_error=` darf nicht leer sein.`
+alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.`
+alpha_dash_dot_error=` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.`
+min_size_error=` muss mindestens %s Zeichen enthalten.`
+max_size_error=` darf höchstens %s Zeichen enthalten.`
+email_error=` ist keine gültige E-Mail-Adresse.`
+url_error=` ist keine gültige URL.`
+unknown_error=Unbekannter Fehler:
+captcha_incorrect=Captcha stimmt nicht überein.
+password_not_match=Die Passwörter stimmen nicht überein.
+
+username_been_taken=Benutzername ist bereits vergeben.
+repo_name_been_taken=Repository-Name ist bereits vergeben.
+org_name_been_taken=Organisationsname ist bereits vergeben.
+team_name_been_taken=Teamname ist bereits vergeben.
+email_been_used=E-Mail-Adresse wird bereits verwendet.
+ssh_key_been_used=SSH-Schlüsselname wird bereits verwendet.
+illegal_username=Benutzername enthält ungültige Zeichen.
+illegal_repo_name=Repository-Name enthält ungültige Zeichen.
+illegal_org_name=Organisationsname enthält ungültige Zeichen.
+illegal_team_name=Teamname enthält ungültige Zeichen.
+username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
+enterred_invalid_repo_name=Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist.
+enterred_invalid_owner_name=Bitte stelle sicher, dass der eingegeben Besitzername richtig ist.
+enterred_invalid_password=Bitte stelle sicher, dass das eingegebene Passwort richtig ist.
+user_not_exist=Angegebener Benutzer existiert nicht.
+last_org_owner=Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben.
+
+invalid_ssh_key=Leider sind wir nicht in der Lage, deinen SSH-Schlüssel zu überprüfen: %s
+unable_verify_ssh_key=Gogs kann deinen SSH-Schlüssel nicht verifizieren, nimmt aber an, dass er gültig ist. Bitte stelle dies selbst sicher.
+auth_failed=Authentifizierung fehlgeschlagen: %v
+
+still_own_repo=Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+still_has_org=Ihr Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
+org_still_own_repo=Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+
+still_own_user=Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut.
+
+target_branch_not_exist=Ziel-Branch existiert nicht
+
+[user]
+change_avatar=Ändere dein Profilbild auf gravatar.com
+join_on=Registriert
+repositories=Repositorys
+activity=Öffentliche Aktivität
+followers=Folgen
+starred=Markiert
+following=Folgt
+
+[settings]
+profile=Profil
+password=Passwort
+ssh_keys=SSH-Schlüssel
+social=Soziale Konten
+applications=Anwendungen
+orgs=Organisationen
+delete=Konto löschen
+uid=Uid
+
+public_profile=Öffentliches Profil
+profile_desc=Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken.
+full_name=Vollständiger Name
+website=Webseite
+location=Standort
+update_profile=Profil aktualisieren
+update_profile_success=Profil aktualisiert
+change_username=Benutzername geändert
+change_username_desc=Benutzername wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die dein Konto betreffen.
+continue=Weiter
+cancel=Abbrechen
+
+change_password=Passwort ändern
+old_password=Aktuelles Passwort
+new_password=Neues Passwort
+password_incorrect=Aktuelles Passwort ist nicht korrekt.
+change_password_success=Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden.
+
+manage_ssh_keys=SSH-Schlüssel verwalten
+add_key=SSH-Schlüssel hinzufügen
+ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst.
+ssh_helper=<strong>Du brauchst Hilfe?</strong> Hier ist eine Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Problemlösen einfacher SSH-Probleme</a>.
+add_new_key=SSH-Schlüssel hinzufügen
+key_name=Schlüsselname
+key_content=Inhalt
+add_key_success=SSH-Schlüssel hinzugefügt
+delete_key=SSH-Schlüssel löschen
+add_on=Hinzugefügt am
+last_used=Zuletzt verwendet auf
+no_activity=Keine neuen Aktivitäten
+
+manage_social=Verknüpfte soziale Konten verwalten
+social_desc=Dies ist eine Liste verknüpfter sozialer Konten. Entferne alle Verknüpfungen, die du nicht kennst.
+unbind=Verknüpfung entfernen
+unbind_success=Die Verknüpfung zum sozialen Konto wurde entfernt.
+
+manage_access_token=Verwaltung persönlicher Zugangs-Tokens
+generate_new_token=Neues Token erzeugen
+tokens_desc=Die von dir erzeugten Tokens können zum Zugriff auf die Gogs-API verwendet werden.
+new_token_desc=Momentan erlaubt jedes Token vollen Zugriff auf dein Konto.
+token_name=Token-Name
+generate_token=Token erzeugen
+generate_token_succees=Neues Zugangs-Token wurde erstellt! Bitte kopiere dein persönliches Zugangs-Token jetzt. Du wirst es später nicht mehr anzeigen können!
+delete_token=Löschen
+delete_token_success=Persönliches Zugangs-Token wurde gelöscht! Vergiss nicht, auch deine Anwendungen zu aktualisieren.
+
+delete_account=Konto löschen
+delete_prompt=Diese Aktion wird dein Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
+confirm_delete_account=Löschen
+delete_account_title=Account löschen
+delete_account_desc=Du bist dabei dieses Konto dauerhaft zu löschen, willst du fortfahren?
+
+[repo]
+owner=Besitzer
+repo_name=Repository-Name
+repo_name_helper=Gute Repository-Namen sind kurz, einprägsam und <strong>einzigartig</strong>.
+visibility=Sichtbarkeit
+visiblity_helper=Dieses Repository ist <span class="label label-red label-radius">Privat</span>
+fork_repo=Repository abspalten
+fork_from=Abspaltung von
+fork_visiblity_helper=Sichtbarkeit von abgespalteten Repositories ist nicht veränderbar
+repo_desc=Beschreibung
+repo_lang=Sprache
+repo_lang_helper=Wähle eine .gitignore Datei
+license=Lizenz
+license_helper=Wähle eine Lizenz aus
+init_readme=Repository mit README.md initialisieren
+create_repo=Repository erstellen
+default_branch=Standard-Branch
+mirror_interval=Spiegel-Intervall (in Stunden)
+goget_meta=Go-Get Meta
+goget_meta_helper=Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können.
+
+need_auth=Authorisierung benötigt
+migrate_type=Migrationstyp
+migrate_type_helper=Dieses Repository wird ein <span class="label label-blue label-radius">Spiegel</span>
+migrate_repo=Repository migrieren
+
+copy_link=Kopieren
+click_to_copy=In Zwischenablage kopieren
+copied=Kopiert OK
+clone_helper=Du brauchst Hilfe beim Klonen? Hier gibt es <a target="_blank" href="%s">Hilfe</a>!
+unwatch=Beobachtung beenden
+watch=Beobachtung
+unstar=Markierung aufheben
+star=Markierung
+fork=Abspaltung
+
+no_desc=Keine Beschreibung
+quick_guide=Kurzanleitung
+clone_this_repo=Dieses Repository klonen
+create_new_repo_command=Erstelle ein neues Repository mittels der Kommandozeile
+push_exist_repo=Übertrage ein existierendes Repository von der Kommandozeile
+
+branch=Branch
+tree=Struktur
+branch_and_tags=Branches & Tags
+branches=Branches
+tags=Markierungen
+issues=Issues
+commits=Commits
+releases=Veröffentlichungen
+file_raw=Roh
+file_history=Verlauf
+file_view_raw=Ansicht Roh
+
+commits.commits=Commits
+commits.search=Durchsuche Commits
+commits.find=Finden
+commits.author=Author
+commits.message=Mitteilung
+commits.date=Datum
+commits.older=Älter
+commits.newer=Neuer
+
+settings=Einstellungen
+settings.options=Optionen
+settings.collaboration=Zusammenarbeit
+settings.hooks=Webhooks
+settings.githooks=Git-Hooks
+settings.deploy_keys=Deploy-Keys
+settings.basic_settings=Grundeinstellungen
+settings.danger_zone=Gefahrenzone
+settings.site=Offizielle Webseite
+settings.update_settings=Aktualisierungseinstellungen
+settings.change_reponame=Name des Repositories geändert
+settings.change_reponame_desc=Repository-Name wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die dieses Repository betreffen.
+settings.transfer=Besitz übertragen
+settings.transfer_desc=Übertrage dieses Repository einem anderen Benutzer oder einer Organisation.
+settings.new_owner_has_same_repo=Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen.
+settings.delete=Repository löschen
+settings.delete_desc=Wenn dieses Repository gelöscht ist, gibt es keinen Weg zurück. Sei dir sicher!
+settings.transfer_notices=<p>- Du wirst den Zugriff verlieren, falls der neue Besitzer ein einzelner Benutzer ist.</p><p>- Du wirst deinen Zugang behalten, falls der neue Besitzer eine Organisation ist, und du zu ihren Besitzern gehörst.</p>
+settings.update_settings_success=Repository-Optionen aktualisiert
+settings.transfer_owner=Neuer Besitzer
+settings.make_transfer=übertragen
+settings.transfer_succeed=Repository-Eigentum wurde erfolgreich übertragen.
+settings.confirm_delete=Löschen
+settings.add_collaborator=Mitarbeiter hinzufügen
+settings.add_collaborator_success=Mitarbeiter hinzugefügt
+settings.remove_collaborator_success=Mitarbeiter entfernt
+settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden.
+settings.add_webhook=Webhook hinzufügen
+settings.hooks_desc=Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="%s">Webhooks Guide</a>.
+settings.githooks_desc=Git-Hooks werden von Git selbst bereitgestellt. Du kannst die Dateien der unterstützten Hooks in der Liste unten bearbeiten, um eigene Operationen einzubinden.
+settings.githook_edit_desc=Wenn ein Hook nicht aktiv ist, wird der Standardinhalt benutzt. Lasse den Inhalt leer, um den Hook zu deaktivieren.
+settings.githook_name=Hook-Name
+settings.githook_content=Hook-Inhalt
+settings.update_githook=Aktualisiere Hook
+settings.remove_hook_success=Webhook entfernt
+settings.add_webhook_desc=GoGS sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="%s">Webhooks Guide</a>.
+settings.payload_url=Payload-URL
+settings.content_type=Inhaltstyp
+settings.secret=Secret
+settings.event_desc=Welche Ereignisse sollen diesen Webhook auslösen?
+settings.event_push_only=Nur das <code>push</code>-Ereignis.
+settings.active=Aktiv
+settings.active_helper=Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird.
+settings.add_hook_success=Webhook hinzugefügt
+settings.update_webhook=Webhook aktualisieren
+settings.update_hook_success=Webhook aktualisiert
+settings.delete_webhook=Webhook löschen
+settings.recent_deliveries=letzte Zustellungen
+settings.hook_type=Hook Typ
+settings.add_slack_hook_desc=Füge <a href="%s">Slack</a>-Integration zu deinem Repository hinzu.
+settings.slack_token=Token
+settings.slack_domain=Domain
+settings.slack_channel=Kanal
+
+diff.browse_source=Quellcode durchsuchen
+diff.parent=Ursprung
+diff.commit=Commit
+diff.data_not_available=Keine Diff-Daten verfügbar.
+diff.show_diff_stats=Diff-Statistik anzeigen
+diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen Zeilen</strong> und <strong>%d gelöschten Zeilen</strong>
+diff.bin=BIN
+diff.view_file=Datei anzeigen
+
+[org]
+org_name_holder=Name der Organisation
+org_name_helper=Gute Namen von Organisationen sind kurz und einprägsam.
+org_email_helper=Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen.
+create_org=Organisation erstellen
+repo_updated=Aktualisiert
+people=Personen
+invite_someone=Benutzer einladen
+teams=Teams
+lower_members=Mitglieder
+lower_repositories=Repositorys
+create_new_team=Neues Team erstellen
+org_desc=Beschreibung
+team_name=Teamname
+team_desc=Beschreibung
+team_name_helper=Verwende diesen Namen, um dich auf dieses Team zu beziehen.
+team_desc_helper=Was hat es mit diesem Team auf sich?
+team_permission_desc=Welche Berechtigungsstufe soll das Team haben?
+
+settings=Einstellungen
+settings.options=Optionen
+settings.full_name=Vollständiger Name
+settings.website=Webseite
+settings.location=Standort
+settings.update_settings=Aktualisierungseinstellungen
+settings.change_orgname=Organisationsname geändert
+settings.change_orgname_desc=Organisationsname wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die diese Organisation betreffen.
+settings.update_setting_success=Organisationseinstellungen aktualisiert
+settings.delete=Organisation löschen
+settings.delete_account=Diese Organisation löschen
+settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden!
+settings.confirm_delete_account=Löschen
+settings.delete_org_title=Organisation löschen
+settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht, möchtest du fortfahren?
+settings.hooks_desc=Füge Webhooks hinzu, die für <strong>alle</strong> Repositorys dieser Organisation ausgelöst werden.
+
+members.public=Öffentlich
+members.public_helper=Privat machen
+members.private=Privat
+members.private_helper=Öffentlich machen
+members.owner=Besitzer
+members.member=Mitglied
+members.conceal=Verbergen
+members.remove=Entfernen
+members.leave=Verlassen
+members.invite_desc=Benutzernamen eingeben, um ihn als neues Mitglied in %s einzuladen:
+members.invite_now=Jetzt einladen
+
+teams.join=Beitreten
+teams.leave=Verlassen
+teams.read_access=Lesezugriff
+teams.read_access_helper=Dieses Team wird Repositorys einsehen und klonen können.
+teams.write_access=Schreibzugriff
+teams.write_access_helper=Dieses Team wird die Repositorys einsehen und in sie hinein pushen können.
+teams.admin_access=Adminzugriff
+teams.admin_access_helper=Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können.
+teams.no_desc=Dieses Team hat keine Beschreibung
+teams.settings=Einstellungen
+teams.owners_permission_desc=Besitzer haben vollen Zugriff auf <strong>alle Repositorys</strong> und <strong>Admin Rechte</strong> für diese Organisation.
+teams.members=Teammitglieder
+teams.update_settings=Einstellungen aktualisieren
+teams.delete_team=Dieses Team löschen
+teams.add_team_member=Teammitglied hinzufügen
+teams.delete_team_title=Team löschen
+teams.delete_team_desc=Dieses Team wird gelöscht, möchtest du fortfahren? Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories.
+teams.delete_team_success=Team gelöscht
+teams.read_permission_desc=Dieses Team hat <strong>Lesezugriff</strong>: Mitglieder können Team-Repositories einsehen und klonen.
+teams.write_permission_desc=Dieses Team erlaubt <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositorys einsehen und hinein pushen.
+teams.admin_permission_desc=Diese Team erlaubt <strong>Adminzugriff</strong>: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen.
+teams.repositories=Team-Repositorys
+teams.add_team_repository=Team-Repository hinzufügen
+teams.remove_repo=Entfernen
+teams.add_nonexistent_repo=Das Repository, das du hinzufügen willst, existiert nicht. Bitte erstelle es zuerst.
+
+[admin]
+dashboard=Dashboard
+users=Benutzer
+organizations=Organisationen
+repositories=Repositorys
+authentication=Authentifizierung
+config=Konfiguration
+notices=System-Mitteilungen
+monitor=Monitoring
+prev=zurück
+next=vor
+
+dashboard.statistic=Statistik
+dashboard.operations=Operationen
+dashboard.system_status=System-Monitor-Status
+dashboard.statistic_info=GoGS Datenbank hat <b>%d</b> Benutzer, <b>%d</b> Organisationen, <b>%d</b> öffentliche Schlüssel, <b>%d</b> Repositorys, <b>%d</b> Beobachtungen, <b>%d</b> Markierungen, <b>%d</b> Aktionen, <b>%d</b> Zugriffe, <b>%d</b> Issues, <b>%d</b> Kommentare, <b>%d</b> soziale Konten, <b>%d</b> Folgende, <b>%d</b> Spiegel, <b>%d</b> Releases, <b>%d</b> Login-Quellen, <b>%d</b> Webhooks, <b>%d</b> Milestones, <b>%d</b> Labels, <b>%d</b> Hook-Tasks, <b>%d</b> Teams, <b>%d</b> Aktualisierungs-Tasks, <b>%d</b> Anhänge.
+dashboard.operation_name=Name der Operation
+dashboard.operation_switch=Switch
+dashboard.operation_run=Ausführen
+dashboard.clean_unbind_oauth=ungebundene OAuths bereinigen
+dashboard.delete_inactivate_accounts=inaktive Konten löschen
+dashboard.server_uptime=Server-Uptime
+dashboard.current_goroutine=Aktuelle Goroutines
+dashboard.current_memory_usage=Aktuelle Speichernutzung
+dashboard.total_memory_allocated=Zugeteilter Gesamtspeicher
+dashboard.memory_obtained=Erhaltener Speicher
+dashboard.pointer_lookup_times=Pointer Lookup Times
+dashboard.memory_allocate_times=Memory Allocate Times
+dashboard.memory_free_times=Memory Free Times
+dashboard.current_heap_usage=Aktuelle Heap-Auslastung
+dashboard.heap_memory_obtained=erhaltener Heap-Memory
+dashboard.heap_memory_idle=unbenutzter Heap-Memory
+dashboard.heap_memory_in_use=benutzter Heap-Memory
+dashboard.heap_memory_released=freigegebener Heap-Memory
+dashboard.heap_objects=Heap-Objekte
+dashboard.bootstrap_stack_usage=Bootstrap-Stack-Auslastung
+dashboard.stack_memory_obtained=erhaltener Stack-Memory
+dashboard.mspan_structures_usage=MSpan-Structures-Auslastung
+dashboard.mspan_structures_obtained=erhaltene MSpan-Structures
+dashboard.mcache_structures_usage=MCache-Structures-Auslastung
+dashboard.mcache_structures_obtained=erhaltene MCache-Structures
+dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained
+dashboard.gc_metadata_obtained=erhaltene GC-Metadata
+dashboard.other_system_allocation_obtained=andere erhaltene System-Allokatoren
+dashboard.next_gc_recycle=nächster GC-Zyklus
+dashboard.last_gc_time=seit letztem GC-Zyklus
+dashboard.total_gc_time=gesammte GC-Zeit
+dashboard.total_gc_pause=gesammte GC-Pause
+dashboard.last_gc_pause=letzte GC-Pause
+dashboard.gc_times=GC-Takt
+
+users.user_manage_panel=Benutzer
+users.new_account=Neues Konto erstellen
+users.name=Name
+users.activated=Aktiviert
+users.admin=Admin
+users.repos=Repositorys
+users.created=Erzeugt
+users.edit=Bearbeiten
+users.auth_source=Auth-Quelle
+users.local=Lokal
+users.auth_login_name=Auth-Login-Name
+users.update_profile_success=Kontoprofil aktualisiert
+users.edit_account=Konto bearbeiten
+users.is_activated=Dieses Konto ist aktiviert
+users.is_admin=Dieses Konto hat Administratorrechte
+users.allow_git_hook=Dieses Konto verfügt über Berechtigungen zum Erstellen von Git hooks
+users.update_profile=Kontoprofil aktualisieren
+users.delete_account=Dieses Konto löschen
+users.still_own_repo=Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+users.still_has_org=Dieses Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
+
+orgs.org_manage_panel=Organisationenverwaltung
+orgs.name=Name
+orgs.teams=Teams
+orgs.members=Mitglieder
+
+repos.repo_manage_panel=Repositorys
+repos.owner=Besitzer
+repos.name=Name
+repos.private=Privat
+repos.watches=Beobachtungen
+repos.stars=Markierungen
+repos.issues=Issues
+
+auths.auth_manage_panel=Authentifizierung
+auths.new=Neue Authentifizierungsquelle hinzufügen
+auths.name=Name
+auths.type=Typ
+auths.enabled=aktiviert
+auths.updated=aktualisiert
+auths.auth_type=Authentifizierungstyp
+auths.auth_name=Authentifizierungsname
+auths.domain=Domain
+auths.host=Host
+auths.port=Port
+auths.base_dn=Base DN
+auths.attributes=Suchattribute
+auths.filter=Suchfilter
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP-Authentifizierungstyp
+auths.smtphost=SMTP-Host
+auths.smtpport=SMTP-Port
+auths.enable_tls=TLS-Verschlüsselung aktivieren
+auths.enable_auto_register=Automatische Registrierung aktivieren
+auths.tips=Tipps
+auths.edit=Authentifizierungseinstellungen bearbeiten
+auths.activated=Diese Authentifizierung ist aktiviert
+auths.update_success=Authentifizierungseinstellungen aktualisiert
+auths.update=Authentifizierungseinstellungen aktualisieren
+auths.delete=Authentifizierung löschen
+auths.delete_auth_title=Authentifizierungsquelle löschen
+auths.delete_auth_desc=Diese Authentifizierungsquelle wird gelöscht, möchtest du fortfahren?
+
+config.server_config=Server-Konfiguration
+config.app_name=Anwendungsname
+config.app_ver=Anwendungsversion
+config.app_url=Anwendungs-URL
+config.domain=Domain
+config.offline_mode=Offline-Modus
+config.disable_router_log=Router-Log deaktivieren
+config.run_user=Laufzeit-Benutzer
+config.run_mode=Laufzeit-Modus
+config.repo_root_path=Repository-Verzeichnis
+config.static_file_root_path=Verzeichnis für statische Dateien
+config.log_file_root_path=Log-Verzeichnis
+config.script_type=Skript-Typ
+config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung
+config.db_config=Datenbankkonfiguration
+config.db_type=Typ
+config.db_host=Host
+config.db_name=Name
+config.db_user=Benutzer
+config.db_ssl_mode=SSL-Modus
+config.db_ssl_mode_helper=(nur für "postgres")
+config.db_path=Verzeichnis
+config.db_path_helper=(nur für "sqlite3")
+config.service_config=Service-Einstellungen
+config.register_email_confirm=E-Mail-Bestätigung bei Registrierung
+config.disable_register=Registrierung deaktivieren
+config.require_sign_in_view=Ansehen erfordert Registrierung
+config.mail_notify=E-Mail-Benachrichtigung
+config.enable_cache_avatar=Avatar-Cache aktivieren
+config.active_code_lives=Aktivierungscode Lebensdauer
+config.reset_password_code_lives=Passwortcode Lebensdauer
+config.webhook_config=Webhook-Einstellungen
+config.task_interval=Task-Intervall
+config.deliver_timeout=Zeitlimit für Zustellung
+config.mailer_config=Mailer-Einstellungen
+config.mailer_enabled=Aktiviert
+config.mailer_name=Name
+config.mailer_host=Host
+config.mailer_user=Benutzer
+config.oauth_config=OAuth-Einstellungen
+config.oauth_enabled=Aktiviert
+config.cache_config=Cache-Einstellungen
+config.cache_adapter=Cache-Adapter
+config.cache_interval=Cache-Intervall
+config.cache_conn=Cache-Anbindung
+config.session_config=Session-Einstellungen
+config.session_provider=Session-Provider
+config.provider_config=Provider-Einstellungen
+config.cookie_name=Cookie-Name
+config.enable_set_cookie=Cookies einschalten
+config.gc_interval_time=GC-Intervallzeit
+config.session_life_time=Session-Lebensdauer
+config.https_only=nur HTTPS
+config.cookie_life_time=Cookie-Lebensdauer
+config.picture_config=Bildeinstellungen
+config.picture_service=Bildservice
+config.disable_gravatar=Gravatar deaktivieren
+config.log_config=Log-Einstellungen
+config.log_mode=Log-Modus
+
+monitor.cron=Cron-Tasks
+monitor.name=Name
+monitor.schedule=Zeitplan
+monitor.next=nächste Ausführung
+monitor.previous=letzte Ausführung
+monitor.execute_times=Anzahl Ausführungen
+monitor.process=Laufende Prozesse
+monitor.desc=Beschreibung
+monitor.start=Startzeit
+monitor.execute_time=Ausführungszeit
+
+notices.system_notice_list=System-Mitteilungen
+notices.type=Typ
+notices.type_1=Repository
+notices.desc=Beschreibung
+notices.op=Op.
+notices.delete_success=System-Mitteilung erfolgreich gelöscht.
+
+[action]
+create_repo=hat Repository <a href="%s/%s">%s</a> erstellt
+commit_repo=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
+create_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> eröffnet
+comment_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> kommentiert
+transfer_repo=hat Repository <code>%s</code> transferiert an <a href="/%s%s">%s</a>
+push_tag=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
+compare_2_commits=Zeige Vergleich dieser 2 Commits
+
+[tool]
+ago=vor
+from_now=ab sofort
+now=Jetzt
+1s=%s 1 Sekunde
+1m=%s 1 Minute
+1h=%s 1 Stunde
+1d=%s 1 Tag
+1w=%s 1 Woche
+1mon=%s 1 Monat
+1y=%s 1 Jahr
+seconds=%[2]s %[1]d Sekunden
+minutes=%[2]s %[1]d Minuten
+hours=%[2]s %[1]d Stunden
+days=%[2]s %[1]d Tagen
+weeks=%[2]s %[1]d Wochen
+months=%[2]s %[1]d Monaten
+years=%[2]s %[1]d Jahren
+raw_seconds=Sekunden
+raw_minutes=Minuten
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 4b85143a..a061bcb2 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -26,6 +26,7 @@ organization = Organization mirror = Mirror new_repo = New Repository new_migrate = New Migration +new_fork = New Fork Repository new_org = New Organization manage_org = Manage Organizations admin_panel = Admin Panel @@ -41,7 +42,7 @@ cancel = Cancel [install] install = Installation title = Install Steps For First-time Run -requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3, but SQLite3. +requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3. db_type = Database Type host = Host user = User @@ -74,7 +75,7 @@ confirm_password = Confirm Password admin_email = E-mail install_gogs = Install Gogs test_git_failed = Fail to test 'git' command: %v -sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from http://gogs.io/docs/installation/install_from_binary.html, NOT the gobuild version. +sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version. invalid_db_setting = Database setting is not correct: %v invalid_repo_path = Repository root path is invalid: %v run_user_not_match = Run user isn't the current user: %s -> %s @@ -163,10 +164,13 @@ unable_verify_ssh_key = Gogs cannot verify your SSH key, but we assume that is v auth_failed = Authentication failed: %v still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first. +still_has_org = Your account still have membership of organization, you have to left or delete them first. org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first. still_own_user = This authentication still has used by some users, you should move them and then delete again. +target_branch_not_exist = Target branch does not exist + [user] change_avatar = Change your avatar at gravatar.com join_on = Joined on @@ -181,6 +185,7 @@ profile = Profile password = Password ssh_keys = SSH Keys social = Social Accounts +applications = Applications orgs = Organizations delete = Delete Account uid = Uid @@ -206,7 +211,7 @@ change_password_success = Password is changed successfully. You can now sign in manage_ssh_keys = Manage SSH Keys add_key = Add Key ssh_desc = This is a list of SSH keys associated with your account. Remove any keys that you do not recognize. -ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="https://help.github.com/articles/generating-ssh-keys">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/">common SSH Problems</a>. +ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="%s">generating SSH keys</a> or troubleshoot <a href="%s">common SSH Problems</a>. add_new_key = Add SSH Key key_name = Key Name key_content = Content @@ -221,6 +226,16 @@ social_desc = This is a list of associated social accounts. Remove any binding t unbind = Unbind unbind_success = Social account has been unbound. +manage_access_token = Manage Personal Access Tokens +generate_new_token = Generate New Token +tokens_desc = Tokens you have generated that can be used to access the Gogs API. +new_token_desc = As for now, every token will have full access to your account. +token_name = Token Name +generate_token = Generate Token +generate_token_succees = New access token has been generated successfully! Make sure to copy your new personal access token now. You won't be able to see it again! +delete_token = Delete +delete_token_success = Personal access token has been deleted successfully! Don't forget to update your applications as well. + delete_account = Delete Your Account delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone! confirm_delete_account = Confirm Deletion @@ -233,6 +248,9 @@ repo_name = Repository Name repo_name_helper = Great repository names are short, memorable and <strong>unique</strong>. visibility = Visibility visiblity_helper = This repository is <span class="label label-red label-radius">Private</span> +fork_repo = Fork Repository +fork_from = Fork From +fork_visiblity_helper = Forked repository cannot change its visiblity repo_desc = Description repo_lang = Language repo_lang_helper = Select a .gitignore file @@ -253,7 +271,7 @@ migrate_repo = Migrate Repository copy_link = Copy click_to_copy = Copy to clipboard copied = Copied OK -clone_helper = Need help cloning? Visit <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">Help</a>! +clone_helper = Need help cloning? Visit <a target="_blank" href="%s">Help</a>! unwatch = Unwatch watch = Watch unstar = Unstar @@ -315,14 +333,14 @@ settings.add_collaborator_success = New collaborator has been added. settings.remove_collaborator_success = Collaborator has been removed. settings.user_is_org_member = User is organization member who cannot be added as a collaborator. settings.add_webhook = Add Webhook -settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>. +settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="%s">Webhooks Guide</a>. settings.githooks_desc = Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to apply custom operations. settings.githook_edit_desc = If hook is not active, sample content will be presented. Leave content to be blank will disable this hook. settings.githook_name = Hook Name settings.githook_content = Hook Content settings.update_githook = Update Hook settings.remove_hook_success = Webhook has been removed. -settings.add_webhook_desc = We’ll send a <code>POST</code> request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). More information can be found in <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>. +settings.add_webhook_desc = We’ll send a <code>POST</code> request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). More information can be found in <a target="_blank" href="%s">Webhooks Guide</a>. settings.payload_url = Payload URL settings.content_type = Content Type settings.secret = Secret @@ -336,7 +354,7 @@ settings.update_hook_success = Webhook has been updated. settings.delete_webhook = Delete Webhook settings.recent_deliveries = Recent Deliveries settings.hook_type = Hook Type -settings.add_slack_hook_desc = Add <a href="http://slack.com">Slack</a> integration to your repository. +settings.add_slack_hook_desc = Add <a href="%s">Slack</a> integration to your repository. settings.slack_token = Token settings.slack_domain = Domain settings.slack_channel = Channel @@ -490,9 +508,11 @@ users.update_profile_success = Account profile has been successfully updated. users.edit_account = Edit Account users.is_activated = This account is activated users.is_admin = This account has administrator permissions +users.allow_git_hook = This account has permissions to create Git hooks users.update_profile = Update Account Profile users.delete_account = Delete This Account users.still_own_repo = This account still have ownership of repository, you have to delete or transfer them first. +users.still_has_org = This account still have membership of organization, you have to left or delete them first. orgs.org_manage_panel = Organization Manage Panel orgs.name = Name @@ -590,8 +610,6 @@ config.gc_interval_time = GC Interval Time config.session_life_time = Session Life Time config.https_only = HTTPS Only config.cookie_life_time = Cookie Life Time -config.session_hash_function = Session ID Hash Function -config.session_hash_key = Session ID Hash Key config.picture_config = Picture Configuration config.picture_service = Picture Service config.disable_gravatar = Disable Gravatar diff --git a/conf/locale/locale_fr-CA.ini b/conf/locale/locale_fr-CA.ini index 3f5d705f..5ebe53e0 100644..100755 --- a/conf/locale/locale_fr-CA.ini +++ b/conf/locale/locale_fr-CA.ini @@ -1,516 +1,679 @@ -app_desc = Un service Git écrit en Go auto-hébergé - -home = Accueil -dashboard = Tableau de bord -explore = Explorer -help = Aide -sign_in = Connexion -social_sign_in = Authentification via Internet: 2ème étape <small>associé le compte</small> -sign_out = Déconnexion -sign_up = Créer un compte -register = S'inscrire -website = Site web -version = Version -page = Page -template = Gabarit -language = Langage - -username = Usager -email = Courriel -password = Mot de passe -re_type = Saisir à nouveau -captcha = Captcha - -repository = Dépôt -organization = Organisation -mirror = Mirroir -new_repo = Nouveau dépôt -new_migrate = Nouvelle migration -new_org = Nouvel organisation -manage_org = Gestion des organisations -admin_panel = Gestion -account_settings = Profil usager -settings = Configuration - -news_feed = Fil de nouvelles -pull_requests = Demandes de fusion (pull requests) -issues = Suivi de problèmes - -cancel = Annuler - -[home] -uname_holder = Nom d'usager ou courriel -password_holder = Mot de passe -switch_dashboard_context = Changer de tableau de bord -my_repos = Mes dépôts -collaborative_repos = Dépôts partagés -my_orgs = Mes organisations -my_mirrors = Mes mirroirs - -[auth] -create_new_account = Créer un nouveau compte -register_hepler_msg = Déjà inscrits? Connectez-vous maintenant! -social_register_hepler_msg = Déjà inscrits? Branchez-vous! -disable_register_prompt = Désolé, l'auto-inscription n'est pas activée. Contactez l'admnistrateur du site. -disable_register_mail = Désolé, la confirmation d'inscription par courriel est désactivée. Contactez l'administrateur du site. -remember_me = Se souvenir de moi -forgot_password= Mot de passe oublié -forget_password = Mot de passe oublié? -sign_up_now = Besoin d'un compte? Inscrivez-vous maintenant. -confirmation_mail_sent_prompt = Un courriel de confirmation à été envoyé à <b>%s</b>, consultez vos courriels d'ici %d heures pour terminer l'inscription. -sign_in_email = Connexion avec votre courriel -active_your_account = Activez votre compte -resent_limit_prompt = Désolé vous demandez trop souvent un courriel de confirmation. S.v.p. patientez 3 minutes. -has_unconfirmed_mail = Bonjour %s, votre adresse courriel n'est pas vérifiée(<b>%s</b>). Si vous n'avez pas reçu de courriel de confirmation ou si vous avez besoin d'en envoyer un maintenant, appuyez sur le bouton ci-dessous. -resend_mail = Appuyez ici pour envoyer de nouveau un courriel de confirmation. -email_not_associate = Ce courriel ne correspond à aucun compte. -send_reset_mail = Appuyez ici pour (ré)envoyer un courriel pour réinitialiser le mot de passe. -reset_password = Réinitialiser votre mot de passe -invalid_code = Désolé, ce code de confirmation est périmé ou non-valide. -reset_password_helper = Appuyez ici pour réinitialiser votre mot de passe -password_too_short = La longueur du mot de passe doit être d'au moins 6 caractères. - -[form] -UserName = Nom d'usager -RepoName = Nom du dépôt -Email = Adresse de courriel -Password = Mot de passe -Retype = Mot de passe (confirmation) -SSHTitle = Nom de la clé SSH -HttpsUrl = URL HTTPS -PayloadUrl = URL cible -TeamName = Nom de l'équipe -AuthName = Nom d'usager - -require_error = ` ne peut être vide.` -alpha_dash_error = ` doit être composé de caractères alpha-numériques et/ou d'un tiret(-_).` -alpha_dash_dot_error = ` doit être composé de caractères alpha-numérique, un point(.) et/ou tiret(-_).` -min_size_error = ` doit être composé d'au moins %s caractères.` -max_size_error = ` doit être conposé d'au plus %s caractères.` -email_error = ` n'est pas une adresse de courriel bien formée.` -url_error = ` n'est pas un URL valide.` -unknown_error = Erreur inconnue: -captcha_incorrect = Le captcha ne concorde pas. -password_not_match = Les deux mots de passe diffèrent. - -username_been_taken = `Nom d'usager dèjà utilisé.` -repo_name_been_taken = Nom de dépôt déjà utilisé. -org_name_been_taken = Nom d'organisation déjà utilisé. -team_name_been_taken = Nom d'équipe déjà utilisé. -email_been_used = Adresse de courriel déjà utilisée. -ssh_key_been_used = Nom de clé publique déjà utilisé. -illegal_username = Votre nom d'usager contient des caractères interdits. -illegal_repo_name = Le nom du dépôt contient des caractères interdits. -illegal_org_name = Le nom de l'organisation contient des caractères interdits. -illegal_team_name = Le nom de l'équipe contient des caractères interdits. -username_password_incorrect = Nom d'usager ou mot de passe erroné. -enterred_invalid_repo_name = Nom de dépôt inexistant. -enterred_invalid_owner_name = Responsable de dépôt inexistant. -enterred_invalid_password = Mot de passe erroné. -user_not_exist = Nom d'usager inexistant. -last_org_owner = Ceci est le dernier responsable du dépôt. Il doit y avoir obligatoirement au moins un usager responsable. - -invalid_ssh_key = Désolé, impossible de vérifier votre clé SSH: % -auth_failed = Erreur d'authentification : %v - -still_own_repo = Votre compte est responsable d'au moins un dépôt. Vous devez soit détruire ces dépôts, soit transférer la responsabilité à un autre usager. -org_still_own_repo = Cette organisation est responsable d'au moins un dépôt. Vous devez soit détruire ces dépôts, soit transférer la responsabilité à un autre usager ou organisation. - -still_own_user = Cette authentification est utilisée par un usager. - -[settings] -profile = Profil -password = Mot de passe -ssh_keys = Clés SSH -social = Comptes Internet -orgs = Organisations -delete = Supprimer votre compte - -public_profile = Profil public -profile_desc = Votre adresse de courriel est publique et sera utilisée pour les avis produits par le site. -full_name = Nom complet -website = Site web -location = Endroit -update_profile = Mettre à jour le profil -update_profile_success = Mise à jour du profil réussie. - -change_password = Changer le mot de passe -old_password = Mot de passe actuel -new_password = Nouveau mot de passe -password_incorrect = Mot de passe actuel erroné. -change_password_success = Modification du mot de passe effectuée. Vous pouvez dorénavant vous connecter avec le nouveau mot de passe. - -manage_ssh_keys = Gestion des clés SSH -add_key = Ajouter une clé -ssh_desc = Voici la liste de clés SSH associées à votre profil. Retirez les clés que vous ne reconnaissez pas. -ssh_helper = <strong>Beson d'aide?</strong> Consultez le guide au <a href="https://help.github.com/articles/generating-ssh-keys">generating SSH keys</a> ou vérifiez <a href="https://help.github.com/ssh-issues/">les problèmes SSH fréquents</a>. -add_new_key = Ajouter une clé SSH -key_name = Nom de la clé -key_content = Contenu -add_key_success = Clé SSH ajoutée! -delete_key = Détruire -add_on = Ajoutée le -last_used = Dernière utilisation le -no_activity = Pas d'activité récente - -manage_social = Gestion des comptes Internets associés -social_desc = Ceci est une liste de comptes Internet associés. Retirez les comptes que vous ne reconnaissez pas. -unbind = Désassocier -unbind_success = Compte Internet déassocié. - -delete_account = Detruire votre compte -delete_prompt = Cette opération détruira votre compte et <strong>ne pourra être annulée</strong>! -confirm_delete_account = Confirmez la suppression - -[repo] -owner = Responsable -repo_name = Nom du dépôt -repo_name_helper = Les bons noms de dépôts sont courts, mémorables et <strong>uniques</strong>. -visibility = Visibilité -visiblity_helper = Ce dépôt est <span class="label label-red label-radius">privé</span> -repo_desc = Description -repo_lang = Langue -repo_lang_helper = Choisir un fichier .gitignore -license = License -license_helper = Choisir un fichier de licence -init_readme = Initialiser le dépôt avec un fichier README.md -create_repo = Créer le dépôt -default_branch = Branche par défaut -mirror_interval = Intervale de synchronisation (heures) -goget_meta = Métadonnées Go-Get -goget_meta_helper = Ce dépôt sera <span class="label label-blue label-radius">Go-Getable</span> - -need_auth = Authorisation requise -migrate_type = Type de migration -migrate_type_helper = Ce dépôt sera un <span class="label label-blue label-radius">mirroir</span> -migrate_repo = Migrer le dépôt - -copy_link = Copier -clone_helper = Besoin d'aide pour cloner? Obtenez de l' <a target="_blank" href="http://git-scm.com/book/fr/Les-bases-de-Git-Démarrer-un-dépôt-Git">aide</a>! -unwatch = Ne plus suivre -watch = Suivre -unstar = Retirer étoile -star = Étoile -fork = Fork - -quick_guide = Guide rapide -clone_this_repo = Cloner ce dépôt -create_new_repo_command = Créer un nouveau dépôt à la ligne de commande -push_exist_repo = Pousser un dépôt existant depuis la ligne de commande - -settings = Réglages -settings.options = Réglages de base -settings.collaboration = Collaboration -settings.hooks = Webhooks -settings.deploy_keys = Clé de déploiement -settings.basic_settings = réglages de base -settings.danger_zone = Danger! -settings.site = Site officiel -settings.update_settings = Réglage des mises à jour -settings.transfer = Transférer la responsabilité -settings.transfer_desc = Transférer ce dépôt à un autre usager ou organisation si vous en avez la responsabilité. -settings.delete = Détruire ce dépôt -settings.delete_desc = La destruction est irrémédiable, impossible d'annuler. Soyez sûr de votre décision. -settings.update_settings_success = Réglages modifiés -settings.transfer_owner = Nouveau responsable -settings.make_transfer = Faire le transfert -settings.confirm_delete = Confirmer la destruction -settings.add_collaborator = Ajouter un nouveau collaborateur -settings.add_collaborator_success = Nouveau collaborateur ajouté. -settings.remove_collaborator_success = Collaborateur supprimé. -settings.add_webhook = Ajouter un Webhook -settings.hooks_desc = Les Webhooks permettent à des services externes d'être avertis de certains changements sur Gogs. Lorque qu'un changement se produit, Gogs envoie une requête POST à chacun des URLs spécifiés. Plus d'info disponible sur notre <a target="_blank" href="http://gogs.io/docs/features/webhook.html">guide Webhooks'</a>. -settings.remove_hook_success = Webhook supprimé. -settings.add_webhook_desc = Gogs envoiera un POST à l'URL ci-dessous avec le détail de l'événement souscrit. Vous pouvez aussi spécifier dans quel format vous désirez recevoir les données (JSON,<code>x-www-form-urlencoded</code>, <em>etc</em>). Plus d'info disponible sur notre <a target="_blank" href="http://gogs.io/docs/features/webhook.html">guide Webhooks'</a>. -settings.payload_url = URL cible -settings.content_type = Content Type -settings.secret = Secret -settings.event_desc = Quels changements déclencheront le webhook? -settings.event_push_only = Uniquement les <code>push</code>. -settings.active = Activé -settings.active_helper = Gogs fournira le détail de l'événement lorsque ce webhook sera déclenché. -settings.add_hook_success = Nouveau webhook ajouté. -settings.update_webhook = Mettre à jour le webhook -settings.update_hook_success = Webhook mis à jour. -settings.delete_webhook = Détruire le webhook -settings.recent_deliveries = Livraisons récentes -settings.hook_type = Type de déclencheur -settings.add_slack_hook_desc = Ajouter la compatibilité <a href="http://slack.com">Slack</a> à ce dépôt. -settings.slack_token = Jeton (token) -settings.slack_domain = Domaine -settings.slack_channel = Canal - -[org] -org_name_holder = Nom de l'organisation -org_name_helper = Les bons noms d'organisations sont courts, mémorables et uniques -org_email_helper = Le courriel de l'organisation recevra toutes les notifications et les confirmations. -create_org = Créer une organisation -repo_updated = Changement effectué -people = Personne -invite_someone = Inviter quelqu'un -teams = Équipes -lower_members = Membres -lower_repositories = Dépôts -create_new_team = Créer une nouvelle équipe -org_desc = Description -team_name = Nom de l'équipe -team_desc = Description -team_name_helper = Le nom qui sera utilisé pour mentionner cette équipe dans les conversations. -team_desc_helper = Quel est la raison d'être de cette équipe? -team_permission_desc = Quel niveau de permission attribuer à cette équipe? - -settings = Réglages -settings.options = Paramètres -settings.full_name = Nom complet -settings.website = Site web -settings.location = Endroit -settings.update_settings = Mettre à jour les paramètres -settings.update_setting_success = Paramètres mis à jour. -settings.delete = Détruire l'organisation -settings.delete_account = Détruire cette organisation -settings.delete_prompt = La destruction de l'organisation est irrémédiable, impossible d'annuler. Soyez sûr de votre décision. -settings.confirm_delete_account = Confirmer la destruction - -members.public = Publique -members.public_helper = Rendre privé -members.private = Privé -members.private_helper = Rendre publique -members.owner = Responsable -members.member = Membre -members.conceal = Caché -members.remove = Retirer -members.leave = Quitter -members.invite_desc = Commencez à saisir un nom d'usager pour l'inviter à %s: -members.invite_now = Inviter - -teams.join = Rejoindre -teams.leave = Quitter -teams.read_access = Droits de lecture -teams.read_access_helper = Cette équipe pourra voir et cloner ses dépôts. -teams.write_access = Droits d'écriture -teams.write_access_helper = Cette équipe pourra voir et cloner ses dépôts ainsi que pousser vers ceux-ci. -teams.admin_access = Droits de gestion -teams.admin_access_helper = En plus des droits d'écriture, cette équipe pourra gérer les collaborateurs. -teams.no_desc = Cette équipe ne posséde pas de description -teams.settings = Réglages -teams.owners_permission_desc = Les responsables ont accès à <strong>tous</strong> les dépôts et en possédent les droits de gestion. -teams.members = Membre de l'équipe -teams.update_settings = Mettre à jour -teams.delete_team = Détruire cette équipe -teams.add_team_member = Ajouter un membre à l'équipe -teams.delete_team_success = Équipe détruite -teams.read_permission_desc = La participation à cette équipe confère les droits de lecture. Ses membres peuvent voir et cloner ses dépôts. -teams.write_permission_desc = La participation à cette équipe confère les droits d'écriture en plus des droits de lecture. Ses membres peuvent pousser vers les dépôts de l'équipe. -teams.admin_permission_desc = La participation à cette équire confère les droits de gestion. Ses membres peuvent voir, cloner, pousser et gérer les collaborateurs des dépôts. -teams.repositories = Dépôts de l'équipe -teams.add_team_repository = Ajouer un dépôt à l'équipe -teams.remove_repo = Enlever - -[admin] -dashboard = Tableau de bord -users = Usagers -organizations = Organisations -repositories = Dépôts -authentication = Sources d'authentifications -config = Configuration -monitor = Monitoring -prev = Préc. -next = Suiv. - -dashboard.statistic = Statistiques -dashboard.operations = Opérations -dashboard.system_status = État du monitoring système -dashboard.statistic_info = La BD Gogs compte <b>%d</b> usagers, <b>%d</b> organisations, <b>%d</b> clé SSH, <b>%d</b> dépôts, <b>%d</b> suivis, <b>%d</b> étoiles, <b>%d</b> actions, <b>%d</b> accès, <b>%d</b> tickets, <b>%d</b> commentaires, <b>%d</b> comptes Internet, <b>%d</b> suivis, <b>%d</b> mirroirs, <b>%d</b> publications, <b>%d</b> sources d'authentification, <b>%d</b> webhooks, <b>%d</b> jalons, <b>%d</b> tags, <b>%d</b> tâches hook, <b>%d</b> équipes, <b>%d</b> tâches de mise à jours, <b>%d</b> fichiers joints. -dashboard.operation_name = Nom de l'opération -dashboard.operation_switch = Commande -dashboard.operation_run = Lancer -dashboard.clean_unbind_oauth = Nettoyer les OAuths orphelins -dashboard.delete_inactivate_accounts = Détruire les comptes inactifs -dashboard.server_uptime = Démarré depuis -dashboard.current_goroutine = Nombre de Goroutines -dashboard.current_memory_usage = Usage mémoire actuel -dashboard.total_memory_allocated = Mémoire allouée totale -dashboard.memory_obtained = Memoire obtenue -dashboard.pointer_lookup_times = Accès pointeur -dashboard.memory_allocate_times = Allocation mémoire -dashboard.memory_free_times = Désallocation mémoire -dashboard.current_heap_usage = Taille du heap actuelle -dashboard.heap_memory_obtained = Mémoire heap obtenue -dashboard.heap_memory_idle = Mémoire heap inactive -dashboard.heap_memory_in_use = Mémoire heap utilisée -dashboard.heap_memory_released = Mémoire heap relachée -dashboard.heap_objects = Objets dans le heap -dashboard.bootstrap_stack_usage = Bootstrap Stack Usage -dashboard.stack_memory_obtained = Stack Memory Obtained -dashboard.mspan_structures_usage = MSpan Structures Usage -dashboard.mspan_structures_obtained = MSpan Structures Obtained -dashboard.mcache_structures_usage = MCache Structures Usage -dashboard.mcache_structures_obtained = MCache Structures Obtained -dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained -dashboard.gc_metadata_obtained = GC Metadada Obtained -dashboard.other_system_allocation_obtained = Other System Allocation Obtained -dashboard.next_gc_recycle = Next GC Recycle -dashboard.last_gc_time = Since Last GC Time -dashboard.total_gc_time = Total GC Pause -dashboard.total_gc_pause = Total GC Pause -dashboard.last_gc_pause = Last GC Pause -dashboard.gc_times = GC Times - -users.user_manage_panel = Gestion des usager -users.new_account = Creér un nouveau compte -users.name = Nom -users.activated = Activé -users.admin = Gestionnaire -users.repos = Dépôts -users.created = Créé -users.edit = Editer -users.auth_source = Source d'authentification -users.local = Locale -users.auth_login_name = Identifiant d'authentification -users.update_profile_success = Compte crée. -users.edit_account = Éditer compte -users.is_activated = Ce compte est activé -users.is_admin = Ce compte a les droits de gestionnaire -users.update_profile = Mettre à jour le compte -users.delete_account = Détruire ce compte -users.still_own_repo = Ce compte est responsables d'un dépôt. I faut détruire le dépôt ou transférer la responsabilité avant de détruire ce compte. - -orgs.org_manage_panel = Gestion des organisations -orgs.name = Nom -orgs.teams = Équipes -orgs.members = Membres - -repos.repo_manage_panel = Gestion des dépôts -repos.owner = Responsable -repos.name = Nom -repos.private = Privé -repos.watches = Suivis -repos.stars = Étoiles -repos.issues = Ticket - -auths.auth_manage_panel = Gestion des sources d'authentification -auths.new = Ajouter une nouvelle source d'authentification -auths.name = Nom -auths.type = Type -auths.enabled = Activé -auths.updated = Mis à jour -auths.auth_type = Type d'authentification -auths.auth_name = Nom de l'authentification -auths.domain = Domaine -auths.host = Serveur -auths.port = Port -auths.base_dn = DN de base -auths.attributes = Attributs de recherche -auths.filter = Filtre de recherche -auths.ms_ad_sa = Microsoft Active Directory -auths.smtp_auth = Authentification SMTP -auths.smtphost = Serveur SMTP -auths.smtpport = Port SMTP -auths.enable_tls = Chiffrement TLS -auths.enable_auto_register = Activer auto-abonnement -auths.tips = Trucs -auths.edit = Éditer réglages d'authentification -auths.activated = Source d'authentification activée -auths.update_success = Réglages mis à jour. -auths.update = Mettre à jour réglages -auths.delete = Détruire cette source - -config.server_config = Configuration du serveur -config.app_name = Nom de l'applicaiton -config.app_ver = Version de l'application -config.app_url = URL de l'application -config.domain = Domaine -config.offline_mode = Mode hors-ligne -config.disable_router_log = Journal du routeur désactivé -config.run_user = Éxécuté en tant que -config.run_mode = Mode de fonctionnement -config.repo_root_path = Dossier contenant les dépôts -config.static_file_root_path = Dossier contenant les fichiers statiques -config.log_file_root_path = Dossier contenant les journaux -config.script_type = Type de script -config.reverse_auth_user = Usager d'authentification inversée -config.db_config = Configuration de la BD -config.db_type = Type -config.db_host = Serveur -config.db_name = Nom -config.db_user = Usager -config.db_ssl_mode = Mode SSL -config.db_ssl_mode_helper = (pour "postgres" seulement) -config.db_path = Path -config.db_path_helper = (pour "sqlite3" seulement) -config.service_config = Configuration du service -config.register_email_confirm = Confirmation d'abonnement par courriel -config.disable_register = Auto-inscription désactivée -config.require_sign_in_view = Connexion requise pour visualiser -config.mail_notify = Notifications par courriel -config.enable_cache_avatar = Cache avatar activée -config.active_code_lives = Jeton d'activation -config.reset_password_code_lives = Jeton de modification mot-de-passe -config.webhook_config = Configuration Webhook -config.task_interval = Intervalle -config.deliver_timeout = Expiration des appels -config.mailer_config = Configuration expédition de courriels -config.mailer_enabled = Activé -config.mailer_name = Nom -config.mailer_host = Serveur -config.mailer_user = Usager -config.oauth_config = Configuration OAuth -config.oauth_enabled = Activé -config.cache_config = Configuration du cache -config.cache_adapter = Mécanisme de cache -config.cache_interval = Intervalle -config.cache_conn = Chaîne de connexion -config.session_config = Configuration des session -config.session_provider = Mécanisme -config.provider_config = Configuration du mécanisme -config.cookie_name = Nom du fichier témoin -config.enable_set_cookie = Fichier témoin actvité -config.gc_interval_time = Intervalle GC -config.session_life_time = Durée de la session -config.https_only = HTTPS exigé -config.cookie_life_time = Expiration du fichier témoin -config.session_hash_function = Fonction de hashage ID de session -config.session_hash_key = Clé de hashage ID de session -config.picture_config = Configuration des avatars -config.picture_service = Service image -config.disable_gravatar = Désactivé Gravatar -config.log_config = Configuration du journal -config.log_mode = Mode de journal - -monitor.cron = Cron Tasks -monitor.name = Name -monitor.schedule = Schedule -monitor.next = Next Time -monitor.previous = Previous Time -monitor.execute_times = Execute Times -monitor.process = Running Processes -monitor.desc = Description -monitor.start = Start Time -monitor.execute_time = Execution Time - -[action] -create_repo = a créé le dépôt <a href="/%s">%s</a> -commit_repo = a poussé sur <a href="/%s/src/%s">%s</a> à <a href="/%s">%s</a> -create_issue = a ouvert le ticket <a href="/%s/issues/%s">%s#%s</a> -comment_issue = a commenté sur le ticket <a href="/%s/issues/%s">%s#%s</a> - -[tool] -ago = auparavant -from_now = depuis -now = maintenant -1s = 1 seconde %s -1m = 1 minute %s -1h = 1 heure %s -1d = 1 jour %s -1w = 1 semaine %s -1mon = 1 mos %s -1y = 1 an %s -seconds = %d secondes %s -minutes = %d minutes %s -hours = %d heures %s -days = %d jours %s -weeks = %d semaines %s -months = %d mois %s -years = %d années %s -raw_seconds = secondes -raw_minutes = minutes +app_desc=Un service de Git sans prise de tête auto-hébergé codé en Go
+
+home=Accueil
+dashboard=Tableau de bord
+explore=Explorer
+help=Aide
+sign_in=Connexion
+social_sign_in=Connexion avec un réseau social : 2e étape <small>associer un compte</small>
+sign_out=Déconnexion
+sign_up=Créer un compte
+register=S'enregistrer
+website=Site Web
+version=Version
+page=Page
+template=Modèle
+language=Langue
+
+username=Nom d'utilisateur
+email=E-mail
+password=Mot de passe
+re_type=Confirmez
+captcha=Captcha
+
+repository=Référentiel
+organization=Organisation
+mirror=Miroir
+new_repo=Nouveau Référentiel
+new_migrate=Nouvelle Migration
+new_fork=Nouveau référentiel de fourche
+new_org=Nouvelle Organisation
+manage_org=Gérer les Organisations
+admin_panel=Administration
+account_settings=Paramètres du Compte
+settings=Paramètres
+
+news_feed=Flux d'actualités
+pull_requests=Extraire les Requêtes
+issues=Problèmes
+
+cancel=Annuler
+
+[install]
+install=Installation
+title=Instructions de Première Installation
+requite_db_desc=Gogs nécessite MySQL, PostgreSQL ou SQLite3.
+db_type=Type de Base de Données
+host=Hôte
+user=Utilisateur
+password=Mot De Passe
+db_name=Nom de la Base de Données
+db_helper=Veuillez utiliser le moteur INNODB avec le jeu de caractères utf8_general_ci pour MySQL.
+ssl_mode=Mode SSL
+path=Chemin
+sqlite_helper=Emplacement du fichier de la base de données SQLite3.
+general_title=Paramètres Généraux de Gogs
+repo_path=Emplacement Racine du Référentiel
+repo_path_helper=Tous les Référentiels Git distants seront sauvegardés ici.
+run_user=Entrer un Utilisateur
+run_user_helper=L'utilisateur doit avoir accès à la Racine du Référentiel et éxécuter Gogs.
+domain=Domaine
+domain_helper=Cela affecte les doublons d'URL SSH.
+app_url=URL de l'Application
+app_url_helper=Cela affecte les doublons d'URL HTTP/HTTPS et le contenu d'e-mail.
+email_title=Paramètres du Service de Messagerie (Facultatif)
+smtp_host=Hôte SMTP
+mailer_user=E-mail de l'Expéditeur
+mailer_password=Mot de Passe de l'Expéditeur
+notify_title=Paramètre des Notifications (Facultatif)
+register_confirm=Activer la Confirmation d'Enregistrement
+mail_notify=Activer la Notification des Mails reçus
+admin_title=Paramètres du Compte Administrateur
+admin_name=Nom d'Utilisateur
+admin_password=Mot de Passe
+confirm_password=Confirmez le Mot de Passe
+admin_email=E-mail
+install_gogs=Installer Gogs
+test_git_failed=Tentative de commande "git" échouée : %v
+sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s.
+invalid_db_setting=Paramètres de base de données incorrects : %v
+invalid_repo_path=Chemin Racine du Référentiel invalide : %v
+run_user_not_match=L'utilisateur entré n'est pas l'utilisateur actuel : %s -> %s
+save_config_failed=Sauvegarde de la configuration échouée : %v
+invalid_admin_setting=Paramètres du compte administrateur invalides : %v
+install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amusez-vous et prenez soin de vous.
+
+[home]
+uname_holder=Nom d'Utilisateur ou E-mail
+password_holder=Mot de Passe
+switch_dashboard_context=Basculer le Contexte du Tableau de Bord
+my_repos=Mes Référentiels
+collaborative_repos=Référentiels collaboratifs
+my_orgs=Mes Organisations
+my_mirrors=Mes Miroirs
+
+[explore]
+repos=Référentiels
+
+[auth]
+create_new_account=Créer un Nouveau Compte
+register_hepler_msg=Déjà enregistré ? Connectez-vous !
+social_register_hepler_msg=Possesseur d'un compte ? Associez-le !
+disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
+disable_register_mail=Désolé, la Confirmation par Mail des Enregistrements a été désactivée.
+remember_me=Se souvenir de Moi
+forgot_password=Mot de Passe oublié
+forget_password=Mot de Passe oublié ?
+sign_up_now=Pas de compte ? Créer maintenant.
+confirmation_mail_sent_prompt=Un nouveau mail de confirmation à été envoyé à <b>%s</b>. Veuillez vérifier votre boîte de réception dans un délai de %d heures pour compléter votre enregistrement.
+sign_in_email=Connexion avec l'E-mail
+active_your_account=Activer votre Compte
+resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes.
+has_unconfirmed_mail=Bonjour %s, votre adresse e-mail n'a pas été confirmée (<b>%s</b>). Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, appuyez sur le bouton ci-dessous.
+resend_mail=Appuyez ici pour renvoyer un mail de confirmation
+email_not_associate=Cette adresse e-mail n'est associée à aucun compte.
+send_reset_mail=Appuyez ici pour (r)envoyer le mail de réinitialisation du mot de passe
+reset_password=Réinitialiser le Mot de Passe
+invalid_code=Désolé, code de confirmation invalide ou expiré.
+reset_password_helper=Appuyez ici pour réinitialiser votre mot de passe
+password_too_short=Le mot de passe doit contenir 6 caractères minimum.
+
+[form]
+UserName=Nom d'Utilisateur
+RepoName=Nom du Référentiel
+Email=Adresse E-mail
+Password=Mot de Passe
+Retype=Confirmez le Mot de Passe
+SSHTitle=Nom de la clé SSH
+HttpsUrl=URL HTTPS
+PayloadUrl=URL des Données Utiles
+TeamName=Nom d'équipe
+AuthName=Nom d'autorisation
+AdminEmail=E-mail d'admin
+
+require_error=` Ne peut être vide `
+alpha_dash_error=` doivent être des caractères alpha, numeriques ou console (-_) valides `
+alpha_dash_dot_error=` doivent être des caractères alpha, numeriques, console (-_) valides ou des points `
+min_size_error=` %s caractères minimum `
+max_size_error=` %s caractères maximum `
+email_error=` adresse e-mail invalide `
+url_error=` URL invalide `
+unknown_error=Erreur inconnue :
+captcha_incorrect=Le Captcha ne correspond pas.
+password_not_match=Le mot de passe et la confirmation de mot de passe ne correspondent pas.
+
+username_been_taken=Nom d'utilisateur déjà pris.
+repo_name_been_taken=Nom de Référentiel déjà pris.
+org_name_been_taken=Nom d'organisation déjà pris.
+team_name_been_taken=Nom d'équipe déjà pris.
+email_been_used=Adresse e-mail déjà utilisée.
+ssh_key_been_used=Le nom de la clé publique a déjà servi.
+illegal_username=Le nom d'utilisateur contient des caractères interdits.
+illegal_repo_name=Le nom du Référentiel contient des caractères interdits.
+illegal_org_name=Le nom de l'organisation contient des caractères interdits.
+illegal_team_name=Le nom de l'équipe contient des caractères interdits.
+username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
+enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du Référentiel soit correct.
+enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
+enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
+user_not_exist=Cet utilisateur n'existe pas.
+last_org_owner=L'utilisateur à exclure est le dernier membre de l'équipe propriétaire. Il doit y avoir un autre propriétaire.
+
+invalid_ssh_key=Désolé, impossible de valider votre clé SSH : %s
+unable_verify_ssh_key=Gogs n'a pu vérifier la validité de votre clé SSH, même si nous partons du principe qu'elle le soit. Cela-dit, veuillez vous en assurer.
+auth_failed=Échec d'authentification : %s
+
+still_own_repo=Votre compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+still_has_org=Votre compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
+org_still_own_repo=Cette organisation comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+
+still_own_user=Cette authentification a déjà servi à d'autres utilisateurs. Veuillez les déplacer puis supprimez à nouveau.
+
+target_branch_not_exist=Branche cible n'existe pas
+
+[user]
+change_avatar=Changez d'avatar via gravatar.com
+join_on=Adhéré le
+repositories=Référentiels
+activity=Activités publiques
+followers=Abonnés
+starred=Votés
+following=Abonnements
+
+[settings]
+profile=Profil
+password=Mot de Passe
+ssh_keys=Clés SSH
+social=Réseaux Sociaux
+applications=Applications
+orgs=Organisations
+delete=Supprimer le Compte
+uid=ID d'Utilisateur
+
+public_profile=Profil Public
+profile_desc=Votre adresse e-mail est publique et sera utilisée pour les notifications relatives au compte, ainsi que pour toute opération Web effectuée via le site.
+full_name=Non Complet
+website=Site Web
+location=Localisation
+update_profile=Valider les modifications
+update_profile_success=Profil mis à jour avec succès.
+change_username=Non d'utilisateur modifié
+change_username_desc=Nom d'utilisateur modifié. Cela affecte tous les liens relatifs à votre compte. Continuer ?
+continue=Continuer
+cancel=Annuler
+
+change_password=Modifier le Mot de Passe
+old_password=Mot de Passe actuel
+new_password=Nouveau Mot de Passe
+password_incorrect=Mot de passe actuel incorrect.
+change_password_success=Mot de passe modifié avec succès. Vous pouvez à présent vous connecter avec le nouveau mot de passe.
+
+manage_ssh_keys=Gérer les clés SSH
+add_key=Ajouter une Clé
+ssh_desc=Ceci est une liste des clés SSH associées à votre compte. Supprimez celles que vous ne reconnaissez pas.
+ssh_helper=<strong>Besoin d'aide?</strong> Consultez notre guide pour <a href="%s"> générer des clés SSH</a> ou résoudre les <a href="%s"> problèmes courants de SSH</a>.
+add_new_key=Ajouter une Clé SSH
+key_name=Nom de la Clé
+key_content=Contenu
+add_key_success=Nouvelle Clé SSH ajoutée !
+delete_key=Supprimer
+add_on=Ajouté le
+last_used=Dernière utilisation le
+no_activity=Aucune activité récente
+
+manage_social=Gérer les réseaux sociaux associés
+social_desc=Ceci est la liste des comptes de réseaux sociaux associés. Supprimez ceux que vous ne reconnaissez pas.
+unbind=Dissocier
+unbind_success=Compte de réseau social dissocié.
+
+manage_access_token=Gérer les jetons d'accès personnels
+generate_new_token=Générer le nouveau jeton
+tokens_desc=Jetons, que vous avez généré qui peuvent être utilisés pour accéder à l'API Gogs.
+new_token_desc=Comme pour l'instant, chaque jeton aura un accès complet à votre compte.
+token_name=Nom du jeton
+generate_token=Générer le jeton
+generate_token_succees=Nouveau jeton d'accès a été généré avec succès ! Assurez-vous de copier votre nouveau jeton d'accès personnel maintenant. Vous ne serez pas en mesure de le revoir !
+delete_token=Supprimer
+delete_token_success=Jeton d'accès personnelle a été supprimée avec succès ! N'oubliez pas de mettre à jour vos applications aussi bien.
+
+delete_account=Supprimer le Compte
+delete_prompt=Votre compte sera supprimé définitivement et cette opération est <strong>IRRÉVERSIBLE</strong> !
+confirm_delete_account=Confirmer la suppression
+delete_account_title=Suppression de compte
+delete_account_desc=Ce compte sera supprimé définitivement. Voulez-vous continuer ?
+
+[repo]
+owner=Propriétaire
+repo_name=Nom du Référentiel
+repo_name_helper=Idéalement, le nom d'un Référentiel devrait être court, mémorable et <strong>unique</strong>.
+visibility=Visibilité
+visiblity_helper=Ce Référentiel est <span class="label label-red label-radius">Privé</span>
+fork_repo=Référentiel de la fourche
+fork_from=Fourche de
+fork_visiblity_helper=Référentiel Aristide ne peut pas changer sa visiblité
+repo_desc=Description
+repo_lang=Langue
+repo_lang_helper=Sélectionner un fichier .gitignore
+license=Licence
+license_helper=Sélectionner un fichier de licence
+init_readme=Initialiser ce Référentiel avec un README.md
+create_repo=Créer un Référentiel
+default_branch=Branche par défaut
+mirror_interval=Intervalle du miroir (heure)
+goget_meta=Méta Go-Get
+goget_meta_helper=Ce Référentiel sera <span class="label label-blue label-radius">Go-Getable</span>
+
+need_auth=Nécessite une Autorisation
+migrate_type=Type de Migration
+migrate_type_helper=Ce Référentiel sera un <span class="label label-blue label-radius">Miroir</span>
+migrate_repo=Migrer le Référentiel
+
+copy_link=Copier
+click_to_copy=Copier dans le presse-papier
+copied=Copié
+clone_helper=Besoin d'aide pour le clonage ? Visitez <a target="_blank" href="%s"> l'aider</a> !
+unwatch=Ne plus suivre
+watch=Suivre
+unstar=Retirer le vote
+star=Voter
+fork=Embranchement
+
+no_desc=Aucune description
+quick_guide=Introduction rapide
+clone_this_repo=Dupliquer ce Référentiel
+create_new_repo_command=Créer un nouveau Référentiel en ligne de commande
+push_exist_repo=Soumettre un Référentiel existant par ligne de commande
+
+branch=Branche
+tree=Aborescence
+branch_and_tags=Branches & Tags
+branches=Branches
+tags=Tags
+issues=Problèmes
+commits=Commissions
+releases=Publications
+file_raw=Raw
+file_history=Historique
+file_view_raw=Voir le Raw
+
+commits.commits=Commissions
+commits.search=Rechercher des commissions
+commits.find=Trouver
+commits.author=Auteur
+commits.message=Message
+commits.date=Date
+commits.older=Précédemment
+commits.newer=Récemment
+
+settings=Paramètres
+settings.options=Options
+settings.collaboration=Collaboration
+settings.hooks=Webhooks
+settings.githooks=Git Hooks
+settings.deploy_keys=Clés de déploiement
+settings.basic_settings=Paramètres de base
+settings.danger_zone=Zone de danger
+settings.site=Site officiel
+settings.update_settings=Valider
+settings.change_reponame=Référentiel renommé
+settings.change_reponame_desc=Le Référentiel a été renommé. Cela affecte tous les liens relatifs à ce Référentiel. Continuer ?
+settings.transfer=Transférer les propriétés
+settings.transfer_desc=Transfère ce Référentiel à un autre utilisateur ou organisation dont vous possédez des droits d'administrateur.
+settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un Référentiel nommé ainsi.
+settings.delete=Supprimer ce Référentiel
+settings.delete_desc=Attention, action irréversible. Soyez sûre de vous.
+settings.transfer_notices=<p>- Vous perdrez l'accès si le nouveau propriétaire est un utilisateur individuel.</p><p>- Vous garderez l'accès si le nouveau propriétaire est une organisation et que vous en faites partie.</p>
+settings.update_settings_success=Options mises à jour avec succès.
+settings.transfer_owner=Nouveau propriétaire
+settings.make_transfer=Transférer
+settings.transfer_succeed=Propriétés transférées avec succès.
+settings.confirm_delete=Confirmer la suppression
+settings.add_collaborator=Ajouter un collaborateur
+settings.add_collaborator_success=Nouveau collaborateur ajouté.
+settings.remove_collaborator_success=Collaborateur supprimé.
+settings.user_is_org_member=Cet utilisateur ne peut pas être ajouté en tant que collaborateur car il fait partie d'une organisation.
+settings.add_webhook=Ajouter un Webhook
+settings.hooks_desc=Webhooks aux services externes être notifié lorsque certains événements se produisent sur Gogs. Lorsque les événements spécifiés se produisent, nous vous enverrons une demande POST à chacun des URL que vous fournissez. Apprenez-en davantage dans notre <a target="_blank" href="%s"> Webhooks Guide</a>.
+settings.githooks_desc=Les Hooks Git sont alimentés par Git lui même. Les Hooks compatibles sont modifiables dans la liste ci-dessous pour effectuer des opérations personnalisées.
+settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous sera proposé. Un contenu laissé vide signifie un Hook inactif.
+settings.githook_name=Nom du Hook
+settings.githook_content=Contenu du Hook
+settings.update_githook=Mettre le Hook à jour
+settings.remove_hook_success=Webhook supprimé.
+settings.add_webhook_desc=Nous vous enverrons une demande <code>POST</code> à l'URL ci-dessous avec les détails de tous les événements souscrites. Vous pouvez également spécifier quel format de données vous souhaitez recevoir (JSON, <code>x-www-formulaires-urlencoded</code>, <em>etc.</em>). Plus d'informations se trouvent dans le <a target="_blank" href="%s"> Guide de le Webhooks</a>.
+settings.payload_url=URL des Données Utiles
+settings.content_type=Type de contenu
+settings.secret=Confidentiel
+settings.event_desc=Quel évènement ce Webhook doit-il déclencher ?
+settings.event_push_only=Uniquement les <code>push</code> (soumissions).
+settings.active=Actif
+settings.active_helper=Les détails seront délivrés lorsque ce Hook sera déclenché.
+settings.add_hook_success=Nouveau Webhook ajouté.
+settings.update_webhook=Mettre le Webhook à jour
+settings.update_hook_success=Webhook mis à jour.
+settings.delete_webhook=Supprimer le Webhook
+settings.recent_deliveries=Livraisons récentes
+settings.hook_type=Type de Hook
+settings.add_slack_hook_desc=Ajouter <a href="%s"> Slack</a> intégration dans votre référentiel.
+settings.slack_token=Jeton
+settings.slack_domain=Domaine
+settings.slack_channel=Canal
+
+diff.browse_source=Parcourir la Source
+diff.parent=Parent
+diff.commit=Commettre
+diff.data_not_available=Données Diff indisponibles.
+diff.show_diff_stats=Afficher les stats Diff
+diff.stats_desc=<strong> %d fichiers modifiés</strong> avec <strong>%d ajouts</strong> et <strong>%d suppressions</strong>
+diff.bin=BIN
+diff.view_file=Voir le fichier
+
+[org]
+org_name_holder=Nom d'organisation
+org_name_helper=Idéalement, un nom d'organisation devrait être court et mémorable.
+org_email_helper=L'e-mail de l'organisation recevra toutes les notifications et confirmations.
+create_org=Créer une organisation
+repo_updated=Mis à jour
+people=Contacts
+invite_someone=Inviter quelqu'un
+teams=Équipes
+lower_members=Membres
+lower_repositories=Référentiels
+create_new_team=Créer une Nouvelle Équipe
+org_desc=Description
+team_name=Nom d'Équipe
+team_desc=Description
+team_name_helper=Ce nom sera utilisé pour mentionner l'équipe dans les conversations.
+team_desc_helper=Présentation de l'équipe
+team_permission_desc=Quel niveau d'accès cette équipe devrait-elle posséder ?
+
+settings=Paramètres
+settings.options=Options
+settings.full_name=Non Complet
+settings.website=Site Web
+settings.location=Localisation
+settings.update_settings=Valider
+settings.change_orgname=Organisation renommée
+settings.change_orgname_desc=L'Organisation a été renommée. Cela affecte tous les liens relatifs à cette organisation. Continuer ?
+settings.update_setting_success=Paramètres d'organisation modifiés avec succès.
+settings.delete=Supprimer l'organisation
+settings.delete_account=Supprimer cette organisation
+settings.delete_prompt=Cela supprimera cette organisation définitivement. Cette opération est <strong>IRRÉVERSIBLE</strong> !
+settings.confirm_delete_account=Confirmez la suppression
+settings.delete_org_title=Suppression d'organisation
+settings.delete_org_desc=Cette organisation sera définitivement supprimée. Continuer ?
+settings.hooks_desc=Ajoute des Webhooks qui seront activés pour <strong>tous les Référentiels</strong> de cette organisation.
+
+members.public=Public
+members.public_helper=Rendre privé
+members.private=Privé
+members.private_helper=Rendre public
+members.owner=Propriétaire
+members.member=Membre
+members.conceal=Masquer
+members.remove=Exclure
+members.leave=Quitter
+members.invite_desc=Tapez un nom d'utilisateur pour inviter un nouveau membre chez %s :
+members.invite_now=Lancer l'invitation
+
+teams.join=Rejoindre
+teams.leave=Quitter
+teams.read_access=Accès en Lecture
+teams.read_access_helper=Cette équipe aura la possibilité de voir et dupliquer ses Référentiels.
+teams.write_access=Accès en Écriture
+teams.write_access_helper=Cette équipe possèdera aussi bien des droits de lecture que d'écriture sur ses Référentiels.
+teams.admin_access=Accès Administrateur
+teams.admin_access_helper=Cette équipe possèdera des droits de lecture, d'écriture, ainsi que le pouvoir d'ajouter des collaborateurs.
+teams.no_desc=Aucune description
+teams.settings=Paramètres
+teams.owners_permission_desc=Les propriétaires possèdent <strong>les droits d'administrateur</strong> et disposent d'un accès complet à <strong>tous les Référentiels</strong> de l'organisation.
+teams.members=Membres de L'Équipe
+teams.update_settings=Valider
+teams.delete_team=Supprimer cette Équipe
+teams.add_team_member=Ajouter un Membre
+teams.delete_team_title=Suppression de l'équipe
+teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains Référentiels.
+teams.delete_team_success=Équipe supprimée avec succès.
+teams.read_permission_desc=Cette équipe permet l'accès en <strong>lecture</strong> : les membres peuvent voir et dupliquer ses Référentiels.
+teams.write_permission_desc=Cette équipe permet l'accès en <strong>écriture</strong> : les membres peuvent participer à ses Référentiels.
+teams.admin_permission_desc=Cette équipe permet l'accès en <strong>administrateur</strong> : les membres peuvent voir, participer et ajouter des collaborateurs à ses Référentiels.
+teams.repositories=Référentiels de l'Équipe
+teams.add_team_repository=Ajouter un Référentiel à l'Équipe
+teams.remove_repo=Supprimer
+teams.add_nonexistent_repo=Référentiel inexistant, veuillez d'abord le créer.
+
+[admin]
+dashboard=Tableau de bord
+users=Utilisateurs
+organizations=Organisations
+repositories=Référentiels
+authentication=Authentifications
+config=Configuration
+notices=Notes Systèmes
+monitor=Supervision
+prev=Préc.
+next=Suiv.
+
+dashboard.statistic=Statistiques
+dashboard.operations=Opérations
+dashboard.system_status=État du Moniteur Système
+dashboard.statistic_info=La base de données Gogs contient <b>%d</b> utilisateurs, <b>%d</b> organisations, <b>%d</b> clés publiques, <b>%d</b> Référentiels, <b>%d</b> suivis, <b>%d</b> votes, <b>%d</b> actions, <b>%d</b> accès, <b>%d</b> problèmes, <b>%d</b> commentaires, <b>%d</b> comptes de réseaux sociaux, <b>%d</b> abonnements, <b>%d</b> miroirs, <b>%d</b> publications, <b>%d</b> connexions d'origine, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> labels, <b>%d</b> tâches hook, <b>%d</b> équipes, <b>%d</b> tâches de mise à jour, <b>%d</b> fichiers.
+dashboard.operation_name=Nom de l'Opération
+dashboard.operation_switch=Basculer
+dashboard.operation_run=Exécuter
+dashboard.clean_unbind_oauth=Nettoyer les associations OAuthes
+dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs
+dashboard.server_uptime=Durée de Marche Serveur
+dashboard.current_goroutine=Goroutines actuelles
+dashboard.current_memory_usage=Utilisation Mémoire actuelle
+dashboard.total_memory_allocated=Mémoire totale allouée
+dashboard.memory_obtained=Mémoire obtenue
+dashboard.pointer_lookup_times=Nombre de Consultations Pointeur
+dashboard.memory_allocate_times=Nombre d'Allocation Mémoire
+dashboard.memory_free_times=Nombre de Libération Mémoire
+dashboard.current_heap_usage=Utilisation Tas (Heap)
+dashboard.heap_memory_obtained=Mémoire Tas (Heap) obtenue
+dashboard.heap_memory_idle=Mémoire Tas (Heap) au Repos
+dashboard.heap_memory_in_use=Utilisation Mémoire Tas (Heap)
+dashboard.heap_memory_released=Mémoire Tas (Heap) libérée
+dashboard.heap_objects=Objets Tas (Heap)
+dashboard.bootstrap_stack_usage=Utilisation Pile Bootstrap
+dashboard.stack_memory_obtained=Mémoire Pile obtenue
+dashboard.mspan_structures_usage=Utilisation des Structures MSpan
+dashboard.mspan_structures_obtained=Structures MSpan obtenues
+dashboard.mcache_structures_usage=Utilisation des Structures MCache
+dashboard.mcache_structures_obtained=Structures MCache obtenues
+dashboard.profiling_bucket_hash_table_obtained=Profilage de Seau de Table de Hashage obtenu
+dashboard.gc_metadata_obtained=Métadonnées GC obtenues
+dashboard.other_system_allocation_obtained=Allocation de l'autre Système obtenue
+dashboard.next_gc_recycle=Traitement GC suivant
+dashboard.last_gc_time=Depuis le dernier GC
+dashboard.total_gc_time=Pause GC totale
+dashboard.total_gc_pause=Pause GC
+dashboard.last_gc_pause=Dernière Pause GC
+dashboard.gc_times=Nombres de GC
+
+users.user_manage_panel=Gestion des Utilisateurs
+users.new_account=Créer un nouveau compte
+users.name=Nom
+users.activated=Activés
+users.admin=Administrateur
+users.repos=Repos
+users.created=Créés
+users.edit=Éditer
+users.auth_source=Source d'Autorisation
+users.local=Locales
+users.auth_login_name=Autorisation de connexion
+users.update_profile_success=Profil mis à jour avec succès.
+users.edit_account=Modifier le Compte
+users.is_activated=Ce compte est activé
+users.is_admin=Ce compte possède un niveau d'accès administrateur
+users.allow_git_hook=Ce compte dispose des autorisations pour créer des crochets de Git
+users.update_profile=Mettre le profil à jour
+users.delete_account=Supprimer ce Compte
+users.still_own_repo=Ce compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+users.still_has_org=Ce compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
+
+orgs.org_manage_panel=Gestion des Organisations
+orgs.name=Nom
+orgs.teams=Équipes
+orgs.members=Membres
+
+repos.repo_manage_panel=Gestion des Référentiels
+repos.owner=Propriétaire
+repos.name=Nom
+repos.private=Privé
+repos.watches=Suivi par
+repos.stars=Votes
+repos.issues=Problèmes
+
+auths.auth_manage_panel=Gestion des Autorisations
+auths.new=Ajouter une Nouvelle Source d'Autorisation
+auths.name=Nom
+auths.type=Type
+auths.enabled=Activé
+auths.updated=Mis à jour
+auths.auth_type=Type d'Autorisation
+auths.auth_name=Nom d'Autorisation
+auths.domain=Domaine
+auths.host=Hôte
+auths.port=Port
+auths.base_dn=Base DN (Nom Distingué)
+auths.attributes=Rechercher les Attributs
+auths.filter=Filtre de recherche
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=Type d'Autorisation SMTP
+auths.smtphost=Hôte SMTP
+auths.smtpport=Port SMTP
+auths.enable_tls=Activer le Chiffrement TLS
+auths.enable_auto_register=Connexion Automatique
+auths.tips=Conseils
+auths.edit=Modifier les Paramètres d'Autorisation
+auths.activated=Authentification activée
+auths.update_success=Paramètres d'autorisation mis à jour avec succès.
+auths.update=Mettre les Paramètres d'Autorisation à jour
+auths.delete=Supprimer cette Autorisation
+auths.delete_auth_title=Suppression d'Autorisation
+auths.delete_auth_desc=Cette autorisation sera supprimée. Continuer ?
+
+config.server_config=Configuration du Serveur
+config.app_name=Nom de l'Application
+config.app_ver=Version de l'Application
+config.app_url=URL de l'Application
+config.domain=Domaine
+config.offline_mode=Mode hors-ligne
+config.disable_router_log=Désactiver la Journalisation du Routeur
+config.run_user=Entrer un Utilisateur
+config.run_mode=Mode d'Éxécution
+config.repo_root_path=Emplacement Racine du Référentiel
+config.static_file_root_path=Emplacement Racine du Fichier Statique
+config.log_file_root_path=Emplacement Racine du Fichier Journal
+config.script_type=Type de Script
+config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur
+config.db_config=Configuration de la Base de Données
+config.db_type=Type
+config.db_host=Hôte
+config.db_name=Nom
+config.db_user=Utilisateur
+config.db_ssl_mode=Mode SSL
+config.db_ssl_mode_helper=("postgres" uniquement)
+config.db_path=Emplacement
+config.db_path_helper=("sqlite3" uniquement)
+config.service_config=Configuration du Service
+config.register_email_confirm=E-mail de Confirmation d'Enregistrement
+config.disable_register=Désactiver l'Enregistrement
+config.require_sign_in_view=Connexion Obligatoire pour Visualiser
+config.mail_notify=Mailer les Notifications
+config.enable_cache_avatar=Activer le Cache d'Avatar
+config.active_code_lives=Limites de Code Actif
+config.reset_password_code_lives=Réinitialiser le Mot De Passe des Limites de Code
+config.webhook_config=Configuration Webhook
+config.task_interval=Intervalles de Tâches
+config.deliver_timeout=Expiration d'Envoi
+config.mailer_config=Configuration du Maileur
+config.mailer_enabled=Activé
+config.mailer_name=Nom
+config.mailer_host=Hôte
+config.mailer_user=Utilisateur
+config.oauth_config=Configuration OAuth
+config.oauth_enabled=Activé
+config.cache_config=Configuration du Cache
+config.cache_adapter=Adaptateur du Cache
+config.cache_interval=Intervals du Cache
+config.cache_conn=Liaison du Cache
+config.session_config=Configuration de Session
+config.session_provider=Fournisseur de Session
+config.provider_config=Configurer le Fournisseur
+config.cookie_name=Nom du Cookie
+config.enable_set_cookie=Activer les Cookies
+config.gc_interval_time=Intervals GC
+config.session_life_time=Durée de Session
+config.https_only=HTTPS uniquement
+config.cookie_life_time=Expiration du Cookie
+config.picture_config=Configuration d'Image
+config.picture_service=Service d'Imagerie
+config.disable_gravatar=Désactiver Gravatar
+config.log_config=Configuration du Journal
+config.log_mode=Mode du Journal
+
+monitor.cron=Tâches Cron
+monitor.name=Nom
+monitor.schedule=Planification
+monitor.next=Suivant
+monitor.previous=Précédent
+monitor.execute_times=Nombre d'Éxécutions
+monitor.process=Processus en cours d'Éxécution
+monitor.desc=Description
+monitor.start=Heure de Démarrage
+monitor.execute_time=Heure d'Éxécution
+
+notices.system_notice_list=Notes Systèmes
+notices.type=Type
+notices.type_1=Référentiel
+notices.desc=Description
+notices.op=Auteur
+notices.delete_success=Note système supprimée avec succès.
+
+[action]
+create_repo=a crée le Référentiel <a href="%s/%s">%s</a>
+commit_repo=a soumis à <a href="%s/%s/src/%s">%s</a> chez <a href="%s/%s">%s</a>
+create_issue=a ouvert un problème <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=a commenté le problème <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=a transféré le Référentiel <code>%s</code> à <a href="/%s%s">%s</a>
+push_tag=a tagé <a href="%s/%s/src/%s">%s</a> à <a href="%s/%s">%s</a>
+compare_2_commits=Comparer ces 2 commissions
+
+[tool]
+ago=auparavant
+from_now=à partir de maintenant
+now=maintenant
+1s=1 seconde %s
+1m=1 minute %s
+1h=1 heure %s
+1d=1 jour %s
+1w=1 semaine %s
+1mon=1 mois %s
+1y=1 an %s
+seconds=%d secondes %s
+minutes=%d minutes %s
+hours=%d heures %s
+days=%d jours %s
+weeks=%d semaines %s
+months=%d mois %s
+years=%d ans %s
+raw_seconds=secondes
+raw_minutes=minutes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_nl-NL.ini b/conf/locale/locale_nl-NL.ini index 4943951f..ab93b8e0 100644..100755 --- a/conf/locale/locale_nl-NL.ini +++ b/conf/locale/locale_nl-NL.ini @@ -1,585 +1,679 @@ -app_desc = Een pijnloze self-hosted Git-dienst geschreven in Go -home = Home -dashboard = Dashboard -explore = Verkennen -help = Help -sign_in = Inloggen -social_sign_in = Social netwerk inlog: tweede stap <small>account koppelen</small> -sign_out = Afmelden -sign_up = Aanmelden -register = Registreer -website = Website -version = Versie -page = Pagina -template = Template -language = Taal -username = Gebruikersnaam -email = E-mail -password = Wachttwoord -re_type = Verificatie -captcha = Captcha -repository = Repositorie -organization = Organisatie -mirror = Mirror -new_repo = Nieuwe repositorie -new_migrate = Nieuwe migratie -new_org = Nieuwe organisatie -manage_org = Beheer organisaties -admin_panel = Adminpaneel -account_settings = Accountinstellingen -settings = Instellingen -news_feed = Nieuwsfeed -pull_requests = Pull-aanvragen -issues = Issues -cancel = Annuleer - -[home] -uname_holder = Gebruikersnaam of e-mail -password_holder = Wachtwoord -switch_dashboard_context = Wissel voorpaginacontext -my_repos = Mijn repositories -collaborative_repos = Gedeelde repositories -my_orgs = Mijn organisaties -my_mirrors = Mijn mirrors - -[auth] -create_new_account = Maak nieuw account aan -register_hepler_msg = Heeft u al een account? Meld u nu aan! -social_register_hepler_msg = Heeft u al een account? Koppel nu! -disable_register_prompt = Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site. -disable_register_mail = Sorry, bevestiging van registratie per e-mail is uitgeschakeld. -remember_me = Onthoud mij -forgot_password = Wachtwoord vergeten -forget_password = Wachtwoord vergeten? -sign_up_now = Een account nodig? Meld u nu aan. -confirmation_mail_sent_prompt = Een bevestigingsemail is gestuurd naar <b>%s</b>, Bevestig u aanvraag binnen %d uren om uw registratie te voltooien. -sign_in_email = Meld u aan met uw e-mailadres -active_your_account = Activeer uw account -resent_limit_prompt = Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag. -has_unconfirmed_mail = Beste %s, u heeft een onbevestigde e-mailadres (<b>%s</b>). Als u nog geen bevestiging per e-mail heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. -resend_mail = Klik hier om uw activatie mail nog een keer te verzenden -send_reset_mail = Klik hier om uw wachtwoord reset mail (nogmaals) te versturen -reset_password = Reset uw wachtwoord -invalid_code = Sorry, uw bevestigingscode is verlopen of niet meer geldig. -reset_password_helper = Klik hier om uw wachtwoord opnieuw in te stellen. -password_too_short = De lengte van uw wachtwoord moet minimaal zes karakters zijn. -email_not_associate = Dit e-mailadres is niet gekoppeld aan een account. - -[form] -UserName = Gebruikersnaam -RepoName = Repositorie naam -Email = e-mailadres -Password = Wachtwoord -Retype = Verifieer wachtwoord -SSHTitle = SSH sleutel naam -HttpsUrl = HTTPS URL -PayloadUrl = Payload URL -TeamName = Team naam -AuthName = Autorisatienaam -require_error = kan niet leeg zijn. -alpha_dash_error = moet een valide alfanumeriek of dash(-_) karakter zijn. -alpha_dash_dot_error = moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn. -min_size_error = moet minimaal %s karakters bevatten. -max_size_error = mag maximaal %s karakters bevatten. -email_error = is niet een valide e-mail adres. -url_error = is niet een valide URL. -unknown_error = Onbekende fout: -captcha_incorrect = Captcha komt niet overeen. -password_not_match = Wachtwoord en verificatie wachtwoord komen niet overeen. -username_been_taken = Gebruikersnaam is al in gebruik. -repo_name_been_taken = Repositorie naam is al in gebruik. -org_name_been_taken = Organisatie naam is al in gebruik. -team_name_been_taken = Team naam is al in gebruik. -email_been_used = e-mailadres is al in gebruik. -ssh_key_been_used = Openbare sleutel naam is al in gebruik. -illegal_username = Gebruikersnaam bevat illegale karakters. -illegal_repo_name = Repositorie naam bevat illegale karakters. -illegal_org_name = Organisatie naam bevat illegale karakters. -illegal_team_name = Team naam bevat illegale karakters. -username_password_incorrect = Gebruikersnaam of wachtwoord is niet correct. -enterred_invalid_repo_name = U heeft een onjuiste repositorie naam ingevoerd. -enterred_invalid_owner_name = U heeft een onjuiste eigenaar ingevoerd. -enterred_invalid_password = U heeft een onjuiste wachtwoord ingevoerd. -user_not_exist = Gegeven gebruiker bestaat niet. -last_org_owner = De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst nieuwe lid (eigenaar) aanstellen. -invalid_ssh_key = Sorry, we zijn niet in staat om uw SSH-sleutel te verifiëren: %s -auth_failed = Verificatie mislukt: %v -still_own_repo = Uw account heeft nog een eigendom op een repositorie. U moet deze eerst verwijderen of overdragen. -org_still_own_repo = De organisatie heeft nog eigendomen op repositories. U moet deze eerst verwijderen of overdragen. -still_own_user = Deze authenticatie methode wordt nog gebruikt door sommige gebruikers. U moet hen eerst verplaatsen of verwijderen. -AdminEmail = E-mail beheerder - -[settings] -profile = Profiel -password = Wachtwoord -ssh_keys = SSH-sleutels -social = Sociale netwerk-accounts -orgs = Organisaties -delete = Verwijder account -public_profile = Openbaar profiel -profile_desc = Uw e-mailadres is openbaar zichtbaar en zal gebruikt worden gebruikt voor alle account gerlateerde berichtgevingen en web bewerking gemaakt via de website. -full_name = Volledige naam -website = Website -location = Locatie -update_profile = Profile bijwerken -update_profile_success = Uw profiel is succesvol bijgewerkt. -change_password = Verander wachtwoord -old_password = Huidige wachtwoord -new_password = Nieuw wachtwoord -password_incorrect = Huidig wachtwoord is niet correct. -change_password_success = Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen. -manage_ssh_keys = Beheer SSH sleutels -add_key = Sleutel toevoegen -ssh_desc = Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent. -ssh_helper = <strong>Hulp nodig?</strong> Bekijk onze help pagina's over <a href="https://help.github.com/articles/generating-ssh-keys">SSH sleutels genereeren</a> of over <a href="https://help.github.com/ssh-issues/">meest voorkomende SSH problemen</a>. -add_new_key = SSH sleutel toevoegen -key_name = Sleutel naam -key_content = Inhoud -add_key_success = Nieuwe SSH sleutel is toegevoegd! -delete_key = Verwijder -add_on = Toegevoegd op -last_used = Laatst gebruikt op -no_activity = Geen recente activiteiten -manage_social = Beheer gekoppelde sociale accounts -social_desc = Dit is een lijst van de bijbehorende sociale accounts koppelingen, Verwijder eventueel koppelingen die u niet herkent. -unbind = Loskoppelen -unbind_success = Sociaal account is ontkoppeld. -delete_account = Verwijder uw account -delete_prompt = Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien! -confirm_delete_account = Bevestig verwijdering -uid = uid -change_username = Username veranderd -change_username_desc = Gebruikersnaam is gewijzigd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op uw account. -continue = Doorgaan -cancel = Annuleren -delete_account_title = Account verwijderen -delete_account_desc = Dit account zal permanent worden verwijderd. Wilt u doorgaan? - -[repo] -owner = Eigenaar -repo_name = Repositorie naam -repo_name_helper = Een goede repositorie naam is kort, memorabel en <strong>uniek</strong>. -visibility = Zichtbaarheid -visiblity_helper = Deze repositorie is <span class="label label-red label-radius">prive</span> -repo_desc = Omschrijving -repo_lang = Taal -repo_lang_helper = Selecteer een .gitignore bestand -license = Licentie -license_helper = Selecteer een licentie bestand -init_readme = Initialiseer deze repositorie met een README.md -create_repo = Nieuwe Repositorie -default_branch = Standaard branch -mirror_interval = Mirror interval(uur) -goget_meta = Go-Get Meta -goget_meta_helper = Deze repositorie is nu beschikbaar voor <span class="label label-blue label-radius">Go-Get</span> -need_auth = Autorisatie vereist -migrate_type = Migratie type -migrate_type_helper = Deze repositorie zal een <span class="label label-blue label-radius">mirror</span> worden -migrate_repo = Migreer repositorie -clone_helper = Hulp nodig bij het klonen? Kijk dan <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">hier</a> voor hulp! -unwatch = Negeren -watch = Volgen -unstar = Ontster -star = Ster -fork = Fork -settings = Instellingen -settings.options = Opties -settings.collaboration = Samenwerking -settings.hooks = Webhooks -settings.deploy_keys = Installeer sleutels -settings.basic_settings = Basis instellingen -settings.danger_zone = Gevaren zone -settings.site = Officiële site -settings.update_settings = Instellingen bewerken -settings.transfer = Eigendom overdragen -settings.transfer_desc = Draag deze repo over aan een andere gebruiker of een organisatie waar u beheerders rechten heeft. -settings.delete = Verwijder deze repositorie -settings.delete_desc = Als u eenmaal een repositorie verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties. -settings.update_settings_success = Repositorie instellingen zijn succesvol bijgewerkt. -settings.transfer_owner = Nieuwe eigenaar -settings.make_transfer = Maak overdracht -settings.confirm_delete = Bevestig verwijdering -settings.add_collaborator = Nieuwe medewerker toevoegen -settings.add_collaborator_success = medewerker is toegevoegd. -settings.remove_collaborator_success = medewerker is verwijderd. -settings.add_webhook = Webhook toevoegen -settings.hooks_desc = Webhooks maken het mogelijk om externe diensten te waaarschuwen wanneer zich bepaalde gebeurtenissen voordoen op Gogs . Wanneer de opgegeven gebeurtenissen gebeuren , zullen we een POST-aanvraag aan alle URL's die u verstrekt sturen . Lees meer in onze <a target="_blank" href="http://gogs.io/docs/features/webhook.html"> Webhooks gids </a>. -settings.remove_hook_success = Webhook is verwijderd. -settings.add_webhook_desc = We sturen een <code>POST</code> verzoek aan de onderstaande URL met de details van het geplaatste evenementen. U kunt ook aangeven welke data u wilt ontvangen (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). U kunt meer informatie vinden in onze <a target="_blank" href="http://gogs.io/docs/features/webhook.html"> webhooks gids</a>. -settings.payload_url = Payload URL -settings.content_type = Content type -settings.secret = Geheim -settings.event_desc = Bij welke gebeurtenissen wilt u dat deze webhook getriggerd wordt? -settings.event_push_only = Alleen bij de <code>push</code> event. -settings.active = Actief -settings.active_helper = We zullen details van de gebeurtenissen af leveren wanneer deze webhook wordt geactiveerd. -settings.add_hook_success = Nieuwe webhook toegevoegd. -settings.update_webhook = Bewerk webhook -settings.update_hook_success = Webhook is bijgewerkt. -settings.delete_webhook = Webhook verwijderen -settings.recent_deliveries = Recente bezorgingen -copy_link = Kopieer -click_to_copy = Kopieer link naar plakbord -copied = Gekopieerd -no_desc = Geen omschrijving -quick_guide = Snelstart gids -clone_this_repo = Kloon deze repositorie -create_new_repo_command = Maak een nieuwe repositorie aan vanaf de console -push_exist_repo = Push een bestaande repositorie vanaf de console -branch = Aftakking -tree = Boom -branch_and_tags = Aftakkingen & labels -branches = Aftakkingen -tags = Labels -issues = Issues -commits = Commits -releases = Publicaties -commits.commits = Commits -commits.search = Zoeken -commits.find = zoek -commits.author = Auteur -commits.message = Bericht -commits.date = Datum -commits.older = Ouder -commits.newer = Nieuwer -settings.change_reponame = Repositorienaam aangepast -settings.change_reponame_desc = De repositorienaam is veranderd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze repositorie. -settings.new_owner_has_same_repo = De nieuwe eigenaar heeft al een repositorie met deze naam -settings.transfer_notices = <p> - U kan uw toegang verliezen als de nieuwe eigenaar een individuele gebruiker is</p> <p> - . . U zal uw toegang behouden als de nieuwe eigenaar een organisatie is en u één van de eigenaren bent</p> -settings.transfer_succeed = Eigendom repositorie succesvol overgedragen -settings.hook_type = Type hook -settings.add_slack_hook_desc = Voeg een <a href="http://slack.com">Slack</a> integratie toe aan uw repositorie. -settings.slack_token = Slack token -settings.slack_domain = Slack domein -settings.slack_channel = Slack kanaal - -[org] -org_name_holder = Organisatienaam -org_name_helper = Een goede organisatienaam is kort en memorabel. -org_email_helper = Alle notificaties en bevestigingen worden op het e-mailadres van de organisatie ontvangen. -create_org = Nieuwe organisatie aanmaken -repo_updated = Geupdate -people = Mensen -invite_someone = Iemand uitnodigen -teams = Teams -lower_members = leden -lower_repositories = repositories -create_new_team = Nieuw team aanmaken -org_desc = Omschrijving -team_name = Teamnaam -team_desc = Omschrijving -team_name_helper = U gebruikt deze naam om dit team te vermelden in conversaties. -team_desc_helper = Waar gaat dit team doen? -team_permission_desc = Welke privileges zou dit team moeten hebben? -settings = Instellingen -settings.options = Opties -settings.full_name = Volledige naam -settings.website = Website -settings.location = Locatie -settings.update_settings = Instellingen bijwerken -settings.update_setting_success = Organisatie instellingen zijn succesvol bijgewerkt. -settings.delete = Verwijder organisatie -settings.delete_account = Verwijder deze organisatie -settings.delete_prompt = Deze actie zal de origanisatie permanent verwijderen. U kunt dit <strong>NIET</strong> terug draaien! -settings.confirm_delete_account = Bevestig verwijdering -members.public = Openbaar -members.public_helper = maak prive -members.private = Prive -members.private_helper = maak openbaar -members.owner = Eigenaar -members.member = Lid -members.conceal = Verbergen -members.remove = Verwijderen -members.leave = Verlaat -members.invite_desc = Begin met het typen van een gebruikersnaam om een nieuw lid aan %s uit te nodigen: -members.invite_now = Nu uitnodigen -teams.join = Lid worden -teams.leave = Vertlaat -teams.read_access = Leestoegang -teams.read_access_helper = Dit team is in staat om zijn repositories te bekijken en te klonen. -teams.write_access = Schrijf toegang -teams.write_access_helper = Dit team is in staat om zijn repositories te bekijken en push aanvragen te verwerken. -teams.admin_access = Beheerder toegang -teams.admin_access_helper = Dit team is in staat om push & pull aanvragen te verwerken en om nieuwe medewerkers toe te voegen. -teams.no_desc = Dit team heeft geen omschrijving -teams.settings = Instellingen -teams.owners_permission_desc = Eigenaren hebben volledige toegang tot <strong>alle repositories</strong> en hebben <strong>beheerder rechten</strong> over de organisatie. -teams.members = Team leden -teams.update_settings = Instellingen bijwerken -teams.delete_team = Verwijder deze team -teams.add_team_member = Nieuwe team lid aanmaken -teams.delete_team_success = Gekozen team is succesvol verwijderd. -teams.read_permission_desc = Dit team heeft <strong>Lees</strong> rechten : leden kunnen repositories lezen en klonen. -teams.write_permission_desc = Dit team heeft <strong>Schrijf</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken. -teams.admin_permission_desc = Dit team heeft <strong>Beheerders</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken en medewerkers toevoegen. -teams.repositories = Teamrepositories -teams.add_team_repository = Nieuwe teamrepositorie aanmaken -teams.remove_repo = Verwijder -settings.change_orgname = Organisatie naam veranderd -settings.change_orgname_desc = De naam van de organisatie is veranderd, wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze organisatie. -settings.delete_org_title = Verwijderen organsiatie -settings.delete_org_desc = Deze organisatie zal permanent worden verwijderd, wilt u doorgaan? -settings.hooks_desc = Een webhook toevoegen die door <strong>alle repositories</strong> in deze organisatie getriggerd kan worden. -teams.delete_team_title = Team verwijderen -teams.delete_team_desc = Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan? - -[admin] -dashboard = Dashboard -users = Gebruikers -organizations = Orgranisaties -repositories = Repositories -authentication = Autenticaties -config = Configuratie -monitor = Bijhouden -prev = Vorige -next = Volgende -dashboard.statistic = Statistieken -dashboard.operations = Bewerkingen -dashboard.system_status = Status Systeemmonitor -dashboard.statistic_info = Gogs database heeft <b>%d</b> gebruikers, <b>%d</b> organisaties, <b>%d</b> openbare sleutels, <b>%d</b> repositories, <b>%d</b> volgers, <b>%d</b> sterren, <b>%d</b> acties, <b>%d</b> participanten, <b>%d</b> issues, <b>%d</b> reacties, <b>%d</b> sociale accounten, <b>%d</b> volgers, <b>%d</b> mirrors, <b>%d</b> publicaties, <b>%d</b> login bronnen, <b>%d</b> webhooks, <b>%d</b> mijlpalen, <b>%d</b> labels, <b>%d</b> hook taken, <b>%d</b> teams, <b>%d</b> bijgewerkte taken, <b>%d</b> bijlagen. -dashboard.operation_name = Bewerking naam -dashboard.operation_switch = Omschakelen -dashboard.operation_run = Uitvoeren -dashboard.clean_unbind_oauth = Clean unbound OAuths -dashboard.delete_inactivate_accounts = Verwijder alle inactieve accounts -dashboard.server_uptime = Uptime server -dashboard.current_goroutine = Huidige Goroutines -dashboard.current_memory_usage = Huidige geheugen gebruik -dashboard.total_memory_allocated = Totaal toegewezen geheugen -dashboard.memory_obtained = Geheugen gebruikt -dashboard.pointer_lookup_times = Pointer Lookup Times -dashboard.memory_allocate_times = Memory Allocate Times -dashboard.memory_free_times = Memory Free Times -dashboard.current_heap_usage = Current Heap Usage -dashboard.heap_memory_obtained = Heap Memory Obtained -dashboard.heap_memory_idle = Heap Memory Idle -dashboard.heap_memory_in_use = Heap Memory In Use -dashboard.heap_memory_released = Heap Memory Released -dashboard.heap_objects = Heap Objects -dashboard.bootstrap_stack_usage = Bootstrap Stack Usage -dashboard.stack_memory_obtained = Stack Memory Obtained -dashboard.mspan_structures_usage = MSpan Structures Usage -dashboard.mspan_structures_obtained = MSpan Structures Obtained -dashboard.mcache_structures_usage = MCache Structures Usage -dashboard.mcache_structures_obtained = MCache Structures Obtained -dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained -dashboard.gc_metadata_obtained = GC Metadada Obtained -dashboard.other_system_allocation_obtained = Other System Allocation Obtained -dashboard.next_gc_recycle = Volgende GC recycle -dashboard.last_gc_time = Sinds vorige GC verwerkingstijd -dashboard.total_gc_time = Totaal GC verwerkingstijd -dashboard.total_gc_pause = Totaal GC verwerkingstijd -dashboard.last_gc_pause = Laatste GC verwerkingstijd -dashboard.gc_times = GC verwerkingen -users.user_manage_panel = Gebruikers beheren -users.new_account = Nieuw account aanmaken -users.name = Naam -users.activated = Geactiveerd -users.admin = Admin -users.repos = Repos -users.created = Aangemaakt -users.edit = Bewerken -users.auth_source = Autorisatiebron -users.local = Lokaal -users.auth_login_name = Autorisatie inlognaam -users.update_profile_success = Profiel is succesvol bijgewerkt. -users.edit_account = Bewerk account -users.is_activated = Dit account is geactiveerd -users.is_admin = Dit account heeft beheerdersrechten -users.update_profile = Account profiel bijwerken -users.delete_account = Dit account verwijderen -users.still_own_repo = Dit account is nog steeds eigendom van een repositorie. U moet deze repositorie eerst verwijderen of overdragen. -orgs.org_manage_panel = Organisaties beheren -orgs.name = Naam -orgs.teams = Teams -orgs.members = Leden -repos.repo_manage_panel = Repositoriebeheerpaneel -repos.owner = Eigenaar -repos.name = Naam -repos.private = Prive -repos.watches = Volgers -repos.stars = Sterren -repos.issues = Issues -auths.auth_manage_panel = Autorisatiebeheerpaneel -auths.new = Nieuwe autorisatiebron -auths.name = Naam -auths.type = Type -auths.enabled = Ingeschakeld -auths.updated = Bijgewerkt -auths.auth_type = Autorisatietype -auths.auth_name = Autorisatienaam -auths.domain = Domein -auths.host = Host -auths.port = Poort -auths.base_dn = Base DN -auths.attributes = Zoek attributen -auths.filter = Zoek filter -auths.ms_ad_sa = Ms Ad SA -auths.smtp_auth = SMTP authenticatietype -auths.smtphost = SMTP host -auths.smtpport = SMTP poort -auths.enable_tls = Activeer TLS-encryptie -auths.enable_auto_register = Activeer automatische registratie -auths.tips = Tips -auths.edit = Bewerk autorisatie-instellingen -auths.activated = Deze autorisatiemethode is geactiveerd -auths.update_success = Autorisatie-instellingen zijn succesvol bijgewerkt. -auths.update = Update autorisatie-instellingen -auths.delete = Verwijder deze autorisatie -config.server_config = Serverconfiguratie -config.app_name = Applicatienaam -config.app_ver = Applicatieversie -config.app_url = Applicatie-URL -config.domain = Domein -config.offline_mode = Offline-modus -config.disable_router_log = Router-log uitschakelen -config.run_user = Uitvoerende gebruiker -config.run_mode = Uitvoer modus -config.repo_root_path = Repositorie basis pad -config.static_file_root_path = Statische bestanden basis pad -config.log_file_root_path = Log bestand basis pad -config.script_type = Script type -config.reverse_auth_user = Reverse Authentication User -config.db_config = Databaseconfiguratie -config.db_type = Type -config.db_host = Host -config.db_name = Naam -config.db_user = Gebruiker -config.db_ssl_mode = SSL modus -config.db_ssl_mode_helper = (alleen voor "postgres") -config.db_path = Path -config.db_path_helper = (alleen voor "sqlite3") -config.service_config = Serviceconfiguratie -config.register_email_confirm = Register Email Confirmation -config.disable_register = Registratie uitgeschakeld -config.require_sign_in_view = Inloggen vereist om te kunnen inzien -config.mail_notify = E-mailnotificaties -config.enable_cache_avatar = Avatar Cache inschakelen -config.active_code_lives = Active Code Lives -config.reset_password_code_lives = Reset Password Code Lives -config.webhook_config = Webhook configuratie -config.task_interval = Taakinterval -config.deliver_timeout = Bezorging verlooptijd -config.mailer_config = Mailerconfiguatie -config.mailer_enabled = Ingeschakeld -config.mailer_name = Naam -config.mailer_host = Host -config.mailer_user = Gebruiker -config.oauth_config = OAuth-configuratie -config.oauth_enabled = Ingeschakeld -config.cache_config = Cache-configuratie -config.cache_adapter = Cache-adapter -config.cache_interval = Cache-interval -config.cache_conn = Cache-connectie -config.session_config = Sessieconfiguratie -config.session_provider = Sessieprovider -config.provider_config = Provider config -config.cookie_name = Cookie naam -config.enable_set_cookie = Set Cookie inschakelen -config.gc_interval_time = GC interval time -config.session_life_time = Sessie duur -config.https_only = Alleen HTTPS -config.cookie_life_time = Cookie duur leeftijd -config.session_hash_function = Sessie ID Hash functie -config.session_hash_key = Sessie ID Hash sleutel -config.picture_config = Foto configuratie -config.picture_service = Foto service -config.disable_gravatar = Gravatar uitschakelen -config.log_config = Logconfiguratie -config.log_mode = Log-modus -monitor.cron = Cron-taken -monitor.name = Naam -monitor.schedule = Planning -monitor.next = Volgende -monitor.previous = Vorige -monitor.execute_times = Aantal keren uitgevoerd -monitor.process = Draaiende processen -monitor.desc = Omschrijving -monitor.start = Starttijd -monitor.execute_time = Uitvoertijd -auths.delete_auth_title = Verwijderings-autorisatie -auths.delete_auth_desc = Deze autorisatiemethode wordt verwijderd. Weet u zeker dat u wilt doorgaan? - -[action] -create_repo = repositorie aangemaakt in <a href="%s/%s">%s</a> -commit_repo = push update naar <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a -create_issue = opende issue in <a href="%s/%s/issues/%s">%s#%s</a> -comment_issue = reactie op issue <a href="%s/%s/issues/%s">%s#%s</a> -transfer_repo = repositorie verplaatst naar <code>%s</code> naar <a href="/%s%s">%s</a> - -[tool] -ago = geleden -from_now = vanaf nu -now = nu -1s = 1 seconde %s -1m = 1 minuut %s -1h = 1 uur %s -1d = 1 dag %s -1w = 1 week %s -1mon = 1 maand %s -1y = 1 jaar %s -seconds = %d seconden %s -minutes = %d minuten %s -hours = %d uur %s -days = %d dagen %s -weeks = %d weken %s -months = %d maanden %s -years = %d jaren %s -raw_seconds = seconden -raw_minutes = minuten - -[install] -install = Installatie -title = Installatiestappen voor de eerste keer opstarten -requite_db_desc = Om Gogs te gebruiken is MySQL, PostgreSQL of SQLite3 vereist (SQLite3 is beschikbaar in de officiële versie). -db_type = Database-type -host = Host -user = Gebruikersnaam -password = Wachtwoord -db_name = Database naam -db_helper = Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL. -ssl_mode = SSL-modus -path = Pad -sqlite_helper = Het pad naar de SQLite3 database. -general_title = Algemene instellingen van Gogs -repo_path = Repositories basis directorie -repo_path_helper = Alle remote Git repositories worden in deze directorie opgeslagen -run_user = Uitvoerende gebruikersnaam -run_user_helper = Deze gebruiker moet toegang hebben tot de git repositorie directorie en moet Gogs kunnen starten -domain = Domein -domain_helper = Dit heeft invloed op de SSH kloon URLs -app_url = Applicatie URL -app_url_helper = Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt -email_title = Email service instellingen (Optioneel) -smtp_host = SMTP host -mailer_user = Afzender e-mail / gebruikersnaam -mailer_password = Wachtwoord -notify_title = Notificatie-instelligen (optioneel) -register_confirm = Activeer registratie emails -mail_notify = Activeer e-mailnotificaties -admin_title = Instellingen beheerdersaccount -admin_name = Gebruikersnaam -admin_password = Wachtwoord -confirm_password = Verifieer wachtwoord -admin_email = E-mailadres -install_gogs = Installeer Gogs -test_git_failed = Git test niet gelukt: 'git' commando %v -sqlite3_not_available = SQLite3 wordt niet ondersteund in uw versie. Gelieve de officiële versie downloaden vanaf http://gogs.io/docs/installation/install_from_binary.html, niet de gobuild versie downloaden. -invalid_db_setting = Uw database instellingen zijn niet correct: %v -invalid_repo_path = Repositorie basis pad is niet correct: %v -run_user_not_match = De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s -save_config_failed = Kan de configuratie niet opslaan: %v -invalid_admin_setting = Uw admin-instellingen zijn niet geldig: %v -install_success = Welkom! Wij zijn veheugd dat u voor Gogs heeft gekozen, veel plezier en tot ziens - -[explore] -repos = Repositories - -[user] -change_avatar = Verander uw avatar op Gravatar.com -join_on = Aangemeld op -repositories = repositories -activity = Openbare activiteit -followers = Volgers -starred = Sterren -following = Volgt +app_desc=Een pijnloze self-hosted Git-dienst geschreven in Go
+
+home=Huis
+dashboard=Dashboard
+explore=Verkennen
+help=Help
+sign_in=Inloggen
+social_sign_in=Social netwerk inlog: tweede stap <small>account koppelen</small>
+sign_out=Afmelden
+sign_up=Aanmelden
+register=Registreer
+website=Website
+version=Versie
+page=Pagina
+template=Sjabloon
+language=Taal
+
+username=Gebruikersnaam
+email=E-mail
+password=Wachttwoord
+re_type=Verificatie
+captcha=CAPTCHA
+
+repository=Repositorie
+organization=Organisatie
+mirror=Spiegel
+new_repo=Nieuwe repositorie
+new_migrate=Nieuwe migratie
+new_fork=Nieuwe vork Repository
+new_org=Nieuwe organisatie
+manage_org=Beheer organisaties
+admin_panel=Adminpaneel
+account_settings=Accountinstellingen
+settings=Instellingen
+
+news_feed=Nieuwsfeed
+pull_requests=Pull-aanvragen
+issues=Kwesties
+
+cancel=Annuleer
+
+[install]
+install=Installatie
+title=Installatiestappen voor de eerste keer opstarten
+requite_db_desc=Om Gogs te gebruiken is MySQL, PostgreSQL of SQLite3 vereist (SQLite3 is beschikbaar in de officiële versie).
+db_type=Database-type
+host=Host
+user=Gebruikersnaam
+password=Wachtwoord
+db_name=Database naam
+db_helper=Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL.
+ssl_mode=SSL-modus
+path=Pad
+sqlite_helper=Het pad naar de SQLite3 database.
+general_title=Algemene instellingen van Gogs
+repo_path=Repositories basis directorie
+repo_path_helper=Alle remote Git repositories worden in deze directorie opgeslagen
+run_user=Uitvoerende gebruikersnaam
+run_user_helper=Deze gebruiker moet toegang hebben tot de git repositorie directorie en moet Gogs kunnen starten
+domain=Domein
+domain_helper=Dit heeft invloed op de SSH kloon URLs
+app_url=Applicatie URL
+app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt
+email_title=Email service instellingen (Optioneel)
+smtp_host=SMTP host
+mailer_user=Afzender e-mail / gebruikersnaam
+mailer_password=Wachtwoord
+notify_title=Notificatie-instelligen (optioneel)
+register_confirm=Activeer registratie emails
+mail_notify=Activeer e-mailnotificaties
+admin_title=Instellingen beheerdersaccount
+admin_name=Gebruikersnaam
+admin_password=Wachtwoord
+confirm_password=Verifieer wachtwoord
+admin_email=E-mailadres
+install_gogs=Installeer Gogs
+test_git_failed=Git test niet gelukt: 'git' commando %v
+sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download de officiële binaire versie van %s, niet de gobuild versie.
+invalid_db_setting=Uw database instellingen zijn niet correct: %v
+invalid_repo_path=Repositorie basis pad is niet correct: %v
+run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s
+save_config_failed=Kan de configuratie niet opslaan: %v
+invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v
+install_success=Welkom! Wij zijn veheugd dat u voor Gogs heeft gekozen, veel plezier en tot ziens
+
+[home]
+uname_holder=Gebruikersnaam of e-mail
+password_holder=Wachtwoord
+switch_dashboard_context=Wissel voorpaginacontext
+my_repos=Mijn repositories
+collaborative_repos=Gedeelde repositories
+my_orgs=Mijn organisaties
+my_mirrors=Mijn mirrors
+
+[explore]
+repos=Repositories
+
+[auth]
+create_new_account=Maak nieuw account aan
+register_hepler_msg=Heeft u al een account? Meld u nu aan!
+social_register_hepler_msg=Heeft u al een account? Koppel nu!
+disable_register_prompt=Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.
+disable_register_mail=Sorry, bevestiging van registratie per e-mail is uitgeschakeld.
+remember_me=Onthoud mij
+forgot_password=Wachtwoord vergeten
+forget_password=Wachtwoord vergeten?
+sign_up_now=Een account nodig? Meld u nu aan.
+confirmation_mail_sent_prompt=Een bevestigingsemail is gestuurd naar <b>%s</b>, Bevestig u aanvraag binnen %d uren om uw registratie te voltooien.
+sign_in_email=Meld u aan met uw e-mailadres
+active_your_account=Activeer uw account
+resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag.
+has_unconfirmed_mail=Beste %s, u heeft een onbevestigde e-mailadres (<b>%s</b>). Als u nog geen bevestiging per e-mail heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
+resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
+email_not_associate=Dit e-mailadres is niet gekoppeld aan een account.
+send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen
+reset_password=Reset uw wachtwoord
+invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig.
+reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen.
+password_too_short=De lengte van uw wachtwoord moet minimaal zes karakters zijn.
+
+[form]
+UserName=Gebruikersnaam
+RepoName=Repositorie naam
+Email=e-mailadres
+Password=Wachtwoord
+Retype=Verifieer wachtwoord
+SSHTitle=SSH sleutel naam
+HttpsUrl=HTTPS-URL
+PayloadUrl=Nettolading URL
+TeamName=Team naam
+AuthName=Autorisatienaam
+AdminEmail=E-mail beheerder
+
+require_error=kan niet leeg zijn.
+alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn.
+alpha_dash_dot_error=moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn.
+min_size_error=moet minimaal %s karakters bevatten.
+max_size_error=mag maximaal %s karakters bevatten.
+email_error=is niet een valide e-mail adres.
+url_error=is niet een valide URL.
+unknown_error=Onbekende fout:
+captcha_incorrect=Captcha komt niet overeen.
+password_not_match=Wachtwoord en verificatie wachtwoord komen niet overeen.
+
+username_been_taken=Gebruikersnaam is al in gebruik.
+repo_name_been_taken=Repositorie naam is al in gebruik.
+org_name_been_taken=Organisatie naam is al in gebruik.
+team_name_been_taken=Team naam is al in gebruik.
+email_been_used=e-mailadres is al in gebruik.
+ssh_key_been_used=Openbare sleutel naam is al in gebruik.
+illegal_username=Gebruikersnaam bevat illegale karakters.
+illegal_repo_name=Repositorie naam bevat illegale karakters.
+illegal_org_name=Organisatie naam bevat illegale karakters.
+illegal_team_name=Team naam bevat illegale karakters.
+username_password_incorrect=Gebruikersnaam of wachtwoord is niet correct.
+enterred_invalid_repo_name=U heeft een onjuiste repositorie naam ingevoerd.
+enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd.
+enterred_invalid_password=U heeft een onjuiste wachtwoord ingevoerd.
+user_not_exist=Gegeven gebruiker bestaat niet.
+last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst nieuwe lid (eigenaar) aanstellen.
+
+invalid_ssh_key=Sorry, we zijn niet in staat om uw SSH-sleutel te verifiëren: %s
+unable_verify_ssh_key=Gogs kan niet controleren of uw SSH-sleutel, maar wij gaan ervan uit dat is geldig, zorg ervoor dat uzelf.
+auth_failed=Verificatie mislukt: %v
+
+still_own_repo=Uw account heeft nog een eigendom op een repositorie. U moet deze eerst verwijderen of overdragen.
+still_has_org=Uw account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen.
+org_still_own_repo=De organisatie heeft nog eigendomen op repositories. U moet deze eerst verwijderen of overdragen.
+
+still_own_user=Deze authenticatie methode wordt nog gebruikt door sommige gebruikers. U moet hen eerst verplaatsen of verwijderen.
+
+target_branch_not_exist=Doel branch bestaat niet
+
+[user]
+change_avatar=Verander uw avatar op Gravatar.com
+join_on=Aangemeld op
+repositories=repositories
+activity=Openbare activiteit
+followers=Volgers
+starred=Sterren
+following=Volgt
+
+[settings]
+profile=Profiel
+password=Wachtwoord
+ssh_keys=SSH-sleutels
+social=Sociale netwerk-accounts
+applications=Toepassingen
+orgs=Organisaties
+delete=Verwijder account
+uid=uid
+
+public_profile=Openbaar profiel
+profile_desc=Uw e-mailadres is openbaar zichtbaar en zal gebruikt worden gebruikt voor alle account gerlateerde berichtgevingen en web bewerking gemaakt via de website.
+full_name=Volledige naam
+website=Website
+location=Locatie
+update_profile=Profile bijwerken
+update_profile_success=Uw profiel is succesvol bijgewerkt.
+change_username=Username veranderd
+change_username_desc=Gebruikersnaam is gewijzigd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op uw account.
+continue=Doorgaan
+cancel=Annuleren
+
+change_password=Verander wachtwoord
+old_password=Huidige wachtwoord
+new_password=Nieuw wachtwoord
+password_incorrect=Huidig wachtwoord is niet correct.
+change_password_success=Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen.
+
+manage_ssh_keys=Beheer SSH sleutels
+add_key=Sleutel toevoegen
+ssh_desc=Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent.
+ssh_helper=<strong>De behoeftehulp van?</strong> Check out onze gids voor het <a href="%s"> genereren van SSH sleutels</a> of <a href="%s"> algemene SSH</a> problemen.
+add_new_key=SSH sleutel toevoegen
+key_name=Sleutel naam
+key_content=Inhoud
+add_key_success=Nieuwe SSH sleutel is toegevoegd!
+delete_key=Verwijder
+add_on=Toegevoegd op
+last_used=Laatst gebruikt op
+no_activity=Geen recente activiteiten
+
+manage_social=Beheer gekoppelde sociale accounts
+social_desc=Dit is een lijst van de bijbehorende sociale accounts koppelingen, Verwijder eventueel koppelingen die u niet herkent.
+unbind=Loskoppelen
+unbind_success=Sociaal account is ontkoppeld.
+
+manage_access_token=Persoonlijke toegangstokens beheren
+generate_new_token=Nieuwe Token genereren
+tokens_desc=Tokens u hebt gegenereerd die kunnen worden gebruikt voor toegang tot de API Gogs.
+new_token_desc=Zoals voor nu, moet elke token zal hebben volledige toegang tot uw account.
+token_name=Symbolische naam
+generate_token=Token genereren
+generate_token_succees=Nieuwe toegangstoken is met succes gegenereerd! Zorg ervoor dat uw nieuwe persoonlijke toegangstoken nu kopiëren. U zal niet zitten kundig voor zien het weer!
+delete_token=Verwijderen
+delete_token_success=Persoonlijke toegangstoken is met succes verwijderd! Vergeet niet uw toepassingen ook wilt bijwerken.
+
+delete_account=Verwijder uw account
+delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien!
+confirm_delete_account=Bevestig verwijdering
+delete_account_title=Account verwijderen
+delete_account_desc=Dit account zal permanent worden verwijderd. Wilt u doorgaan?
+
+[repo]
+owner=Eigenaar
+repo_name=Repositorie naam
+repo_name_helper=Een goede repositorie naam is kort, memorabel en <strong>uniek</strong>.
+visibility=Zichtbaarheid
+visiblity_helper=Deze repositorie is <span class="label label-red label-radius">prive</span>
+fork_repo=Vork Repository
+fork_from=Afsplitsing van
+fork_visiblity_helper=Gevorkte repository wijzigen zijn bereik potentiële kopers niet
+repo_desc=Omschrijving
+repo_lang=Taal
+repo_lang_helper=Selecteer een .gitignore bestand
+license=Licentie
+license_helper=Selecteer een licentie bestand
+init_readme=Initialiseer deze repositorie met een README.md
+create_repo=Nieuwe Repositorie
+default_branch=Standaard branch
+mirror_interval=Mirror interval(uur)
+goget_meta=Go-Get Meta
+goget_meta_helper=Deze repositorie is nu beschikbaar voor <span class="label label-blue label-radius">Go-Get</span>
+
+need_auth=Autorisatie vereist
+migrate_type=Migratie type
+migrate_type_helper=Deze repositorie zal een <span class="label label-blue label-radius">mirror</span> worden
+migrate_repo=Migreer repositorie
+
+copy_link=Kopieer
+click_to_copy=Kopieer link naar plakbord
+copied=Gekopieerd
+clone_helper=De behoeftehulp van klonen? Bezoek <a target="_blank" href="%s"> helpen</a>!
+unwatch=Negeren
+watch=Volgen
+unstar=Ontster
+star=Ster
+fork=Vork
+
+no_desc=Geen omschrijving
+quick_guide=Snelstart gids
+clone_this_repo=Kloon deze repositorie
+create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
+push_exist_repo=Push een bestaande repositorie vanaf de console
+
+branch=Aftakking
+tree=Boom
+branch_and_tags=Aftakkingen & labels
+branches=Aftakkingen
+tags=Labels
+issues=Kwesties
+commits=Commits
+releases=Publicaties
+file_raw=Ruwe
+file_history=Geschiedenis
+file_view_raw=Weergave ruwe
+
+commits.commits=Commits
+commits.search=Zoeken
+commits.find=zoek
+commits.author=Auteur
+commits.message=Bericht
+commits.date=Datum
+commits.older=Ouder
+commits.newer=Nieuwer
+
+settings=Instellingen
+settings.options=Opties
+settings.collaboration=Samenwerking
+settings.hooks=Webhooks
+settings.githooks=Git haken
+settings.deploy_keys=Installeer sleutels
+settings.basic_settings=Basis instellingen
+settings.danger_zone=Gevaren zone
+settings.site=Officiële site
+settings.update_settings=Instellingen bewerken
+settings.change_reponame=Repositorienaam aangepast
+settings.change_reponame_desc=De repositorienaam is veranderd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze repositorie.
+settings.transfer=Eigendom overdragen
+settings.transfer_desc=Draag deze repo over aan een andere gebruiker of een organisatie waar u beheerders rechten heeft.
+settings.new_owner_has_same_repo=De nieuwe eigenaar heeft al een repositorie met deze naam
+settings.delete=Verwijder deze repositorie
+settings.delete_desc=Als u eenmaal een repositorie verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties.
+settings.transfer_notices=<p> - U kan uw toegang verliezen als de nieuwe eigenaar een individuele gebruiker is</p> <p> - . . U zal uw toegang behouden als de nieuwe eigenaar een organisatie is en u één van de eigenaren bent</p>
+settings.update_settings_success=Repositorie instellingen zijn succesvol bijgewerkt.
+settings.transfer_owner=Nieuwe eigenaar
+settings.make_transfer=Maak overdracht
+settings.transfer_succeed=Eigendom repositorie succesvol overgedragen
+settings.confirm_delete=Bevestig verwijdering
+settings.add_collaborator=Nieuwe medewerker toevoegen
+settings.add_collaborator_success=medewerker is toegevoegd.
+settings.remove_collaborator_success=medewerker is verwijderd.
+settings.user_is_org_member=Gebruiker is lid van de organisatie die als een medewerker kan niet worden toegevoegd.
+settings.add_webhook=Webhook toevoegen
+settings.hooks_desc=Webhooks dat de externe diensten om kennisgevingen te ontvangen wanneer bepaalde gebeurtenissen op Gogs plaatsvinden. Wanneer de opgegeven gebeurtenissen plaatsvinden, sturen we een POST-aanvraag naar elk van de URL's die u opgeeft. Meer informatie vindt u in onze <a target="_blank" href="%s"> Webhooks gids</a>.
+settings.githooks_desc=Git haken worden aangedreven door Git zelf, u kunt bestanden van ondersteunde haken in de lijst hieronder om aangepaste acties van toepassing bewerken.
+settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden gepresenteerd. Verlof inhoud leeg zal deze haak uitschakelen.
+settings.githook_name=Haak naam
+settings.githook_content=Haak inhoud
+settings.update_githook=Haak bijwerken
+settings.remove_hook_success=Webhook is verwijderd.
+settings.add_webhook_desc=We sturen een <code>POST</code>-aanvraag naar de onderstaande URL met details voor alle geplaatste gebeurtenissen. U kunt ook opgeven welke gegevensindeling u wenst te ontvangen (JSON, <code>x-1-800-www-Dell-vorm-urlencoded</code>, <em>enz</em>.). Meer informatie kan gevonden worden in <a target="_blank" href="%s"> Webhooks gids</a>.
+settings.payload_url=Nettolading URL
+settings.content_type=Content type
+settings.secret=Geheim
+settings.event_desc=Bij welke gebeurtenissen wilt u dat deze webhook getriggerd wordt?
+settings.event_push_only=Alleen bij de <code>push</code> event.
+settings.active=Actief
+settings.active_helper=We zullen details van de gebeurtenissen af leveren wanneer deze webhook wordt geactiveerd.
+settings.add_hook_success=Nieuwe webhook toegevoegd.
+settings.update_webhook=Bewerk webhook
+settings.update_hook_success=Webhook is bijgewerkt.
+settings.delete_webhook=Webhook verwijderen
+settings.recent_deliveries=Recente bezorgingen
+settings.hook_type=Type hook
+settings.add_slack_hook_desc=<a href="%s"> toegestane vertraging</a> integratie toevoegen aan uw repository.
+settings.slack_token=Slack token
+settings.slack_domain=Slack domein
+settings.slack_channel=Slack kanaal
+
+diff.browse_source=Bladeren bron
+diff.parent=bovenliggende
+diff.commit=commit
+diff.data_not_available=Diff gegevens niet beschikbaar.
+diff.show_diff_stats=Toon Diff Stats
+diff.stats_desc=<strong>%d gewijzigde bestanden</strong> met <strong>toevoegingen van %d</strong> en <strong>%d verwijderingen</strong>
+diff.bin=BIN
+diff.view_file=Bestand weergeven
+
+[org]
+org_name_holder=Organisatienaam
+org_name_helper=Een goede organisatienaam is kort en memorabel.
+org_email_helper=Alle notificaties en bevestigingen worden op het e-mailadres van de organisatie ontvangen.
+create_org=Nieuwe organisatie aanmaken
+repo_updated=Geupdate
+people=Mensen
+invite_someone=Iemand uitnodigen
+teams=Teams
+lower_members=leden
+lower_repositories=repositories
+create_new_team=Nieuw team aanmaken
+org_desc=Omschrijving
+team_name=Teamnaam
+team_desc=Omschrijving
+team_name_helper=U gebruikt deze naam om dit team te vermelden in conversaties.
+team_desc_helper=Waar gaat dit team doen?
+team_permission_desc=Welke privileges zou dit team moeten hebben?
+
+settings=Instellingen
+settings.options=Opties
+settings.full_name=Volledige naam
+settings.website=Website
+settings.location=Locatie
+settings.update_settings=Instellingen bijwerken
+settings.change_orgname=Organisatie naam veranderd
+settings.change_orgname_desc=De naam van de organisatie is veranderd, wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze organisatie.
+settings.update_setting_success=Organisatie instellingen zijn succesvol bijgewerkt.
+settings.delete=Verwijder organisatie
+settings.delete_account=Verwijder deze organisatie
+settings.delete_prompt=Deze actie zal de origanisatie permanent verwijderen. U kunt dit <strong>NIET</strong> terug draaien!
+settings.confirm_delete_account=Bevestig verwijdering
+settings.delete_org_title=Verwijderen organsiatie
+settings.delete_org_desc=Deze organisatie zal permanent worden verwijderd, wilt u doorgaan?
+settings.hooks_desc=Een webhook toevoegen die door <strong>alle repositories</strong> in deze organisatie getriggerd kan worden.
+
+members.public=Openbaar
+members.public_helper=maak prive
+members.private=Prive
+members.private_helper=maak openbaar
+members.owner=Eigenaar
+members.member=Lid
+members.conceal=Verbergen
+members.remove=Verwijderen
+members.leave=Verlaat
+members.invite_desc=Begin met het typen van een gebruikersnaam om een nieuw lid aan %s uit te nodigen:
+members.invite_now=Nu uitnodigen
+
+teams.join=Lid worden
+teams.leave=Vertlaat
+teams.read_access=Leestoegang
+teams.read_access_helper=Dit team is in staat om zijn repositories te bekijken en te klonen.
+teams.write_access=Schrijf toegang
+teams.write_access_helper=Dit team is in staat om zijn repositories te bekijken en push aanvragen te verwerken.
+teams.admin_access=Beheerder toegang
+teams.admin_access_helper=Dit team is in staat om push & pull aanvragen te verwerken en om nieuwe medewerkers toe te voegen.
+teams.no_desc=Dit team heeft geen omschrijving
+teams.settings=Instellingen
+teams.owners_permission_desc=Eigenaren hebben volledige toegang tot <strong>alle repositories</strong> en hebben <strong>beheerder rechten</strong> over de organisatie.
+teams.members=Team leden
+teams.update_settings=Instellingen bijwerken
+teams.delete_team=Verwijder deze team
+teams.add_team_member=Nieuwe team lid aanmaken
+teams.delete_team_title=Team verwijderen
+teams.delete_team_desc=Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan?
+teams.delete_team_success=Gekozen team is succesvol verwijderd.
+teams.read_permission_desc=Dit team heeft <strong>Lees</strong> rechten : leden kunnen repositories lezen en klonen.
+teams.write_permission_desc=Dit team heeft <strong>Schrijf</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken.
+teams.admin_permission_desc=Dit team heeft <strong>Beheerders</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken en medewerkers toevoegen.
+teams.repositories=Teamrepositories
+teams.add_team_repository=Nieuwe teamrepositorie aanmaken
+teams.remove_repo=Verwijder
+teams.add_nonexistent_repo=De opslagplaats die u probeert toe te voegen niet bestaat, kunt u het eerst aanmaken.
+
+[admin]
+dashboard=Dashboard
+users=Gebruikers
+organizations=Orgranisaties
+repositories=Repositories
+authentication=Autenticaties
+config=Configuratie
+notices=Systeem aankondigingen
+monitor=Bijhouden
+prev=Vorige
+next=Volgende
+
+dashboard.statistic=Statistieken
+dashboard.operations=Bewerkingen
+dashboard.system_status=Status Systeemmonitor
+dashboard.statistic_info=Gogs database heeft <b>%d</b> gebruikers, <b>%d</b> organisaties, <b>%d</b> openbare sleutels, <b>%d</b> repositories, <b>%d</b> volgers, <b>%d</b> sterren, <b>%d</b> acties, <b>%d</b> participanten, <b>%d</b> issues, <b>%d</b> reacties, <b>%d</b> sociale accounten, <b>%d</b> volgers, <b>%d</b> mirrors, <b>%d</b> publicaties, <b>%d</b> login bronnen, <b>%d</b> webhooks, <b>%d</b> mijlpalen, <b>%d</b> labels, <b>%d</b> hook taken, <b>%d</b> teams, <b>%d</b> bijgewerkte taken, <b>%d</b> bijlagen.
+dashboard.operation_name=Bewerking naam
+dashboard.operation_switch=Omschakelen
+dashboard.operation_run=Uitvoeren
+dashboard.clean_unbind_oauth=Clean unbound OAuths
+dashboard.delete_inactivate_accounts=Verwijder alle inactieve accounts
+dashboard.server_uptime=Uptime server
+dashboard.current_goroutine=Huidige Goroutines
+dashboard.current_memory_usage=Huidige geheugen gebruik
+dashboard.total_memory_allocated=Totaal toegewezen geheugen
+dashboard.memory_obtained=Geheugen gebruikt
+dashboard.pointer_lookup_times=Aanwijzer Lookup keer
+dashboard.memory_allocate_times=Geheugen toewijzen keer
+dashboard.memory_free_times=Geheugen gratis keer
+dashboard.current_heap_usage=Huidige Heap gebruik
+dashboard.heap_memory_obtained=Heap-geheugen verkregen
+dashboard.heap_memory_idle=Heap Memory inactief
+dashboard.heap_memory_in_use=Hoop geheugen In gebruik
+dashboard.heap_memory_released=Heap-geheugen vrijgegeven
+dashboard.heap_objects=Heap-objecten
+dashboard.bootstrap_stack_usage=Bootstrap Stack gebruik
+dashboard.stack_memory_obtained=Stapel geheugen verkregen
+dashboard.mspan_structures_usage=MSpan structuren gebruik
+dashboard.mspan_structures_obtained=MSpan structuren verkregen
+dashboard.mcache_structures_usage=MCache structuren gebruik
+dashboard.mcache_structures_obtained=MCache structuren verkregen
+dashboard.profiling_bucket_hash_table_obtained=Profilering emmer hashtabel verkregen
+dashboard.gc_metadata_obtained=GC Metadada verkregen
+dashboard.other_system_allocation_obtained=Andere systeem toewijzing verkregen
+dashboard.next_gc_recycle=Volgende GC recycle
+dashboard.last_gc_time=Sinds vorige GC verwerkingstijd
+dashboard.total_gc_time=Totaal GC verwerkingstijd
+dashboard.total_gc_pause=Totaal GC verwerkingstijd
+dashboard.last_gc_pause=Laatste GC verwerkingstijd
+dashboard.gc_times=GC verwerkingen
+
+users.user_manage_panel=Gebruikers beheren
+users.new_account=Nieuw account aanmaken
+users.name=Naam
+users.activated=Geactiveerd
+users.admin=Admin
+users.repos=Repos
+users.created=Aangemaakt
+users.edit=Bewerken
+users.auth_source=Autorisatiebron
+users.local=Lokaal
+users.auth_login_name=Autorisatie inlognaam
+users.update_profile_success=Profiel is succesvol bijgewerkt.
+users.edit_account=Bewerk account
+users.is_activated=Dit account is geactiveerd
+users.is_admin=Dit account heeft beheerdersrechten
+users.allow_git_hook=Deze account beschikt over machtigingen voor het maken van Git haken
+users.update_profile=Account profiel bijwerken
+users.delete_account=Dit account verwijderen
+users.still_own_repo=Dit account is nog steeds eigendom van een repositorie. U moet deze repositorie eerst verwijderen of overdragen.
+users.still_has_org=Deze account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen.
+
+orgs.org_manage_panel=Organisaties beheren
+orgs.name=Naam
+orgs.teams=Teams
+orgs.members=Leden
+
+repos.repo_manage_panel=Repositoriebeheerpaneel
+repos.owner=Eigenaar
+repos.name=Naam
+repos.private=Prive
+repos.watches=Volgers
+repos.stars=Sterren
+repos.issues=Kwesties
+
+auths.auth_manage_panel=Autorisatiebeheerpaneel
+auths.new=Nieuwe autorisatiebron
+auths.name=Naam
+auths.type=Type
+auths.enabled=Ingeschakeld
+auths.updated=Bijgewerkt
+auths.auth_type=Autorisatietype
+auths.auth_name=Autorisatienaam
+auths.domain=Domein
+auths.host=Host
+auths.port=Poort
+auths.base_dn=Base DN
+auths.attributes=Zoek attributen
+auths.filter=Zoek filter
+auths.ms_ad_sa=MS Ad SA
+auths.smtp_auth=SMTP authenticatietype
+auths.smtphost=SMTP host
+auths.smtpport=SMTP poort
+auths.enable_tls=Activeer TLS-encryptie
+auths.enable_auto_register=Activeer automatische registratie
+auths.tips=Tips
+auths.edit=Bewerk autorisatie-instellingen
+auths.activated=Deze autorisatiemethode is geactiveerd
+auths.update_success=Autorisatie-instellingen zijn succesvol bijgewerkt.
+auths.update=Update autorisatie-instellingen
+auths.delete=Verwijder deze autorisatie
+auths.delete_auth_title=Verwijderings-autorisatie
+auths.delete_auth_desc=Deze autorisatiemethode wordt verwijderd. Weet u zeker dat u wilt doorgaan?
+
+config.server_config=Serverconfiguratie
+config.app_name=Applicatienaam
+config.app_ver=Applicatieversie
+config.app_url=Applicatie-URL
+config.domain=Domein
+config.offline_mode=Offline-modus
+config.disable_router_log=Router-log uitschakelen
+config.run_user=Uitvoerende gebruiker
+config.run_mode=Uitvoer modus
+config.repo_root_path=Repositorie basis pad
+config.static_file_root_path=Statische bestanden basis pad
+config.log_file_root_path=Log bestand basis pad
+config.script_type=Script type
+config.reverse_auth_user=Omgekeerde verificatie gebruiker
+config.db_config=Databaseconfiguratie
+config.db_type=Type
+config.db_host=Host
+config.db_name=Naam
+config.db_user=Gebruiker
+config.db_ssl_mode=SSL modus
+config.db_ssl_mode_helper=(alleen voor "postgres")
+config.db_path=Pad
+config.db_path_helper=(alleen voor "sqlite3")
+config.service_config=Serviceconfiguratie
+config.register_email_confirm=E-mailbevestiging registreren
+config.disable_register=Registratie uitgeschakeld
+config.require_sign_in_view=Inloggen vereist om te kunnen inzien
+config.mail_notify=E-mailnotificaties
+config.enable_cache_avatar=Avatar Cache inschakelen
+config.active_code_lives=Actieve Code leven
+config.reset_password_code_lives=Reset wachtwoord Code leven
+config.webhook_config=Webhook configuratie
+config.task_interval=Taakinterval
+config.deliver_timeout=Bezorging verlooptijd
+config.mailer_config=Mailerconfiguatie
+config.mailer_enabled=Ingeschakeld
+config.mailer_name=Naam
+config.mailer_host=Host
+config.mailer_user=Gebruiker
+config.oauth_config=OAuth-configuratie
+config.oauth_enabled=Ingeschakeld
+config.cache_config=Cache-configuratie
+config.cache_adapter=Cache-adapter
+config.cache_interval=Cache-interval
+config.cache_conn=Cache-connectie
+config.session_config=Sessieconfiguratie
+config.session_provider=Sessieprovider
+config.provider_config=Provider config
+config.cookie_name=Cookie naam
+config.enable_set_cookie=Set Cookie inschakelen
+config.gc_interval_time=GC interval time
+config.session_life_time=Sessie duur
+config.https_only=Alleen HTTPS
+config.cookie_life_time=Cookie duur leeftijd
+config.picture_config=Foto configuratie
+config.picture_service=Foto service
+config.disable_gravatar=Gravatar uitschakelen
+config.log_config=Logconfiguratie
+config.log_mode=Log-modus
+
+monitor.cron=Cron-taken
+monitor.name=Naam
+monitor.schedule=Planning
+monitor.next=Volgende
+monitor.previous=Vorige
+monitor.execute_times=Aantal keren uitgevoerd
+monitor.process=Draaiende processen
+monitor.desc=Omschrijving
+monitor.start=Starttijd
+monitor.execute_time=Uitvoertijd
+
+notices.system_notice_list=Systeem aankondigingen
+notices.type=Type
+notices.type_1=Opslagplaats
+notices.desc=Beschrijving
+notices.op=Op.
+notices.delete_success=Systeem bericht is met succes verwijderd.
+
+[action]
+create_repo=repositorie aangemaakt in <a href="%s/%s">%s</a>
+commit_repo=push update naar <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a
+create_issue=opende issue in <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=reactie op issue <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=repositorie verplaatst naar <code>%s</code> naar <a href="/%s%s">%s</a>
+push_tag=geduwd label <a href="%s/%s/src/%s"> %s</a> naar <a href="%s/%s"> %s</a>
+compare_2_commits=Weergave vergelijking voor deze 2 commits
+
+[tool]
+ago=geleden
+from_now=vanaf nu
+now=nu
+1s=1 seconde %s
+1m=1 minuut %s
+1h=1 uur %s
+1d=1 dag %s
+1w=1 week %s
+1mon=1 maand %s
+1y=1 jaar %s
+seconds=%d seconden %s
+minutes=%d minuten %s
+hours=%d uur %s
+days=%d dagen %s
+weeks=%d weken %s
+months=%d maanden %s
+years=%d jaren %s
+raw_seconds=seconden
+raw_minutes=minuten
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index a5bccb55..bf1b21a4 100644..100755 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -1,659 +1,679 @@ -app_desc = 基于 Go 语言的自助 Git 服务 - -home = 首页 -dashboard = 控制面板 -explore = 探索 -help = 帮助 -sign_in = 登录 -social_sign_in = 社交帐号登录:第 2 步 <small>关联帐号</small> -sign_out = 退出 -sign_up = 注册 -register = 注册 -website = 官方网站 -version = 当前版本 -page = 页面 -template = 模板 -language = 语言选项 - -username = 用户名 -email = 邮箱 -password = 密码 -re_type = 确认密码 -captcha = 验证码 - -repository = 仓库 -organization = 组织 -mirror = 镜像 -new_repo = 创建新的仓库 -new_migrate = 迁移外部仓库 -new_org = 创建新的组织 -manage_org = 管理我的组织 -admin_panel = 管理面板 -account_settings = 帐户设置 -settings = 帐户设置 - -news_feed = 最新活动 -pull_requests = 合并请求 -issues = 工单管理 - -cancel = 取消 - -[install] -install = 安装页面 -title = 首次运行安装程序 -requite_db_desc = Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3。 -db_type = 数据库类型 -host = 数据库主机 -user = 数据库用户 -password = 数据库用户密码 -db_name = 数据库名称 -db_helper = 如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集。 -ssl_mode = SSL 模式 -path = 数据库文件路径 -sqlite_helper = SQLite3 数据库的文件路径。 -general_title = 应用基本设置 -repo_path = 仓库根目录 -repo_path_helper = 所有 Git 远程仓库都将被存放于该目录。 -run_user = 运行系统用户 -run_user_helper = 该用户必须具有对仓库根目录和运行 Gogs 的操作权限。 -domain = 域名 -domain_helper = 该设置影响 SSH 克隆地址。 -app_url = 应用 URL -app_url_helper = 该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。 -email_title = 邮件服务设置(可选) -smtp_host = SMTP 主机 -mailer_user = 发送邮箱 -mailer_password = 发送邮箱密码 -notify_title = 通知提醒设置(可选) -register_confirm = 启用注册邮箱确认 -mail_notify = 启用邮件通知提醒 -admin_title = 管理员帐号设置 -admin_name = 管理员用户名 -admin_password = 管理员密码 -confirm_password = 确认密码 -admin_email = 管理员邮箱 -install_gogs = 立即安装 -test_git_failed = 无法识别 'git' 命令:%v -sqlite3_not_available = 您所使用的发行版不支持 SQLite3,请从 http://gogs.io/docs/installation/install_from_binary.html 下载官方二进制发行版,而不是 gobuild 版本。 -invalid_db_setting = 数据库设置不正确:%v -invalid_repo_path = 仓库根目录设置不正确:%v -run_user_not_match = 运行系统用户非当前用户:%s -> %s -save_config_failed = 应用配置保存失败:%v -invalid_admin_setting = 管理员帐户设置不正确:%v -install_success = 您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG! - -[home] -uname_holder = 用户名或邮箱 -password_holder = 密码 -switch_dashboard_context = 切换控制面板用户 -my_repos = 我的仓库 -collaborative_repos = 参与协作的仓库 -my_orgs = 我的组织 -my_mirrors = 我的镜像 - -[explore] -repos = 探索仓库 - -[auth] -create_new_account = 创建帐户 -register_hepler_msg = 已经注册?立即登录! -social_register_hepler_msg = 已经注册?立即绑定! -disable_register_prompt = 对不起,注册功能已被关闭。请联系网站管理员。 -disable_register_mail = 对不起,注册邮箱确认功能已被关闭。 -remember_me = 记住登录 -forgot_password = 忘记密码 -forget_password = 忘记密码? -sign_up_now = 还没帐户?马上注册。 -confirmation_mail_sent_prompt = 一封新的确认邮件已经被发送至 <b>%s</b>,请检查您的收件箱并在 %d 小时内完成确认注册操作。 -sign_in_email = 登录到您的邮箱 -active_your_account = 激活您的帐户 -resent_limit_prompt = 对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试! -has_unconfirmed_mail = %s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 -resend_mail = 单击此处重新发送确认邮件 -email_not_associate = 您输入的邮箱地址未被关联到任何帐号! -send_reset_mail = 单击此处(重新)发送您的密码重置邮件 -reset_password = 重置密码 -invalid_code = 对不起,您的确认代码已过期或已失效。 -reset_password_helper = 单击此处重置密码 -password_too_short = 密码长度不能少于 6 位! - -[form] -UserName = 用户名 -RepoName = 仓库名称 -Email = 邮箱地址 -Password = 密码 -Retype = 确认密码 -SSHTitle = SSH 密钥名称 -HttpsUrl = HTTPS URL 地址 -PayloadUrl = 推送地址 -TeamName = 团队名称 -AuthName = 认证名称 -AdminEmail = 管理员邮箱 - -require_error = 不能为空。 -alpha_dash_error = 必须为英文字母、阿拉伯数字或横线(-_)。 -alpha_dash_dot_error = 必须为英文字母、阿拉伯数字、横线(-_)或点。 -min_size_error = 长度最小为 %s 个字符。 -max_size_error = 长度最大为 %s 个字符。 -email_error = 不是一个有效的邮箱地址。 -url_error = 不是一个有效的 URL。 -unknown_error = 未知错误: -captcha_incorrect = 验证码未匹配。 -password_not_match = 密码与确认密码未匹配。 - -username_been_taken = 用户名已经被占用。 -repo_name_been_taken = 仓库名称已经被占用。 -org_name_been_taken = 组织名称已经被占用。 -team_name_been_taken = 团队名称已经被占用。 -email_been_used = 邮箱地址已经被使用。 -ssh_key_been_used = SSH 密钥已经被使用。 -illegal_username = 您的用户名包含非法字符。 -illegal_repo_name = 仓库名称包含非法字符。 -illegal_org_name = 组织名称包含非法字符。 -illegal_team_name = 团队名称包含非法字符。 -username_password_incorrect = 用户名或密码不正确。 -enterred_invalid_repo_name = 请检查您输入的仓库名称是正确。 -enterred_invalid_owner_name = 请检查您输入的新所有者用户名是否正确。 -enterred_invalid_password = 请检查您输入的密码是否正确。 -user_not_exist = 被操作的用户不存在! -last_org_owner = 被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作! - -invalid_ssh_key = 很抱歉,我们无法验证您输入的 SSH 密钥:%s -unable_verify_ssh_key = Gogs 无法验证您输入的 SSH 密钥,但我们假设那是有效的密钥,请您自行确保其有效性! -auth_failed = 授权验证失败:%v - -still_own_repo = 您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! -org_still_own_repo = 该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作! - -still_own_user = 该授权认证依旧被部分用户使用,请先删除该部分用户后再试! - -[user] -change_avatar = 到 gravatar.com 上修改您的头像 -join_on = 加入于 -repositories = 仓库列表 -activity = 公开活动 -followers = 关注者 -starred = 已点赞 -following = 关注中 - -[settings] -profile = 个人信息 -password = 修改密码 -ssh_keys = 管理 SSH 密钥 -social = 社交帐号绑定 -orgs = 管理组织 -delete = 删除帐户 -uid = 用户 ID - -public_profile = 公开信息 -profile_desc = 您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。 -full_name = 自定义名称 -website = 个人网站 -location = 所在地区 -update_profile = 更新信息 -update_profile_success = 您的个人信息更新成功! -change_username = 用户名将被修改 -change_username_desc = 用户名被修改,您确定要继续操作吗?这将会影响到所有与您帐户有关的链接。 -continue = 继续操作 -cancel = 取消操作 - -change_password = 修改密码 -old_password = 当前密码 -new_password = 新的密码 -password_incorrect = 当前密码不正确! -change_password_success = 密码修改成功!您现在可以使用新的密码登录。 - -manage_ssh_keys = 管理 SSH 密钥 -add_key = 增加密钥 -ssh_desc = 以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它! -ssh_helper = <strong>需要帮助?</strong> 请查看有关 <a href="https://help.github.com/articles/generating-ssh-keys">如何生成 SSH 密钥</a> 或 <a href="https://help.github.com/ssh-issues/">常见 SSH 问题</a> 寻找答案。 -add_new_key = 增加 SSH 密钥 -key_name = 密钥名称 -key_content = 密钥内容 -add_key_success = 新的 SSH 密钥添加成功! -delete_key = 删除 -add_on = 增加于 -last_used = 上次使用在 -no_activity = 没有最近活动 - -manage_social = 管理关联社交帐户 -social_desc = 以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定! -unbind = 解除绑定 -unbind_success = 社交帐号解除绑定成功! - -delete_account = 删除当前帐户 -delete_prompt = 删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>! -confirm_delete_account = 确认删除帐户 -delete_account_title = 帐户删除操作 -delete_account_desc = 该帐户将被永久性删除,您确定要继续操作吗? - -[repo] -owner = 拥有者 -repo_name = 仓库名称 -repo_name_helper = 伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。 -visibility = 可见性 -visiblity_helper = 本仓库将是 <span class="label label-red label-radius">私有的</span> -repo_desc = 仓库描述 -repo_lang = 仓库语言 -repo_lang_helper = 请选择 .gitignore 文件 -license = 授权许可 -license_helper = 请选择授权许可文件 -init_readme = 使用 README.md 文件初始化仓库 -create_repo = 创建仓库 -default_branch = 默认分支 -mirror_interval = 镜像同步周期(小时) -goget_meta = Go-Get 支持 -goget_meta_helper = 本仓库将可以通过 <span class="label label-blue label-radius">Go Get</span> 获取 - -need_auth = 需要授权验证 -migrate_type = 迁移类型 -migrate_type_helper = 本仓库将是 <span class="label label-blue label-radius">镜像</span> -migrate_repo = 迁移仓库 - -copy_link = 复制链接 -click_to_copy = 复制到剪切板 -copied = 复制成功 -clone_helper = 不知道如何操作?访问 <a target="_blank" href="http://git-scm.com/book/zh/Git-基础-取得项目的-Git-仓库">此处</a> 查看帮助! -unwatch = 取消关注 -watch = 关注 -unstar = 取消点赞 -star = 点赞 -fork = 派生 - -no_desc = 暂无描述 -quick_guide = 快速帮助 -clone_this_repo = 克隆当前仓库 -create_new_repo_command = 从命令行创建一个新的仓库 -push_exist_repo = 从命令行推送已经创建的仓库 - -branch = 分支 -tree = 目录树 -branch_and_tags = 分支与标签 -branches = 分支列表 -tags = 标签列表 -issues = 工单管理 -commits = 提交历史 -releases = 版本发布 -file_raw = 原始文件 -file_history = 文件历史 -file_view_raw = 查看原始文件 - -commits.commits = 次代码提交 -commits.search = 搜索提交历史 -commits.find = 查找 -commits.author = 作者 -commits.message = 备注 -commits.date = 提交日期 -commits.older = 更旧的提交 -commits.newer = 更新的提交 - -settings = 仓库设置 -settings.options = 基本设置 -settings.collaboration = 管理协作者 -settings.hooks = 管理 Web 钩子 -settings.githooks = 管理 Git 钩子 -settings.deploy_keys = 管理部署密钥 -settings.basic_settings = 基本设置 -settings.danger_zone = 危险操作区 -settings.site = 官方网站 -settings.update_settings = 更新仓库设置 -settings.change_reponame = 仓库名称将被修改 -settings.change_reponame_desc = 仓库名称被修改,您确定要继续操作吗?这将会影响到所有与该仓库有关的链接。 -settings.transfer = 转移仓库所有权 -settings.transfer_desc = 您可以将仓库转移至您拥有管理员权限的帐户或组织。 -settings.new_owner_has_same_repo = 新的仓库拥有者已经存在同名仓库! -settings.delete = 删除本仓库 -settings.delete_desc = 删除仓库操作不可逆转,请三思而后行。 -settings.transfer_notices = <p>- 如果您转移给个人用户,您将对仓库失去所有权限。</p><p>- 如果您转移给您作为拥有者的组织,则可继续保持操作权限。</p> -settings.update_settings_success = 仓库设置更新成功! -settings.transfer_owner = 新拥有者 -settings.make_transfer = 确认转移仓库 -settings.transfer_succeed = 仓库所有权转移成功! -settings.confirm_delete = 确认删除仓库 -settings.add_collaborator = 增加新的协作者 -settings.add_collaborator_success = 成功添加新的协作者! -settings.remove_collaborator_success = 被操作的协作者已经被收回权限! -settings.user_is_org_member = 被操作的用户是组织成员,因此无法添加为协作者! -settings.add_webhook = 添加 Web 钩子 -settings.hooks_desc = Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文档</a> 获取更多信息。 -settings.remove_hook_success = Web 钩子删除成功! -settings.add_webhook_desc = 我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文档</a> 获取更多信息。 -settings.githooks_desc = Git 钩子是由 Git 本身提供的功能,以下为 Gogs 所支持的钩子列表。 -settings.githook_edit_desc = 如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。 -settings.githook_name = 钩子名称 -settings.githook_content = 钩子文本 -settings.update_githook = 更新钩子设置 -settings.payload_url = 推送地址 -settings.content_type = 数据格式 -settings.secret = 密钥文本 -settings.event_desc = 请设置您希望触发 Web 钩子的事件: -settings.event_push_only = 只推送 <code>push</code> 事件。 -settings.active = 是否激活 -settings.active_helper = 当指定事件发生时我们将会触发此 Web 钩子。 -settings.add_hook_success = Web 钩子添加成功! -settings.update_webhook = 更新 Web 钩子 -settings.update_hook_success = Web 钩子更新成功! -settings.delete_webhook = 删除 Web 钩子 -settings.recent_deliveries = 最近推送记录 -settings.hook_type = 钩子类型 -settings.add_slack_hook_desc = 为您的仓库增加 <a href="http://slack.com">Slack</a> 集成 -settings.slack_token = 令牌 -settings.slack_domain = 域名 -settings.slack_channel = 频道 - -diff.browse_source = 浏览代码 -diff.parent = 父节点 -diff.commit = 当前提交 -diff.data_not_available = 暂无可用数据 -diff.show_diff_stats = 显示文件统计 -diff.stats_desc = 共有 <strong> %d 个文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong> -diff.bin = 二进制 -diff.view_file = 查看文件 - -[org] -org_name_holder = 组织名称 -org_name_helper = 伟大的组织都有一个简短而寓意深刻的名字。 -org_email_helper = 组织的邮箱用于接收所有通知和确认邮件。 -create_org = 创建组织 -repo_updated = 最后更新于 -people = 组织成员 -invite_someone = 邀请他人加入 -teams = 组织团队 -lower_members = 名成员 -lower_repositories = 个仓库 -create_new_team = 创建新的团队 -org_desc = 组织描述 -team_name = 团队名称 -team_desc = 团队描述 -team_name_helper = 您可以使用该名称来通知改组全体成员。 -team_desc_helper = 一句话描述这个团队是做什么的。 -team_permission_desc = 请选择该团队所具有的权限等级: - -settings = 组织设置 -settings.options = 基本设置 -settings.full_name = 组织全名 -settings.website = 官方网站 -settings.location = 所在地区 -settings.update_settings = 更新组织设置 -settings.change_orgname = 组织名称将被修改 -settings.change_orgname_desc = 组织名称被修改,您确定要继续操作吗?这将会影响到所有与该组织有关的链接。 -settings.update_setting_success = 组织设置更新成功! -settings.delete = 删除组织 -settings.delete_account = 删除当前组织 -settings.delete_prompt = 删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong>! -settings.confirm_delete_account = 确认删除组织 -settings.delete_org_title = 组织删除操作 -settings.delete_org_desc = 该组织将被永久性删除,您确定要继续操作吗? -settings.hooks_desc = 在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。 - -members.public = 公开成员 -members.public_helper = 设为私有 -members.private = 私有成员 -members.private_helper = 设为公开 -members.owner = 管理员 -members.member = 普通成员 -members.conceal = 隐藏身份 -members.remove = 移除成员 -members.leave = 离开组织 -members.invite_desc = 请输入被邀请到组织 %s 的用户名称: -members.invite_now = 立即邀请 - -teams.join = 加入团队 -teams.leave = 离开团队 -teams.read_access = 读取权限 -teams.read_access_helper = 这个团队将拥有查看和克隆所属仓库的权限。 -teams.write_access = 写入权限 -teams.write_access_helper = 这个团队将拥有查看、克隆和推送所属仓库的权限。 -teams.admin_access = 管理权限 -teams.admin_access_helper = 这个团队将拥有查看、克隆、推送和添加其他组织成员到团队的权限。 -teams.no_desc = 该团队暂无描述 -teams.settings = 团队设置 -teams.owners_permission_desc = 管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。 -teams.members = 团队成员 -teams.update_settings = 更新团队设置 -teams.delete_team = 删除当前团队 -teams.add_team_member = 添加团队成员 -teams.delete_team_title = 团队删除操作 -teams.delete_team_desc = 删除操作会永久清除有关该团队的信息,您确定要继续操作吗?团队成员可能会失去对某些仓库的操作权限。 -teams.delete_team_success = 指定团队删除成功! -teams.read_permission_desc = 该团队拥有对所属仓库的 <strong>读取</strong> 权限,团队成员可以进行查看和克隆等只读操作。 -teams.write_permission_desc = 该团队拥有对所属仓库的 <strong>读取</strong> 和 <strong>写入</strong> 的权限。 -teams.admin_permission_desc = 该团队拥有一定的 <strong>管理</strong> 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。 -teams.repositories = 团队仓库 -teams.add_team_repository = 添加团队仓库 -teams.remove_repo = 移除仓库 -teams.add_nonexistent_repo = 您尝试添加到团队的仓库不存在,请先创建仓库! - -[admin] -dashboard = 控制面板 -users = 用户管理 -organizations = 组织管理 -repositories = 仓库管理 -authentication = 授权认证管理 -config = 应用配置管理 -notices = 系统提示管理 -monitor = 应用监控面板 -prev = 上一页 -next = 下一页 - -dashboard.statistic = 应用统计数据 -dashboard.operations = 管理员操作 -dashboard.system_status = 系统监视状态 -dashboard.statistic_info = Gogs 数据库统计:<b>%d</b> 位用户,<b>%d</b> 个组织,<b>%d</b> 个公钥,<b>%d</b> 个仓库,<b>%d</b> 个仓库关注,<b>%d</b> 个赞,<b>%d</b> 次行为,<b>%d</b> 条权限记录,<b>%d</b> 张工单,<b>%d</b> 次评论,<b>%d</b> 个社交帐号,<b>%d</b> 个用户关注,<b>%d</b> 个镜像,<b>%d</b> 个版本发布,<b>%d</b> 个登录源,<b>%d</b> 个 Web 钩子,<b>%d</b> 个里程碑,<b>%d</b> 个标签,<b>%d</b> 个钩子任务,<b>%d</b> 个团队,<b>%d</b> 个更新任务,<b>%d</b> 个附件。 -dashboard.operation_name = 操作名称 -dashboard.operation_switch = 开关 -dashboard.operation_run = 执行 -dashboard.clean_unbind_oauth = 清理未绑定社交帐号 -dashboard.delete_inactivate_accounts = 删除所有未激活帐户 -dashboard.server_uptime = 服务运行时间 -dashboard.current_goroutine = 当前 Goroutines 数量 -dashboard.current_memory_usage = 当前内存使用量 -dashboard.total_memory_allocated = 所有被分配的内存 -dashboard.memory_obtained = 内存占用量 -dashboard.pointer_lookup_times = 指针查找次数 -dashboard.memory_allocate_times = 内存分配次数 -dashboard.memory_free_times = 内存释放次数 -dashboard.current_heap_usage = 当前 Heap 内存使用量 -dashboard.heap_memory_obtained = Heap 内存占用量 -dashboard.heap_memory_idle = Heap 内存空闲量 -dashboard.heap_memory_in_use = 正在使用的 Heap 内存 -dashboard.heap_memory_released = 被释放的 Heap 内存 -dashboard.heap_objects = Heap 对象数量 -dashboard.bootstrap_stack_usage = 启动 Stack 使用量 -dashboard.stack_memory_obtained = 被分配的 Stack 内存 -dashboard.mspan_structures_usage = MSpan 结构内存使用量 -dashboard.mspan_structures_obtained = 被分配的 MSpan 结构内存 -dashboard.mcache_structures_usage = MCache 结构内存使用量 -dashboard.mcache_structures_obtained = 被分配的 MCache 结构内存 -dashboard.profiling_bucket_hash_table_obtained = 被分配的剖析哈希表内存 -dashboard.gc_metadata_obtained = 被分配的 GC 元数据内存 -dashboard.other_system_allocation_obtained = 其它被分配的系统内存 -dashboard.next_gc_recycle = 下次 GC 内存回收量 -dashboard.last_gc_time = 距离上次 GC 时间 -dashboard.total_gc_time = GC 执行时间总量 -dashboard.total_gc_pause = GC 暂停时间总量 -dashboard.last_gc_pause = 上次 GC 暂停时间 -dashboard.gc_times = GC 执行次数 - -users.user_manage_panel = 用户管理面板 -users.new_account = 创建新的帐户 -users.name = 用户名 -users.activated = 已激活 -users.admin = 管理员 -users.repos = 仓库数 -users.created = 创建时间 -users.edit = 编辑 -users.auth_source = 认证源 -users.local = 本地 -users.auth_login_name = 认证登录名 -users.update_profile_success = 该用户信息更新成功! -users.edit_account = 编辑用户信息 -users.is_activated = 该用户已被激活 -users.is_admin = 该用户具有管理员权限 -users.update_profile = 更新用户信息 -users.delete_account = 删除该用户 -users.still_own_repo = 该帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! - -orgs.org_manage_panel = 组织管理面板 -orgs.name = 组织名称 -orgs.teams = 团队数 -orgs.members = 成员数 - -repos.repo_manage_panel = 仓库管理界面 -repos.owner = 所有者 -repos.name = 仓库名称 -repos.private = 私有库 -repos.watches = 关注数 -repos.stars = 点赞数 -repos.issues = 工单数 - -auths.auth_manage_panel = 授权认证管理面板 -auths.new = 添加新的认证源 -auths.name = 认证名称 -auths.type = 认证类型 -auths.enabled = 已启用 -auths.updated = 最后更新时间 -auths.auth_type = 授权类型 -auths.auth_name = 授权名称 -auths.domain = 域名 -auths.host = 主机地址 -auths.port = 主机端口 -auths.base_dn = Base DN -auths.attributes = Search Attributes -auths.filter = Search Filter -auths.ms_ad_sa = Ms Ad SA -auths.smtp_auth = SMTP 授权类型 -auths.smtphost = SMTP 主机地址 -auths.smtpport = SMTP 主机端口 -auths.enable_tls = 启用 TLS 加密 -auths.enable_auto_register = 允许授权用户自动注册 -auths.tips = 帮助提示 -auths.edit = 修改授权认证设置 -auths.activated = 该授权认证已经启用 -auths.update_success = 授权认证设置更新成功! -auths.update = 更新授权认证信息 -auths.delete = 删除该授权认证 -auths.delete_auth_title = 授权认证删除操作 -auths.delete_auth_desc = 该授权认证将被删除,您确定要继续吗? - -config.server_config = 服务器配置 -config.app_name = 应用名称 -config.app_ver = 应用版本 -config.app_url = 应用 URL -config.domain = 应用域名 -config.offline_mode = 离线模式 -config.disable_router_log = 关闭路由日志 -config.run_user = 运行用户 -config.run_mode = 运行模式 -config.repo_root_path = 仓库根目录 -config.static_file_root_path = 静态文件根目录 -config.log_file_root_path = 日志文件根目录 -config.script_type = 脚本类型 -config.reverse_auth_user = 反向代理认证 -config.db_config = 数据库配置 -config.db_type = 数据库类型 -config.db_host = 主机地址 -config.db_name = 数据库名称 -config.db_user = 连接用户 -config.db_ssl_mode = SSL 模式 -config.db_ssl_mode_helper = (仅限 "postgres" 使用) -config.db_path = 数据库路径 -config.db_path_helper = (仅限 "sqlite3" 使用) -config.service_config = 服务配置 -config.register_email_confirm = 注册邮件确认 -config.disable_register = 关闭注册功能 -config.require_sign_in_view = 强制登录浏览 -config.mail_notify = 邮件通知提醒 -config.enable_cache_avatar = 开启缓存头像 -config.active_code_lives = 激活用户链接有效期 -config.reset_password_code_lives = 重置密码链接有效期 -config.webhook_config = Web 钩子配置 -config.task_interval = 任务周期 -config.deliver_timeout = 推送超时 -config.mailer_config = 邮件配置 -config.mailer_enabled = 启用服务 -config.mailer_name = 发送者名称 -config.mailer_host = 邮件主机地址 -config.mailer_user = 发送者帐号 -config.oauth_config = 社交帐号配置 -config.oauth_enabled = 启用服务 -config.cache_config = Cache 配置 -config.cache_adapter = Cache 适配器 -config.cache_interval = Cache 周期 -config.cache_conn = Cache 连接字符串 -config.session_config = Session 配置 -config.session_provider = Session 提供者 -config.provider_config = 提供者配置 -config.cookie_name = Cookie 名称 -config.enable_set_cookie = 启用设置 Cookie -config.gc_interval_time = GC 周期 -config.session_life_time = Session 生命周期 -config.https_only = 仅限 HTTPS -config.cookie_life_time = Cookie 生命周期 -config.session_hash_function = Session ID 哈希函数 -config.session_hash_key = Session ID 哈希健值 -config.picture_config = 图片配置 -config.picture_service = 图片服务 -config.disable_gravatar = 禁用 Gravatar 头像 -config.log_config = 日志配置 -config.log_mode = 日志模式 - -monitor.cron = Cron 任务 -monitor.name = 任务名称 -monitor.schedule = 任务安排 -monitor.next = 下次执行时间 -monitor.previous = 上次执行时间 -monitor.execute_times = 执行次数 -monitor.process = 运行中进程 -monitor.desc = 进程描述 -monitor.start = 开始时间 -monitor.execute_time = 已执行时间 - -notices.system_notice_list = 系统提示管理 -notices.type = 提示类型 -notices.type_1 = 仓库 -notices.desc = 描述 -notices.op = 操作 -notices.delete_success = 系统提示删除成功! - -[action] -create_repo = 创建了仓库 <a href="%s/%s">%s</a> -commit_repo = 推送了 <a href="%s/%s/src/%s">%s</a> 分支的代码到 <a href="%s/%s">%s</a> -create_issue = 创建了工单 <a href="%s/%s/issues/%s">%s#%s</a> -comment_issue = 评论了工单 <a href="%s/%s/issues/%s">%s#%s</a> -transfer_repo = 将仓库 <code>%s</code> 转移至 <a href="/%s%s">%s</a> -push_tag = 推送了标签 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a> -compare_2_commits = 查看 2 次提交的内容对比 - -[tool] -ago = 之前 -from_now = 之后 -now = 现在 -1s = 1 秒%s -1m = 1 分钟%s -1h = 1 小时%s -1d = 1 天%s -1w = 1 周%s -1mon = 1 月%s -1y = 1 年%s -seconds = %d 秒%s -minutes = %d 分钟%s -hours = %d 小时%s -days = %d 天%s -weeks = %d 周%s -months = %d 月%s -years = %d 年%s -raw_seconds = 秒 -raw_minutes = 分钟 - - - - - - - - - - - - +app_desc=基于 Go 语言的自助 Git 服务
+
+home=首页
+dashboard=控制面板
+explore=探索
+help=帮助
+sign_in=登录
+social_sign_in=社交帐号登录:第 2 步 <small>关联帐号</small>
+sign_out=退出
+sign_up=注册
+register=注册
+website=官方网站
+version=当前版本
+page=页面
+template=模板
+language=语言选项
+
+username=用户名
+email=邮箱
+password=密码
+re_type=确认密码
+captcha=验证码
+
+repository=仓库
+organization=组织
+mirror=镜像
+new_repo=创建新的仓库
+new_migrate=迁移外部仓库
+new_fork=创建新的派生仓库
+new_org=创建新的组织
+manage_org=管理我的组织
+admin_panel=管理面板
+account_settings=帐户设置
+settings=帐户设置
+
+news_feed=最新活动
+pull_requests=合并请求
+issues=工单管理
+
+cancel=取消
+
+[install]
+install=安装页面
+title=首次运行安装程序
+requite_db_desc=Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3。
+db_type=数据库类型
+host=数据库主机
+user=数据库用户
+password=数据库用户密码
+db_name=数据库名称
+db_helper=如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集。
+ssl_mode=SSL 模式
+path=数据库文件路径
+sqlite_helper=SQLite3 数据库的文件路径。
+general_title=应用基本设置
+repo_path=仓库根目录
+repo_path_helper=所有 Git 远程仓库都将被存放于该目录。
+run_user=运行系统用户
+run_user_helper=该用户必须具有对仓库根目录和运行 Gogs 的操作权限。
+domain=域名
+domain_helper=该设置影响 SSH 克隆地址。
+app_url=应用 URL
+app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。
+email_title=邮件服务设置(可选)
+smtp_host=SMTP 主机
+mailer_user=发送邮箱
+mailer_password=发送邮箱密码
+notify_title=通知提醒设置(可选)
+register_confirm=启用注册邮箱确认
+mail_notify=启用邮件通知提醒
+admin_title=管理员帐号设置
+admin_name=管理员用户名
+admin_password=管理员密码
+confirm_password=确认密码
+admin_email=管理员邮箱
+install_gogs=立即安装
+test_git_failed=无法识别 'git' 命令:%v
+sqlite3_not_available=您所使用的发行版不支持 SQLite3,请从 %s 下载官方构建版,而不是 gobuild 版本。
+invalid_db_setting=数据库设置不正确:%v
+invalid_repo_path=仓库根目录设置不正确:%v
+run_user_not_match=运行系统用户非当前用户:%s -> %s
+save_config_failed=应用配置保存失败:%v
+invalid_admin_setting=管理员帐户设置不正确:%v
+install_success=您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG!
+
+[home]
+uname_holder=用户名或邮箱
+password_holder=密码
+switch_dashboard_context=切换控制面板用户
+my_repos=我的仓库
+collaborative_repos=参与协作的仓库
+my_orgs=我的组织
+my_mirrors=我的镜像
+
+[explore]
+repos=探索仓库
+
+[auth]
+create_new_account=创建帐户
+register_hepler_msg=已经注册?立即登录!
+social_register_hepler_msg=已经注册?立即绑定!
+disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。
+disable_register_mail=对不起,注册邮箱确认功能已被关闭。
+remember_me=记住登录
+forgot_password=忘记密码
+forget_password=忘记密码?
+sign_up_now=还没帐户?马上注册。
+confirmation_mail_sent_prompt=一封新的确认邮件已经被发送至 <b>%s</b>,请检查您的收件箱并在 %d 小时内完成确认注册操作。
+sign_in_email=登录到您的邮箱
+active_your_account=激活您的帐户
+resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
+has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
+resend_mail=单击此处重新发送确认邮件
+email_not_associate=您输入的邮箱地址未被关联到任何帐号!
+send_reset_mail=单击此处(重新)发送您的密码重置邮件
+reset_password=重置密码
+invalid_code=对不起,您的确认代码已过期或已失效。
+reset_password_helper=单击此处重置密码
+password_too_short=密码长度不能少于 6 位!
+
+[form]
+UserName=用户名
+RepoName=仓库名称
+Email=邮箱地址
+Password=密码
+Retype=确认密码
+SSHTitle=SSH 密钥名称
+HttpsUrl=HTTPS URL 地址
+PayloadUrl=推送地址
+TeamName=团队名称
+AuthName=认证名称
+AdminEmail=管理员邮箱
+
+require_error=不能为空。
+alpha_dash_error=必须为英文字母、阿拉伯数字或横线(-_)。
+alpha_dash_dot_error=必须为英文字母、阿拉伯数字、横线(-_)或点。
+min_size_error=长度最小为 %s 个字符。
+max_size_error=长度最大为 %s 个字符。
+email_error=不是一个有效的邮箱地址。
+url_error=不是一个有效的 URL。
+unknown_error=未知错误:
+captcha_incorrect=验证码未匹配。
+password_not_match=密码与确认密码未匹配。
+
+username_been_taken=用户名已经被占用。
+repo_name_been_taken=仓库名称已经被占用。
+org_name_been_taken=组织名称已经被占用。
+team_name_been_taken=团队名称已经被占用。
+email_been_used=邮箱地址已经被使用。
+ssh_key_been_used=SSH 密钥已经被使用。
+illegal_username=您的用户名包含非法字符。
+illegal_repo_name=仓库名称包含非法字符。
+illegal_org_name=组织名称包含非法字符。
+illegal_team_name=团队名称包含非法字符。
+username_password_incorrect=用户名或密码不正确。
+enterred_invalid_repo_name=请检查您输入的仓库名称是正确。
+enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。
+enterred_invalid_password=请检查您输入的密码是否正确。
+user_not_exist=被操作的用户不存在!
+last_org_owner=被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作!
+
+invalid_ssh_key=很抱歉,我们无法验证您输入的 SSH 密钥:%s
+unable_verify_ssh_key=Gogs 无法验证您输入的 SSH 密钥,但我们假设那是有效的密钥,请您自行确保其有效性!
+auth_failed=授权验证失败:%v
+
+still_own_repo=您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
+still_has_org=您的帐户仍旧是某些组织的成员,您必须先离开或删除组织。
+org_still_own_repo=该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作!
+
+still_own_user=该授权认证依旧被部分用户使用,请先删除该部分用户后再试!
+
+target_branch_not_exist=目标分支不存在。
+
+[user]
+change_avatar=到 gravatar.com 上修改您的头像
+join_on=加入于
+repositories=仓库列表
+activity=公开活动
+followers=关注者
+starred=已点赞
+following=关注中
+
+[settings]
+profile=个人信息
+password=修改密码
+ssh_keys=管理 SSH 密钥
+social=社交帐号绑定
+applications=管理授权应用
+orgs=管理组织
+delete=删除帐户
+uid=用户 ID
+
+public_profile=公开信息
+profile_desc=您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。
+full_name=自定义名称
+website=个人网站
+location=所在地区
+update_profile=更新信息
+update_profile_success=您的个人信息更新成功!
+change_username=用户名将被修改
+change_username_desc=用户名被修改,您确定要继续操作吗?这将会影响到所有与您帐户有关的链接。
+continue=继续操作
+cancel=取消操作
+
+change_password=修改密码
+old_password=当前密码
+new_password=新的密码
+password_incorrect=当前密码不正确!
+change_password_success=密码修改成功!您现在可以使用新的密码登录。
+
+manage_ssh_keys=管理 SSH 密钥
+add_key=增加密钥
+ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它!
+ssh_helper=<strong>需要帮助?</strong> 请查看有关 <a href="%s">如何生成 SSH 密钥</a> 或 <a href="%s">常见 SSH 问题</a> 寻找答案。
+add_new_key=增加 SSH 密钥
+key_name=密钥名称
+key_content=密钥内容
+add_key_success=新的 SSH 密钥添加成功!
+delete_key=删除
+add_on=增加于
+last_used=上次使用在
+no_activity=没有最近活动
+
+manage_social=管理关联社交帐户
+social_desc=以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定!
+unbind=解除绑定
+unbind_success=社交帐号解除绑定成功!
+
+manage_access_token=管理个人操作令牌
+generate_new_token=生成新的令牌
+tokens_desc=您可以使用这些已生成的令牌来操作 Gogs API。
+new_token_desc=目前为止,任何令牌都对您的帐户拥有完整的操作权限。
+token_name=令牌名称
+generate_token=生成令牌
+generate_token_succees=新的操作令牌生成成功!您必须立即复制到一个安全的地方,因为该令牌只会显示一次!
+delete_token=删除令牌
+delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。
+
+delete_account=删除当前帐户
+delete_prompt=删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>!
+confirm_delete_account=确认删除帐户
+delete_account_title=帐户删除操作
+delete_account_desc=该帐户将被永久性删除,您确定要继续操作吗?
+
+[repo]
+owner=拥有者
+repo_name=仓库名称
+repo_name_helper=伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。
+visibility=可见性
+visiblity_helper=本仓库将是 <span class="label label-red label-radius">私有的</span>
+fork_repo=派生仓库
+fork_from=派生自
+fork_visiblity_helper=派生仓库无法修改可见性
+repo_desc=仓库描述
+repo_lang=仓库语言
+repo_lang_helper=请选择 .gitignore 文件
+license=授权许可
+license_helper=请选择授权许可文件
+init_readme=使用 README.md 文件初始化仓库
+create_repo=创建仓库
+default_branch=默认分支
+mirror_interval=镜像同步周期(小时)
+goget_meta=Go-Get 支持
+goget_meta_helper=本仓库将可以通过 <span class="label label-blue label-radius">Go Get</span> 获取
+
+need_auth=需要授权验证
+migrate_type=迁移类型
+migrate_type_helper=本仓库将是 <span class="label label-blue label-radius">镜像</span>
+migrate_repo=迁移仓库
+
+copy_link=复制链接
+click_to_copy=复制到剪切板
+copied=复制成功
+clone_helper=不知道如何操作?访问 <a target="_blank" href="%s">此处</a> 查看帮助!
+unwatch=取消关注
+watch=关注
+unstar=取消点赞
+star=点赞
+fork=派生
+
+no_desc=暂无描述
+quick_guide=快速帮助
+clone_this_repo=克隆当前仓库
+create_new_repo_command=从命令行创建一个新的仓库
+push_exist_repo=从命令行推送已经创建的仓库
+
+branch=分支
+tree=目录树
+branch_and_tags=分支与标签
+branches=分支列表
+tags=标签列表
+issues=工单管理
+commits=提交历史
+releases=版本发布
+file_raw=原始文件
+file_history=文件历史
+file_view_raw=查看原始文件
+
+commits.commits=次代码提交
+commits.search=搜索提交历史
+commits.find=查找
+commits.author=作者
+commits.message=备注
+commits.date=提交日期
+commits.older=更旧的提交
+commits.newer=更新的提交
+
+settings=仓库设置
+settings.options=基本设置
+settings.collaboration=管理协作者
+settings.hooks=管理 Web 钩子
+settings.githooks=管理 Git 钩子
+settings.deploy_keys=管理部署密钥
+settings.basic_settings=基本设置
+settings.danger_zone=危险操作区
+settings.site=官方网站
+settings.update_settings=更新仓库设置
+settings.change_reponame=仓库名称将被修改
+settings.change_reponame_desc=仓库名称被修改,您确定要继续操作吗?这将会影响到所有与该仓库有关的链接。
+settings.transfer=转移仓库所有权
+settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。
+settings.new_owner_has_same_repo=新的仓库拥有者已经存在同名仓库!
+settings.delete=删除本仓库
+settings.delete_desc=删除仓库操作不可逆转,请三思而后行。
+settings.transfer_notices=<p>- 如果您转移给个人用户,您将对仓库失去所有权限。</p><p>- 如果您转移给您作为拥有者的组织,则可继续保持操作权限。</p>
+settings.update_settings_success=仓库设置更新成功!
+settings.transfer_owner=新拥有者
+settings.make_transfer=确认转移仓库
+settings.transfer_succeed=仓库所有权转移成功!
+settings.confirm_delete=确认删除仓库
+settings.add_collaborator=增加新的协作者
+settings.add_collaborator_success=成功添加新的协作者!
+settings.remove_collaborator_success=被操作的协作者已经被收回权限!
+settings.user_is_org_member=被操作的用户是组织成员,因此无法添加为协作者!
+settings.add_webhook=添加 Web 钩子
+settings.hooks_desc=Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" href="%s">Webhooks 文档</a> 获取更多信息。
+settings.githooks_desc=Git 钩子是由 Git 本身提供的功能,以下为 Gogs 所支持的钩子列表。
+settings.githook_edit_desc=如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。
+settings.githook_name=钩子名称
+settings.githook_content=钩子文本
+settings.update_githook=更新钩子设置
+settings.remove_hook_success=Web 钩子删除成功!
+settings.add_webhook_desc=我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target="_blank" href="%s">Webhooks 文档</a> 获取更多信息。
+settings.payload_url=推送地址
+settings.content_type=数据格式
+settings.secret=密钥文本
+settings.event_desc=请设置您希望触发 Web 钩子的事件:
+settings.event_push_only=只推送 <code>push</code> 事件。
+settings.active=是否激活
+settings.active_helper=当指定事件发生时我们将会触发此 Web 钩子。
+settings.add_hook_success=Web 钩子添加成功!
+settings.update_webhook=更新 Web 钩子
+settings.update_hook_success=Web 钩子更新成功!
+settings.delete_webhook=删除 Web 钩子
+settings.recent_deliveries=最近推送记录
+settings.hook_type=钩子类型
+settings.add_slack_hook_desc=为您的仓库增加 <a href="%s">Slack</a> 集成。
+settings.slack_token=令牌
+settings.slack_domain=域名
+settings.slack_channel=频道
+
+diff.browse_source=浏览代码
+diff.parent=父节点
+diff.commit=当前提交
+diff.data_not_available=暂无可用数据
+diff.show_diff_stats=显示文件统计
+diff.stats_desc=共有 <strong> %d 个文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
+diff.bin=二进制
+diff.view_file=查看文件
+
+[org]
+org_name_holder=组织名称
+org_name_helper=伟大的组织都有一个简短而寓意深刻的名字。
+org_email_helper=组织的邮箱用于接收所有通知和确认邮件。
+create_org=创建组织
+repo_updated=最后更新于
+people=组织成员
+invite_someone=邀请他人加入
+teams=组织团队
+lower_members=名成员
+lower_repositories=个仓库
+create_new_team=创建新的团队
+org_desc=组织描述
+team_name=团队名称
+team_desc=团队描述
+team_name_helper=您可以使用该名称来通知改组全体成员。
+team_desc_helper=一句话描述这个团队是做什么的。
+team_permission_desc=请选择该团队所具有的权限等级:
+
+settings=组织设置
+settings.options=基本设置
+settings.full_name=组织全名
+settings.website=官方网站
+settings.location=所在地区
+settings.update_settings=更新组织设置
+settings.change_orgname=组织名称将被修改
+settings.change_orgname_desc=组织名称被修改,您确定要继续操作吗?这将会影响到所有与该组织有关的链接。
+settings.update_setting_success=组织设置更新成功!
+settings.delete=删除组织
+settings.delete_account=删除当前组织
+settings.delete_prompt=删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong>!
+settings.confirm_delete_account=确认删除组织
+settings.delete_org_title=组织删除操作
+settings.delete_org_desc=该组织将被永久性删除,您确定要继续操作吗?
+settings.hooks_desc=在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。
+
+members.public=公开成员
+members.public_helper=设为私有
+members.private=私有成员
+members.private_helper=设为公开
+members.owner=管理员
+members.member=普通成员
+members.conceal=隐藏身份
+members.remove=移除成员
+members.leave=离开组织
+members.invite_desc=请输入被邀请到组织 %s 的用户名称:
+members.invite_now=立即邀请
+
+teams.join=加入团队
+teams.leave=离开团队
+teams.read_access=读取权限
+teams.read_access_helper=这个团队将拥有查看和克隆所属仓库的权限。
+teams.write_access=写入权限
+teams.write_access_helper=这个团队将拥有查看、克隆和推送所属仓库的权限。
+teams.admin_access=管理权限
+teams.admin_access_helper=这个团队将拥有查看、克隆、推送和添加其他组织成员到团队的权限。
+teams.no_desc=该团队暂无描述
+teams.settings=团队设置
+teams.owners_permission_desc=管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。
+teams.members=团队成员
+teams.update_settings=更新团队设置
+teams.delete_team=删除当前团队
+teams.add_team_member=添加团队成员
+teams.delete_team_title=团队删除操作
+teams.delete_team_desc=删除操作会永久清除有关该团队的信息,您确定要继续操作吗?团队成员可能会失去对某些仓库的操作权限。
+teams.delete_team_success=指定团队删除成功!
+teams.read_permission_desc=该团队拥有对所属仓库的 <strong>读取</strong> 权限,团队成员可以进行查看和克隆等只读操作。
+teams.write_permission_desc=该团队拥有对所属仓库的 <strong>读取</strong> 和 <strong>写入</strong> 的权限。
+teams.admin_permission_desc=该团队拥有一定的 <strong>管理</strong> 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。
+teams.repositories=团队仓库
+teams.add_team_repository=添加团队仓库
+teams.remove_repo=移除仓库
+teams.add_nonexistent_repo=您尝试添加到团队的仓库不存在,请先创建仓库!
+
+[admin]
+dashboard=控制面板
+users=用户管理
+organizations=组织管理
+repositories=仓库管理
+authentication=授权认证管理
+config=应用配置管理
+notices=系统提示管理
+monitor=应用监控面板
+prev=上一页
+next=下一页
+
+dashboard.statistic=应用统计数据
+dashboard.operations=管理员操作
+dashboard.system_status=系统监视状态
+dashboard.statistic_info=Gogs 数据库统计:<b>%d</b> 位用户,<b>%d</b> 个组织,<b>%d</b> 个公钥,<b>%d</b> 个仓库,<b>%d</b> 个仓库关注,<b>%d</b> 个赞,<b>%d</b> 次行为,<b>%d</b> 条权限记录,<b>%d</b> 张工单,<b>%d</b> 次评论,<b>%d</b> 个社交帐号,<b>%d</b> 个用户关注,<b>%d</b> 个镜像,<b>%d</b> 个版本发布,<b>%d</b> 个登录源,<b>%d</b> 个 Web 钩子,<b>%d</b> 个里程碑,<b>%d</b> 个标签,<b>%d</b> 个钩子任务,<b>%d</b> 个团队,<b>%d</b> 个更新任务,<b>%d</b> 个附件。
+dashboard.operation_name=操作名称
+dashboard.operation_switch=开关
+dashboard.operation_run=执行
+dashboard.clean_unbind_oauth=清理未绑定社交帐号
+dashboard.delete_inactivate_accounts=删除所有未激活帐户
+dashboard.server_uptime=服务运行时间
+dashboard.current_goroutine=当前 Goroutines 数量
+dashboard.current_memory_usage=当前内存使用量
+dashboard.total_memory_allocated=所有被分配的内存
+dashboard.memory_obtained=内存占用量
+dashboard.pointer_lookup_times=指针查找次数
+dashboard.memory_allocate_times=内存分配次数
+dashboard.memory_free_times=内存释放次数
+dashboard.current_heap_usage=当前 Heap 内存使用量
+dashboard.heap_memory_obtained=Heap 内存占用量
+dashboard.heap_memory_idle=Heap 内存空闲量
+dashboard.heap_memory_in_use=正在使用的 Heap 内存
+dashboard.heap_memory_released=被释放的 Heap 内存
+dashboard.heap_objects=Heap 对象数量
+dashboard.bootstrap_stack_usage=启动 Stack 使用量
+dashboard.stack_memory_obtained=被分配的 Stack 内存
+dashboard.mspan_structures_usage=MSpan 结构内存使用量
+dashboard.mspan_structures_obtained=被分配的 MSpan 结构内存
+dashboard.mcache_structures_usage=MCache 结构内存使用量
+dashboard.mcache_structures_obtained=被分配的 MCache 结构内存
+dashboard.profiling_bucket_hash_table_obtained=被分配的剖析哈希表内存
+dashboard.gc_metadata_obtained=被分配的 GC 元数据内存
+dashboard.other_system_allocation_obtained=其它被分配的系统内存
+dashboard.next_gc_recycle=下次 GC 内存回收量
+dashboard.last_gc_time=距离上次 GC 时间
+dashboard.total_gc_time=GC 执行时间总量
+dashboard.total_gc_pause=GC 暂停时间总量
+dashboard.last_gc_pause=上次 GC 暂停时间
+dashboard.gc_times=GC 执行次数
+
+users.user_manage_panel=用户管理面板
+users.new_account=创建新的帐户
+users.name=用户名
+users.activated=已激活
+users.admin=管理员
+users.repos=仓库数
+users.created=创建时间
+users.edit=编辑
+users.auth_source=认证源
+users.local=本地
+users.auth_login_name=认证登录名
+users.update_profile_success=该用户信息更新成功!
+users.edit_account=编辑用户信息
+users.is_activated=该用户已被激活
+users.is_admin=该用户具有管理员权限
+users.allow_git_hook=该帐户具有创建 Git 钩子的权限
+users.update_profile=更新用户信息
+users.delete_account=删除该用户
+users.still_own_repo=该帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
+users.still_has_org=该帐户仍旧是某些组织的成员,您必须先使其离开或删除组织。
+
+orgs.org_manage_panel=组织管理面板
+orgs.name=组织名称
+orgs.teams=团队数
+orgs.members=成员数
+
+repos.repo_manage_panel=仓库管理界面
+repos.owner=所有者
+repos.name=仓库名称
+repos.private=私有库
+repos.watches=关注数
+repos.stars=点赞数
+repos.issues=工单数
+
+auths.auth_manage_panel=授权认证管理面板
+auths.new=添加新的认证源
+auths.name=认证名称
+auths.type=认证类型
+auths.enabled=已启用
+auths.updated=最后更新时间
+auths.auth_type=授权类型
+auths.auth_name=授权名称
+auths.domain=域名
+auths.host=主机地址
+auths.port=主机端口
+auths.base_dn=Base DN
+auths.attributes=Search Attributes
+auths.filter=Search Filter
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP 授权类型
+auths.smtphost=SMTP 主机地址
+auths.smtpport=SMTP 主机端口
+auths.enable_tls=启用 TLS 加密
+auths.enable_auto_register=允许授权用户自动注册
+auths.tips=帮助提示
+auths.edit=修改授权认证设置
+auths.activated=该授权认证已经启用
+auths.update_success=授权认证设置更新成功!
+auths.update=更新授权认证信息
+auths.delete=删除该授权认证
+auths.delete_auth_title=授权认证删除操作
+auths.delete_auth_desc=该授权认证将被删除,您确定要继续吗?
+
+config.server_config=服务器配置
+config.app_name=应用名称
+config.app_ver=应用版本
+config.app_url=应用 URL
+config.domain=应用域名
+config.offline_mode=离线模式
+config.disable_router_log=关闭路由日志
+config.run_user=运行用户
+config.run_mode=运行模式
+config.repo_root_path=仓库根目录
+config.static_file_root_path=静态文件根目录
+config.log_file_root_path=日志文件根目录
+config.script_type=脚本类型
+config.reverse_auth_user=反向代理认证
+config.db_config=数据库配置
+config.db_type=数据库类型
+config.db_host=主机地址
+config.db_name=数据库名称
+config.db_user=连接用户
+config.db_ssl_mode=SSL 模式
+config.db_ssl_mode_helper=(仅限 "postgres" 使用)
+config.db_path=数据库路径
+config.db_path_helper=(仅限 "sqlite3" 使用)
+config.service_config=服务配置
+config.register_email_confirm=注册邮件确认
+config.disable_register=关闭注册功能
+config.require_sign_in_view=强制登录浏览
+config.mail_notify=邮件通知提醒
+config.enable_cache_avatar=开启缓存头像
+config.active_code_lives=激活用户链接有效期
+config.reset_password_code_lives=重置密码链接有效期
+config.webhook_config=Web 钩子配置
+config.task_interval=任务周期
+config.deliver_timeout=推送超时
+config.mailer_config=邮件配置
+config.mailer_enabled=启用服务
+config.mailer_name=发送者名称
+config.mailer_host=邮件主机地址
+config.mailer_user=发送者帐号
+config.oauth_config=社交帐号配置
+config.oauth_enabled=启用服务
+config.cache_config=Cache 配置
+config.cache_adapter=Cache 适配器
+config.cache_interval=Cache 周期
+config.cache_conn=Cache 连接字符串
+config.session_config=Session 配置
+config.session_provider=Session 提供者
+config.provider_config=提供者配置
+config.cookie_name=Cookie 名称
+config.enable_set_cookie=启用设置 Cookie
+config.gc_interval_time=GC 周期
+config.session_life_time=Session 生命周期
+config.https_only=仅限 HTTPS
+config.cookie_life_time=Cookie 生命周期
+config.picture_config=图片配置
+config.picture_service=图片服务
+config.disable_gravatar=禁用 Gravatar 头像
+config.log_config=日志配置
+config.log_mode=日志模式
+
+monitor.cron=Cron 任务
+monitor.name=任务名称
+monitor.schedule=任务安排
+monitor.next=下次执行时间
+monitor.previous=上次执行时间
+monitor.execute_times=执行次数
+monitor.process=运行中进程
+monitor.desc=进程描述
+monitor.start=开始时间
+monitor.execute_time=已执行时间
+
+notices.system_notice_list=系统提示管理
+notices.type=提示类型
+notices.type_1=仓库
+notices.desc=描述
+notices.op=操作
+notices.delete_success=系统提示删除成功!
+
+[action]
+create_repo=创建了仓库 <a href="%s/%s">%s</a>
+commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代码到 <a href="%s/%s">%s</a>
+create_issue=创建了工单 <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=评论了工单 <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=将仓库 <code>%s</code> 转移至 <a href="/%s%s">%s</a>
+push_tag=推送了标签 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
+compare_2_commits=查看 2 次提交的内容对比
+
+[tool]
+ago=之前
+from_now=之后
+now=现在
+1s=1 秒%s
+1m=1 分钟%s
+1h=1 小时%s
+1d=1 天%s
+1w=1 周%s
+1mon=1 月%s
+1y=1 年%s
+seconds=%d 秒%s
+minutes=%d 分钟%s
+hours=%d 小时%s
+days=%d 天%s
+weeks=%d 周%s
+months=%d 月%s
+years=%d 年%s
+raw_seconds=秒
+raw_minutes=分钟
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_zh-HK.ini b/conf/locale/locale_zh-HK.ini index d8b98168..25974e7d 100644..100755 --- a/conf/locale/locale_zh-HK.ini +++ b/conf/locale/locale_zh-HK.ini @@ -1,659 +1,679 @@ -app_desc = 基於 Go 語言的自助 Git 服務 - -home = 首頁 -dashboard = 控制面版 -explore = 探索 -help = 幫助 -sign_in = 登錄 -social_sign_in = 社交帳號登錄:第 2 步 <small>關聯帳號</small> -sign_out = 退出 -sign_up = 註冊 -register = 註冊 -website = 官方網站 -version = 當前版本 -page = 頁面 -template = 模版 -language = 語言選項 - -username = 用戶名 -email = 郵箱 -password = 密碼 -re_type = 確認密碼 -captcha = 驗證碼 - -repository = 倉庫 -organization = 組織 -mirror = 鏡像 -new_repo = 創建新的倉庫 -new_migrate = 遷移外部倉庫 -new_org = 創建新的組織 -manage_org = 管理我的組織 -admin_panel = 管理面版 -account_settings = 帳戶設置 -settings = 帳戶設置 - -news_feed = 最新活動 -pull_requests = 合併請求 -issues = 問題管理 - -cancel = 取消 - -[install] -install = 安裝頁面 -title = 首次執行安裝程序 -requite_db_desc = Gogs 允許後端數據庫為 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二進制發行版才支持。 -db_type = 數據庫類型 -host = 數據庫主機 -user = 數據庫用戶 -password = 數據庫用戶密碼 -db_name = 數據庫名稱 -db_helper = 如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字符集。 -ssl_mode = SSL 模式 -path = 數據庫文件路徑 -sqlite_helper = SQLite3 數據庫的文件路徑。 -general_title = 應用基本設置 -repo_path = 倉庫根目錄 -repo_path_helper = 所有 Git 遠程倉庫都將被存放於該目錄。 -run_user = 執行系統用戶 -run_user_helper = 該用戶必須具有對倉庫根目錄和執行 Gogs 的操作權限。 -domain = 域名 -domain_helper = 該設置影響 SSH 復製地址。 -app_url = 應用 URL -app_url_helper = 該設置影響 HTTP/HTTPS 復製地址和一些郵箱中的連結。 -email_title = 郵件服務設置(可選) -smtp_host = SMTP 主機 -mailer_user = 發送郵箱 -mailer_password = 發送郵箱密碼 -notify_title = 通知提醒設置(可選) -register_confirm = 啟用註冊郵箱確認 -mail_notify = 啟用郵件通知提醒 -admin_title = 管理員帳號設置 -admin_name = 管理員用戶名 -admin_password = 管理員密碼 -confirm_password = 確認密碼 -admin_email = 管理員郵箱 -install_gogs = 立即安裝 -test_git_failed = 無法識別 'git' 命令:%v -sqlite3_not_available = 您所使用的發行版本不支持 SQLite3,請從 http://gogs.io/docs/installation/install_from_binary.html 下載官方二進制發行版本,而不是 gobuild 版本。 -invalid_db_setting = 數據庫設置不正確:%v -invalid_repo_path = 倉庫根目錄設置不正確:%v -run_user_not_match = 執行系統用戶非當前用戶:%s -> %s -save_config_failed = 應用配置保存失敗:%v -invalid_admin_setting = 管理員帳戶設置不正確:%v -install_success = 您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG! - -[home] -uname_holder = 用戶名或郵箱 -password_holder = 密碼 -switch_dashboard_context = 切換控制面版用戶 -my_repos = 我的倉庫 -collaborative_repos = 參與協作的倉庫 -my_orgs = 我的組織 -my_mirrors = 我的鏡像 - -[explore] -repos = 探索倉庫 - -[auth] -create_new_account = 創建帳戶 -register_hepler_msg = 已經註冊?立即登錄! -social_register_hepler_msg = 已經註冊?立即綁定! -disable_register_prompt = 對不起,註冊功能已被關閉。請聯系網站管理員。 -disable_register_mail = 對不起,註冊郵箱確認功能已被關閉。 -remember_me = 記住登錄 -forgot_password = 忘記密碼 -forget_password = 忘記密碼? -sign_up_now = 還沒帳戶?馬上註冊。 -confirmation_mail_sent_prompt = 一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 -sign_in_email = 登錄到您的郵箱 -active_your_account = 激活您的帳戶 -resent_limit_prompt = 對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試! -has_unconfirmed_mail = %s 您好,系統檢測到您有一封發送至 <b>%s</b> 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。 -resend_mail = 單擊此處重新發送確認郵件 -email_not_associate = 您輸入的郵箱地址未被關聯到任何帳號! -send_reset_mail = 單擊此處(重新)發送您的密碼重置郵件 -reset_password = 重置密碼 -invalid_code = 對不起,您的確認代碼已過期或已失效。 -reset_password_helper = 單擊此處重置密碼 -password_too_short = 密碼長度不能少於 6 位! - -[form] -UserName = 用戶名 -RepoName = 倉庫名稱 -Email = 郵箱地址 -Password = 密碼 -Retype = 確認密碼 -SSHTitle = SSH 密鑰名稱 -HttpsUrl = HTTPS URL 地址 -PayloadUrl = 推送地址 -TeamName = 團隊名稱 -AuthName = 認證名稱 -AdminEmail = 管理員郵箱 - -require_error = 不能為空。 -alpha_dash_error = 必須為英文字母、阿拉伯數字或橫線(-_)。 -alpha_dash_dot_error = 必須為英文字母、阿拉伯數字、橫線(-_)或點。 -min_size_error = 長度最小為 %s 個字符。 -max_size_error = 長度最大為 %s 個字符。 -email_error = 不是一個有效的郵箱地址。 -url_error = 不是一個有效的 URL。 -unknown_error = 未知錯誤: -captcha_incorrect = 驗證碼未匹配。 -password_not_match = 密碼與確認密碼未匹配。 - -username_been_taken = 用戶名已經被佔用。 -repo_name_been_taken = 倉庫名稱已經被佔用。 -org_name_been_taken = 組織名稱已經被佔用。 -team_name_been_taken = 團隊名稱已經被佔用。 -email_been_used = 郵箱地址已經被使用。 -ssh_key_been_used = SSH 密鑰已經被使用。 -illegal_username = 您的用戶名包含不合法字符。 -illegal_repo_name = 倉庫名稱包含不合法字符。 -illegal_org_name = 組織名稱包含不合法字符。 -illegal_team_name = 團隊名稱包含不合法字符。 -username_password_incorrect = 用戶名或密碼不正確。 -enterred_invalid_repo_name = 請檢查您輸入的倉庫名稱是正確。 -enterred_invalid_owner_name = 請檢查您輸入的新所有者用戶名是否正確。 -enterred_invalid_password = 請檢查您輸入的密碼是否正確。 -user_not_exist = 被操作的用戶不存在! -last_org_owner = 被移除用戶為最後一位管理員。請添加一位新的管理員再進行移除成員操作! - -invalid_ssh_key = 很抱歉,我們無法驗證您輸入的 SSH 密鑰:%s -unable_verify_ssh_key = Gogs 無法驗證您輸入的 SSH 密鑰,但我們假設那是有效的密鑰,請您自行確保其有效性! -auth_failed = 授權驗證失敗:%v - -still_own_repo = 您的帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! -org_still_own_repo = 該組織仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作! - -still_own_user = 該授權認證依舊被部分用戶使用,請先刪除該部分用戶後再試! - -[user] -change_avatar = 到 gravatar.com 上修改您的頭像 -join_on = 加入於 -repositories = 倉庫列表 -activity = 公開活動 -followers = 關註者 -starred = 已讚好 -following = 關註中 - -[settings] -profile = 個人信息 -password = 修改密碼 -ssh_keys = 管理 SSH 密鑰 -social = 社交帳號綁定 -orgs = 管理組織 -delete = 刪除帳戶 -uid = 用戶 ID - -public_profile = 公開信息 -profile_desc = 您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。 -full_name = 自定義名稱 -website = 個人網站 -location = 所在地區 -update_profile = 更新信息 -update_profile_success = 您的個人信息更新成功! -change_username = 用戶名將被修改 -change_username_desc = 用戶名被修改,您確定要繼續操作嗎?這將會影響到所有與您帳戶有關的連結。 -continue = 繼續操作 -cancel = 取消操作 - -change_password = 修改密碼 -old_password = 當前密碼 -new_password = 新的密碼 -password_incorrect = 當前密碼不正確! -change_password_success = 密碼修改成功!您現在可以使用新的密碼登錄。 - -manage_ssh_keys = 管理 SSH 密鑰 -add_key = 增加密鑰 -ssh_desc = 以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它! -ssh_helper = <strong>需要幫助?</strong> 請查看有關 <a href="https://help.github.com/articles/generating-ssh-keys">如何生成 SSH 密鑰</a> 或 <a href="https://help.github.com/ssh-issues/">常見 SSH 問題</a> 尋找答案。 -add_new_key = 增加 SSH 密鑰 -key_name = 密鑰名稱 -key_content = 密鑰內容 -add_key_success = 新的 SSH 密鑰添加成功! -delete_key = 刪除 -add_on = 增加於 -last_used = 上次使用在 -no_activity = 沒有最近活動 - -manage_social = 管理關聯社交帳戶 -social_desc = 以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定! -unbind = 解除綁定 -unbind_success = 社交帳號解除綁定成功! - -delete_account = 刪除當前帳戶 -delete_prompt = 刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>! -confirm_delete_account = 確認刪除帳戶 -delete_account_title = 帳戶刪除操作 -delete_account_desc = 該帳戶將被永久性刪除,您確定要繼續操作嗎? - -[repo] -owner = 擁有者 -repo_name = 倉庫名稱 -repo_name_helper = 偉大的倉庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。 -visibility = 可見度 -visiblity_helper = 本倉庫將是 <span class="label label-red label-radius">私有的</span> -repo_desc = 倉庫描述 -repo_lang = 倉庫語言 -repo_lang_helper = 請選擇 .gitignore 文件 -license = 授權許可 -license_helper = 請選擇授權許可文件 -init_readme = 使用 README.md 文件初始化倉庫 -create_repo = 創建倉庫 -default_branch = 默認分支 -mirror_interval = 鏡像同步周期(小時) -goget_meta = Go-Get 支持 -goget_meta_helper = 本倉庫將可以通過 <span class="label label-blue label-radius">Go Get</span> 獲取 - -need_auth = 需要授權驗證 -migrate_type = 遷移類型 -migrate_type_helper = 本倉庫將是 <span class="label label-blue label-radius">鏡像</span> -migrate_repo = 遷移倉庫 - -copy_link = 復製連結 -click_to_copy = 復製到剪切簿 -copied = 復製成功 -clone_helper = 不知道如何操作?訪問 <a target="_blank" href="http://git-scm.com/book/zh/Git-基礎-取得項目的-Git-倉庫">此處</a> 查看幫助! -unwatch = 取消關註 -watch = 關註 -unstar = 取消讚好 -star = 讚好 -fork = 派生 - -no_desc = 暫無描述 -quick_guide = 快速幫助 -clone_this_repo = 復製當前倉庫 -create_new_repo_command = 從命令行創建一個新的倉庫 -push_exist_repo = 從命令行推送已經創建的倉庫 - -branch = 分支 -tree = 目錄樹 -branch_and_tags = 分支與標籤 -branches = 分支列表 -tags = 標籤列表 -issues = 問題管理 -commits = 提交歷史 -releases = 版本發佈 -file_raw = 原始文件 -file_history = 文件歷史 -file_view_raw = 查看原始文件 - -commits.commits = 次代碼提交 -commits.search = 搜索提交歷史 -commits.find = 查找 -commits.author = 作者 -commits.message = 備註 -commits.date = 提交日期 -commits.older = 更舊的提交 -commits.newer = 更新的提交 - -settings = 倉庫設置 -settings.options = 基本設置 -settings.collaboration = 管理協作者 -settings.hooks = 管理 Web 鉤子 -settings.githooks = 管理 Git 鉤子 -settings.deploy_keys = 管理部署密鑰 -settings.basic_settings = 基本設置 -settings.danger_zone = 危險操作區 -settings.site = 官方網站 -settings.update_settings = 更新倉庫設置 -settings.change_reponame = 倉庫名稱將被修改 -settings.change_reponame_desc = 倉庫名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該倉庫有關的連結。 -settings.transfer = 轉移倉庫所有權 -settings.transfer_desc = 您可以將倉庫轉移至您擁有管理員權限的帳戶或組織。 -settings.new_owner_has_same_repo = 新的倉庫擁有者已經存在同名倉庫! -settings.delete = 刪除本倉庫 -settings.delete_desc = 刪除倉庫操作不可逆轉,請三思而後行。 -settings.transfer_notices = <p>- 如果您轉移給個人用戶,您將對倉庫失去所有權限。</p><p>- 如果您轉移給您作為擁有者的組織,則可繼續保持操作權限。</p> -settings.update_settings_success = 倉庫設置更新成功! -settings.transfer_owner = 新擁有者 -settings.make_transfer = 確認轉移倉庫 -settings.transfer_succeed = 倉庫所有權轉移成功! -settings.confirm_delete = 確認刪除倉庫 -settings.add_collaborator = 增加新的協作者 -settings.add_collaborator_success = 成功添加新的協作者! -settings.remove_collaborator_success = 被操作的協作者已經被收回權限! -settings.user_is_org_member = 被操作的用戶是組織成員,因此無法添加為協作者! -settings.add_webhook = 添加 Web 鉤子 -settings.hooks_desc = Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文檔</a> 獲取更多信息。 -settings.remove_hook_success = Web 鉤子刪除成功! -settings.add_webhook_desc = 我們會通過 <code>POST</code> 請求將訂閱事件信息發送至向指定 URL 地址。您可以設置不同的數據接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文檔</a> 獲取更多信息。 -settings.githooks_desc = Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。 -settings.githook_edit_desc = 如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。 -settings.githook_name = 鉤子名稱 -settings.githook_content = 鉤子文本 -settings.update_githook = 更新鉤子設置 -settings.payload_url = 推送地址 -settings.content_type = 數據格式 -settings.secret = 密鑰文本 -settings.event_desc = 請設置您希望觸發 Web 鉤子的事件: -settings.event_push_only = 只推送 <code>push</code> 事件。 -settings.active = 是否激活 -settings.active_helper = 當指定事件發生時我們將會觸發此 Web 鉤子。 -settings.add_hook_success = Web 鉤子添加成功! -settings.update_webhook = 更新 Web 鉤子 -settings.update_hook_success = Web 鉤子更新成功! -settings.delete_webhook = 刪除 Web 鉤子 -settings.recent_deliveries = 最近推送記錄 -settings.hook_type = 鉤子類型 -settings.add_slack_hook_desc = 為您的倉庫增加 <a href="http://slack.com">Slack</a> 集成 -settings.slack_token = 令牌 -settings.slack_domain = 域名 -settings.slack_channel = 頻道 - -diff.browse_source = 瀏覽代碼 -diff.parent = 父節點 -diff.commit = 當前提交 -diff.data_not_available = 暫無可用數據 -diff.show_diff_stats = 顯示文件統計 -diff.stats_desc = 共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong> -diff.bin = 二進制 -diff.view_file = 查看文件 - -[org] -org_name_holder = 組織名稱 -org_name_helper = 偉大的組織都有一個簡短而寓意深刻的名字。 -org_email_helper = 組織的郵箱用於接收所有通知和確認郵件。 -create_org = 創建組織 -repo_updated = 最後更新於 -people = 組織成員 -invite_someone = 邀請他人加入 -teams = 組織團隊 -lower_members = 名成員 -lower_repositories = 個倉庫 -create_new_team = 創建新的團隊 -org_desc = 組織描述 -team_name = 團隊名稱 -team_desc = 團隊描述 -team_name_helper = 您可以使用該名稱來通知改組全體成員。 -team_desc_helper = 一句話描述這個團隊是做什麼的。 -team_permission_desc = 請選擇該團隊所具有的權限等級: - -settings = 組織設置 -settings.options = 基本設置 -settings.full_name = 組織全名 -settings.website = 官方網站 -settings.location = 所在地區 -settings.update_settings = 更新組織設置 -settings.change_orgname = 組織名稱將被修改 -settings.change_orgname_desc = 組織名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該組織有關的連結。 -settings.update_setting_success = 組織設置更新成功! -settings.delete = 刪除組織 -settings.delete_account = 刪除當前組織 -settings.delete_prompt = 刪除操作會永久清除該組織的信息,並且 <strong>不可恢復</strong>! -settings.confirm_delete_account = 確認刪除組織 -settings.delete_org_title = 組織刪除操作 -settings.delete_org_desc = 該組織將被永久性刪除,您確定要繼續操作嗎? -settings.hooks_desc = 在此處添加的 Web 鉤子將會應用到該組織下的 <strong>所有倉庫</strong>。 - -members.public = 公開成員 -members.public_helper = 設為私有 -members.private = 私有成員 -members.private_helper = 設為公開 -members.owner = 管理員 -members.member = 普通成員 -members.conceal = 隱藏身份 -members.remove = 移除成員 -members.leave = 離開組織 -members.invite_desc = 請輸入被邀請到組織 %s 的用戶名稱: -members.invite_now = 立即邀請 - -teams.join = 加入團隊 -teams.leave = 離開團隊 -teams.read_access = 讀取權限 -teams.read_access_helper = 這個團隊將擁有查看和復製所屬倉庫的權限。 -teams.write_access = 寫入權限 -teams.write_access_helper = 這個團隊將擁有查看、復製和推送所屬倉庫的權限。 -teams.admin_access = 管理權限 -teams.admin_access_helper = 這個團隊將擁有查看、復製、推送和添加其他組織成員到團隊的權限。 -teams.no_desc = 該團隊暫無描述 -teams.settings = 團隊設置 -teams.owners_permission_desc = 管理員團隊對 <strong>所有倉庫</strong> 具有操作權限,且對組織具有 <strong>管理員權限</strong>。 -teams.members = 團隊成員 -teams.update_settings = 更新團隊設置 -teams.delete_team = 刪除當前團隊 -teams.add_team_member = 添加團隊成員 -teams.delete_team_title = 團隊刪除操作 -teams.delete_team_desc = 刪除操作會永久清除有關該團隊的信息,您確定要繼續操作嗎?團隊成員可能會失去對某些倉庫的操作權限。 -teams.delete_team_success = 指定團隊刪除成功! -teams.read_permission_desc = 該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和復製等只讀操作。 -teams.write_permission_desc = 該團隊擁有對所屬倉庫的 <strong>讀取</strong> 和 <strong>寫入</strong> 的權限。 -teams.admin_permission_desc = 該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、復製、推送以及添加其它倉庫協作者。 -teams.repositories = 團隊倉庫 -teams.add_team_repository = 添加團隊倉庫 -teams.remove_repo = 移除倉庫 -teams.add_nonexistent_repo = 您嘗試添加到團隊的倉庫不存在,請先創建倉庫! - -[admin] -dashboard = 控制面版 -users = 用戶管理 -organizations = 組織管理 -repositories = 倉庫管理 -authentication = 授權認證管理 -config = 應用配置管理 -notices = 系統提示管理 -monitor = 應用監控面版 -prev = 上一頁 -next = 下一頁 - -dashboard.statistic = 應用統計數據 -dashboard.operations = 管理員操作 -dashboard.system_status = 系統監視狀態 -dashboard.statistic_info = Gogs 數據庫統計:<b>%d</b> 位用戶,<b>%d</b> 個組織,<b>%d</b> 個公鑰,<b>%d</b> 個倉庫,<b>%d</b> 個倉庫關註,<b>%d</b> 個贊,<b>%d</b> 次行為,<b>%d</b> 條權限記錄,<b>%d</b> 個問題,<b>%d</b> 次評論,<b>%d</b> 個社交帳號,<b>%d</b> 個用戶關註,<b>%d</b> 個鏡像,<b>%d</b> 個版本發佈,<b>%d</b> 個登錄源,<b>%d</b> 個 Web 鉤子,<b>%d</b> 個里程碑,<b>%d</b> 個標籤,<b>%d</b> 個鉤子任務,<b>%d</b> 個團隊,<b>%d</b> 個更新任務,<b>%d</b> 個附件。 -dashboard.operation_name = 操作名稱 -dashboard.operation_switch = 開關 -dashboard.operation_run = 執行 -dashboard.clean_unbind_oauth = 清理未綁定社交帳號 -dashboard.delete_inactivate_accounts = 刪除所有未激活帳戶 -dashboard.server_uptime = 服務執行時間 -dashboard.current_goroutine = 當前 Goroutines 數量 -dashboard.current_memory_usage = 當前內存使用量 -dashboard.total_memory_allocated = 所有被分配的內存 -dashboard.memory_obtained = 內存佔用量 -dashboard.pointer_lookup_times = 指針查找次數 -dashboard.memory_allocate_times = 內存分配次數 -dashboard.memory_free_times = 內存釋放次數 -dashboard.current_heap_usage = 當前 Heap 內存使用量 -dashboard.heap_memory_obtained = Heap 內存佔用量 -dashboard.heap_memory_idle = Heap 內存空閒量 -dashboard.heap_memory_in_use = 正在使用的 Heap 內存 -dashboard.heap_memory_released = 被釋放的 Heap 內存 -dashboard.heap_objects = Heap 對象數量 -dashboard.bootstrap_stack_usage = 啟動 Stack 使用量 -dashboard.stack_memory_obtained = 被分配的 Stack 內存 -dashboard.mspan_structures_usage = MSpan 結構內存使用量 -dashboard.mspan_structures_obtained = 被分配的 MSpan 結構內存 -dashboard.mcache_structures_usage = MCache 結構內存使用量 -dashboard.mcache_structures_obtained = 被分配的 MCache 結構內存 -dashboard.profiling_bucket_hash_table_obtained = 被分配的剖析哈希表內存 -dashboard.gc_metadata_obtained = 被分配的垃圾收集元數據內存 -dashboard.other_system_allocation_obtained = 其它被分配的系統內存 -dashboard.next_gc_recycle = 下次垃圾收集內存回收量 -dashboard.last_gc_time = 距離上次垃圾收集時間 -dashboard.total_gc_time = 垃圾收集執行時間總量 -dashboard.total_gc_pause = 垃圾收集暫停時間總量 -dashboard.last_gc_pause = 上次垃圾收集暫停時間 -dashboard.gc_times = 垃圾收集執行次數 - -users.user_manage_panel = 用戶管理面版 -users.new_account = 創建新的帳戶 -users.name = 用戶名 -users.activated = 已激活 -users.admin = 管理員 -users.repos = 倉庫數 -users.created = 創建時間 -users.edit = 編輯 -users.auth_source = 認證源 -users.local = 本地 -users.auth_login_name = 認證登錄名 -users.update_profile_success = 該用戶信息更新成功! -users.edit_account = 編輯用戶信息 -users.is_activated = 該用戶已被激活 -users.is_admin = 該用戶具有管理員權限 -users.update_profile = 更新用戶信息 -users.delete_account = 刪除該用戶 -users.still_own_repo = 該帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! - -orgs.org_manage_panel = 組織管理面版 -orgs.name = 組織名稱 -orgs.teams = 團隊數 -orgs.members = 成員數 - -repos.repo_manage_panel = 倉庫管理界面 -repos.owner = 所有者 -repos.name = 倉庫名稱 -repos.private = 私有庫 -repos.watches = 關註數 -repos.stars = 讚好數 -repos.issues = 問題數 - -auths.auth_manage_panel = 授權認證管理面版 -auths.new = 添加新的認證源 -auths.name = 認證名稱 -auths.type = 認證類型 -auths.enabled = 已啟用 -auths.updated = 最後更新時間 -auths.auth_type = 授權類型 -auths.auth_name = 授權名稱 -auths.domain = 域名 -auths.host = 主機地址 -auths.port = 主機端口 -auths.base_dn = Base DN -auths.attributes = 搜尋屬性 -auths.filter = 搜尋過濾 -auths.ms_ad_sa = Ms Ad SA -auths.smtp_auth = SMTP 授權類型 -auths.smtphost = SMTP 主機地址 -auths.smtpport = SMTP 主機端口 -auths.enable_tls = 啟用 TLS 加密 -auths.enable_auto_register = 允許授權用戶自動註冊 -auths.tips = 幫助提示 -auths.edit = 修改授權認證設置 -auths.activated = 該授權認證已經啟用 -auths.update_success = 授權認證設置更新成功! -auths.update = 更新授權認證信息 -auths.delete = 刪除該授權認證 -auths.delete_auth_title = 授權認證刪除操作 -auths.delete_auth_desc = 該授權認證將被刪除,您確定要繼續嗎? - -config.server_config = 服務器配置 -config.app_name = 應用名稱 -config.app_ver = 應用版本 -config.app_url = 應用 URL -config.domain = 應用域名 -config.offline_mode = 離線模式 -config.disable_router_log = 關閉路由日志 -config.run_user = 執行用戶 -config.run_mode = 執行模式 -config.repo_root_path = 倉庫根目錄 -config.static_file_root_path = 靜態文件根目錄 -config.log_file_root_path = 日志文件根目錄 -config.script_type = 腳本類型 -config.reverse_auth_user = 反向代理認證 -config.db_config = 數據庫配置 -config.db_type = 數據庫類型 -config.db_host = 主機地址 -config.db_name = 數據庫名稱 -config.db_user = 數據庫用戶 -config.db_ssl_mode = SSL 模式 -config.db_ssl_mode_helper = (僅限 "postgres" 使用) -config.db_path = 數據庫路徑 -config.db_path_helper = (僅限 "sqlite3" 使用) -config.service_config = 服務配置 -config.register_email_confirm = 註冊郵件確認 -config.disable_register = 關閉註冊功能 -config.require_sign_in_view = 強制登錄瀏覽 -config.mail_notify = 郵件通知提醒 -config.enable_cache_avatar = 開啟緩存頭像 -config.active_code_lives = 激活用戶連結有效期 -config.reset_password_code_lives = 重置密碼連結有效期 -config.webhook_config = Web 鉤子配置 -config.task_interval = 任務周期 -config.deliver_timeout = 推送超時 -config.mailer_config = 郵件配置 -config.mailer_enabled = 啟用服務 -config.mailer_name = 發送者名稱 -config.mailer_host = 郵件主機地址 -config.mailer_user = 發送者帳號 -config.oauth_config = 社交帳號配置 -config.oauth_enabled = 啟用服務 -config.cache_config = Cache 配置 -config.cache_adapter = Cache 適配器 -config.cache_interval = Cache 周期 -config.cache_conn = Cache 連接字符串 -config.session_config = Session 配置 -config.session_provider = Session 提供者 -config.provider_config = 提供者配置 -config.cookie_name = Cookie 名稱 -config.enable_set_cookie = 啟用設置 Cookie -config.gc_interval_time = 垃圾收集周期 -config.session_life_time = Session 生命周期 -config.https_only = 僅限 HTTPS -config.cookie_life_time = Cookie 生命周期 -config.session_hash_function = Session ID 哈希函數 -config.session_hash_key = Session ID 哈希健值 -config.picture_config = 圖片配置 -config.picture_service = 圖片服務 -config.disable_gravatar = 禁用 Gravatar 頭像 -config.log_config = 日誌配置 -config.log_mode = 日誌模式 - -monitor.cron = Cron 任務 -monitor.name = 任務名稱 -monitor.schedule = 任務安排 -monitor.next = 下次執行時間 -monitor.previous = 上次執行時間 -monitor.execute_times = 執行次數 -monitor.process = 執行中進程 -monitor.desc = 進程描述 -monitor.start = 開始時間 -monitor.execute_time = 已執行時間 - -notices.system_notice_list = 系統提示管理 -notices.type = 提示類型 -notices.type_1 = 倉庫 -notices.desc = 描述 -notices.op = 操作 -notices.delete_success = 系統提示刪除成功! - -[action] -create_repo = 創建了倉庫 <a href="%s/%s">%s</a> -commit_repo = 推送了 <a href="%s/%s/src/%s">%s</a> 分支的代碼到 <a href="%s/%s">%s</a> -create_issue = 創建了問題 <a href="%s/%s/issues/%s">%s#%s</a> -comment_issue = 評論了問題 <a href="%s/%s/issues/%s">%s#%s</a> -transfer_repo = 將倉庫 <code>%s</code> 轉移至 <a href="/%s%s">%s</a> -push_tag = 推送了標籤 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a> -compare_2_commits = 查看 2 次提交的內容對比 - -[tool] -ago = 之前 -from_now = 之後 -now = 現在 -1s = 1 秒%s -1m = 1 分鐘%s -1h = 1 小時%s -1d = 1 天%s -1w = 1 周%s -1mon = 1 月%s -1y = 1 年%s -seconds = %d 秒%s -minutes = %d 分鐘%s -hours = %d 小時%s -days = %d 天%s -weeks = %d 周%s -months = %d 月%s -years = %d 年%s -raw_seconds = 秒 -raw_minutes = 分鐘 - - - - - - - - - - - - +app_desc=基於 Go 語言的自助 Git 服務
+
+home=首頁
+dashboard=控制面版
+explore=探索
+help=幫助
+sign_in=登錄
+social_sign_in=社交帳號登錄:第 2 步 <small>關聯帳號</small>
+sign_out=退出
+sign_up=註冊
+register=註冊
+website=官方網站
+version=當前版本
+page=頁面
+template=模版
+language=語言選項
+
+username=用戶名
+email=郵箱
+password=密碼
+re_type=確認密碼
+captcha=驗證碼
+
+repository=倉庫
+organization=組織
+mirror=鏡像
+new_repo=創建新的倉庫
+new_migrate=遷移外部倉庫
+new_fork=新的派生倉庫
+new_org=創建新的組織
+manage_org=管理我的組織
+admin_panel=管理面版
+account_settings=帳戶設置
+settings=帳戶設置
+
+news_feed=最新活動
+pull_requests=合併請求
+issues=問題管理
+
+cancel=取消
+
+[install]
+install=安裝頁面
+title=首次執行安裝程序
+requite_db_desc=Gogs 允許後端數據庫為 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二進制發行版才支持。
+db_type=數據庫類型
+host=數據庫主機
+user=數據庫用戶
+password=數據庫用戶密碼
+db_name=數據庫名稱
+db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字符集。
+ssl_mode=SSL 模式
+path=數據庫文件路徑
+sqlite_helper=SQLite3 數據庫的文件路徑。
+general_title=應用基本設置
+repo_path=倉庫根目錄
+repo_path_helper=所有 Git 遠程倉庫都將被存放於該目錄。
+run_user=執行系統用戶
+run_user_helper=該用戶必須具有對倉庫根目錄和執行 Gogs 的操作權限。
+domain=域名
+domain_helper=該設置影響 SSH 復製地址。
+app_url=應用 URL
+app_url_helper=該設置影響 HTTP/HTTPS 復製地址和一些郵箱中的連結。
+email_title=郵件服務設置(可選)
+smtp_host=SMTP 主機
+mailer_user=發送郵箱
+mailer_password=發送郵箱密碼
+notify_title=通知提醒設置(可選)
+register_confirm=啟用註冊郵箱確認
+mail_notify=啟用郵件通知提醒
+admin_title=管理員帳號設置
+admin_name=管理員用戶名
+admin_password=管理員密碼
+confirm_password=確認密碼
+admin_email=管理員郵箱
+install_gogs=立即安裝
+test_git_failed=無法識別 'git' 命令:%v
+sqlite3_not_available=您所使用的發行版本不支持 SQLite3,請從 %s 下載官方構建版,而不是 gobuild 版本。
+invalid_db_setting=數據庫設置不正確:%v
+invalid_repo_path=倉庫根目錄設置不正確:%v
+run_user_not_match=執行系統用戶非當前用戶:%s -> %s
+save_config_failed=應用配置保存失敗:%v
+invalid_admin_setting=管理員帳戶設置不正確:%v
+install_success=您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG!
+
+[home]
+uname_holder=用戶名或郵箱
+password_holder=密碼
+switch_dashboard_context=切換控制面版用戶
+my_repos=我的倉庫
+collaborative_repos=參與協作的倉庫
+my_orgs=我的組織
+my_mirrors=我的鏡像
+
+[explore]
+repos=探索倉庫
+
+[auth]
+create_new_account=創建帳戶
+register_hepler_msg=已經註冊?立即登錄!
+social_register_hepler_msg=已經註冊?立即綁定!
+disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。
+disable_register_mail=對不起,註冊郵箱確認功能已被關閉。
+remember_me=記住登錄
+forgot_password=忘記密碼
+forget_password=忘記密碼?
+sign_up_now=還沒帳戶?馬上註冊。
+confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。
+sign_in_email=登錄到您的郵箱
+active_your_account=激活您的帳戶
+resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
+has_unconfirmed_mail=%s 您好,系統檢測到您有一封發送至 <b>%s</b> 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
+resend_mail=單擊此處重新發送確認郵件
+email_not_associate=您輸入的郵箱地址未被關聯到任何帳號!
+send_reset_mail=單擊此處(重新)發送您的密碼重置郵件
+reset_password=重置密碼
+invalid_code=對不起,您的確認代碼已過期或已失效。
+reset_password_helper=單擊此處重置密碼
+password_too_short=密碼長度不能少於 6 位!
+
+[form]
+UserName=用戶名
+RepoName=倉庫名稱
+Email=郵箱地址
+Password=密碼
+Retype=確認密碼
+SSHTitle=SSH 密鑰名稱
+HttpsUrl=HTTPS URL 地址
+PayloadUrl=推送地址
+TeamName=團隊名稱
+AuthName=認證名稱
+AdminEmail=管理員郵箱
+
+require_error=不能為空。
+alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。
+alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。
+min_size_error=長度最小為 %s 個字符。
+max_size_error=長度最大為 %s 個字符。
+email_error=不是一個有效的郵箱地址。
+url_error=不是一個有效的 URL。
+unknown_error=未知錯誤:
+captcha_incorrect=驗證碼未匹配。
+password_not_match=密碼與確認密碼未匹配。
+
+username_been_taken=用戶名已經被佔用。
+repo_name_been_taken=倉庫名稱已經被佔用。
+org_name_been_taken=組織名稱已經被佔用。
+team_name_been_taken=團隊名稱已經被佔用。
+email_been_used=郵箱地址已經被使用。
+ssh_key_been_used=SSH 密鑰已經被使用。
+illegal_username=您的用戶名包含不合法字符。
+illegal_repo_name=倉庫名稱包含不合法字符。
+illegal_org_name=組織名稱包含不合法字符。
+illegal_team_name=團隊名稱包含不合法字符。
+username_password_incorrect=用戶名或密碼不正確。
+enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
+enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。
+enterred_invalid_password=請檢查您輸入的密碼是否正確。
+user_not_exist=被操作的用戶不存在!
+last_org_owner=被移除用戶為最後一位管理員。請添加一位新的管理員再進行移除成員操作!
+
+invalid_ssh_key=很抱歉,我們無法驗證您輸入的 SSH 密鑰:%s
+unable_verify_ssh_key=Gogs 無法驗證您輸入的 SSH 密鑰,但我們假設那是有效的密鑰,請您自行確保其有效性!
+auth_failed=授權驗證失敗:%v
+
+still_own_repo=您的帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
+still_has_org=您的帳戶仍舊是某些組織的成員,您必須先離開或刪除組織。
+org_still_own_repo=該組織仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作!
+
+still_own_user=該授權認證依舊被部分用戶使用,請先刪除該部分用戶後再試!
+
+target_branch_not_exist=目標分支不存在
+
+[user]
+change_avatar=到 gravatar.com 上修改您的頭像
+join_on=加入於
+repositories=倉庫列表
+activity=公開活動
+followers=關註者
+starred=已讚好
+following=關註中
+
+[settings]
+profile=個人信息
+password=修改密碼
+ssh_keys=管理 SSH 密鑰
+social=社交帳號綁定
+applications=管理授權應用
+orgs=管理組織
+delete=刪除帳戶
+uid=用戶 ID
+
+public_profile=公開信息
+profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
+full_name=自定義名稱
+website=個人網站
+location=所在地區
+update_profile=更新信息
+update_profile_success=您的個人信息更新成功!
+change_username=用戶名將被修改
+change_username_desc=用戶名被修改,您確定要繼續操作嗎?這將會影響到所有與您帳戶有關的連結。
+continue=繼續操作
+cancel=取消操作
+
+change_password=修改密碼
+old_password=當前密碼
+new_password=新的密碼
+password_incorrect=當前密碼不正確!
+change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。
+
+manage_ssh_keys=管理 SSH 密鑰
+add_key=增加密鑰
+ssh_desc=以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它!
+ssh_helper=<strong>需要幫助嗎?</strong> 請查看有關 <a href="%s"> 如何生成 SSH 密鑰</a> 的指南或 <a href="%s"> SSH 的常見問題</a> 的疑難排解。
+add_new_key=增加 SSH 密鑰
+key_name=密鑰名稱
+key_content=密鑰內容
+add_key_success=新的 SSH 密鑰添加成功!
+delete_key=刪除
+add_on=增加於
+last_used=上次使用在
+no_activity=沒有最近活動
+
+manage_social=管理關聯社交帳戶
+social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定!
+unbind=解除綁定
+unbind_success=社交帳號解除綁定成功!
+
+manage_access_token=管理個人操作令牌
+generate_new_token=生成新的令牌
+tokens_desc=您可以使用這些已生成的令牌來操作 Gogs API。
+new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。
+token_name=令牌名稱
+generate_token=生成令牌
+generate_token_succees=新的操作令牌生成成功!您必須立即復製到一個安全的地方,因為該令牌只會顯示一次!
+delete_token=删除令牌
+delete_token_success=個人操作令牌刪除成功!請更新與該令牌有關的所有應用。
+
+delete_account=刪除當前帳戶
+delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
+confirm_delete_account=確認刪除帳戶
+delete_account_title=帳戶刪除操作
+delete_account_desc=該帳戶將被永久性刪除,您確定要繼續操作嗎?
+
+[repo]
+owner=擁有者
+repo_name=倉庫名稱
+repo_name_helper=偉大的倉庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。
+visibility=可見度
+visiblity_helper=本倉庫將是 <span class="label label-red label-radius">私有的</span>
+fork_repo=派生倉庫
+fork_from=派生自
+fork_visiblity_helper=派生倉庫無法修改可見性。
+repo_desc=倉庫描述
+repo_lang=倉庫語言
+repo_lang_helper=請選擇 .gitignore 文件
+license=授權許可
+license_helper=請選擇授權許可文件
+init_readme=使用 README.md 文件初始化倉庫
+create_repo=創建倉庫
+default_branch=默認分支
+mirror_interval=鏡像同步周期(小時)
+goget_meta=Go-Get 支持
+goget_meta_helper=本倉庫將可以通過 <span class="label label-blue label-radius">Go Get</span> 獲取
+
+need_auth=需要授權驗證
+migrate_type=遷移類型
+migrate_type_helper=本倉庫將是 <span class="label label-blue label-radius">鏡像</span>
+migrate_repo=遷移倉庫
+
+copy_link=復製連結
+click_to_copy=復製到剪切簿
+copied=復製成功
+clone_helper=不知道如何操作?訪問 <a target="_blank"href="%s"> 帮助説明</a> !
+unwatch=取消關註
+watch=關註
+unstar=取消讚好
+star=讚好
+fork=派生
+
+no_desc=暫無描述
+quick_guide=快速幫助
+clone_this_repo=復製當前倉庫
+create_new_repo_command=從命令行創建一個新的倉庫
+push_exist_repo=從命令行推送已經創建的倉庫
+
+branch=分支
+tree=目錄樹
+branch_and_tags=分支與標籤
+branches=分支列表
+tags=標籤列表
+issues=問題管理
+commits=提交歷史
+releases=版本發佈
+file_raw=原始文件
+file_history=文件歷史
+file_view_raw=查看原始文件
+
+commits.commits=次代碼提交
+commits.search=搜索提交歷史
+commits.find=查找
+commits.author=作者
+commits.message=備註
+commits.date=提交日期
+commits.older=更舊的提交
+commits.newer=更新的提交
+
+settings=倉庫設置
+settings.options=基本設置
+settings.collaboration=管理協作者
+settings.hooks=管理 Web 鉤子
+settings.githooks=管理 Git 鉤子
+settings.deploy_keys=管理部署密鑰
+settings.basic_settings=基本設置
+settings.danger_zone=危險操作區
+settings.site=官方網站
+settings.update_settings=更新倉庫設置
+settings.change_reponame=倉庫名稱將被修改
+settings.change_reponame_desc=倉庫名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該倉庫有關的連結。
+settings.transfer=轉移倉庫所有權
+settings.transfer_desc=您可以將倉庫轉移至您擁有管理員權限的帳戶或組織。
+settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫!
+settings.delete=刪除本倉庫
+settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。
+settings.transfer_notices=<p>- 如果您轉移給個人用戶,您將對倉庫失去所有權限。</p><p>- 如果您轉移給您作為擁有者的組織,則可繼續保持操作權限。</p>
+settings.update_settings_success=倉庫設置更新成功!
+settings.transfer_owner=新擁有者
+settings.make_transfer=確認轉移倉庫
+settings.transfer_succeed=倉庫所有權轉移成功!
+settings.confirm_delete=確認刪除倉庫
+settings.add_collaborator=增加新的協作者
+settings.add_collaborator_success=成功添加新的協作者!
+settings.remove_collaborator_success=被操作的協作者已經被收回權限!
+settings.user_is_org_member=被操作的用戶是組織成員,因此無法添加為協作者!
+settings.add_webhook=添加 Web 鉤子
+settings.hooks_desc=Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target="_blank" href="%s">Webhooks 文檔</a> 獲取更多信息。
+settings.githooks_desc=Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。
+settings.githook_edit_desc=如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。
+settings.githook_name=鉤子名稱
+settings.githook_content=鉤子文本
+settings.update_githook=更新鉤子設置
+settings.remove_hook_success=Web 鉤子刪除成功!
+settings.add_webhook_desc=我們會通過 <code>POST</code> 請求將訂閱事件信息發送至向指定 URL 地址。您可以設置不同的數據接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target="_blank" href="%s">Webhooks 指南</a>.
+settings.payload_url=推送地址
+settings.content_type=數據格式
+settings.secret=密鑰文本
+settings.event_desc=請設置您希望觸發 Web 鉤子的事件:
+settings.event_push_only=只推送 <code>push</code> 事件。
+settings.active=是否激活
+settings.active_helper=當指定事件發生時我們將會觸發此 Web 鉤子。
+settings.add_hook_success=Web 鉤子添加成功!
+settings.update_webhook=更新 Web 鉤子
+settings.update_hook_success=Web 鉤子更新成功!
+settings.delete_webhook=刪除 Web 鉤子
+settings.recent_deliveries=最近推送記錄
+settings.hook_type=鉤子類型
+settings.add_slack_hook_desc=為您的倉庫增加 <a href="%s">Slack</a> 集成。
+settings.slack_token=令牌
+settings.slack_domain=域名
+settings.slack_channel=頻道
+
+diff.browse_source=瀏覽代碼
+diff.parent=父節點
+diff.commit=當前提交
+diff.data_not_available=暫無可用數據
+diff.show_diff_stats=顯示文件統計
+diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
+diff.bin=二進制
+diff.view_file=查看文件
+
+[org]
+org_name_holder=組織名稱
+org_name_helper=偉大的組織都有一個簡短而寓意深刻的名字。
+org_email_helper=組織的郵箱用於接收所有通知和確認郵件。
+create_org=創建組織
+repo_updated=最後更新於
+people=組織成員
+invite_someone=邀請他人加入
+teams=組織團隊
+lower_members=名成員
+lower_repositories=個倉庫
+create_new_team=創建新的團隊
+org_desc=組織描述
+team_name=團隊名稱
+team_desc=團隊描述
+team_name_helper=您可以使用該名稱來通知改組全體成員。
+team_desc_helper=一句話描述這個團隊是做什麼的。
+team_permission_desc=請選擇該團隊所具有的權限等級:
+
+settings=組織設置
+settings.options=基本設置
+settings.full_name=組織全名
+settings.website=官方網站
+settings.location=所在地區
+settings.update_settings=更新組織設置
+settings.change_orgname=組織名稱將被修改
+settings.change_orgname_desc=組織名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該組織有關的連結。
+settings.update_setting_success=組織設置更新成功!
+settings.delete=刪除組織
+settings.delete_account=刪除當前組織
+settings.delete_prompt=刪除操作會永久清除該組織的信息,並且 <strong>不可恢復</strong>!
+settings.confirm_delete_account=確認刪除組織
+settings.delete_org_title=組織刪除操作
+settings.delete_org_desc=該組織將被永久性刪除,您確定要繼續操作嗎?
+settings.hooks_desc=在此處添加的 Web 鉤子將會應用到該組織下的 <strong>所有倉庫</strong>。
+
+members.public=公開成員
+members.public_helper=設為私有
+members.private=私有成員
+members.private_helper=設為公開
+members.owner=管理員
+members.member=普通成員
+members.conceal=隱藏身份
+members.remove=移除成員
+members.leave=離開組織
+members.invite_desc=請輸入被邀請到組織 %s 的用戶名稱:
+members.invite_now=立即邀請
+
+teams.join=加入團隊
+teams.leave=離開團隊
+teams.read_access=讀取權限
+teams.read_access_helper=這個團隊將擁有查看和復製所屬倉庫的權限。
+teams.write_access=寫入權限
+teams.write_access_helper=這個團隊將擁有查看、復製和推送所屬倉庫的權限。
+teams.admin_access=管理權限
+teams.admin_access_helper=這個團隊將擁有查看、復製、推送和添加其他組織成員到團隊的權限。
+teams.no_desc=該團隊暫無描述
+teams.settings=團隊設置
+teams.owners_permission_desc=管理員團隊對 <strong>所有倉庫</strong> 具有操作權限,且對組織具有 <strong>管理員權限</strong>。
+teams.members=團隊成員
+teams.update_settings=更新團隊設置
+teams.delete_team=刪除當前團隊
+teams.add_team_member=添加團隊成員
+teams.delete_team_title=團隊刪除操作
+teams.delete_team_desc=刪除操作會永久清除有關該團隊的信息,您確定要繼續操作嗎?團隊成員可能會失去對某些倉庫的操作權限。
+teams.delete_team_success=指定團隊刪除成功!
+teams.read_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和復製等只讀操作。
+teams.write_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 和 <strong>寫入</strong> 的權限。
+teams.admin_permission_desc=該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、復製、推送以及添加其它倉庫協作者。
+teams.repositories=團隊倉庫
+teams.add_team_repository=添加團隊倉庫
+teams.remove_repo=移除倉庫
+teams.add_nonexistent_repo=您嘗試添加到團隊的倉庫不存在,請先創建倉庫!
+
+[admin]
+dashboard=控制面版
+users=用戶管理
+organizations=組織管理
+repositories=倉庫管理
+authentication=授權認證管理
+config=應用配置管理
+notices=系統提示管理
+monitor=應用監控面版
+prev=上一頁
+next=下一頁
+
+dashboard.statistic=應用統計數據
+dashboard.operations=管理員操作
+dashboard.system_status=系統監視狀態
+dashboard.statistic_info=Gogs 數據庫統計:<b>%d</b> 位用戶,<b>%d</b> 個組織,<b>%d</b> 個公鑰,<b>%d</b> 個倉庫,<b>%d</b> 個倉庫關註,<b>%d</b> 個贊,<b>%d</b> 次行為,<b>%d</b> 條權限記錄,<b>%d</b> 個問題,<b>%d</b> 次評論,<b>%d</b> 個社交帳號,<b>%d</b> 個用戶關註,<b>%d</b> 個鏡像,<b>%d</b> 個版本發佈,<b>%d</b> 個登錄源,<b>%d</b> 個 Web 鉤子,<b>%d</b> 個里程碑,<b>%d</b> 個標籤,<b>%d</b> 個鉤子任務,<b>%d</b> 個團隊,<b>%d</b> 個更新任務,<b>%d</b> 個附件。
+dashboard.operation_name=操作名稱
+dashboard.operation_switch=開關
+dashboard.operation_run=執行
+dashboard.clean_unbind_oauth=清理未綁定社交帳號
+dashboard.delete_inactivate_accounts=刪除所有未激活帳戶
+dashboard.server_uptime=服務執行時間
+dashboard.current_goroutine=當前 Goroutines 數量
+dashboard.current_memory_usage=當前內存使用量
+dashboard.total_memory_allocated=所有被分配的內存
+dashboard.memory_obtained=內存佔用量
+dashboard.pointer_lookup_times=指針查找次數
+dashboard.memory_allocate_times=內存分配次數
+dashboard.memory_free_times=內存釋放次數
+dashboard.current_heap_usage=當前 Heap 內存使用量
+dashboard.heap_memory_obtained=Heap 內存佔用量
+dashboard.heap_memory_idle=Heap 內存空閒量
+dashboard.heap_memory_in_use=正在使用的 Heap 內存
+dashboard.heap_memory_released=被釋放的 Heap 內存
+dashboard.heap_objects=Heap 對象數量
+dashboard.bootstrap_stack_usage=啟動 Stack 使用量
+dashboard.stack_memory_obtained=被分配的 Stack 內存
+dashboard.mspan_structures_usage=MSpan 結構內存使用量
+dashboard.mspan_structures_obtained=被分配的 MSpan 結構內存
+dashboard.mcache_structures_usage=MCache 結構內存使用量
+dashboard.mcache_structures_obtained=被分配的 MCache 結構內存
+dashboard.profiling_bucket_hash_table_obtained=被分配的剖析哈希表內存
+dashboard.gc_metadata_obtained=被分配的垃圾收集元數據內存
+dashboard.other_system_allocation_obtained=其它被分配的系統內存
+dashboard.next_gc_recycle=下次垃圾收集內存回收量
+dashboard.last_gc_time=距離上次垃圾收集時間
+dashboard.total_gc_time=垃圾收集執行時間總量
+dashboard.total_gc_pause=垃圾收集暫停時間總量
+dashboard.last_gc_pause=上次垃圾收集暫停時間
+dashboard.gc_times=垃圾收集執行次數
+
+users.user_manage_panel=用戶管理面版
+users.new_account=創建新的帳戶
+users.name=用戶名
+users.activated=已激活
+users.admin=管理員
+users.repos=倉庫數
+users.created=創建時間
+users.edit=編輯
+users.auth_source=認證源
+users.local=本地
+users.auth_login_name=認證登錄名
+users.update_profile_success=該用戶信息更新成功!
+users.edit_account=編輯用戶信息
+users.is_activated=該用戶已被激活
+users.is_admin=該用戶具有管理員權限
+users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限
+users.update_profile=更新用戶信息
+users.delete_account=刪除該用戶
+users.still_own_repo=該帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
+users.still_has_org=該帳戶仍舊是某些組織的成員,您必須先使其離開或刪除組織。
+
+orgs.org_manage_panel=組織管理面版
+orgs.name=組織名稱
+orgs.teams=團隊數
+orgs.members=成員數
+
+repos.repo_manage_panel=倉庫管理界面
+repos.owner=所有者
+repos.name=倉庫名稱
+repos.private=私有庫
+repos.watches=關註數
+repos.stars=讚好數
+repos.issues=問題數
+
+auths.auth_manage_panel=授權認證管理面版
+auths.new=添加新的認證源
+auths.name=認證名稱
+auths.type=認證類型
+auths.enabled=已啟用
+auths.updated=最後更新時間
+auths.auth_type=授權類型
+auths.auth_name=授權名稱
+auths.domain=域名
+auths.host=主機地址
+auths.port=主機端口
+auths.base_dn=Base DN
+auths.attributes=搜尋屬性
+auths.filter=搜尋過濾
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP 授權類型
+auths.smtphost=SMTP 主機地址
+auths.smtpport=SMTP 主機端口
+auths.enable_tls=啟用 TLS 加密
+auths.enable_auto_register=允許授權用戶自動註冊
+auths.tips=幫助提示
+auths.edit=修改授權認證設置
+auths.activated=該授權認證已經啟用
+auths.update_success=授權認證設置更新成功!
+auths.update=更新授權認證信息
+auths.delete=刪除該授權認證
+auths.delete_auth_title=授權認證刪除操作
+auths.delete_auth_desc=該授權認證將被刪除,您確定要繼續嗎?
+
+config.server_config=服務器配置
+config.app_name=應用名稱
+config.app_ver=應用版本
+config.app_url=應用 URL
+config.domain=應用域名
+config.offline_mode=離線模式
+config.disable_router_log=關閉路由日志
+config.run_user=執行用戶
+config.run_mode=執行模式
+config.repo_root_path=倉庫根目錄
+config.static_file_root_path=靜態文件根目錄
+config.log_file_root_path=日志文件根目錄
+config.script_type=腳本類型
+config.reverse_auth_user=反向代理認證
+config.db_config=數據庫配置
+config.db_type=數據庫類型
+config.db_host=主機地址
+config.db_name=數據庫名稱
+config.db_user=數據庫用戶
+config.db_ssl_mode=SSL 模式
+config.db_ssl_mode_helper=(僅限 "postgres" 使用)
+config.db_path=數據庫路徑
+config.db_path_helper=(僅限 "sqlite3" 使用)
+config.service_config=服務配置
+config.register_email_confirm=註冊郵件確認
+config.disable_register=關閉註冊功能
+config.require_sign_in_view=強制登錄瀏覽
+config.mail_notify=郵件通知提醒
+config.enable_cache_avatar=開啟緩存頭像
+config.active_code_lives=激活用戶連結有效期
+config.reset_password_code_lives=重置密碼連結有效期
+config.webhook_config=Web 鉤子配置
+config.task_interval=任務周期
+config.deliver_timeout=推送超時
+config.mailer_config=郵件配置
+config.mailer_enabled=啟用服務
+config.mailer_name=發送者名稱
+config.mailer_host=郵件主機地址
+config.mailer_user=發送者帳號
+config.oauth_config=社交帳號配置
+config.oauth_enabled=啟用服務
+config.cache_config=Cache 配置
+config.cache_adapter=Cache 適配器
+config.cache_interval=Cache 周期
+config.cache_conn=Cache 連接字符串
+config.session_config=Session 配置
+config.session_provider=Session 提供者
+config.provider_config=提供者配置
+config.cookie_name=Cookie 名稱
+config.enable_set_cookie=啟用設置 Cookie
+config.gc_interval_time=垃圾收集周期
+config.session_life_time=Session 生命周期
+config.https_only=僅限 HTTPS
+config.cookie_life_time=Cookie 生命周期
+config.picture_config=圖片配置
+config.picture_service=圖片服務
+config.disable_gravatar=禁用 Gravatar 頭像
+config.log_config=日誌配置
+config.log_mode=日誌模式
+
+monitor.cron=Cron 任務
+monitor.name=任務名稱
+monitor.schedule=任務安排
+monitor.next=下次執行時間
+monitor.previous=上次執行時間
+monitor.execute_times=執行次數
+monitor.process=執行中進程
+monitor.desc=進程描述
+monitor.start=開始時間
+monitor.execute_time=已執行時間
+
+notices.system_notice_list=系統提示管理
+notices.type=提示類型
+notices.type_1=倉庫
+notices.desc=描述
+notices.op=操作
+notices.delete_success=系統提示刪除成功!
+
+[action]
+create_repo=創建了倉庫 <a href="%s/%s">%s</a>
+commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代碼到 <a href="%s/%s">%s</a>
+create_issue=創建了問題 <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=評論了問題 <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=將倉庫 <code>%s</code> 轉移至 <a href="/%s%s">%s</a>
+push_tag=推送了標籤 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
+compare_2_commits=查看 2 次提交的內容對比
+
+[tool]
+ago=之前
+from_now=之後
+now=現在
+1s=1 秒%s
+1m=1 分鐘%s
+1h=1 小時%s
+1d=1 天%s
+1w=1 周%s
+1mon=1 月%s
+1y=1 年%s
+seconds=%d 秒%s
+minutes=%d 分鐘%s
+hours=%d 小時%s
+days=%d 天%s
+weeks=%d 周%s
+months=%d 月%s
+years=%d 年%s
+raw_seconds=秒
+raw_minutes=分鐘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.5.6.1027 Beta" +const APP_VER = "0.5.8.1117 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/models.go b/models/models.go index 46716728..92a579df 100644 --- a/models/models.go +++ b/models/models.go @@ -39,7 +39,8 @@ var ( ) func init() { - tables = append(tables, new(User), new(PublicKey), new(Follow), new(Oauth2), + tables = append(tables, + new(User), new(PublicKey), new(Follow), new(Oauth2), new(AccessToken), new(Repository), new(Watch), new(Star), new(Action), new(Access), new(Issue), new(Comment), new(Attachment), new(IssueUser), new(Label), new(Milestone), new(Mirror), new(Release), new(LoginSource), new(Webhook), @@ -129,7 +130,7 @@ func NewEngine() (err error) { if err = SetEngine(); err != nil { return err } - if err = x.Sync2(tables...); err != nil { + if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { return fmt.Errorf("sync database struct error: %v\n", err) } return nil diff --git a/models/publickey.go b/models/publickey.go index c29003ce..f379e121 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -239,10 +239,10 @@ func GetPublicKeyById(keyId int64) (*PublicKey, error) { return key, nil } -// ListPublicKey returns a list of all public keys that user has. -func ListPublicKey(uid int64) ([]*PublicKey, error) { +// ListPublicKeys returns a list of public keys belongs to given user. +func ListPublicKeys(uid int64) ([]*PublicKey, error) { keys := make([]*PublicKey, 0, 5) - err := x.Find(&keys, &PublicKey{OwnerId: uid}) + err := x.Where("owner_id=?", uid).Find(&keys) if err != nil { return nil, err } diff --git a/models/repo.go b/models/repo.go index 888dea1e..d0cd1b55 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1080,15 +1080,21 @@ func GetCollaboratorNames(repoName string) ([]string, error) { return names, nil } +// CollaborativeRepository represents a repository with collaborative information. +type CollaborativeRepository struct { + *Repository + CanPush bool +} + // GetCollaborativeRepos returns a list of repositories that user is collaborator. -func GetCollaborativeRepos(uname string) ([]*Repository, error) { +func GetCollaborativeRepos(uname string) ([]*CollaborativeRepository, error) { uname = strings.ToLower(uname) accesses := make([]*Access, 0, 10) if err := x.Find(&accesses, &Access{UserName: uname}); err != nil { return nil, err } - repos := make([]*Repository, 0, 10) + repos := make([]*CollaborativeRepository, 0, 10) for _, access := range accesses { infos := strings.Split(access.RepoName, "/") if infos[0] == uname { @@ -1105,7 +1111,7 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) { return nil, err } repo.Owner = u - repos = append(repos, repo) + repos = append(repos, &CollaborativeRepository{repo, access.Mode == WRITABLE}) } return repos, nil } @@ -1161,7 +1167,7 @@ func SearchRepositoryByName(opt SearchOption) (repos []*Repository, err error) { if !opt.Private { sess.And("is_private=false") } - sess.And("lower_name like '%" + opt.Keyword + "%'").Find(&repos) + sess.And("lower_name like ?", "%"+opt.Keyword+"%").Find(&repos) return repos, err } @@ -1298,8 +1304,8 @@ func IsStaring(uid, repoId int64) bool { // \___ / \____/|__| |__|_ \ // \/ \/ -func ForkRepository(u *User, oldRepo *Repository) (*Repository, error) { - isExist, err := IsRepositoryExist(u, oldRepo.Name) +func ForkRepository(u *User, oldRepo *Repository, name, desc string) (*Repository, error) { + isExist, err := IsRepositoryExist(u, name) if err != nil { return nil, err } else if isExist { @@ -1323,9 +1329,9 @@ func ForkRepository(u *User, oldRepo *Repository) (*Repository, error) { repo := &Repository{ OwnerId: u.Id, Owner: u, - Name: oldRepo.Name, - LowerName: oldRepo.LowerName, - Description: oldRepo.Description, + Name: name, + LowerName: strings.ToLower(name), + Description: desc, IsPrivate: oldRepo.IsPrivate, IsFork: true, ForkId: oldRepo.Id, diff --git a/models/token.go b/models/token.go new file mode 100644 index 00000000..909d05e0 --- /dev/null +++ b/models/token.go @@ -0,0 +1,69 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "errors" + "time" + + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/uuid" +) + +var ( + ErrAccessTokenNotExist = errors.New("Access token does not exist") +) + +// AccessToken represents a personal access token. +type AccessToken struct { + Id int64 + Uid int64 + Name string + Sha1 string `xorm:"UNIQUE VARCHAR(40)"` + Created time.Time `xorm:"CREATED"` + Updated time.Time + HasRecentActivity bool `xorm:"-"` + HasUsed bool `xorm:"-"` +} + +// NewAccessToken creates new access token. +func NewAccessToken(t *AccessToken) error { + t.Sha1 = base.EncodeSha1(uuid.NewV4().String()) + _, err := x.Insert(t) + return err +} + +// GetAccessTokenBySha returns access token by given sha1. +func GetAccessTokenBySha(sha string) (*AccessToken, error) { + t := &AccessToken{Sha1: sha} + has, err := x.Get(t) + if err != nil { + return nil, err + } else if !has { + return nil, ErrAccessTokenNotExist + } + return t, nil +} + +// ListAccessTokens returns a list of access tokens belongs to given user. +func ListAccessTokens(uid int64) ([]*AccessToken, error) { + tokens := make([]*AccessToken, 0, 5) + err := x.Where("uid=?", uid).Desc("id").Find(&tokens) + if err != nil { + return nil, err + } + + for _, t := range tokens { + t.HasUsed = t.Updated.After(t.Created) + t.HasRecentActivity = t.Updated.Add(7 * 24 * time.Hour).After(time.Now()) + } + return tokens, nil +} + +// DeleteAccessTokenById deletes access token by given ID. +func DeleteAccessTokenById(id int64) error { + _, err := x.Id(id).Delete(new(AccessToken)) + return err +} diff --git a/models/user.go b/models/user.go index ce85008b..31f4a289 100644 --- a/models/user.go +++ b/models/user.go @@ -67,6 +67,7 @@ type User struct { Website string IsActive bool IsAdmin bool + AllowGitHook bool Rands string `xorm:"VARCHAR(10)"` Salt string `xorm:"VARCHAR(10)"` Created time.Time `xorm:"CREATED"` @@ -100,7 +101,7 @@ func (u *User) AvatarLink() string { } else if setting.Service.EnableCacheAvatar { return setting.AppSubUrl + "/avatar/" + u.Avatar } - return "//1.gravatar.com/avatar/" + u.Avatar + return setting.GravatarSource + u.Avatar } // NewGitSig generates and returns the signature of given user. @@ -376,7 +377,7 @@ func UpdateUser(u *User) error { return err } -// TODO: need some kind of mechanism to record failure. +// FIXME: need some kind of mechanism to record failure. HINT: system notice // DeleteUser completely and permanently deletes everything of user. func DeleteUser(u *User) error { // Check ownership of repository. @@ -390,13 +391,13 @@ func DeleteUser(u *User) error { // Check membership of organization. count, err = u.GetOrganizationCount() if err != nil { - return errors.New("modesl.GetRepositories(GetOrganizationCount): " + err.Error()) + return errors.New("GetOrganizationCount: " + err.Error()) } else if count > 0 { return ErrUserHasOrgs } - // TODO: check issues, other repos' commits - // TODO: roll backable in some point. + // FIXME: check issues, other repos' commits + // FIXME: roll backable in some point. // Delete all followers. if _, err = x.Delete(&Follow{FollowId: u.Id}); err != nil { @@ -581,7 +582,7 @@ func SearchUserByName(opt SearchOption) (us []*User, err error) { opt.Keyword = strings.ToLower(opt.Keyword) us = make([]*User, 0, opt.Limit) - err = x.Limit(opt.Limit).Where("type=0").And("lower_name like '%" + opt.Keyword + "%'").Find(&us) + err = x.Limit(opt.Limit).Where("type=0").And("lower_name like ?", "%"+opt.Keyword+"%").Find(&us) return us, err } diff --git a/models/webhook.go b/models/webhook.go index ac0c2409..33146b52 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -27,6 +27,32 @@ const ( FORM ) +var hookContentTypes = map[string]HookContentType{ + "json": JSON, + "form": FORM, +} + +// ToHookContentType returns HookContentType by given name. +func ToHookContentType(name string) HookContentType { + return hookContentTypes[name] +} + +func (t HookContentType) Name() string { + switch t { + case JSON: + return "json" + case FORM: + return "form" + } + return "" +} + +// IsValidHookContentType returns true if given name is a valid hook content type. +func IsValidHookContentType(name string) bool { + _, ok := hookContentTypes[name] + return ok +} + // HookEvent represents events that will delivery hook. type HookEvent struct { PushOnly bool `json:"push_only"` @@ -46,6 +72,8 @@ type Webhook struct { HookTaskType HookTaskType Meta string `xorm:"TEXT"` // store hook-specific attributes OrgId int64 + Created time.Time `xorm:"CREATED"` + Updated time.Time `xorm:"UPDATED"` } // GetEvent handles conversion from Events to HookEvent. @@ -147,12 +175,39 @@ const ( SLACK ) +var hookTaskTypes = map[string]HookTaskType{ + "gogs": GOGS, + "slack": SLACK, +} + +// ToHookTaskType returns HookTaskType by given name. +func ToHookTaskType(name string) HookTaskType { + return hookTaskTypes[name] +} + +func (t HookTaskType) Name() string { + switch t { + case GOGS: + return "gogs" + case SLACK: + return "slack" + } + return "" +} + +// IsValidHookTaskType returns true if given name is a valid hook task type. +func IsValidHookTaskType(name string) bool { + _, ok := hookTaskTypes[name] + return ok +} + type HookEventType string const ( PUSH HookEventType = "push" ) +// FIXME: just use go-gogs-client structs maybe? type PayloadAuthor struct { Name string `json:"name"` Email string `json:"email"` diff --git a/modules/auth/admin.go b/modules/auth/admin.go index 60ea3a3c..6fec6ce7 100644 --- a/modules/auth/admin.go +++ b/modules/auth/admin.go @@ -11,14 +11,15 @@ import ( ) type AdminEditUserForm struct { - Email string `form:"email" binding:"Required;Email;MaxSize(50)"` - Passwd string `form:"password"` - Website string `form:"website" binding:"MaxSize(50)"` - Location string `form:"location" binding:"MaxSize(50)"` - Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"` - Active bool `form:"active"` - Admin bool `form:"admin"` - LoginType int `form:"login_type"` + Email string `form:"email" binding:"Required;Email;MaxSize(50)"` + Passwd string `form:"password"` + Website string `form:"website" binding:"MaxSize(50)"` + Location string `form:"location" binding:"MaxSize(50)"` + Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"` + Active bool `form:"active"` + Admin bool `form:"admin"` + AllowGitHook bool `form:"allow_git_hook"` + LoginType int `form:"login_type"` } func (f *AdminEditUserForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { diff --git a/modules/auth/auth.go b/modules/auth/auth.go index 95e647f5..da89c20c 100644 --- a/modules/auth/auth.go +++ b/modules/auth/auth.go @@ -14,27 +14,32 @@ import ( "github.com/macaron-contrib/session" "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/setting" ) // SignedInId returns the id of signed in user. -func SignedInId(header http.Header, sess session.Store) int64 { +func SignedInId(req *http.Request, sess session.Store) int64 { if !models.HasEngine { return 0 } - if setting.Service.EnableReverseProxyAuth { - webAuthUser := header.Get(setting.ReverseProxyAuthUser) - if len(webAuthUser) > 0 { - u, err := models.GetUserByName(webAuthUser) - if err != nil { - if err != models.ErrUserNotExist { - log.Error(4, "GetUserByName: %v", err) + // API calls need to check access token. + if strings.HasPrefix(req.URL.Path, "/api/") { + auHead := req.Header.Get("Authorization") + if len(auHead) > 0 { + auths := strings.Fields(auHead) + if len(auths) == 2 && auths[0] == "token" { + t, err := models.GetAccessTokenBySha(auths[1]) + if err != nil { + if err != models.ErrAccessTokenNotExist { + log.Error(4, "GetAccessTokenBySha: %v", err) + } + return 0 } - return 0 + return t.Uid } - return u.Id } } @@ -55,9 +60,47 @@ func SignedInId(header http.Header, sess session.Store) int64 { } // SignedInUser returns the user object of signed user. -func SignedInUser(header http.Header, sess session.Store) *models.User { - uid := SignedInId(header, sess) +func SignedInUser(req *http.Request, sess session.Store) *models.User { + if !models.HasEngine { + return nil + } + + uid := SignedInId(req, sess) + if uid <= 0 { + if setting.Service.EnableReverseProxyAuth { + webAuthUser := req.Header.Get(setting.ReverseProxyAuthUser) + if len(webAuthUser) > 0 { + u, err := models.GetUserByName(webAuthUser) + if err != nil { + if err != models.ErrUserNotExist { + log.Error(4, "GetUserByName: %v", err) + } + return nil + } + return u + } + } + + // Check with basic auth. + baHead := req.Header.Get("Authorization") + if len(baHead) > 0 { + auths := strings.Fields(baHead) + if len(auths) == 2 && auths[0] == "Basic" { + uname, passwd, _ := base.BasicAuthDecode(auths[1]) + u, err := models.GetUserByName(uname) + if err != nil { + if err != models.ErrUserNotExist { + log.Error(4, "GetUserByName: %v", err) + } + return nil + } + + if u.ValidtePassword(passwd) { + return u + } + } + } return nil } diff --git a/modules/auth/publickey_form.go b/modules/auth/publickey_form.go deleted file mode 100644 index 5a1d44c0..00000000 --- a/modules/auth/publickey_form.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2014 The Gogs Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package auth - -import ( - "github.com/Unknwon/macaron" - "github.com/macaron-contrib/binding" -) - -type AddSSHKeyForm struct { - SSHTitle string `form:"title" binding:"Required"` - Content string `form:"content" binding:"Required"` -} - -func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 72bdd458..6046a8d1 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -95,3 +95,20 @@ type ChangePasswordForm struct { func (f *ChangePasswordForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } + +type AddSSHKeyForm struct { + SSHTitle string `form:"title" binding:"Required"` + Content string `form:"content" binding:"Required"` +} + +func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + +type NewAccessTokenForm struct { + Name string `form:"name" binding:"Required"` +} + +func (f *NewAccessTokenForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 5ed5d16a..fb198da1 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -33,11 +33,17 @@ import ( "github.com/nfnt/resize" "github.com/gogits/gogs/modules/log" + "github.com/gogits/gogs/modules/setting" ) -var ( - gravatar = "http://www.gravatar.com/avatar" -) +var gravatarSource string + +func init() { + gravatarSource = setting.GravatarSource + if !strings.HasPrefix(gravatarSource, "http:") { + gravatarSource = "http:" + gravatarSource + } +} // hash email to md5 string // keep this func in order to make this package indenpent @@ -121,7 +127,7 @@ func (this *Avatar) Encode(wr io.Writer, size int) (err error) { // get image from gravatar.com func (this *Avatar) Update() { - thunder.Fetch(gravatar+"/"+this.Hash+"?"+this.reqParams, + thunder.Fetch(gravatarSource+this.Hash+"?"+this.reqParams, this.imagePath) } @@ -129,7 +135,7 @@ func (this *Avatar) UpdateTimeout(timeout time.Duration) (err error) { select { case <-time.After(timeout): err = fmt.Errorf("get gravatar image %s timeout", this.Hash) - case err = <-thunder.GoFetch(gravatar+"/"+this.Hash+"?"+this.reqParams, + case err = <-thunder.GoFetch(gravatarSource+this.Hash+"?"+this.reqParams, this.imagePath): } return err diff --git a/modules/base/base.go b/modules/base/base.go index cb514782..6bd29468 100644 --- a/modules/base/base.go +++ b/modules/base/base.go @@ -4,12 +4,14 @@ package base +const DOC_URL = "http://gogs.io/docs" + type ( TplName string ApiJsonErr struct { Message string `json:"message"` - DocUrl string `json:"documentation_url"` + DocUrl string `json:"url"` } ) diff --git a/modules/base/template.go b/modules/base/template.go index 58572e24..446d01dd 100644 --- a/modules/base/template.go +++ b/modules/base/template.go @@ -141,6 +141,9 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{ "Oauth2Icon": Oauth2Icon, "Oauth2Name": Oauth2Name, "ToUtf8": ToUtf8, + "EscapePound": func(str string) string { + return strings.Replace(str, "#", "%23", -1) + }, } type Actioner interface { diff --git a/modules/base/tool.go b/modules/base/tool.go index 5b56d1f6..0e083c8d 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -9,7 +9,9 @@ import ( "crypto/md5" "crypto/rand" "crypto/sha1" + "encoding/base64" "encoding/hex" + "errors" "fmt" "hash" "html/template" @@ -31,6 +33,33 @@ func EncodeMd5(str string) string { return hex.EncodeToString(m.Sum(nil)) } +// Encode string to sha1 hex value. +func EncodeSha1(str string) string { + h := sha1.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +func BasicAuthDecode(encoded string) (user string, name string, err error) { + var s []byte + s, err = base64.StdEncoding.DecodeString(encoded) + if err != nil { + return user, name, err + } + + a := strings.Split(string(s), ":") + if len(a) == 2 { + user, name = a[0], a[1] + } else { + err = errors.New("decode failed") + } + return user, name, err +} + +func BasicAuthEncode(username, password string) string { + return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) +} + // GetRandomString generate random string by specify chars. func GetRandomString(n int, alphabets ...byte) string { const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" @@ -151,7 +180,7 @@ func AvatarLink(email string) string { } else if setting.Service.EnableCacheAvatar { return setting.AppSubUrl + "/avatar/" + EncodeMd5(email) } - return "//1.gravatar.com/avatar/" + EncodeMd5(email) + return setting.GravatarSource + EncodeMd5(email) } // Seconds-based time units diff --git a/modules/cron/doc.go b/modules/cron/doc.go index dbdf5012..258fe1ef 100644 --- a/modules/cron/doc.go +++ b/modules/cron/doc.go @@ -7,9 +7,9 @@ Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines. c := cron.New() - c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") }) - c.AddFunc("@hourly", func() { fmt.Println("Every hour") }) - c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") }) + c.AddFunc("Every hour on the half hour","0 30 * * * *", func() { fmt.Println("Every hour on the half hour") }) + c.AddFunc("Every hour","@hourly", func() { fmt.Println("Every hour") }) + c.AddFunc("Every hour and a half","@every 1h30m", func() { fmt.Println("Every hour thirty") }) c.Start() .. // Funcs are invoked in their own goroutine, asynchronously. diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go index 758792a3..df3efb61 100644 --- a/modules/mailer/mailer.go +++ b/modules/mailer/mailer.go @@ -82,7 +82,7 @@ func sendMail(hostAddressWithPort string, auth smtp.Auth, from string, recipient return err } - if auth != nil { + if ok, _ := client.Extension("AUTH"); ok && auth != nil { if err = client.Auth(auth); err != nil { return err } diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go index 2bc05697..8388d2b2 100644 --- a/modules/middleware/auth.go +++ b/modules/middleware/auth.go @@ -67,3 +67,12 @@ func Toggle(options *ToggleOptions) macaron.Handler { } } } + +func ApiReqToken() macaron.Handler { + return func(ctx *Context) { + if !ctx.IsSigned { + ctx.Error(403) + return + } + } +} diff --git a/modules/middleware/context.go b/modules/middleware/context.go index c45206a9..cbc0b0cf 100644 --- a/modules/middleware/context.go +++ b/modules/middleware/context.go @@ -53,6 +53,7 @@ type Context struct { GitRepo *git.Repository BranchName string TagName string + TreeName string CommitId string RepoLink string CloneLink struct { @@ -171,12 +172,16 @@ func Contexter() macaron.Handler { ctx.Data["PageStartTime"] = time.Now() // Get user from session if logined. - ctx.User = auth.SignedInUser(ctx.Req.Header, ctx.Session) + ctx.User = auth.SignedInUser(ctx.Req.Request, ctx.Session) + if ctx.User != nil { ctx.IsSigned = true ctx.Data["IsSigned"] = ctx.IsSigned ctx.Data["SignedUser"] = ctx.User + ctx.Data["SignedUserName"] = ctx.User.Name ctx.Data["IsAdmin"] = ctx.User.IsAdmin + } else { + ctx.Data["SignedUserName"] = "" } // If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go index fec9c541..0aae122d 100644 --- a/modules/middleware/repo.go +++ b/modules/middleware/repo.go @@ -13,22 +13,221 @@ import ( "github.com/Unknwon/macaron" "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/setting" ) +func ApiRepoAssignment() macaron.Handler { + return func(ctx *Context) { + userName := ctx.Params(":username") + repoName := ctx.Params(":reponame") + + var ( + u *models.User + err error + ) + + // Collaborators who have write access can be seen as owners. + if ctx.IsSigned { + ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, userName+"/"+repoName, models.WRITABLE) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"HasAccess: " + err.Error(), base.DOC_URL}) + return + } + ctx.Repo.IsTrueOwner = ctx.User.LowerName == strings.ToLower(userName) + } + + if !ctx.Repo.IsTrueOwner { + u, err = models.GetUserByName(userName) + if err != nil { + if err == models.ErrUserNotExist { + ctx.Error(404) + } else { + ctx.JSON(500, &base.ApiJsonErr{"GetUserByName: " + err.Error(), base.DOC_URL}) + } + return + } + } else { + u = ctx.User + } + ctx.Repo.Owner = u + + // Organization owner team members are true owners as well. + if ctx.IsSigned && ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgOwner(ctx.User.Id) { + ctx.Repo.IsTrueOwner = true + } + + // Get repository. + repo, err := models.GetRepositoryByName(u.Id, repoName) + if err != nil { + if err == models.ErrRepoNotExist { + ctx.Error(404) + return + } + ctx.JSON(500, &base.ApiJsonErr{"GetRepositoryByName: " + err.Error(), base.DOC_URL}) + return + } else if err = repo.GetOwner(); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetOwner: " + err.Error(), base.DOC_URL}) + return + } + + // Check if the mirror repository owner(mirror repository doesn't have access). + if ctx.IsSigned && !ctx.Repo.IsOwner { + if repo.OwnerId == ctx.User.Id { + ctx.Repo.IsOwner = true + } + // Check if current user has admin permission to repository. + if u.IsOrganization() { + auth, err := models.GetHighestAuthorize(u.Id, ctx.User.Id, repo.Id, 0) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetHighestAuthorize: " + err.Error(), base.DOC_URL}) + return + } + if auth == models.ORG_ADMIN { + ctx.Repo.IsOwner = true + ctx.Repo.IsAdmin = true + } + } + } + + // Check access. + if repo.IsPrivate && !ctx.Repo.IsOwner { + if ctx.User == nil { + ctx.Error(404) + return + } + + hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+repo.Name, models.READABLE) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"HasAccess: " + err.Error(), base.DOC_URL}) + return + } else if !hasAccess { + ctx.Error(404) + return + } + } + ctx.Repo.HasAccess = true + + ctx.Repo.Repository = repo + } +} + +// RepoRef handles repository reference name including those contain `/`. +func RepoRef() macaron.Handler { + return func(ctx *Context) { + var ( + refName string + err error + ) + + // For API calls. + if ctx.Repo.GitRepo == nil { + repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + ctx.Handle(500, "RepoRef Invalid repo "+repoPath, err) + return + } + ctx.Repo.GitRepo = gitRepo + } + + // Get default branch. + if len(ctx.Params("*")) == 0 { + refName = ctx.Repo.Repository.DefaultBranch + if !ctx.Repo.GitRepo.IsBranchExist(refName) { + brs, err := ctx.Repo.GitRepo.GetBranches() + if err != nil { + ctx.Handle(500, "GetBranches", err) + return + } + refName = brs[0] + } + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName) + if err != nil { + ctx.Handle(500, "GetCommitOfBranch", err) + return + } + ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() + ctx.Repo.IsBranch = true + + } else { + hasMatched := false + parts := strings.Split(ctx.Params("*"), "/") + for i, part := range parts { + refName = strings.TrimPrefix(refName+"/"+part, "/") + + if ctx.Repo.GitRepo.IsBranchExist(refName) || + ctx.Repo.GitRepo.IsTagExist(refName) { + if i < len(parts)-1 { + ctx.Repo.TreeName = strings.Join(parts[i+1:], "/") + } + hasMatched = true + break + } + } + if !hasMatched && len(parts[0]) == 40 { + refName = parts[0] + ctx.Repo.TreeName = strings.Join(parts[1:], "/") + } + + if ctx.Repo.GitRepo.IsBranchExist(refName) { + ctx.Repo.IsBranch = true + + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName) + if err != nil { + ctx.Handle(500, "GetCommitOfBranch", err) + return + } + ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() + + } else if ctx.Repo.GitRepo.IsTagExist(refName) { + ctx.Repo.IsTag = true + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName) + if err != nil { + ctx.Handle(500, "GetCommitOfTag", err) + return + } + ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() + } else if len(refName) == 40 { + ctx.Repo.IsCommit = true + ctx.Repo.CommitId = refName + + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName) + if err != nil { + ctx.Handle(404, "GetCommit", nil) + return + } + } else { + ctx.Handle(404, "RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) + return + } + } + + ctx.Repo.BranchName = refName + ctx.Data["BranchName"] = ctx.Repo.BranchName + ctx.Data["CommitId"] = ctx.Repo.CommitId + ctx.Data["IsBranch"] = ctx.Repo.IsBranch + ctx.Data["IsTag"] = ctx.Repo.IsTag + ctx.Data["IsCommit"] = ctx.Repo.IsCommit + + ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() + if err != nil { + ctx.Handle(500, "CommitsCount", err) + return + } + ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount + } +} + func RepoAssignment(redirect bool, args ...bool) macaron.Handler { return func(ctx *Context) { var ( - validBranch bool // To valid brach name. displayBare bool // To display bare page if it is a bare repo. ) if len(args) >= 1 { - validBranch = args[0] - } - if len(args) >= 2 { - displayBare = args[1] + displayBare = args[0] } var ( @@ -200,73 +399,6 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler { ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, u.LowerName, repo.LowerName) } - // when repo is bare, not valid branch - if !ctx.Repo.Repository.IsBare && validBranch { - detect: - if len(refName) > 0 { - if gitRepo.IsBranchExist(refName) { - ctx.Repo.IsBranch = true - ctx.Repo.BranchName = refName - - ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName) - if err != nil { - ctx.Handle(500, "RepoAssignment invalid branch", err) - return - } - ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() - - } else if gitRepo.IsTagExist(refName) { - ctx.Repo.IsTag = true - ctx.Repo.BranchName = refName - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName) - if err != nil { - ctx.Handle(500, "Fail to get tag commit", err) - return - } - ctx.Repo.CommitId = ctx.Repo.Commit.Id.String() - } else if len(refName) == 40 { - ctx.Repo.IsCommit = true - ctx.Repo.CommitId = refName - ctx.Repo.BranchName = refName - - ctx.Repo.Commit, err = gitRepo.GetCommit(refName) - if err != nil { - ctx.Handle(404, "RepoAssignment invalid commit", nil) - return - } - } else { - ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) - return - } - - } else { - if len(refName) == 0 { - if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) { - refName = ctx.Repo.Repository.DefaultBranch - } else { - brs, err := gitRepo.GetBranches() - if err != nil { - ctx.Handle(500, "GetBranches", err) - return - } - refName = brs[0] - } - } - goto detect - } - - ctx.Data["IsBranch"] = ctx.Repo.IsBranch - ctx.Data["IsTag"] = ctx.Repo.IsTag - ctx.Data["IsCommit"] = ctx.Repo.IsCommit - - ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() - if err != nil { - ctx.Handle(500, "CommitsCount", err) - return - } - ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount - } - // repo is bare and display enable if ctx.Repo.Repository.IsBare { log.Debug("Bare repository: %s", ctx.Repo.RepoLink) @@ -322,7 +454,7 @@ func RequireTrueOwner() macaron.Handler { // GitHookService checks if repsitory Git hooks service has been enabled. func GitHookService() macaron.Handler { return func(ctx *Context) { - if !setting.Service.EnableGitHooks { + if !ctx.User.AllowGitHook && !ctx.User.IsAdmin { ctx.Handle(404, "GitHookService", nil) return } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index b8fc4dec..0f293b69 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -28,6 +28,7 @@ type Scheme string const ( HTTP Scheme = "http" HTTPS Scheme = "https" + FCGI Scheme = "fcgi" ) var ( @@ -66,6 +67,7 @@ var ( // Picture settings. PictureService string + GravatarSource string DisableGravatar bool // Log settings. @@ -181,6 +183,9 @@ func NewConfigContext() { CertFile = Cfg.MustValue("server", "CERT_FILE") KeyFile = Cfg.MustValue("server", "KEY_FILE") } + if Cfg.MustValue("server", "PROTOCOL") == "fcgi" { + Protocol = FCGI + } Domain = Cfg.MustValue("server", "DOMAIN", "localhost") HttpAddr = Cfg.MustValue("server", "HTTP_ADDR", "0.0.0.0") HttpPort = Cfg.MustValue("server", "HTTP_PORT", "3000") @@ -253,8 +258,13 @@ func NewConfigContext() { } ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash") - PictureService = Cfg.MustValueRange("picture", "SERVICE", "server", - []string{"server"}) + PictureService = Cfg.MustValueRange("picture", "SERVICE", "server", []string{"server"}) + switch Cfg.MustValue("picture", "GRAVATAR_SOURCE", "gravatar") { + case "duoshuo": + GravatarSource = "http://gravatar.duoshuo.com/avatar/" + default: + GravatarSource = "//1.gravatar.com/avatar/" + } DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR") MaxGitDiffLines = Cfg.MustInt("git", "MAX_GITDIFF_LINES", 10000) @@ -275,7 +285,6 @@ var Service struct { LdapAuth bool ActiveCodeLives int ResetPwdCodeLives int - EnableGitHooks bool } func newService() { @@ -285,7 +294,6 @@ func newService() { Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW") Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR") Service.EnableReverseProxyAuth = Cfg.MustBool("service", "ENABLE_REVERSE_PROXY_AUTHENTICATION") - Service.EnableGitHooks = Cfg.MustBool("service", "ENABLE_GIT_HOOKS") } var logLevels = map[string]string{ @@ -390,9 +398,6 @@ func newSessionService() { SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true) SessionConfig.Gclifetime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) SessionConfig.Maxlifetime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400) - SessionConfig.SessionIDHashFunc = Cfg.MustValueRange("session", "SESSION_ID_HASHFUNC", - "sha1", []string{"sha1", "sha256", "md5"}) - SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY", string(com.RandomCreateBytes(16))) if SessionProvider == "file" { os.MkdirAll(path.Dir(SessionConfig.ProviderConfig), os.ModePerm) diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 8e5b590c..14acd7a9 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -240,6 +240,9 @@ img.avatar-100 { .text-black { color: #444444; } +.text-gold { + color: #a1882b; +} .table { width: 100%; max-width: 100%; @@ -1049,9 +1052,9 @@ The register and sign-in page style } #repo-header-download-drop { line-height: 24px; - width: 440px; + width: 460px; top: 50px; - left: -370px; + left: -390px; padding: 20px; box-sizing: border-box; z-index: 1; @@ -1063,11 +1066,15 @@ The register and sign-in page style #repo-header-download-drop input { font-size: 11px; } +#repo-header-download-drop #repo-clone-copy { + width: 85px; + text-overflow: clip; +} #repo-content { padding: 18px 0; } .repo-wide-wrapper { - padding: 18px 0; + padding: 18px; position: relative; } #repo-clone-url { @@ -1692,18 +1699,21 @@ The register and sign-in page style #repo-hooks-panel, #repo-hooks-history-panel, #user-social-panel, +#user-applications-panel, #user-ssh-panel { margin-bottom: 20px; } #repo-hooks-panel .setting-list, #repo-hooks-history-panel .setting-list, #user-social-panel .setting-list, +#user-applications-panel .setting-list, #user-ssh-panel .setting-list { background-color: #FFF; } #repo-hooks-panel .setting-list li, #repo-hooks-history-panel .setting-list li, #user-social-panel .setting-list li, +#user-applications-panel .setting-list li, #user-ssh-panel .setting-list li { padding: 8px 20px; border-bottom: 1px solid #eaeaea; @@ -1711,18 +1721,21 @@ The register and sign-in page style #repo-hooks-panel .setting-list li.ssh:hover, #repo-hooks-history-panel .setting-list li.ssh:hover, #user-social-panel .setting-list li.ssh:hover, +#user-applications-panel .setting-list li.ssh:hover, #user-ssh-panel .setting-list li.ssh:hover { background-color: #ffffEE; } #repo-hooks-panel .setting-list li i, #repo-hooks-history-panel .setting-list li i, #user-social-panel .setting-list li i, +#user-applications-panel .setting-list li i, #user-ssh-panel .setting-list li i { padding-right: 5px; } #repo-hooks-panel .active-icon, #repo-hooks-history-panel .active-icon, #user-social-panel .active-icon, +#user-applications-panel .active-icon, #user-ssh-panel .active-icon { width: 10px; height: 10px; @@ -1734,43 +1747,60 @@ The register and sign-in page style #repo-hooks-panel .ssh-content, #repo-hooks-history-panel .ssh-content, #user-social-panel .ssh-content, +#user-applications-panel .ssh-content, #user-ssh-panel .ssh-content { margin-left: 24px; } #repo-hooks-panel .ssh-content .octicon, #repo-hooks-history-panel .ssh-content .octicon, #user-social-panel .ssh-content .octicon, +#user-applications-panel .ssh-content .octicon, #user-ssh-panel .ssh-content .octicon { margin-right: 4px; } #repo-hooks-panel .ssh-content .print, #repo-hooks-history-panel .ssh-content .print, #user-social-panel .ssh-content .print, +#user-applications-panel .ssh-content .print, #user-ssh-panel .ssh-content .print, +#repo-hooks-panel .ssh-content .access, +#repo-hooks-history-panel .ssh-content .access, +#user-social-panel .ssh-content .access, +#user-applications-panel .ssh-content .access, +#user-ssh-panel .ssh-content .access, #repo-hooks-panel .ssh-content .activity, #repo-hooks-history-panel .ssh-content .activity, #user-social-panel .ssh-content .activity, +#user-applications-panel .ssh-content .activity, #user-ssh-panel .ssh-content .activity { color: #888; } -#repo-hooks-panel .ssh-delete-btn, -#repo-hooks-history-panel .ssh-delete-btn, -#user-social-panel .ssh-delete-btn, -#user-ssh-panel .ssh-delete-btn { +#repo-hooks-panel .ssh-content .access, +#repo-hooks-history-panel .ssh-content .access, +#user-social-panel .ssh-content .access, +#user-applications-panel .ssh-content .access, +#user-ssh-panel .ssh-content .access { + max-width: 500px; +} +#repo-hooks-panel .ssh-btn, +#repo-hooks-history-panel .ssh-btn, +#user-social-panel .ssh-btn, +#user-applications-panel .ssh-btn, +#user-ssh-panel .ssh-btn { margin-top: 6px; } -#user-ssh-add-form .panel-body { +.form-settings-add .panel-body { background-color: #FFF; padding: 30px 0; } -#user-ssh-add-form .ipt { +.form-settings-add .ipt { width: 500px; } -#user-ssh-add-form textarea { +.form-settings-add textarea { height: 120px; margin-left: 3px; } -#user-ssh-add-form .field { +.form-settings-add .field { margin-bottom: 24px; } .pr-main { @@ -1972,16 +2002,18 @@ textarea#issue-add-content { height: 120px; resize: vertical; } +#issue-list-nav { + border-bottom: 1px solid #DDD; + padding-bottom: 12px; +} #issue-list-nav li > a { font-size: 13px; font-weight: bold; - padding: .4em .9em; - border-radius: .3em; + padding: .2em .8em; } #issue-list-nav li.current > a { background-color: #0079bc; color: #FAFAFA; - border-radius: .3em; } #issue-list-nav li.right { margin-left: 4px; @@ -1990,7 +2022,109 @@ textarea#issue-add-content { padding: 0 !important; } #issue-new > a button { - height: 34px; + height: 29px; +} +#issue-list-menu { + padding: 16px 0 12px 0; + border-bottom: 1px solid #BBB; + margin-bottom: 12px; +} +#issue-list-menu .mark a { + color: #AAA; +} +#issue-list-menu .mark a:hover { + color: #444; +} +#issue-list-menu .mark.hover a { + color: #222; + font-weight: bold; +} +#issue-list-menu > .left .mark { + margin-right: 12px; +} +#issue-list-menu > .right .mark { + margin-left: 12px; +} +#issue-list .item, +#pull-list .item { + position: relative; + padding-bottom: 12px; + margin-bottom: 12px; + border-bottom: 1px dashed #AAA; +} +#issue-list .item .title > .title-text, +#pull-list .item .title > .title-text { + color: #444; + font-size: 15px; + margin: 0 6px; +} +#issue-list .item .index-num, +#pull-list .item .index-num { + padding: .25em .6em; +} +#issue-list .comment, +#pull-list .comment { + color: #666; + position: absolute; + top: 6px; + right: 0; +} +#issue-list .issue-label, +#pull-list .issue-label { + padding: .25em .6em; +} +#issue-list .issue-label a, +#pull-list .issue-label a { + color: #FFF; +} +#issue-list .desc, +#pull-list .desc { + color: #999; +} +#issue-list .desc a, +#pull-list .desc a { + color: #999; +} +#issue-list .desc a:hover, +#pull-list .desc a:hover { + color: #03a2ef; +} +#issue-list-pager { + margin: 18px 0 24px 0; + font-size: 14px; + line-height: 24px; +} +#labels-num { + margin-right: 1em; +} +#label-list .right { + margin-left: 1em; + color: #999; + line-height: 30px; +} +#label-list .right i { + margin-right: 3px; +} +#label-list .right:hover { + color: #444444; +} +#label-list .num { + margin-right: 3px; +} +#label-list .issue-num { + margin-right: 4em; +} +#label-list .label:hover { + color: #FFF; +} +#label-list .label i { + margin-right: 6px; +} +#label-list .item { + height: 30px; + padding-bottom: 12px; + margin-bottom: 12px; + border-bottom: 1px dashed #AAA; } .org-header-alert .alert { margin-top: 10px; diff --git a/public/ng/css/ui.css b/public/ng/css/ui.css index a6c218ad..a33d9a7a 100644 --- a/public/ng/css/ui.css +++ b/public/ng/css/ui.css @@ -735,7 +735,7 @@ ul.menu-radius > li:last-child > a { border-color: #F0C36D; } .label { - padding: 2px 6px; + padding: .3em .6em .2em .6em; color: #ffffff; } .label-red { @@ -881,3 +881,30 @@ table td { .table-radius tbody tr:last-child > td:last-child { border-bottom-right-radius: .3em; } +.pager .page { + padding: .3em .5em .2em .5em; + margin: 0 .3em; + background-color: #cccccc; + color: #444444; +} +.pager .page:hover, +.pager .page.hover { + background-color: #428bca; + color: #ffffff; +} +.pager .prev, +.pager .next { + padding: .4em .6em; + margin: 0 .3em; + background-color: #505050; + color: #fafafa; +} +.pager .prev.invalid, +.pager .next.invalid { + background-color: #eeeeee; + color: #aaaaaa; + cursor: not-allowed; +} +.pager .page-radius { + border-radius: .2em; +} diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index eba1744b..3578cd7c 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -210,7 +210,7 @@ var Gogs = {}; if (json.ok && json.data.length) { var html = ''; $.each(json.data, function (i, item) { - html += '<li><a><img src="' + item.avatar + '">' + item.username + '</a></li>'; + html += '<li><a><img src="' + item.avatar_url + '">' + item.username + '</a></li>'; }); $target.html(html); $target.toggleShow(); @@ -230,7 +230,7 @@ var Gogs = {}; if (json.ok && json.data.length) { var html = ''; $.each(json.data, function (i, item) { - html += '<li><a><span class="octicon octicon-repo"></span> ' + item.repolink + '</a></li>'; + html += '<li><a><span class="octicon octicon-repo"></span> ' + item.full_name + '</a></li>'; }); $target.html(html); $target.toggleShow(); @@ -300,8 +300,11 @@ function initCore() { $.magnificPopup.close(); }); - // Collapse. + // Plugins. $('.collapse').hide(); + $('.tipsy-tooltip').tipsy({ + fade: true + }); } function initUserSetting() { @@ -329,9 +332,9 @@ function initUserSetting() { $profile_form.submit(); }); - // Show add SSH key panel. - $('#ssh-add').click(function () { - $('#user-ssh-add-form').removeClass("hide"); + // Show panels. + $('.show-form-btn').click(function () { + $($(this).data('target-form')).removeClass("hide"); }); // Confirmation of delete account. diff --git a/public/ng/js/min/gogs-min.js b/public/ng/js/min/gogs-min.js index 6b7f408d..2035d45b 100644 --- a/public/ng/js/min/gogs-min.js +++ b/public/ng/js/min/gogs-min.js @@ -1,5 +1,5 @@ -function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(e){e.preventDefault();var o=$(this);o.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(o))}),console.log("init tabs @",e)}}function Preview(e,t){function n(e){return e.find(".js-preview-input").eq(0)}function r(e){return e.hasClass("js-preview-container")?e:e.find(".js-preview-container").eq(0)}var i=$(e),o=$(t),a=n(o);if(!a.length)return void console.log("[preview]: no preview input");var s=r(o);return s.length?(i.on("click",function(){$.post("/api/v1/markdown",{text:a.val()},function(e){s.html(e)})}),void console.log("[preview]: init preview @",e,"&",t)):void console.log("[preview]: no preview container")}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView(),$(".js-tab-nav").click(function(e){$(this).hasClass("js-tab-nav-show")||($(this).parent().find(".js-tab-nav-show").each(function(){$(this).removeClass("js-tab-nav-show"),$($(this).data("tab-target")).hide()}),$(this).addClass("js-tab-nav-show"),$($(this).data("tab-target")).show()),e.preventDefault()}),$(document).on("click",".popup-modal-dismiss",function(e){e.preventDefault(),$.magnificPopup.close()}),$(".collapse").hide()}function initUserSetting(){var t=$("#username"),n=$("#user-profile-form");$("#change-username-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("uname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("uname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-username-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#ssh-add").click(function(){$("#user-ssh-add-form").removeClass("hide")}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close(),$("#delete-account-form").submit()})}function initRepoCreate(){$("#repo-create-owner-list").on("click","li",function(){if(!$(this).hasClass("checked")){var e=$(this).data("uid");$("#repo-owner-id").val(e),$("#repo-owner-avatar").attr("src",$(this).find("img").attr("src")),$("#repo-owner-name").text($(this).text().trim()),$(this).parent().find(".checked").removeClass("checked"),$(this).addClass("checked"),console.log("set repo owner to uid :",e,$(this).text().trim())}}),$("#auth-button").click(function(e){$("#repo-migrate-auth").slideToggle("fast"),e.preventDefault()}),console.log("initRepoCreate")}function initRepo(){$("#repo-clone-ssh").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-https").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))}),$("#repo-clone-https").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-ssh").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))});var e=$("#repo-clone-copy");e.hover(function(){Gogs.bindCopy($(this))}),e.tipsy({fade:!0})}function initHookTypeChange(){$("select#hook-type").on("change",function(){hookTypes=["Gogs","Slack"];var e=$(this).val();hookTypes.forEach(function(t){e===t?$("div#"+t.toLowerCase()).toggleShow():$("div#"+t.toLowerCase()).toggleHide()})})}function initRepoSetting(){var t=$("#repo_name"),n=$("#repo-setting-form");$("#change-reponame-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("repo-name")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("repo-name")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-reponame-submit").click(function(){$.magnificPopup.close(),n.submit()}),initHookTypeChange(),$("#transfer-repo-btn").magnificPopup({modal:!0}),$("#transfer-repo-submit").click(function(){$.magnificPopup.close(),$("#transfer-repo-form").submit()}),$("#delete-repo-btn").magnificPopup({modal:!0}),$("#delete-repo-submit").click(function(){$.magnificPopup.close(),$("#delete-repo-form").submit()}),$("#repo-collab-list hr:last-child").remove();var r=$("#repo-collaborator").next().next().find("ul");$("#repo-collaborator").on("keyup",function(){var e=$(this);return e.val()?void Gogs.searchUsers(e.val(),r):void r.toggleHide()}).on("focus",function(){$(this).val()?r.toggleShow():r.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#repo-collaborator").val($(this).text()),r.toggleHide()})}function initOrgSetting(){var t=$("#orgname"),n=$("#org-setting-form");$("#change-orgname-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("orgname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("orgname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-orgname-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#delete-org-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-org-submit").click(function(){$.magnificPopup.close(),$("#delete-org-form").submit()}),initHookTypeChange()}function initInvite(){var e=$("#org-member-invite-list");$("#org-member-invite").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-member-invite").val($(this).text()),e.toggleHide()})}function initOrgTeamCreate(){$("#org-team-delete").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-team-submit").click(function(){$.magnificPopup.close();var e=$("#team-create-form");e.attr("action",e.data("delete-url"))})}function initTeamMembersList(){var e=$("#org-team-members-list");$("#org-team-members-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-members-add").val($(this).text()),e.toggleHide()})}function initTeamRepositoriesList(){var e=$("#org-team-repositories-list");$("#org-team-repositories-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchRepos(t.val(),e,"uid="+t.data("uid")):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-repositories-add").val($(this).text()),e.toggleHide()})}function initAdmin(){$("#login-type").on("change",function(){var e=$(this).val();e.indexOf("0-")+1?($(".auth-name").toggleHide(),$(".pwd").find("input").attr("required","required").end().toggleShow()):($(".pwd").find("input").removeAttr("required").end().toggleHide(),$(".auth-name").toggleShow())}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close();var e=$("#user-profile-form");e.attr("action",e.data("delete-url"))}),$("#auth-type").on("change",function(){var e=$(this).val();2==e&&($(".ldap").toggleShow(),$(".smtp").toggleHide()),3==e&&($(".smtp").toggleShow(),$(".ldap").toggleHide())}),$("#delete-auth-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-auth-submit").click(function(){$.magnificPopup.close();var e=$("#auth-setting-form");e.attr("action",e.data("delete-url"))})}function initInstall(){!function(){var e="127.0.0.1:3306",t="127.0.0.1:5432";$("#install-database").on("change",function(){var n=$(this).val();"SQLite3"!=n?($(".server-sql").show(),$(".sqlite-setting").addClass("hide"),"PostgreSQL"==n?($(".pgsql-setting").removeClass("hide"),$("#database-host").val()==e&&$("#database-host").val(t)):"MySQL"==n?($(".pgsql-setting").addClass("hide"),$("#database-host").val()==t&&$("#database-host").val(e)):$(".pgsql-setting").addClass("hide")):($(".server-sql").hide(),$(".pgsql-setting").hide(),$(".sqlite-setting").removeClass("hide"))})}()}function initProfile(){$("#profile-avatar").tipsy({fade:!0})}function initTimeSwitch(){$(".time-since[title]").on("click",function(){var e=$(this),t=e.attr("title"),n=e.text();e.text(t),e.attr("title",n)})}function initDiff(){$(".diff-detail-box>a").click(function(){$($(this).data("target")).slideToggle(100)});var e=$(".diff-counter");e.length<1||e.each(function(e,t){var n=$(t),r=n.find("span[data-line].add").data("line"),i=n.find("span[data-line].del").data("line"),o=parseFloat(r)/(parseFloat(r)+parseFloat(i))*100;n.find(".bar .add").css("width",o+"%")})}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/sign_up",!0):void $("#promo-form").attr("action",Gogs.AppSubUrl+"/user/sign_up")})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace($t,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:Tt.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function c(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,c=s?e[a]:e[a]&&a;if(c&&l[c]&&(r||l[c].data)||void 0!==n||"string"!=typeof t)return c||(c=s?e[a]=V.pop()||ot.guid++:a),l[c]||(l[c]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[c]=ot.extend(l[c],t):l[c].data=ot.extend(l[c].data,t)),o=l[c],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!c(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,c(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){Dt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Dt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function k(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function T(e){var t=mt,n=Jt[e];return n||(n=k(e,t),"none"!==n&&n||(Kt=(Kt||ot("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Kt[0].contentWindow||Kt[0].contentDocument).document,t.write(),t.close(),n=k(e,t),Kt.detach()),Jt[e]=n),n}function E(e,t){return{get:function(){var n=e();return null!=n?n?void delete this.get:(this.get=t).apply(this,arguments):void 0}}}function N(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=pn.length;i--;)if(t=pn[i]+n,t in e)return t;return r}function L(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=ot._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[a]=ot._data(r,"olddisplay",T(r.nodeName)))):(i=Lt(r),(n&&"none"!==n||!i)&&ot._data(r,"olddisplay",i?n:ot.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function A(e,t,n){var r=cn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function D(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=ot.css(e,n+Nt[o],!0,i)),r?("content"===n&&(a-=ot.css(e,"padding"+Nt[o],!0,i)),"margin"!==n&&(a-=ot.css(e,"border"+Nt[o]+"Width",!0,i))):(a+=ot.css(e,"padding"+Nt[o],!0,i),"padding"!==n&&(a+=ot.css(e,"border"+Nt[o]+"Width",!0,i)));return a}function j(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=nn(e),a=rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=rn(e,t,o),(0>i||null==i)&&(i=e.style[t]),tn.test(i))return i;r=a&&(rt.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+D(e,t,n||(a?"border":"content"),r,o)+"px"}function R(e,t,n,r,i){return new R.prototype.init(e,t,n,r,i)}function P(){return setTimeout(function(){hn=void 0}),hn=ot.now()}function _(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Nt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function H(e,t,n){for(var r,i=(xn[t]||[]).concat(xn["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,t,e))return r}function O(e,t,n){var r,i,o,a,s,l,c,u,d=this,f={},p=e.style,h=e.nodeType&&Lt(e),m=ot._data(e,"fxshow");n.queue||(s=ot._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,d.always(function(){d.always(function(){s.unqueued--,ot.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=ot.css(e,"display"),u="none"===c?ot._data(e,"olddisplay")||T(e.nodeName):c,"inline"===u&&"none"===ot.css(e,"float")&&(rt.inlineBlockNeedsLayout&&"inline"!==T(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",rt.shrinkWrapBlocks()||d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],gn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!m||void 0===m[r])continue;h=!0}f[r]=m&&m[r]||ot.style(e,r)}else c=void 0;if(ot.isEmptyObject(f))"inline"===("none"===c?T(e.nodeName):c)&&(p.display=c);else{m?"hidden"in m&&(h=m.hidden):m=ot._data(e,"fxshow",{}),o&&(m.hidden=!h),h?ot(e).show():d.done(function(){ot(e).hide()}),d.done(function(){var t;ot._removeData(e,"fxshow");for(t in f)ot.style(e,t,f[t])});for(r in f)a=H(h?m[r]:0,r,d),r in m||(m[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function q(e,t){var n,r,i,o,a;for(n in e)if(r=ot.camelCase(n),i=t[r],o=e[n],ot.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=ot.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function M(e,t,n){var r,i,o=0,a=bn.length,s=ot.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=hn||P(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,o=1-r,a=0,l=c.tweens.length;l>a;a++)c.tweens[a].run(o);return s.notifyWith(e,[c,o,n]),1>o&&l?n:(s.resolveWith(e,[c]),!1)},c=s.promise({elem:e,props:ot.extend({},t),opts:ot.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:hn||P(),duration:n.duration,tweens:[],createTween:function(t,n){var r=ot.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)c.tweens[n].run(1);return t?s.resolveWith(e,[c,t]):s.rejectWith(e,[c,t]),this}}),u=c.props;for(q(u,c.opts.specialEasing);a>o;o++)if(r=bn[o].call(c,e,u,c.opts))return r;return ot.map(u,H,c),ot.isFunction(c.opts.start)&&c.opts.start.call(e,c),ot.fx.timer(ot.extend(l,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(xt)||[];if(ot.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function F(e,t,n,r){function i(s){var l;return o[s]=!0,ot.each(e[s]||[],function(e,s){var c=s(t,n,r);return"string"!=typeof c||a||o[c]?a?!(l=c):void 0:(t.dataTypes.unshift(c),i(c),!1)}),l}var o={},a=e===Wn;return i(t.dataTypes[0])||!o["*"]&&i("*")}function I(e,t){var n,r,i=ot.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&ot.extend(!0,e,n),e}function B(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function W(e,t,n,r){var i,o,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=c[l+" "+o]||c["* "+o],!a)for(i in c)if(s=i.split(" "),s[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){a===!0?a=c[i]:c[i]!==!0&&(o=s[0],u.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(d){return{state:"parsererror",error:a?d:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(ot.isArray(t))ot.each(t,function(t,i){n||Gn.test(e)?r(e,i):U(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==ot.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function X(){try{return new e.XMLHttpRequest}catch(t){}}function Z(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function G(e){return ot.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var V=[],Q=V.slice,Y=V.concat,K=V.push,J=V.indexOf,et={},tt=et.toString,nt=et.hasOwnProperty,rt={},it="1.11.1",ot=function(e,t){return new ot.fn.init(e,t)},at=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,st=/^-ms-/,lt=/-([\da-z])/gi,ct=function(e,t){return t.toUpperCase()};ot.fn=ot.prototype={jquery:it,constructor:ot,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=ot.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ot.each(this,e,t)},map:function(e){return this.pushStack(ot.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:K,sort:V.sort,splice:V.splice},ot.extend=ot.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,c=!1;for("boolean"==typeof a&&(c=a,a=arguments[s]||{},s++),"object"==typeof a||ot.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(c&&n&&(ot.isPlainObject(n)||(t=ot.isArray(n)))?(t?(t=!1,o=e&&ot.isArray(e)?e:[]):o=e&&ot.isPlainObject(e)?e:{},a[r]=ot.extend(c,o,n)):void 0!==n&&(a[r]=n));return a},ot.extend({expando:"jQuery"+(it+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ot.type(e)},isArray:Array.isArray||function(e){return"array"===ot.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ot.isArray(e)&&e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ot.type(e)||e.nodeType||ot.isWindow(e))return!1;try{if(e.constructor&&!nt.call(e,"constructor")&&!nt.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(rt.ownLast)for(t in e)return nt.call(e,t);for(t in e);return void 0===t||nt.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?et[tt.call(e)]||"object":typeof e},globalEval:function(t){t&&ot.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(st,"ms-").replace(lt,ct)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(at,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?ot.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(J)return J.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;a>o;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),l=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&l.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&l.push(i);return Y.apply([],l)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ot.isFunction(e)?(n=Q.call(arguments,2),r=function(){return e.apply(t||this,n.concat(Q.call(arguments)))},r.guid=e.guid=e.guid||ot.guid++,r):void 0},now:function(){return+new Date},support:rt}),ot.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){et["[object "+t+"]"]=t.toLowerCase()});var ut=function(e){function t(e,t,n,r){var i,o,a,s,l,c,d,p,h,m;if((t?t.ownerDocument||t:F)!==R&&j(t),t=t||R,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(_&&!r){if(i=yt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&M(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return et.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&w.getElementsByClassName&&t.getElementsByClassName)return et.apply(n,t.getElementsByClassName(a)),n}if(w.qsa&&(!H||!H.test(e))){if(p=d=z,h=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=T(e),(d=t.getAttribute("id"))?p=d.replace(xt,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=c.length;l--;)c[l]=p+f(c[l]);h=bt.test(e)&&u(t.parentNode)||t,m=c.join(",")}if(m)try{return et.apply(n,h.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return N(e.replace(ct,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>C.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[z]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)C.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&typeof e.getElementsByTagName!==G&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,c=[I,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[z]||(t[z]={}),(s=l[r])&&s[0]===I&&s[1]===o)return c[2]=s[2];if(l[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),c&&t.push(s));return a}function v(e,t,n,i,o,a){return i&&!i[z]&&(i=v(i)),o&&!o[z]&&(o=v(o,a)),r(function(r,a,s,l){var c,u,d,f=[],p=[],h=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(c=g(b,p),i(c,[],s,l),u=c.length;u--;)(d=c[u])&&(b[p[u]]=!(y[p[u]]=d));if(r){if(o||e){if(o){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);o(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=o?nt.call(r,d):f[u])>-1&&(r[c]=!(a[c]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):et.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),c=p(function(e){return nt.call(t,e)>-1},a,!0),u=[function(e,n,r){return!o&&(r||n!==L)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])u=[p(h(u),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[z]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return v(s>1&&h(u),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ct,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&f(e))}u.push(n)}return h(u)}function b(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,l,c){var u,d,f,p=0,h="0",m=r&&[],v=[],y=L,b=r||o&&C.find.TAG("*",c),x=I+=null==y?1:Math.random()||.1,w=b.length;for(c&&(L=a!==R&&a);h!==w&&null!=(u=b[h]);h++){if(o&&u){for(d=0;f=e[d++];)if(f(u,a,s)){l.push(u);break}c&&(I=x)}i&&((u=!f&&u)&&p--,r&&m.push(u))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=K.call(l));v=g(v)}et.apply(l,v),c&&!r&&v.length>0&&p+n.length>1&&t.uniqueSort(l)}return c&&(I=x,L=y),m};return i?r(a):a}var x,w,C,S,k,T,E,N,L,A,D,j,R,P,_,H,O,q,M,z="sizzle"+-new Date,F=e.document,I=0,B=0,W=n(),U=n(),X=n(),Z=function(e,t){return e===t&&(D=!0),0},G="undefined",V=1<<31,Q={}.hasOwnProperty,Y=[],K=Y.pop,J=Y.push,et=Y.push,tt=Y.slice,nt=Y.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},rt="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",it="[\\x20\\t\\r\\n\\f]",ot="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",at=ot.replace("w","w#"),st="\\["+it+"*("+ot+")(?:"+it+"*([*^$|!~]?=)"+it+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+at+"))|)"+it+"*\\]",lt=":("+ot+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+st+")*)|.*)\\)|)",ct=new RegExp("^"+it+"+|((?:^|[^\\\\])(?:\\\\.)*)"+it+"+$","g"),ut=new RegExp("^"+it+"*,"+it+"*"),dt=new RegExp("^"+it+"*([>+~]|"+it+")"+it+"*"),ft=new RegExp("="+it+"*([^\\]'\"]*?)"+it+"*\\]","g"),pt=new RegExp(lt),ht=new RegExp("^"+at+"$"),mt={ID:new RegExp("^#("+ot+")"),CLASS:new RegExp("^\\.("+ot+")"),TAG:new RegExp("^("+ot.replace("w","w*")+")"),ATTR:new RegExp("^"+st),PSEUDO:new RegExp("^"+lt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+it+"*(even|odd|(([+-]|)(\\d*)n|)"+it+"*(?:([+-]|)"+it+"*(\\d+)|))"+it+"*\\)|)","i"),bool:new RegExp("^(?:"+rt+")$","i"),needsContext:new RegExp("^"+it+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+it+"*((?:-\\d)?\\d*)"+it+"*\\)|)(?=[^-]|$)","i")},gt=/^(?:input|select|textarea|button)$/i,vt=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bt=/[+~]/,xt=/'|\\/g,wt=new RegExp("\\\\([\\da-f]{1,6}"+it+"?|("+it+")|.)","ig"),Ct=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{et.apply(Y=tt.call(F.childNodes),F.childNodes),Y[F.childNodes.length].nodeType}catch(St){et={apply:Y.length?function(e,t){J.apply(e,tt.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},j=t.setDocument=function(e){var t,n=e?e.ownerDocument||e:F,r=n.defaultView;return n!==R&&9===n.nodeType&&n.documentElement?(R=n,P=n.documentElement,_=!k(n),r&&r!==r.top&&(r.addEventListener?r.addEventListener("unload",function(){j()},!1):r.attachEvent&&r.attachEvent("onunload",function(){j()})),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=$.test(n.getElementsByClassName)&&i(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),w.getById=i(function(e){return P.appendChild(e).id=z,!n.getElementsByName||!n.getElementsByName(z).length +function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(e){e.preventDefault();var o=$(this);o.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(o))}),console.log("init tabs @",e)}}function Preview(e,t){function n(e){return e.find(".js-preview-input").eq(0)}function r(e){return e.hasClass("js-preview-container")?e:e.find(".js-preview-container").eq(0)}var i=$(e),o=$(t),a=n(o);if(!a.length)return void console.log("[preview]: no preview input");var s=r(o);return s.length?(i.on("click",function(){$.post("/api/v1/markdown",{text:a.val()},function(e){s.html(e)})}),void console.log("[preview]: init preview @",e,"&",t)):void console.log("[preview]: no preview container")}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView(),$(".js-tab-nav").click(function(e){$(this).hasClass("js-tab-nav-show")||($(this).parent().find(".js-tab-nav-show").each(function(){$(this).removeClass("js-tab-nav-show"),$($(this).data("tab-target")).hide()}),$(this).addClass("js-tab-nav-show"),$($(this).data("tab-target")).show()),e.preventDefault()}),$(document).on("click",".popup-modal-dismiss",function(e){e.preventDefault(),$.magnificPopup.close()}),$(".collapse").hide(),$(".tipsy-tooltip").tipsy({fade:!0})}function initUserSetting(){var t=$("#username"),n=$("#user-profile-form");$("#change-username-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("uname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("uname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-username-submit").click(function(){$.magnificPopup.close(),n.submit()}),$(".show-form-btn").click(function(){$($(this).data("target-form")).removeClass("hide")}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close(),$("#delete-account-form").submit()})}function initRepoCreate(){$("#repo-create-owner-list").on("click","li",function(){if(!$(this).hasClass("checked")){var e=$(this).data("uid");$("#repo-owner-id").val(e),$("#repo-owner-avatar").attr("src",$(this).find("img").attr("src")),$("#repo-owner-name").text($(this).text().trim()),$(this).parent().find(".checked").removeClass("checked"),$(this).addClass("checked"),console.log("set repo owner to uid :",e,$(this).text().trim())}}),$("#auth-button").click(function(e){$("#repo-migrate-auth").slideToggle("fast"),e.preventDefault()}),console.log("initRepoCreate")}function initRepo(){$("#repo-clone-ssh").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-https").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))}),$("#repo-clone-https").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-ssh").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))});var e=$("#repo-clone-copy");e.hover(function(){Gogs.bindCopy($(this))}),e.tipsy({fade:!0})}function initHookTypeChange(){$("select#hook-type").on("change",function(){hookTypes=["Gogs","Slack"];var e=$(this).val();hookTypes.forEach(function(t){e===t?$("div#"+t.toLowerCase()).toggleShow():$("div#"+t.toLowerCase()).toggleHide()})})}function initRepoSetting(){var t=$("#repo_name"),n=$("#repo-setting-form");$("#change-reponame-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("repo-name")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("repo-name")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-reponame-submit").click(function(){$.magnificPopup.close(),n.submit()}),initHookTypeChange(),$("#transfer-repo-btn").magnificPopup({modal:!0}),$("#transfer-repo-submit").click(function(){$.magnificPopup.close(),$("#transfer-repo-form").submit()}),$("#delete-repo-btn").magnificPopup({modal:!0}),$("#delete-repo-submit").click(function(){$.magnificPopup.close(),$("#delete-repo-form").submit()}),$("#repo-collab-list hr:last-child").remove();var r=$("#repo-collaborator").next().next().find("ul");$("#repo-collaborator").on("keyup",function(){var e=$(this);return e.val()?void Gogs.searchUsers(e.val(),r):void r.toggleHide()}).on("focus",function(){$(this).val()?r.toggleShow():r.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#repo-collaborator").val($(this).text()),r.toggleHide()})}function initOrgSetting(){var t=$("#orgname"),n=$("#org-setting-form");$("#change-orgname-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("orgname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("orgname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-orgname-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#delete-org-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-org-submit").click(function(){$.magnificPopup.close(),$("#delete-org-form").submit()}),initHookTypeChange()}function initInvite(){var e=$("#org-member-invite-list");$("#org-member-invite").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-member-invite").val($(this).text()),e.toggleHide()})}function initOrgTeamCreate(){$("#org-team-delete").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-team-submit").click(function(){$.magnificPopup.close();var e=$("#team-create-form");e.attr("action",e.data("delete-url"))})}function initTeamMembersList(){var e=$("#org-team-members-list");$("#org-team-members-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-members-add").val($(this).text()),e.toggleHide()})}function initTeamRepositoriesList(){var e=$("#org-team-repositories-list");$("#org-team-repositories-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchRepos(t.val(),e,"uid="+t.data("uid")):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-repositories-add").val($(this).text()),e.toggleHide()})}function initAdmin(){$("#login-type").on("change",function(){var e=$(this).val();e.indexOf("0-")+1?($(".auth-name").toggleHide(),$(".pwd").find("input").attr("required","required").end().toggleShow()):($(".pwd").find("input").removeAttr("required").end().toggleHide(),$(".auth-name").toggleShow())}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close();var e=$("#user-profile-form");e.attr("action",e.data("delete-url"))}),$("#auth-type").on("change",function(){var e=$(this).val();2==e&&($(".ldap").toggleShow(),$(".smtp").toggleHide()),3==e&&($(".smtp").toggleShow(),$(".ldap").toggleHide())}),$("#delete-auth-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-auth-submit").click(function(){$.magnificPopup.close();var e=$("#auth-setting-form");e.attr("action",e.data("delete-url"))})}function initInstall(){!function(){var e="127.0.0.1:3306",t="127.0.0.1:5432";$("#install-database").on("change",function(){var n=$(this).val();"SQLite3"!=n?($(".server-sql").show(),$(".sqlite-setting").addClass("hide"),"PostgreSQL"==n?($(".pgsql-setting").removeClass("hide"),$("#database-host").val()==e&&$("#database-host").val(t)):"MySQL"==n?($(".pgsql-setting").addClass("hide"),$("#database-host").val()==t&&$("#database-host").val(e)):$(".pgsql-setting").addClass("hide")):($(".server-sql").hide(),$(".pgsql-setting").hide(),$(".sqlite-setting").removeClass("hide"))})}()}function initProfile(){$("#profile-avatar").tipsy({fade:!0})}function initTimeSwitch(){$(".time-since[title]").on("click",function(){var e=$(this),t=e.attr("title"),n=e.text();e.text(t),e.attr("title",n)})}function initDiff(){$(".diff-detail-box>a").click(function(){$($(this).data("target")).slideToggle(100)});var e=$(".diff-counter");e.length<1||e.each(function(e,t){var n=$(t),r=n.find("span[data-line].add").data("line"),i=n.find("span[data-line].del").data("line"),o=parseFloat(r)/(parseFloat(r)+parseFloat(i))*100;n.find(".bar .add").css("width",o+"%")})}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/sign_up",!0):void $("#promo-form").attr("action",Gogs.AppSubUrl+"/user/sign_up")})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace($t,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:Tt.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function c(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,c=s?e[a]:e[a]&&a;if(c&&l[c]&&(r||l[c].data)||void 0!==n||"string"!=typeof t)return c||(c=s?e[a]=V.pop()||ot.guid++:a),l[c]||(l[c]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[c]=ot.extend(l[c],t):l[c].data=ot.extend(l[c].data,t)),o=l[c],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!c(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,c(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){Dt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Dt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function k(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function T(e){var t=mt,n=Jt[e];return n||(n=k(e,t),"none"!==n&&n||(Kt=(Kt||ot("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Kt[0].contentWindow||Kt[0].contentDocument).document,t.write(),t.close(),n=k(e,t),Kt.detach()),Jt[e]=n),n}function E(e,t){return{get:function(){var n=e();return null!=n?n?void delete this.get:(this.get=t).apply(this,arguments):void 0}}}function N(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=pn.length;i--;)if(t=pn[i]+n,t in e)return t;return r}function L(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=ot._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[a]=ot._data(r,"olddisplay",T(r.nodeName)))):(i=Lt(r),(n&&"none"!==n||!i)&&ot._data(r,"olddisplay",i?n:ot.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function A(e,t,n){var r=cn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function D(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=ot.css(e,n+Nt[o],!0,i)),r?("content"===n&&(a-=ot.css(e,"padding"+Nt[o],!0,i)),"margin"!==n&&(a-=ot.css(e,"border"+Nt[o]+"Width",!0,i))):(a+=ot.css(e,"padding"+Nt[o],!0,i),"padding"!==n&&(a+=ot.css(e,"border"+Nt[o]+"Width",!0,i)));return a}function j(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=nn(e),a=rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=rn(e,t,o),(0>i||null==i)&&(i=e.style[t]),tn.test(i))return i;r=a&&(rt.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+D(e,t,n||(a?"border":"content"),r,o)+"px"}function R(e,t,n,r,i){return new R.prototype.init(e,t,n,r,i)}function P(){return setTimeout(function(){hn=void 0}),hn=ot.now()}function _(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Nt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function H(e,t,n){for(var r,i=(xn[t]||[]).concat(xn["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,t,e))return r}function O(e,t,n){var r,i,o,a,s,l,c,u,d=this,f={},p=e.style,h=e.nodeType&&Lt(e),m=ot._data(e,"fxshow");n.queue||(s=ot._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,d.always(function(){d.always(function(){s.unqueued--,ot.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=ot.css(e,"display"),u="none"===c?ot._data(e,"olddisplay")||T(e.nodeName):c,"inline"===u&&"none"===ot.css(e,"float")&&(rt.inlineBlockNeedsLayout&&"inline"!==T(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",rt.shrinkWrapBlocks()||d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],gn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!m||void 0===m[r])continue;h=!0}f[r]=m&&m[r]||ot.style(e,r)}else c=void 0;if(ot.isEmptyObject(f))"inline"===("none"===c?T(e.nodeName):c)&&(p.display=c);else{m?"hidden"in m&&(h=m.hidden):m=ot._data(e,"fxshow",{}),o&&(m.hidden=!h),h?ot(e).show():d.done(function(){ot(e).hide()}),d.done(function(){var t;ot._removeData(e,"fxshow");for(t in f)ot.style(e,t,f[t])});for(r in f)a=H(h?m[r]:0,r,d),r in m||(m[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function q(e,t){var n,r,i,o,a;for(n in e)if(r=ot.camelCase(n),i=t[r],o=e[n],ot.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=ot.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function M(e,t,n){var r,i,o=0,a=bn.length,s=ot.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=hn||P(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,o=1-r,a=0,l=c.tweens.length;l>a;a++)c.tweens[a].run(o);return s.notifyWith(e,[c,o,n]),1>o&&l?n:(s.resolveWith(e,[c]),!1)},c=s.promise({elem:e,props:ot.extend({},t),opts:ot.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:hn||P(),duration:n.duration,tweens:[],createTween:function(t,n){var r=ot.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)c.tweens[n].run(1);return t?s.resolveWith(e,[c,t]):s.rejectWith(e,[c,t]),this}}),u=c.props;for(q(u,c.opts.specialEasing);a>o;o++)if(r=bn[o].call(c,e,u,c.opts))return r;return ot.map(u,H,c),ot.isFunction(c.opts.start)&&c.opts.start.call(e,c),ot.fx.timer(ot.extend(l,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(xt)||[];if(ot.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function F(e,t,n,r){function i(s){var l;return o[s]=!0,ot.each(e[s]||[],function(e,s){var c=s(t,n,r);return"string"!=typeof c||a||o[c]?a?!(l=c):void 0:(t.dataTypes.unshift(c),i(c),!1)}),l}var o={},a=e===Wn;return i(t.dataTypes[0])||!o["*"]&&i("*")}function I(e,t){var n,r,i=ot.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&ot.extend(!0,e,n),e}function B(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function W(e,t,n,r){var i,o,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=c[l+" "+o]||c["* "+o],!a)for(i in c)if(s=i.split(" "),s[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){a===!0?a=c[i]:c[i]!==!0&&(o=s[0],u.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(d){return{state:"parsererror",error:a?d:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(ot.isArray(t))ot.each(t,function(t,i){n||Gn.test(e)?r(e,i):U(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==ot.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function X(){try{return new e.XMLHttpRequest}catch(t){}}function Z(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function G(e){return ot.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var V=[],Q=V.slice,Y=V.concat,K=V.push,J=V.indexOf,et={},tt=et.toString,nt=et.hasOwnProperty,rt={},it="1.11.1",ot=function(e,t){return new ot.fn.init(e,t)},at=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,st=/^-ms-/,lt=/-([\da-z])/gi,ct=function(e,t){return t.toUpperCase()};ot.fn=ot.prototype={jquery:it,constructor:ot,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=ot.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ot.each(this,e,t)},map:function(e){return this.pushStack(ot.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:K,sort:V.sort,splice:V.splice},ot.extend=ot.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,c=!1;for("boolean"==typeof a&&(c=a,a=arguments[s]||{},s++),"object"==typeof a||ot.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(c&&n&&(ot.isPlainObject(n)||(t=ot.isArray(n)))?(t?(t=!1,o=e&&ot.isArray(e)?e:[]):o=e&&ot.isPlainObject(e)?e:{},a[r]=ot.extend(c,o,n)):void 0!==n&&(a[r]=n));return a},ot.extend({expando:"jQuery"+(it+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ot.type(e)},isArray:Array.isArray||function(e){return"array"===ot.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ot.isArray(e)&&e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ot.type(e)||e.nodeType||ot.isWindow(e))return!1;try{if(e.constructor&&!nt.call(e,"constructor")&&!nt.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(rt.ownLast)for(t in e)return nt.call(e,t);for(t in e);return void 0===t||nt.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?et[tt.call(e)]||"object":typeof e},globalEval:function(t){t&&ot.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(st,"ms-").replace(lt,ct)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(at,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?ot.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(J)return J.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;a>o;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),l=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&l.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&l.push(i);return Y.apply([],l)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ot.isFunction(e)?(n=Q.call(arguments,2),r=function(){return e.apply(t||this,n.concat(Q.call(arguments)))},r.guid=e.guid=e.guid||ot.guid++,r):void 0},now:function(){return+new Date},support:rt}),ot.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){et["[object "+t+"]"]=t.toLowerCase()});var ut=function(e){function t(e,t,n,r){var i,o,a,s,l,c,d,p,h,m;if((t?t.ownerDocument||t:F)!==R&&j(t),t=t||R,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(_&&!r){if(i=yt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&M(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return et.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&w.getElementsByClassName&&t.getElementsByClassName)return et.apply(n,t.getElementsByClassName(a)),n}if(w.qsa&&(!H||!H.test(e))){if(p=d=z,h=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=T(e),(d=t.getAttribute("id"))?p=d.replace(xt,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=c.length;l--;)c[l]=p+f(c[l]);h=bt.test(e)&&u(t.parentNode)||t,m=c.join(",")}if(m)try{return et.apply(n,h.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return N(e.replace(ct,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>C.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[z]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)C.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&typeof e.getElementsByTagName!==G&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,c=[I,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[z]||(t[z]={}),(s=l[r])&&s[0]===I&&s[1]===o)return c[2]=s[2];if(l[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),c&&t.push(s));return a}function v(e,t,n,i,o,a){return i&&!i[z]&&(i=v(i)),o&&!o[z]&&(o=v(o,a)),r(function(r,a,s,l){var c,u,d,f=[],p=[],h=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(c=g(b,p),i(c,[],s,l),u=c.length;u--;)(d=c[u])&&(b[p[u]]=!(y[p[u]]=d));if(r){if(o||e){if(o){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);o(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=o?nt.call(r,d):f[u])>-1&&(r[c]=!(a[c]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):et.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),c=p(function(e){return nt.call(t,e)>-1},a,!0),u=[function(e,n,r){return!o&&(r||n!==L)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])u=[p(h(u),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[z]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return v(s>1&&h(u),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ct,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&f(e))}u.push(n)}return h(u)}function b(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,l,c){var u,d,f,p=0,h="0",m=r&&[],v=[],y=L,b=r||o&&C.find.TAG("*",c),x=I+=null==y?1:Math.random()||.1,w=b.length;for(c&&(L=a!==R&&a);h!==w&&null!=(u=b[h]);h++){if(o&&u){for(d=0;f=e[d++];)if(f(u,a,s)){l.push(u);break}c&&(I=x)}i&&((u=!f&&u)&&p--,r&&m.push(u))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=K.call(l));v=g(v)}et.apply(l,v),c&&!r&&v.length>0&&p+n.length>1&&t.uniqueSort(l)}return c&&(I=x,L=y),m};return i?r(a):a}var x,w,C,S,k,T,E,N,L,A,D,j,R,P,_,H,O,q,M,z="sizzle"+-new Date,F=e.document,I=0,B=0,W=n(),U=n(),X=n(),Z=function(e,t){return e===t&&(D=!0),0},G="undefined",V=1<<31,Q={}.hasOwnProperty,Y=[],K=Y.pop,J=Y.push,et=Y.push,tt=Y.slice,nt=Y.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},rt="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",it="[\\x20\\t\\r\\n\\f]",ot="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",at=ot.replace("w","w#"),st="\\["+it+"*("+ot+")(?:"+it+"*([*^$|!~]?=)"+it+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+at+"))|)"+it+"*\\]",lt=":("+ot+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+st+")*)|.*)\\)|)",ct=new RegExp("^"+it+"+|((?:^|[^\\\\])(?:\\\\.)*)"+it+"+$","g"),ut=new RegExp("^"+it+"*,"+it+"*"),dt=new RegExp("^"+it+"*([>+~]|"+it+")"+it+"*"),ft=new RegExp("="+it+"*([^\\]'\"]*?)"+it+"*\\]","g"),pt=new RegExp(lt),ht=new RegExp("^"+at+"$"),mt={ID:new RegExp("^#("+ot+")"),CLASS:new RegExp("^\\.("+ot+")"),TAG:new RegExp("^("+ot.replace("w","w*")+")"),ATTR:new RegExp("^"+st),PSEUDO:new RegExp("^"+lt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+it+"*(even|odd|(([+-]|)(\\d*)n|)"+it+"*(?:([+-]|)"+it+"*(\\d+)|))"+it+"*\\)|)","i"),bool:new RegExp("^(?:"+rt+")$","i"),needsContext:new RegExp("^"+it+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+it+"*((?:-\\d)?\\d*)"+it+"*\\)|)(?=[^-]|$)","i")},gt=/^(?:input|select|textarea|button)$/i,vt=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bt=/[+~]/,xt=/'|\\/g,wt=new RegExp("\\\\([\\da-f]{1,6}"+it+"?|("+it+")|.)","ig"),Ct=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{et.apply(Y=tt.call(F.childNodes),F.childNodes),Y[F.childNodes.length].nodeType}catch(St){et={apply:Y.length?function(e,t){J.apply(e,tt.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},j=t.setDocument=function(e){var t,n=e?e.ownerDocument||e:F,r=n.defaultView;return n!==R&&9===n.nodeType&&n.documentElement?(R=n,P=n.documentElement,_=!k(n),r&&r!==r.top&&(r.addEventListener?r.addEventListener("unload",function(){j()},!1):r.attachEvent&&r.attachEvent("onunload",function(){j()})),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=$.test(n.getElementsByClassName)&&i(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),w.getById=i(function(e){return P.appendChild(e).id=z,!n.getElementsByName||!n.getElementsByName(z).length }),w.getById?(C.find.ID=function(e,t){if(typeof t.getElementById!==G&&_){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},C.filter.ID=function(e){var t=e.replace(wt,Ct);return function(e){return e.getAttribute("id")===t}}):(delete C.find.ID,C.filter.ID=function(e){var t=e.replace(wt,Ct);return function(e){var n=typeof e.getAttributeNode!==G&&e.getAttributeNode("id");return n&&n.value===t}}),C.find.TAG=w.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==G?t.getElementsByTagName(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},C.find.CLASS=w.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==G&&_?t.getElementsByClassName(e):void 0},O=[],H=[],(w.qsa=$.test(n.querySelectorAll))&&(i(function(e){e.innerHTML="<select msallowclip=''><option selected=''></option></select>",e.querySelectorAll("[msallowclip^='']").length&&H.push("[*^$]="+it+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||H.push("\\["+it+"*(?:value|"+rt+")"),e.querySelectorAll(":checked").length||H.push(":checked")}),i(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&H.push("name"+it+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),H.push(",.*:")})),(w.matchesSelector=$.test(q=P.matches||P.webkitMatchesSelector||P.mozMatchesSelector||P.oMatchesSelector||P.msMatchesSelector))&&i(function(e){w.disconnectedMatch=q.call(e,"div"),q.call(e,"[s!='']:x"),O.push("!=",lt)}),H=H.length&&new RegExp(H.join("|")),O=O.length&&new RegExp(O.join("|")),t=$.test(P.compareDocumentPosition),M=t||$.test(P.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Z=t?function(e,t){if(e===t)return D=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r?r:(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&r||!w.sortDetached&&t.compareDocumentPosition(e)===r?e===n||e.ownerDocument===F&&M(F,e)?-1:t===n||t.ownerDocument===F&&M(F,t)?1:A?nt.call(A,e)-nt.call(A,t):0:4&r?-1:1)}:function(e,t){if(e===t)return D=!0,0;var r,i=0,o=e.parentNode,s=t.parentNode,l=[e],c=[t];if(!o||!s)return e===n?-1:t===n?1:o?-1:s?1:A?nt.call(A,e)-nt.call(A,t):0;if(o===s)return a(e,t);for(r=e;r=r.parentNode;)l.unshift(r);for(r=t;r=r.parentNode;)c.unshift(r);for(;l[i]===c[i];)i++;return i?a(l[i],c[i]):l[i]===F?-1:c[i]===F?1:0},n):R},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==R&&j(e),n=n.replace(ft,"='$1']"),!(!w.matchesSelector||!_||O&&O.test(n)||H&&H.test(n)))try{var r=q.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,R,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==R&&j(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==R&&j(e);var n=C.attrHandle[t.toLowerCase()],r=n&&Q.call(C.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(D=!w.detectDuplicates,A=!w.sortStable&&e.slice(0),e.sort(Z),D){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return A=null,e},S=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=S(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=S(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:mt,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(wt,Ct),e[3]=(e[3]||e[4]||e[5]||"").replace(wt,Ct),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return mt.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&pt.test(n)&&(t=T(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(wt,Ct).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+it+")"+e+"("+it+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==G&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:n?(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o+" ").indexOf(r)>-1:"|="===n?o===r||o.slice(0,r.length+1)===r+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,f,p,h,m=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(s?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;h=m="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(u=g[z]||(g[z]={}),c=u[e]||[],p=c[0]===I&&c[1],f=c[0]===I&&c[2],d=p&&g.childNodes[p];d=++p&&d&&d[m]||(f=p=0)||h.pop();)if(1===d.nodeType&&++f&&d===t){u[e]=[I,p,f];break}}else if(y&&(c=(t[z]||(t[z]={}))[e])&&c[0]===I)f=c[1];else for(;(d=++p&&d&&d[m]||(f=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[z]||(d[z]={}))[e]=[I,f]),d!==t)););return f-=i,f===r||f%r===0&&f/r>=0}}},PSEUDO:function(e,n){var i,o=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[z]?o(n):o.length>1?(i=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=nt.call(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=E(e.replace(ct,"$1"));return i[z]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return function(t){return(t.textContent||t.innerText||S(t)).indexOf(e)>-1}}),lang:r(function(e){return ht.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(wt,Ct).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===P},focus:function(e){return e===R.activeElement&&(!R.hasFocus||R.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return vt.test(e.nodeName)},input:function(e){return gt.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(x in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[x]=s(x);for(x in{submit:!0,reset:!0})C.pseudos[x]=l(x);return d.prototype=C.filters=C.pseudos,C.setFilters=new d,T=t.tokenize=function(e,n){var r,i,o,a,s,l,c,u=U[e+" "];if(u)return n?0:u.slice(0);for(s=e,l=[],c=C.preFilter;s;){(!r||(i=ut.exec(s)))&&(i&&(s=s.slice(i[0].length)||s),l.push(o=[])),r=!1,(i=dt.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ct," ")}),s=s.slice(r.length));for(a in C.filter)!(i=mt[a].exec(s))||c[a]&&!(i=c[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):U(e,l).slice(0)},E=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=T(e)),n=t.length;n--;)o=y(t[n]),o[z]?r.push(o):i.push(o);o=X(e,b(i,r)),o.selector=e}return o},N=t.select=function(e,t,n,r){var i,o,a,s,l,c="function"==typeof e&&e,d=!r&&T(e=c.selector||e);if(n=n||[],1===d.length){if(o=d[0]=d[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&C.relative[o[1].type]){if(t=(C.find.ID(a.matches[0].replace(wt,Ct),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=mt.needsContext.test(e)?0:o.length;i--&&(a=o[i],!C.relative[s=a.type]);)if((l=C.find[s])&&(r=l(a.matches[0].replace(wt,Ct),bt.test(o[0].type)&&u(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&f(o),!e)return et.apply(n,r),n;break}}return(c||E(e,d))(r,t,!_,n,bt.test(e)&&u(t.parentNode)||t),n},w.sortStable=z.split("").sort(Z).join("")===z,w.detectDuplicates=!!D,j(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(R.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(rt,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);ot.find=ut,ot.expr=ut.selectors,ot.expr[":"]=ot.expr.pseudos,ot.unique=ut.uniqueSort,ot.text=ut.getText,ot.isXMLDoc=ut.isXML,ot.contains=ut.contains;var dt=ot.expr.match.needsContext,ft=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,pt=/^.[^:#\[\.,]*$/;ot.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ot.find.matchesSelector(r,e)?[r]:[]:ot.find.matches(e,ot.grep(t,function(e){return 1===e.nodeType}))},ot.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(ot(e).filter(function(){for(t=0;i>t;t++)if(ot.contains(r[t],this))return!0}));for(t=0;i>t;t++)ot.find(e,r[t],n);return n=this.pushStack(i>1?ot.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&dt.test(e)?ot(e):e||[],!1).length}});var ht,mt=e.document,gt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,vt=ot.fn.init=function(e,t){var n,r;if(!e)return this;if("string"==typeof e){if(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:gt.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||ht).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof ot?t[0]:t,ot.merge(this,ot.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:mt,!0)),ft.test(n[1])&&ot.isPlainObject(t))for(n in t)ot.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if(r=mt.getElementById(n[2]),r&&r.parentNode){if(r.id!==n[2])return ht.find(e);this.length=1,this[0]=r}return this.context=mt,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ot.isFunction(e)?"undefined"!=typeof ht.ready?ht.ready(e):e(ot):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ot.makeArray(e,this))};vt.prototype=ot.fn,ht=ot(mt);var yt=/^(?:parents|prev(?:Until|All))/,bt={children:!0,contents:!0,next:!0,prev:!0};ot.extend({dir:function(e,t,n){for(var r=[],i=e[t];i&&9!==i.nodeType&&(void 0===n||1!==i.nodeType||!ot(i).is(n));)1===i.nodeType&&r.push(i),i=i[t];return r},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),ot.fn.extend({has:function(e){var t,n=ot(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(ot.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=dt.test(e)||"string"!=typeof e?ot(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&ot.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ot.unique(o):o)},index:function(e){return e?"string"==typeof e?ot.inArray(this[0],ot(e)):ot.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ot.unique(ot.merge(this.get(),ot(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ot.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ot.dir(e,"parentNode")},parentsUntil:function(e,t,n){return ot.dir(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return ot.dir(e,"nextSibling")},prevAll:function(e){return ot.dir(e,"previousSibling")},nextUntil:function(e,t,n){return ot.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return ot.dir(e,"previousSibling",n)},siblings:function(e){return ot.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return ot.sibling(e.firstChild)},contents:function(e){return ot.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:ot.merge([],e.childNodes)}},function(e,t){ot.fn[e]=function(n,r){var i=ot.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ot.filter(r,i)),this.length>1&&(bt[e]||(i=ot.unique(i)),yt.test(e)&&(i=i.reverse())),this.pushStack(i)}});var xt=/\S+/g,wt={};ot.Callbacks=function(e){e="string"==typeof e?wt[e]||o(e):ot.extend({},e);var t,n,r,i,a,s,l=[],c=!e.once&&[],u=function(o){for(n=e.memory&&o,r=!0,a=s||0,s=0,i=l.length,t=!0;l&&i>a;a++)if(l[a].apply(o[0],o[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,l&&(c?c.length&&u(c.shift()):n?l=[]:d.disable())},d={add:function(){if(l){var r=l.length;!function o(t){ot.each(t,function(t,n){var r=ot.type(n);"function"===r?e.unique&&d.has(n)||l.push(n):n&&n.length&&"string"!==r&&o(n)})}(arguments),t?i=l.length:n&&(s=r,u(n))}return this},remove:function(){return l&&ot.each(arguments,function(e,n){for(var r;(r=ot.inArray(n,l,r))>-1;)l.splice(r,1),t&&(i>=r&&i--,a>=r&&a--)}),this},has:function(e){return e?ot.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],i=0,this},disable:function(){return l=c=n=void 0,this},disabled:function(){return!l},lock:function(){return c=void 0,n||d.disable(),this},locked:function(){return!c},fireWith:function(e,n){return!l||r&&!c||(n=n||[],n=[e,n.slice?n.slice():n],t?c.push(n):u(n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!r}};return d},ot.extend({Deferred:function(e){var t=[["resolve","done",ot.Callbacks("once memory"),"resolved"],["reject","fail",ot.Callbacks("once memory"),"rejected"],["notify","progress",ot.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ot.Deferred(function(n){ot.each(t,function(t,o){var a=ot.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&ot.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ot.extend(e,r):r}},i={};return r.pipe=r.then,ot.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=Q.call(arguments),r=n.length,i=1!==r||e&&ot.isFunction(e.promise)?r:0,o=1===i?e:ot.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?Q.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,c;if(r>1)for(s=new Array(r),l=new Array(r),c=new Array(r);r>t;t++)n[t]&&ot.isFunction(n[t].promise)?n[t].promise().done(a(t,c,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(c,n),o.promise()}});var Ct;ot.fn.ready=function(e){return ot.ready.promise().done(e),this},ot.extend({isReady:!1,readyWait:1,holdReady:function(e){e?ot.readyWait++:ot.ready(!0)},ready:function(e){if(e===!0?!--ot.readyWait:!ot.isReady){if(!mt.body)return setTimeout(ot.ready);ot.isReady=!0,e!==!0&&--ot.readyWait>0||(Ct.resolveWith(mt,[ot]),ot.fn.triggerHandler&&(ot(mt).triggerHandler("ready"),ot(mt).off("ready")))}}}),ot.ready.promise=function(t){if(!Ct)if(Ct=ot.Deferred(),"complete"===mt.readyState)setTimeout(ot.ready);else if(mt.addEventListener)mt.addEventListener("DOMContentLoaded",s,!1),e.addEventListener("load",s,!1);else{mt.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&mt.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!ot.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}a(),ot.ready()}}()}return Ct.promise(t)};var St="undefined",kt;for(kt in ot(rt))break;rt.ownLast="0"!==kt,rt.inlineBlockNeedsLayout=!1,ot(function(){var e,t,n,r;n=mt.getElementsByTagName("body")[0],n&&n.style&&(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==St&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",rt.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=mt.createElement("div");if(null==rt.deleteExpando){rt.deleteExpando=!0;try{delete e.test}catch(t){rt.deleteExpando=!1}}e=null}(),ot.acceptData=function(e){var t=ot.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return 1!==n&&9!==n?!1:!t||t!==!0&&e.getAttribute("classid")===t};var Tt=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,$t=/([A-Z])/g;ot.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?ot.cache[e[ot.expando]]:e[ot.expando],!!e&&!c(e)},data:function(e,t,n){return u(e,t,n)},removeData:function(e,t){return d(e,t)},_data:function(e,t,n){return u(e,t,n,!0)},_removeData:function(e,t){return d(e,t,!0)}}),ot.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=ot.data(o),1===o.nodeType&&!ot._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=ot.camelCase(r.slice(5)),l(o,r,i[r])));ot._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){ot.data(this,e)}):arguments.length>1?this.each(function(){ot.data(this,e,t)}):o?l(o,e,ot.data(o,e)):void 0},removeData:function(e){return this.each(function(){ot.removeData(this,e)})}}),ot.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=ot._data(e,t),n&&(!r||ot.isArray(n)?r=ot._data(e,t,ot.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=ot.queue(e,t),r=n.length,i=n.shift(),o=ot._queueHooks(e,t),a=function(){ot.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ot._data(e,n)||ot._data(e,n,{empty:ot.Callbacks("once memory").add(function(){ot._removeData(e,t+"queue"),ot._removeData(e,n)})})}}),ot.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?ot.queue(this[0],e):void 0===t?this:this.each(function(){var n=ot.queue(this,e,t);ot._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&ot.dequeue(this,e)})},dequeue:function(e){return this.each(function(){ot.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ot.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=ot._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var Et=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Nt=["Top","Right","Bottom","Left"],Lt=function(e,t){return e=t||e,"none"===ot.css(e,"display")||!ot.contains(e.ownerDocument,e)},At=ot.access=function(e,t,n,r,i,o,a){var s=0,l=e.length,c=null==n;if("object"===ot.type(n)){i=!0;for(s in n)ot.access(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,ot.isFunction(r)||(a=!0),c&&(a?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(ot(e),n)})),t))for(;l>s;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:c?t.call(e):l?t(e[0],n):o},Dt=/^(?:checkbox|radio)$/i;!function(){var e=mt.createElement("input"),t=mt.createElement("div"),n=mt.createDocumentFragment();if(t.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",rt.leadingWhitespace=3===t.firstChild.nodeType,rt.tbody=!t.getElementsByTagName("tbody").length,rt.htmlSerialize=!!t.getElementsByTagName("link").length,rt.html5Clone="<:nav></:nav>"!==mt.createElement("nav").cloneNode(!0).outerHTML,e.type="checkbox",e.checked=!0,n.appendChild(e),rt.appendChecked=e.checked,t.innerHTML="<textarea>x</textarea>",rt.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,n.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",rt.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,rt.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){rt.noCloneEvent=!1}),t.cloneNode(!0).click()),null==rt.deleteExpando){rt.deleteExpando=!0;try{delete t.test}catch(r){rt.deleteExpando=!1}}}(),function(){var t,n,r=mt.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(rt[t+"Bubbles"]=n in e)||(r.setAttribute(n,"t"),rt[t+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var jt=/^(?:input|select|textarea)$/i,Rt=/^key/,Pt=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_t=/^([^.]*)(?:\.(.+)|)$/;ot.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,m,g=ot._data(e);if(g){for(n.handler&&(l=n,n=l.handler,i=l.selector),n.guid||(n.guid=ot.guid++),(a=g.events)||(a=g.events={}),(u=g.handle)||(u=g.handle=function(e){return typeof ot===St||e&&ot.event.triggered===e.type?void 0:ot.event.dispatch.apply(u.elem,arguments)},u.elem=e),t=(t||"").match(xt)||[""],s=t.length;s--;)o=_t.exec(t[s])||[],p=m=o[1],h=(o[2]||"").split(".").sort(),p&&(c=ot.event.special[p]||{},p=(i?c.delegateType:c.bindType)||p,c=ot.event.special[p]||{},d=ot.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ot.expr.match.needsContext.test(i),namespace:h.join(".")},l),(f=a[p])||(f=a[p]=[],f.delegateCount=0,c.setup&&c.setup.call(e,r,h,u)!==!1||(e.addEventListener?e.addEventListener(p,u,!1):e.attachEvent&&e.attachEvent("on"+p,u))),c.add&&(c.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),i?f.splice(f.delegateCount++,0,d):f.push(d),ot.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,m,g=ot.hasData(e)&&ot._data(e);if(g&&(u=g.events)){for(t=(t||"").match(xt)||[""],c=t.length;c--;)if(s=_t.exec(t[c])||[],p=m=s[1],h=(s[2]||"").split(".").sort(),p){for(d=ot.event.special[p]||{},p=(r?d.delegateType:d.bindType)||p,f=u[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;o--;)a=f[o],!i&&m!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,d.remove&&d.remove.call(e,a));l&&!f.length&&(d.teardown&&d.teardown.call(e,h,g.handle)!==!1||ot.removeEvent(e,p,g.handle),delete u[p])}else for(p in u)ot.event.remove(e,p+t[c],n,r,!0);ot.isEmptyObject(u)&&(delete g.handle,ot._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,l,c,u,d,f=[r||mt],p=nt.call(t,"type")?t.type:t,h=nt.call(t,"namespace")?t.namespace.split("."):[];if(s=u=r=r||mt,3!==r.nodeType&&8!==r.nodeType&&!$.test(p+ot.event.triggered)&&(p.indexOf(".")>=0&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[ot.expando]?t:new ot.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:ot.makeArray(n,[t]),c=ot.event.special[p]||{},i||!c.trigger||c.trigger.apply(r,n)!==!1)){if(!i&&!c.noBubble&&!ot.isWindow(r)){for(l=c.delegateType||p,$.test(l+p)||(s=s.parentNode);s;s=s.parentNode)f.push(s),u=s;u===(r.ownerDocument||mt)&&f.push(u.defaultView||u.parentWindow||e)}for(d=0;(s=f[d++])&&!t.isPropagationStopped();)t.type=d>1?l:c.bindType||p,o=(ot._data(s,"events")||{})[t.type]&&ot._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&ot.acceptData(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!c._default||c._default.apply(f.pop(),n)===!1)&&ot.acceptData(r)&&a&&r[p]&&!ot.isWindow(r)){u=r[a],u&&(r[a]=null),ot.event.triggered=p;try{r[p]()}catch(m){}ot.event.triggered=void 0,u&&(r[a]=u)}return t.result}},dispatch:function(e){e=ot.event.fix(e);var t,n,r,i,o,a=[],s=Q.call(arguments),l=(ot._data(this,"events")||{})[e.type]||[],c=ot.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(a=ot.event.handlers.call(this,e,l),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,o=0;(r=i.handlers[o++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(r.namespace))&&(e.handleObj=r,e.data=r.data,n=((ot.event.special[r.origType]||{}).handle||r.handler).apply(i.elem,s),void 0!==n&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(i=[],o=0;s>o;o++)r=t[o],n=r.selector+" ",void 0===i[n]&&(i[n]=r.needsContext?ot(n,this).index(l)>=0:ot.find(n,this,null,[l]).length),i[n]&&i.push(r);i.length&&a.push({elem:l,handlers:i})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[ot.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Pt.test(i)?this.mouseHooks:Rt.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new ot.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||mt),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||mt,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==h()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===h()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return ot.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(e){return ot.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=ot.extend(new ot.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?ot.event.trigger(i,null,t):ot.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},ot.removeEvent=mt.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===St&&(e[r]=null),e.detachEvent(r,n))},ot.Event=function(e,t){return this instanceof ot.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?f:p):this.type=e,t&&ot.extend(this,t),this.timeStamp=e&&e.timeStamp||ot.now(),void(this[ot.expando]=!0)):new ot.Event(e,t)},ot.Event.prototype={isDefaultPrevented:p,isPropagationStopped:p,isImmediatePropagationStopped:p,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=f,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=f,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=f,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},ot.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){ot.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!ot.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),rt.submitBubbles||(ot.event.special.submit={setup:function(){return ot.nodeName(this,"form")?!1:void ot.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=ot.nodeName(t,"input")||ot.nodeName(t,"button")?t.form:void 0;n&&!ot._data(n,"submitBubbles")&&(ot.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),ot._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&ot.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return ot.nodeName(this,"form")?!1:void ot.event.remove(this,"._submit")}}),rt.changeBubbles||(ot.event.special.change={setup:function(){return jt.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ot.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),ot.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),ot.event.simulate("change",this,e,!0) })),!1):void ot.event.add(this,"beforeactivate._change",function(e){var t=e.target;jt.test(t.nodeName)&&!ot._data(t,"changeBubbles")&&(ot.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||ot.event.simulate("change",this.parentNode,e,!0)}),ot._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ot.event.remove(this,"._change"),!jt.test(this.nodeName)}}),rt.focusinBubbles||ot.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ot.event.simulate(t,e.target,ot.event.fix(e),!0)};ot.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=ot._data(r,t);i||r.addEventListener(e,n,!0),ot._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=ot._data(r,t)-1;i?ot._data(r,t,i):(r.removeEventListener(e,n,!0),ot._removeData(r,t))}}}),ot.fn.extend({on:function(e,t,n,r,i){var o,a;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=void 0);for(o in e)this.on(o,t,n,e[o],i);return this}if(null==n&&null==r?(r=t,n=t=void 0):null==r&&("string"==typeof t?(r=n,n=void 0):(r=n,n=t,t=void 0)),r===!1)r=p;else if(!r)return this;return 1===i&&(a=r,r=function(e){return ot().off(e),a.apply(this,arguments)},r.guid=a.guid||(a.guid=ot.guid++)),this.each(function(){ot.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ot(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=void 0),n===!1&&(n=p),this.each(function(){ot.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){ot.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?ot.event.trigger(e,t,n,!0):void 0}});var Ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Ot=/ jQuery\d+="(?:null|\d+)"/g,qt=new RegExp("<(?:"+Ht+")[\\s/>]","i"),Mt=/^\s+/,zt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Ft=/<([\w:]+)/,It=/<tbody/i,Bt=/<|&#?\w+;/,Wt=/<(?:script|style|link)/i,Ut=/checked\s*(?:[^=]|=\s*.checked.)/i,Xt=/^$|\/(?:java|ecma)script/i,Zt=/^true\/(.*)/,Gt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Vt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:rt.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Qt=m(mt),Yt=Qt.appendChild(mt.createElement("div"));Vt.optgroup=Vt.option,Vt.tbody=Vt.tfoot=Vt.colgroup=Vt.caption=Vt.thead,Vt.th=Vt.td,ot.extend({clone:function(e,t,n){var r,i,o,a,s,l=ot.contains(e.ownerDocument,e);if(rt.html5Clone||ot.isXMLDoc(e)||!qt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Yt.innerHTML=e.outerHTML,Yt.removeChild(o=Yt.firstChild)),!(rt.noCloneEvent&&rt.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ot.isXMLDoc(e)))for(r=g(o),s=g(e),a=0;null!=(i=s[a]);++a)r[a]&&S(i,r[a]);if(t)if(n)for(s=s||g(e),r=r||g(o),a=0;null!=(i=s[a]);a++)C(i,r[a]);else C(e,o);return r=g(o,"script"),r.length>0&&w(r,!l&&g(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,l,c,u,d=e.length,f=m(t),p=[],h=0;d>h;h++)if(o=e[h],o||0===o)if("object"===ot.type(o))ot.merge(p,o.nodeType?[o]:o);else if(Bt.test(o)){for(s=s||f.appendChild(t.createElement("div")),l=(Ft.exec(o)||["",""])[1].toLowerCase(),u=Vt[l]||Vt._default,s.innerHTML=u[1]+o.replace(zt,"<$1></$2>")+u[2],i=u[0];i--;)s=s.lastChild;if(!rt.leadingWhitespace&&Mt.test(o)&&p.push(t.createTextNode(Mt.exec(o)[0])),!rt.tbody)for(o="table"!==l||It.test(o)?"<table>"!==u[1]||It.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)ot.nodeName(c=o.childNodes[i],"tbody")&&!c.childNodes.length&&o.removeChild(c);for(ot.merge(p,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=f.lastChild}else p.push(t.createTextNode(o));for(s&&f.removeChild(s),rt.appendChecked||ot.grep(g(p,"input"),v),h=0;o=p[h++];)if((!r||-1===ot.inArray(o,r))&&(a=ot.contains(o.ownerDocument,o),s=g(f.appendChild(o),"script"),a&&w(s),n))for(i=0;o=s[i++];)Xt.test(o.type||"")&&n.push(o);return s=null,f},cleanData:function(e,t){for(var n,r,i,o,a=0,s=ot.expando,l=ot.cache,c=rt.deleteExpando,u=ot.event.special;null!=(n=e[a]);a++)if((t||ot.acceptData(n))&&(i=n[s],o=i&&l[i])){if(o.events)for(r in o.events)u[r]?ot.event.remove(n,r):ot.removeEvent(n,r,o.handle);l[i]&&(delete l[i],c?delete n[s]:typeof n.removeAttribute!==St?n.removeAttribute(s):n[s]=null,V.push(i))}}}),ot.fn.extend({text:function(e){return At(this,function(e){return void 0===e?ot.text(this):this.empty().append((this[0]&&this[0].ownerDocument||mt).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=e?ot.filter(e,this):this,i=0;null!=(n=r[i]);i++)t||1!==n.nodeType||ot.cleanData(g(n)),n.parentNode&&(t&&ot.contains(n.ownerDocument,n)&&w(g(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&ot.cleanData(g(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&ot.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return ot.clone(this,e,t)})},html:function(e){return At(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ot,""):void 0;if(!("string"!=typeof e||Wt.test(e)||!rt.htmlSerialize&&qt.test(e)||!rt.leadingWhitespace&&Mt.test(e)||Vt[(Ft.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(zt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(ot.cleanData(g(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,ot.cleanData(g(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=Y.apply([],e);var n,r,i,o,a,s,l=0,c=this.length,u=this,d=c-1,f=e[0],p=ot.isFunction(f);if(p||c>1&&"string"==typeof f&&!rt.checkClone&&Ut.test(f))return this.each(function(n){var r=u.eq(n);p&&(e[0]=f.call(this,n,r.html())),r.domManip(e,t)});if(c&&(s=ot.buildFragment(e,this[0].ownerDocument,!1,this),n=s.firstChild,1===s.childNodes.length&&(s=n),n)){for(o=ot.map(g(s,"script"),b),i=o.length;c>l;l++)r=s,l!==d&&(r=ot.clone(r,!0,!0),i&&ot.merge(o,g(r,"script"))),t.call(this[l],r,l);if(i)for(a=o[o.length-1].ownerDocument,ot.map(o,x),l=0;i>l;l++)r=o[l],Xt.test(r.type||"")&&!ot._data(r,"globalEval")&&ot.contains(a,r)&&(r.src?ot._evalUrl&&ot._evalUrl(r.src):ot.globalEval((r.text||r.textContent||r.innerHTML||"").replace(Gt,"")));s=n=null}return this}}),ot.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){ot.fn[e]=function(e){for(var n,r=0,i=[],o=ot(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),ot(o[r])[t](n),K.apply(i,n.get());return this.pushStack(i)}});var Kt,Jt={};!function(){var e;rt.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=mt.getElementsByTagName("body")[0],n&&n.style?(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==St&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(mt.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var en=/^margin/,tn=new RegExp("^("+Et+")(?!px)[a-z%]+$","i"),nn,rn,on=/^(top|right|bottom|left)$/;e.getComputedStyle?(nn=function(e){return e.ownerDocument.defaultView.getComputedStyle(e,null)},rn=function(e,t,n){var r,i,o,a,s=e.style;return n=n||nn(e),a=n?n.getPropertyValue(t)||n[t]:void 0,n&&(""!==a||ot.contains(e.ownerDocument,e)||(a=ot.style(e,t)),tn.test(a)&&en.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0===a?a:a+""}):mt.documentElement.currentStyle&&(nn=function(e){return e.currentStyle},rn=function(e,t,n){var r,i,o,a,s=e.style;return n=n||nn(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),tn.test(a)&&!on.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"}),!function(){function t(){var t,n,r,i;n=mt.getElementsByTagName("body")[0],n&&n.style&&(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),t.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",o=a=!1,l=!0,e.getComputedStyle&&(o="1%"!==(e.getComputedStyle(t,null)||{}).top,a="4px"===(e.getComputedStyle(t,null)||{width:"4px"}).width,i=t.appendChild(mt.createElement("div")),i.style.cssText=t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",t.style.width="1px",l=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight)),t.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=t.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",s=0===i[0].offsetHeight,s&&(i[0].style.display="",i[1].style.display="none",s=0===i[0].offsetHeight),n.removeChild(r))}var n,r,i,o,a,s,l;n=mt.createElement("div"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",i=n.getElementsByTagName("a")[0],(r=i&&i.style)&&(r.cssText="float:left;opacity:.5",rt.opacity="0.5"===r.opacity,rt.cssFloat=!!r.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",rt.clearCloneStyle="content-box"===n.style.backgroundClip,rt.boxSizing=""===r.boxSizing||""===r.MozBoxSizing||""===r.WebkitBoxSizing,ot.extend(rt,{reliableHiddenOffsets:function(){return null==s&&t(),s},boxSizingReliable:function(){return null==a&&t(),a},pixelPosition:function(){return null==o&&t(),o},reliableMarginRight:function(){return null==l&&t(),l}}))}(),ot.swap=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};var an=/alpha\([^)]*\)/i,sn=/opacity\s*=\s*([^)]*)/,ln=/^(none|table(?!-c[ea]).+)/,cn=new RegExp("^("+Et+")(.*)$","i"),un=new RegExp("^([+-])=("+Et+")","i"),dn={position:"absolute",visibility:"hidden",display:"block"},fn={letterSpacing:"0",fontWeight:"400"},pn=["Webkit","O","Moz","ms"];ot.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=rn(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":rt.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ot.camelCase(t),l=e.style;if(t=ot.cssProps[s]||(ot.cssProps[s]=N(l,s)),a=ot.cssHooks[t]||ot.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];if(o=typeof n,"string"===o&&(i=un.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(ot.css(e,t)),o="number"),null!=n&&n===n&&("number"!==o||ot.cssNumber[s]||(n+="px"),rt.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{l[t]=n}catch(c){}}},css:function(e,t,n,r){var i,o,a,s=ot.camelCase(t);return t=ot.cssProps[s]||(ot.cssProps[s]=N(e.style,s)),a=ot.cssHooks[t]||ot.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=rn(e,t,r)),"normal"===o&&t in fn&&(o=fn[t]),""===n||n?(i=parseFloat(o),n===!0||ot.isNumeric(i)?i||0:o):o}}),ot.each(["height","width"],function(e,t){ot.cssHooks[t]={get:function(e,n,r){return n?ln.test(ot.css(e,"display"))&&0===e.offsetWidth?ot.swap(e,dn,function(){return j(e,t,r)}):j(e,t,r):void 0},set:function(e,n,r){var i=r&&nn(e);return A(e,n,r?D(e,t,r,rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,i),i):0)}}}),rt.opacity||(ot.cssHooks.opacity={get:function(e,t){return sn.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=ot.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===ot.trim(o.replace(an,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=an.test(o)?o.replace(an,i):o+" "+i)}}),ot.cssHooks.marginRight=E(rt.reliableMarginRight,function(e,t){return t?ot.swap(e,{display:"inline-block"},rn,[e,"marginRight"]):void 0}),ot.each({margin:"",padding:"",border:"Width"},function(e,t){ot.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+Nt[r]+t]=o[r]||o[r-2]||o[0];return i}},en.test(e)||(ot.cssHooks[e+t].set=A)}),ot.fn.extend({css:function(e,t){return At(this,function(e,t,n){var r,i,o={},a=0;if(ot.isArray(t)){for(r=nn(e),i=t.length;i>a;a++)o[t[a]]=ot.css(e,t[a],!1,r);return o}return void 0!==n?ot.style(e,t,n):ot.css(e,t)},e,t,arguments.length>1)},show:function(){return L(this,!0)},hide:function(){return L(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?ot(this).show():ot(this).hide()})}}),ot.Tween=R,R.prototype={constructor:R,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ot.cssNumber[n]?"":"px")},cur:function(){var e=R.propHooks[this.prop];return e&&e.get?e.get(this):R.propHooks._default.get(this)},run:function(e){var t,n=R.propHooks[this.prop];return this.pos=t=this.options.duration?ot.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):R.propHooks._default.set(this),this}},R.prototype.init.prototype=R.prototype,R.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=ot.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){ot.fx.step[e.prop]?ot.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[ot.cssProps[e.prop]]||ot.cssHooks[e.prop])?ot.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},R.propHooks.scrollTop=R.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ot.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},ot.fx=R.prototype.init,ot.fx.step={};var hn,mn,gn=/^(?:toggle|show|hide)$/,vn=new RegExp("^(?:([+-])=|)("+Et+")([a-z%]*)$","i"),yn=/queueHooks$/,bn=[O],xn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=vn.exec(t),o=i&&i[3]||(ot.cssNumber[e]?"":"px"),a=(ot.cssNumber[e]||"px"!==o&&+r)&&vn.exec(ot.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,ot.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};ot.Animation=ot.extend(M,{tweener:function(e,t){ot.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],xn[n]=xn[n]||[],xn[n].unshift(t)},prefilter:function(e,t){t?bn.unshift(e):bn.push(e)}}),ot.speed=function(e,t,n){var r=e&&"object"==typeof e?ot.extend({},e):{complete:n||!n&&t||ot.isFunction(e)&&e,duration:e,easing:n&&t||t&&!ot.isFunction(t)&&t};return r.duration=ot.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in ot.fx.speeds?ot.fx.speeds[r.duration]:ot.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){ot.isFunction(r.old)&&r.old.call(this),r.queue&&ot.dequeue(this,r.queue)},r},ot.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=ot.isEmptyObject(e),o=ot.speed(t,n,r),a=function(){var t=M(this,ot.extend({},e),o);(i||ot._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=ot.timers,a=ot._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&yn.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&ot.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=ot._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=ot.timers,a=r?r.length:0;for(n.finish=!0,ot.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),ot.each(["toggle","show","hide"],function(e,t){var n=ot.fn[t];ot.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(_(t,!0),e,r,i)}}),ot.each({slideDown:_("show"),slideUp:_("hide"),slideToggle:_("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){ot.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),ot.timers=[],ot.fx.tick=function(){var e,t=ot.timers,n=0;for(hn=ot.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||ot.fx.stop(),hn=void 0},ot.fx.timer=function(e){ot.timers.push(e),e()?ot.fx.start():ot.timers.pop()},ot.fx.interval=13,ot.fx.start=function(){mn||(mn=setInterval(ot.fx.tick,ot.fx.interval))},ot.fx.stop=function(){clearInterval(mn),mn=null},ot.fx.speeds={slow:600,fast:200,_default:400},ot.fn.delay=function(e,t){return e=ot.fx?ot.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e,t,n,r,i;t=mt.createElement("div"),t.setAttribute("className","t"),t.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=t.getElementsByTagName("a")[0],n=mt.createElement("select"),i=n.appendChild(mt.createElement("option")),e=t.getElementsByTagName("input")[0],r.style.cssText="top:1px",rt.getSetAttribute="t"!==t.className,rt.style=/top/.test(r.getAttribute("style")),rt.hrefNormalized="/a"===r.getAttribute("href"),rt.checkOn=!!e.value,rt.optSelected=i.selected,rt.enctype=!!mt.createElement("form").enctype,n.disabled=!0,rt.optDisabled=!i.disabled,e=mt.createElement("input"),e.setAttribute("value",""),rt.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),rt.radioValue="t"===e.value}();var wn=/\r/g;ot.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=ot.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ot(this).val()):e,null==i?i="":"number"==typeof i?i+="":ot.isArray(i)&&(i=ot.map(i,function(e){return null==e?"":e+""})),t=ot.valHooks[this.type]||ot.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=ot.valHooks[i.type]||ot.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(wn,""):null==n?"":n)):void 0}}),ot.extend({valHooks:{option:{get:function(e){var t=ot.find.attr(e,"value");return null!=t?t:ot.trim(ot.text(e))}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(rt.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&ot.nodeName(n.parentNode,"optgroup"))){if(t=ot(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=ot.makeArray(t),a=i.length;a--;)if(r=i[a],ot.inArray(ot.valHooks.option.get(r),o)>=0)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),ot.each(["radio","checkbox"],function(){ot.valHooks[this]={set:function(e,t){return ot.isArray(t)?e.checked=ot.inArray(ot(e).val(),t)>=0:void 0}},rt.checkOn||(ot.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Cn,Sn,kn=ot.expr.attrHandle,Tn=/^(?:checked|selected)$/i,$n=rt.getSetAttribute,En=rt.input;ot.fn.extend({attr:function(e,t){return At(this,ot.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){ot.removeAttr(this,e)})}}),ot.extend({attr:function(e,t,n){var r,i,o=e.nodeType;return e&&3!==o&&8!==o&&2!==o?typeof e.getAttribute===St?ot.prop(e,t,n):(1===o&&ot.isXMLDoc(e)||(t=t.toLowerCase(),r=ot.attrHooks[t]||(ot.expr.match.bool.test(t)?Sn:Cn)),void 0===n?r&&"get"in r&&null!==(i=r.get(e,t))?i:(i=ot.find.attr(e,t),null==i?void 0:i):null!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):void ot.removeAttr(e,t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(xt);if(o&&1===e.nodeType)for(;n=o[i++];)r=ot.propFix[n]||n,ot.expr.match.bool.test(n)?En&&$n||!Tn.test(n)?e[r]=!1:e[ot.camelCase("default-"+n)]=e[r]=!1:ot.attr(e,n,""),e.removeAttribute($n?n:r)},attrHooks:{type:{set:function(e,t){if(!rt.radioValue&&"radio"===t&&ot.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),Sn={set:function(e,t,n){return t===!1?ot.removeAttr(e,n):En&&$n||!Tn.test(n)?e.setAttribute(!$n&&ot.propFix[n]||n,n):e[ot.camelCase("default-"+n)]=e[n]=!0,n}},ot.each(ot.expr.match.bool.source.match(/\w+/g),function(e,t){var n=kn[t]||ot.find.attr;kn[t]=En&&$n||!Tn.test(t)?function(e,t,r){var i,o;return r||(o=kn[t],kn[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,kn[t]=o),i}:function(e,t,n){return n?void 0:e[ot.camelCase("default-"+t)]?t.toLowerCase():null}}),En&&$n||(ot.attrHooks.value={set:function(e,t,n){return ot.nodeName(e,"input")?void(e.defaultValue=t):Cn&&Cn.set(e,t,n)}}),$n||(Cn={set:function(e,t,n){var r=e.getAttributeNode(n);return r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n)?t:void 0}},kn.id=kn.name=kn.coords=function(e,t,n){var r;return n?void 0:(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},ot.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:void 0},set:Cn.set},ot.attrHooks.contenteditable={set:function(e,t,n){Cn.set(e,""===t?!1:t,n)}},ot.each(["width","height"],function(e,t){ot.attrHooks[t]={set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}}})),rt.style||(ot.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Nn=/^(?:input|select|textarea|button|object)$/i,Ln=/^(?:a|area)$/i;ot.fn.extend({prop:function(e,t){return At(this,ot.prop,e,t,arguments.length>1)},removeProp:function(e){return e=ot.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),ot.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,a=e.nodeType;return e&&3!==a&&8!==a&&2!==a?(o=1!==a||!ot.isXMLDoc(e),o&&(t=ot.propFix[t]||t,i=ot.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]):void 0},propHooks:{tabIndex:{get:function(e){var t=ot.find.attr(e,"tabindex");return t?parseInt(t,10):Nn.test(e.nodeName)||Ln.test(e.nodeName)&&e.href?0:-1}}}}),rt.hrefNormalized||ot.each(["href","src"],function(e,t){ot.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),rt.optSelected||(ot.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),ot.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ot.propFix[this.toLowerCase()]=this}),rt.enctype||(ot.propFix.enctype="encoding");var An=/[\t\r\n\f]/g;ot.fn.extend({addClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,c="string"==typeof e&&e;if(ot.isFunction(e))return this.each(function(t){ot(this).addClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(xt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(An," "):" ")){for(o=0;i=t[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=ot.trim(r),n.className!==a&&(n.className=a)}return this},removeClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,c=0===arguments.length||"string"==typeof e&&e;if(ot.isFunction(e))return this.each(function(t){ot(this).removeClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(xt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(An," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");a=e?ot.trim(r):"",n.className!==a&&(n.className=a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):this.each(ot.isFunction(e)?function(n){ot(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var t,r=0,i=ot(this),o=e.match(xt)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else(n===St||"boolean"===n)&&(this.className&&ot._data(this,"__className__",this.className),this.className=this.className||e===!1?"":ot._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(An," ").indexOf(t)>=0)return!0;return!1}}),ot.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ot.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ot.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Dn=ot.now(),jn=/\?/,Rn=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;ot.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=ot.trim(t+"");return i&&!ot.trim(i.replace(Rn,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():ot.error("Invalid JSON: "+t)},ot.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new DOMParser,n=r.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||ot.error("Invalid XML: "+t),n};var Pn,_n,Hn=/#.*$/,On=/([?&])_=[^&]*/,qn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Mn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,zn=/^(?:GET|HEAD)$/,Fn=/^\/\//,In=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Bn={},Wn={},Un="*/".concat("*");try{_n=location.href}catch(Xn){_n=mt.createElement("a"),_n.href="",_n=_n.href}Pn=In.exec(_n.toLowerCase())||[],ot.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:_n,type:"GET",isLocal:Mn.test(Pn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Un,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ot.parseJSON,"text xml":ot.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?I(I(e,ot.ajaxSettings),t):I(ot.ajaxSettings,e)},ajaxPrefilter:z(Bn),ajaxTransport:z(Wn),ajax:function(e,t){function n(e,t,n,r){var i,u,v,y,x,C=t;2!==b&&(b=2,s&&clearTimeout(s),c=void 0,a=r||"",w.readyState=e>0?4:0,i=e>=200&&300>e||304===e,n&&(y=B(d,w,n)),y=W(d,y,w,i),i?(d.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(ot.lastModified[o]=x),x=w.getResponseHeader("etag"),x&&(ot.etag[o]=x)),204===e||"HEAD"===d.type?C="nocontent":304===e?C="notmodified":(C=y.state,u=y.data,v=y.error,i=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),w.status=e,w.statusText=(t||C)+"",i?h.resolveWith(f,[u,C,w]):h.rejectWith(f,[w,C,v]),w.statusCode(g),g=void 0,l&&p.trigger(i?"ajaxSuccess":"ajaxError",[w,d,i?u:v]),m.fireWith(f,[w,C]),l&&(p.trigger("ajaxComplete",[w,d]),--ot.active||ot.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,a,s,l,c,u,d=ot.ajaxSetup({},t),f=d.context||d,p=d.context&&(f.nodeType||f.jquery)?ot(f):ot.event,h=ot.Deferred(),m=ot.Callbacks("once memory"),g=d.statusCode||{},v={},y={},b=0,x="canceled",w={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!u)for(u={};t=qn.exec(a);)u[t[1].toLowerCase()]=t[2];t=u[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)g[t]=[g[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||x;return c&&c.abort(t),n(0,t),this}};if(h.promise(w).complete=m.add,w.success=w.done,w.error=w.fail,d.url=((e||d.url||_n)+"").replace(Hn,"").replace(Fn,Pn[1]+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=ot.trim(d.dataType||"*").toLowerCase().match(xt)||[""],null==d.crossDomain&&(r=In.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]===Pn[1]&&r[2]===Pn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(Pn[3]||("http:"===Pn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=ot.param(d.data,d.traditional)),F(Bn,d,t,w),2===b)return w;l=d.global,l&&0===ot.active++&&ot.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!zn.test(d.type),o=d.url,d.hasContent||(d.data&&(o=d.url+=(jn.test(o)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=On.test(o)?o.replace(On,"$1_="+Dn++):o+(jn.test(o)?"&":"?")+"_="+Dn++)),d.ifModified&&(ot.lastModified[o]&&w.setRequestHeader("If-Modified-Since",ot.lastModified[o]),ot.etag[o]&&w.setRequestHeader("If-None-Match",ot.etag[o])),(d.data&&d.hasContent&&d.contentType!==!1||t.contentType)&&w.setRequestHeader("Content-Type",d.contentType),w.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Un+"; q=0.01":""):d.accepts["*"]); for(i in d.headers)w.setRequestHeader(i,d.headers[i]);if(d.beforeSend&&(d.beforeSend.call(f,w,d)===!1||2===b))return w.abort();x="abort";for(i in{success:1,error:1,complete:1})w[i](d[i]);if(c=F(Wn,d,t,w)){w.readyState=1,l&&p.trigger("ajaxSend",[w,d]),d.async&&d.timeout>0&&(s=setTimeout(function(){w.abort("timeout")},d.timeout));try{b=1,c.send(v,n)}catch(C){if(!(2>b))throw C;n(-1,C)}}else n(-1,"No Transport");return w},getJSON:function(e,t,n){return ot.get(e,t,n,"json")},getScript:function(e,t){return ot.get(e,void 0,t,"script")}}),ot.each(["get","post"],function(e,t){ot[t]=function(e,n,r,i){return ot.isFunction(n)&&(i=i||r,r=n,n=void 0),ot.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),ot.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ot.fn[t]=function(e){return this.on(t,e)}}),ot._evalUrl=function(e){return ot.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},ot.fn.extend({wrapAll:function(e){if(ot.isFunction(e))return this.each(function(t){ot(this).wrapAll(e.call(this,t))});if(this[0]){var t=ot(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(ot.isFunction(e)?function(t){ot(this).wrapInner(e.call(this,t))}:function(){var t=ot(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ot.isFunction(e);return this.each(function(n){ot(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ot.nodeName(this,"body")||ot(this).replaceWith(this.childNodes)}).end()}}),ot.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!rt.reliableHiddenOffsets()&&"none"===(e.style&&e.style.display||ot.css(e,"display"))},ot.expr.filters.visible=function(e){return!ot.expr.filters.hidden(e)};var Zn=/%20/g,Gn=/\[\]$/,Vn=/\r?\n/g,Qn=/^(?:submit|button|image|reset|file)$/i,Yn=/^(?:input|select|textarea|keygen)/i;ot.param=function(e,t){var n,r=[],i=function(e,t){t=ot.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ot.ajaxSettings&&ot.ajaxSettings.traditional),ot.isArray(e)||e.jquery&&!ot.isPlainObject(e))ot.each(e,function(){i(this.name,this.value)});else for(n in e)U(n,e[n],t,i);return r.join("&").replace(Zn,"+")},ot.fn.extend({serialize:function(){return ot.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ot.prop(this,"elements");return e?ot.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ot(this).is(":disabled")&&Yn.test(this.nodeName)&&!Qn.test(e)&&(this.checked||!Dt.test(e))}).map(function(e,t){var n=ot(this).val();return null==n?null:ot.isArray(n)?ot.map(n,function(e){return{name:t.name,value:e.replace(Vn,"\r\n")}}):{name:t.name,value:n.replace(Vn,"\r\n")}}).get()}}),ot.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&X()||Z()}:X;var Kn=0,Jn={},er=ot.ajaxSettings.xhr();e.ActiveXObject&&ot(e).on("unload",function(){for(var e in Jn)Jn[e](void 0,!0)}),rt.cors=!!er&&"withCredentials"in er,er=rt.ajax=!!er,er&&ot.ajaxTransport(function(e){if(!e.crossDomain||rt.cors){var t;return{send:function(n,r){var i,o=e.xhr(),a=++Kn;if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)void 0!==n[i]&&o.setRequestHeader(i,n[i]+"");o.send(e.hasContent&&e.data||null),t=function(n,i){var s,l,c;if(t&&(i||4===o.readyState))if(delete Jn[a],t=void 0,o.onreadystatechange=ot.noop,i)4!==o.readyState&&o.abort();else{c={},s=o.status,"string"==typeof o.responseText&&(c.text=o.responseText);try{l=o.statusText}catch(u){l=""}s||!e.isLocal||e.crossDomain?1223===s&&(s=204):s=c.text?200:404}c&&r(s,l,c,o.getAllResponseHeaders())},e.async?4===o.readyState?setTimeout(t):o.onreadystatechange=Jn[a]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),ot.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return ot.globalEval(e),e}}}),ot.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),ot.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=mt.head||ot("head")[0]||mt.documentElement;return{send:function(r,i){t=mt.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var tr=[],nr=/(=)\?(?=&|$)|\?\?/;ot.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=tr.pop()||ot.expando+"_"+Dn++;return this[e]=!0,e}}),ot.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(nr.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&nr.test(t.data)&&"data");return s||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=ot.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(nr,"$1"+i):t.jsonp!==!1&&(t.url+=(jn.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||ot.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,tr.push(i)),a&&ot.isFunction(o)&&o(a[0]),a=o=void 0}),"script"):void 0}),ot.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||mt;var r=ft.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=ot.buildFragment([e],t,i),i&&i.length&&ot(i).remove(),ot.merge([],r.childNodes))};var rr=ot.fn.load;ot.fn.load=function(e,t,n){if("string"!=typeof e&&rr)return rr.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>=0&&(r=ot.trim(e.slice(s,e.length)),e=e.slice(0,s)),ot.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(o="POST"),a.length>0&&ot.ajax({url:e,type:o,dataType:"html",data:t}).done(function(e){i=arguments,a.html(r?ot("<div>").append(ot.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){a.each(n,i||[e.responseText,t,e])}),this},ot.expr.filters.animated=function(e){return ot.grep(ot.timers,function(t){return e===t.elem}).length};var ir=e.document.documentElement;ot.offset={setOffset:function(e,t,n){var r,i,o,a,s,l,c,u=ot.css(e,"position"),d=ot(e),f={};"static"===u&&(e.style.position="relative"),s=d.offset(),o=ot.css(e,"top"),l=ot.css(e,"left"),c=("absolute"===u||"fixed"===u)&&ot.inArray("auto",[o,l])>-1,c?(r=d.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(l)||0),ot.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):d.css(f)}},ot.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){ot.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;return o?(t=o.documentElement,ot.contains(t,i)?(typeof i.getBoundingClientRect!==St&&(r=i.getBoundingClientRect()),n=G(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r):void 0},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===ot.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),ot.nodeName(e[0],"html")||(n=e.offset()),n.top+=ot.css(e[0],"borderTopWidth",!0),n.left+=ot.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-ot.css(r,"marginTop",!0),left:t.left-n.left-ot.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||ir;e&&!ot.nodeName(e,"html")&&"static"===ot.css(e,"position");)e=e.offsetParent;return e||ir})}}),ot.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);ot.fn[e]=function(r){return At(this,function(e,r,i){var o=G(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?ot(o).scrollLeft():i,n?i:ot(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),ot.each(["top","left"],function(e,t){ot.cssHooks[t]=E(rt.pixelPosition,function(e,n){return n?(n=rn(e,t),tn.test(n)?ot(e).position()[t]+"px":n):void 0})}),ot.each({Height:"height",Width:"width"},function(e,t){ot.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){ot.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return At(this,function(t,n,r){var i;return ot.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?ot.css(t,n,a):ot.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),ot.fn.size=function(){return this.length},ot.fn.andSelf=ot.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return ot});var or=e.jQuery,ar=e.$;return ot.noConflict=function(t){return e.$===ot&&(e.$=ar),t&&e.jQuery===ot&&(e.jQuery=or),ot},typeof t===St&&(e.jQuery=e.$=ot),ot}),!function(){var e=null;window.PR_SHOULD_USE_CONTINUATION=!0,function(){function t(e){function t(e){var t=e.charCodeAt(0);if(92!==t)return t;var n=e.charAt(1);return(t=d[n])?t:n>="0"&&"7">=n?parseInt(e.substring(1),8):"u"===n||"x"===n?parseInt(e.substring(2),16):e.charCodeAt(1)}function n(e){return 32>e?(16>e?"\\x0":"\\x")+e.toString(16):(e=String.fromCharCode(e),"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e)}function r(e){var r=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],i="^"===r[0],o=["["];i&&o.push("^");for(var i=i?1:0,a=r.length;a>i;++i){var s=r[i];if(/\\[bdsw]/i.test(s))o.push(s);else{var s=t(s),l;a>i+2&&"-"===r[i+1]?(l=t(r[i+2]),i+=2):l=s,e.push([s,l]),65>l||s>122||(65>l||s>90||e.push([32|Math.max(65,s),32|Math.min(l,90)]),97>l||s>122||e.push([-33&Math.max(97,s),-33&Math.min(l,122)]))}}for(e.sort(function(e,t){return e[0]-t[0]||t[1]-e[1]}),r=[],a=[],i=0;i<e.length;++i)s=e[i],s[0]<=a[1]+1?a[1]=Math.max(a[1],s[1]):r.push(a=s);for(i=0;i<r.length;++i)s=r[i],o.push(n(s[0])),s[1]>s[0]&&(s[1]+1>s[0]&&o.push("-"),o.push(n(s[1])));return o.push("]"),o.join("")}function i(e){for(var t=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),i=t.length,s=[],l=0,c=0;i>l;++l){var u=t[l];"("===u?++c:"\\"===u.charAt(0)&&(u=+u.substring(1))&&(c>=u?s[u]=-1:t[l]=n(u))}for(l=1;l<s.length;++l)-1===s[l]&&(s[l]=++o);for(c=l=0;i>l;++l)u=t[l],"("===u?(++c,s[c]||(t[l]="(?:")):"\\"===u.charAt(0)&&(u=+u.substring(1))&&c>=u&&(t[l]="\\"+s[u]);for(l=0;i>l;++l)"^"===t[l]&&"^"!==t[l+1]&&(t[l]="");if(e.ignoreCase&&a)for(l=0;i>l;++l)u=t[l],e=u.charAt(0),u.length>=2&&"["===e?t[l]=r(u):"\\"!==e&&(t[l]=u.replace(/[A-Za-z]/g,function(e){return e=e.charCodeAt(0),"["+String.fromCharCode(-33&e,32|e)+"]"}));return t.join("")}for(var o=0,a=!1,s=!1,l=0,c=e.length;c>l;++l){var u=e[l];if(u.ignoreCase)s=!0;else if(/[a-z]/i.test(u.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){a=!0,s=!1;break}}for(var d={b:8,t:9,n:10,v:11,f:12,r:13},f=[],l=0,c=e.length;c>l;++l){if(u=e[l],u.global||u.multiline)throw Error(""+u);f.push("(?:"+i(u)+")")}return RegExp(f.join("|"),s?"gi":"g")}function n(e,t){function n(e){var l=e.nodeType;if(1==l){if(!r.test(e.className)){for(l=e.firstChild;l;l=l.nextSibling)n(l);l=e.nodeName.toLowerCase(),("br"===l||"li"===l)&&(i[s]="\n",a[s<<1]=o++,a[s++<<1|1]=e)}}else(3==l||4==l)&&(l=e.nodeValue,l.length&&(l=t?l.replace(/\r\n?/g,"\n"):l.replace(/[\t\n\r ]+/g," "),i[s]=l,a[s<<1]=o,o+=l.length,a[s++<<1|1]=e))}var r=/(?:^|\s)nocode(?:\s|$)/,i=[],o=0,a=[],s=0;return n(e),{a:i.join("").replace(/\n$/,""),d:a}}function r(e,t,n,r){t&&(e={a:t,e:e},n(e),r.push.apply(r,e.g))}function i(e){for(var t=void 0,n=e.firstChild;n;n=n.nextSibling)var r=n.nodeType,t=1===r?t?e:n:3===r&&w.test(n.nodeValue)?e:t;return t===e?void 0:t}function o(n,i){function o(e){for(var t=e.e,n=[t,"pln"],u=0,d=e.a.match(s)||[],f={},p=0,h=d.length;h>p;++p){var m=d[p],g=f[m],v=void 0,y;if("string"==typeof g)y=!1;else{var b=a[m.charAt(0)];if(b)v=m.match(b[1]),g=b[0];else{for(y=0;l>y;++y)if(b=i[y],v=m.match(b[1])){g=b[0];break}v||(g="pln")}!(y=g.length>=5&&"lang-"===g.substring(0,5))||v&&"string"==typeof v[1]||(y=!1,g="src"),y||(f[m]=g)}if(b=u,u+=m.length,y){y=v[1];var x=m.indexOf(y),w=x+y.length;v[2]&&(w=m.length-v[2].length,x=w-y.length),g=g.substring(5),r(t+b,m.substring(0,x),o,n),r(t+b+x,y,c(g,y),n),r(t+b+w,m.substring(w),o,n)}else n.push(t+b,g)}e.g=n}var a={},s;!function(){for(var r=n.concat(i),o=[],l={},c=0,u=r.length;u>c;++c){var d=r[c],f=d[3];if(f)for(var p=f.length;--p>=0;)a[f.charAt(p)]=d;d=d[1],f=""+d,l.hasOwnProperty(f)||(o.push(d),l[f]=e)}o.push(/[\S\s]/),s=t(o)}();var l=i.length;return o}function a(t){var n=[],r=[];n.push(t.tripleQuotedStrings?["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,e,"'\""]:t.multiLineStrings?["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,e,"'\"`"]:["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,e,"\"'"]),t.verbatimStrings&&r.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,e]);var i=t.hashComments;if(i&&(t.cStyleComments?(n.push(i>1?["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,e,"#"]:["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,e,"#"]),r.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,e])):n.push(["com",/^#[^\n\r]*/,e,"#"])),t.cStyleComments&&(r.push(["com",/^\/\/[^\n\r]*/,e]),r.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,e])),i=t.regexLiterals){var a=(i=i>1?"":"\n\r")?".":"[\\S\\s]";r.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+i+"])(?:[^/\\x5B\\x5C"+i+"]|\\x5C"+a+"|\\x5B(?:[^\\x5C\\x5D"+i+"]|\\x5C"+a+")*(?:\\x5D|$))+/")+")")])}return(i=t.types)&&r.push(["typ",i]),i=(""+t.keywords).replace(/^ | $/g,""),i.length&&r.push(["kwd",RegExp("^(?:"+i.replace(/[\s,]+/g,"|")+")\\b"),e]),n.push(["pln",/^\s+/,e," \r\n "]),i="^.[^\\s\\w.$@'\"`/\\\\]*",t.regexLiterals&&(i+="(?!s*/)"),r.push(["lit",/^@[$_a-z][\w$@]*/i,e],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,e],["pln",/^[$_a-z][\w$@]*/i,e],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,e,"0123456789"],["pln",/^\\[\S\s]?/,e],["pun",RegExp(i),e]),o(n,r)}function s(e,t,n){function r(e){var t=e.nodeType;if(1!=t||o.test(e.className)){if((3==t||4==t)&&n){var l=e.nodeValue,c=l.match(a);c&&(t=l.substring(0,c.index),e.nodeValue=t,(l=l.substring(c.index+c[0].length))&&e.parentNode.insertBefore(s.createTextNode(l),e.nextSibling),i(e),t||e.parentNode.removeChild(e))}}else if("br"===e.nodeName)i(e),e.parentNode&&e.parentNode.removeChild(e);else for(e=e.firstChild;e;e=e.nextSibling)r(e)}function i(e){function t(e,n){var r=n?e.cloneNode(!1):e,i=e.parentNode;if(i){var i=t(i,1),o=e.nextSibling;i.appendChild(r);for(var a=o;a;a=o)o=a.nextSibling,i.appendChild(a)}return r}for(;!e.nextSibling;)if(e=e.parentNode,!e)return;for(var e=t(e.nextSibling,0),n;(n=e.parentNode)&&1===n.nodeType;)e=n;c.push(e)}for(var o=/(?:^|\s)nocode(?:\s|$)/,a=/\r\n?|\n/,s=e.ownerDocument,l=s.createElement("li");e.firstChild;)l.appendChild(e.firstChild);for(var c=[l],u=0;u<c.length;++u)r(c[u]);t===(0|t)&&c[0].setAttribute("value",t);var d=s.createElement("ol");d.className="linenums";for(var t=Math.max(0,t-1|0)||0,u=0,f=c.length;f>u;++u)l=c[u],l.setAttribute("rel","L"+(u+t+1)),l.className="L"+(u+t+1),l.firstChild||l.appendChild(s.createTextNode(" ")),d.appendChild(l);e.appendChild(d)}function l(e,t){for(var n=t.length;--n>=0;){var r=t[n];S.hasOwnProperty(r)?d.console&&console.warn("cannot override language handler %s",r):S[r]=e}}function c(e,t){return e&&S.hasOwnProperty(e)||(e=/^\s*</.test(t)?"default-markup":"default-code"),S[e]}function u(e){var t=e.h;try{var r=n(e.c,e.i),i=r.a;e.a=i,e.d=r.d,e.e=0,c(t,i)(e);var o=/\bMSIE\s(\d+)/.exec(navigator.userAgent),o=o&&+o[1]<=8,t=/\n/g,a=e.a,s=a.length,r=0,l=e.d,u=l.length,i=0,f=e.g,p=f.length,h=0;f[p]=s;var m,g;for(g=m=0;p>g;)f[g]!==f[g+2]?(f[m++]=f[g++],f[m++]=f[g++]):g+=2;for(p=m,g=m=0;p>g;){for(var v=f[g],y=f[g+1],b=g+2;p>=b+2&&f[b+1]===y;)b+=2;f[m++]=v,f[m++]=y,g=b}f.length=m;var x=e.c,w;x&&(w=x.style.display,x.style.display="none");try{for(;u>i;){var C=l[i+2]||s,S=f[h+2]||s,b=Math.min(C,S),k=l[i+1],T;if(1!==k.nodeType&&(T=a.substring(r,b))){o&&(T=T.replace(t,"\r")),k.nodeValue=T;var E=k.ownerDocument,N=E.createElement("span");N.className=f[h+1];var L=k.parentNode;L.replaceChild(N,k),N.appendChild(k),C>r&&(l[i+1]=k=E.createTextNode(a.substring(b,C)),L.insertBefore(k,N.nextSibling))}r=b,r>=C&&(i+=2),r>=S&&(h+=2)}}finally{x&&(x.style.display=w)}}catch(A){d.console&&console.log(A&&A.stack||A)}}var d=window,f=["break,continue,do,else,for,if,return,while"],p=[[f,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],h=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],m=[p,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],g=[m,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],p=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],v=[f,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],y=[f,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],b=[f,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],f=[f,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],x=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,w=/\S/,C=a({keywords:[h,g,p,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",v,y,f],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),S={};l(C,["default-code"]),l(o([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]),l(o([["pln",/^\s+/,e," \r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,e,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]),l(o([],[["atv",/^[\S\s]+/]]),["uq.val"]),l(a({keywords:h,hashComments:!0,cStyleComments:!0,types:x}),["c","cc","cpp","cxx","cyc","m"]),l(a({keywords:"null,true,false"}),["json"]),l(a({keywords:g,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:x}),["cs"]),l(a({keywords:m,cStyleComments:!0}),["java"]),l(a({keywords:f,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]),l(a({keywords:v,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]),l(a({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]),l(a({keywords:y,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]),l(a({keywords:p,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]),l(a({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]),l(a({keywords:b,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]),l(o([],[["str",/^[\S\s]+/]]),["regex"]);var k=d.PR={createSimpleLexer:o,registerLangHandler:l,sourceDecorator:a,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:d.prettyPrintOne=function(e,t,n){var r=document.createElement("div");return r.innerHTML="<pre>"+e+"</pre>",r=r.firstChild,n&&s(r,n,!0),u({h:t,j:n,c:r,i:1}),r.innerHTML},prettyPrint:d.prettyPrint=function(t,n){function r(){for(var n=d.PR_SHOULD_USE_CONTINUATION?h.now()+250:1/0;m<l.length&&h.now()<n;m++){for(var o=l[m],c=S,f=o;f=f.previousSibling;){var p=f.nodeType,k=(7===p||8===p)&&f.nodeValue;if(k?!/^\??prettify\b/.test(k):3!==p||/\S/.test(f.nodeValue))break;if(k){c={},k.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(e,t,n){c[t]=n});break}}if(f=o.className,(c!==S||y.test(f))&&!b.test(f)){for(p=!1,k=o.parentNode;k;k=k.parentNode)if(C.test(k.tagName)&&k.className&&y.test(k.className)){p=!0;break}if(!p){if(o.className+=" prettyprinted",p=c.lang,!p){var p=f.match(v),T;!p&&(T=i(o))&&w.test(T.tagName)&&(p=T.className.match(v)),p&&(p=p[1])}if(x.test(o.tagName))k=1;else var k=o.currentStyle,E=a.defaultView,k=(k=k?k.whiteSpace:E&&E.getComputedStyle?E.getComputedStyle(o,e).getPropertyValue("white-space"):0)&&"pre"===k.substring(0,3);E=c.linenums,(E="true"===E||+E)||(E=(E=f.match(/\blinenums\b(?::(\d+))?/))?E[1]&&E[1].length?+E[1]:!0:!1),E&&s(o,E,k),g={h:p,c:o,j:E,i:k},u(g)}}}m<l.length?setTimeout(r,250):"function"==typeof t&&t()}for(var o=n||document.body,a=o.ownerDocument||document,o=[o.getElementsByTagName("pre"),o.getElementsByTagName("code"),o.getElementsByTagName("xmp")],l=[],c=0;c<o.length;++c)for(var f=0,p=o[c].length;p>f;++f)l.push(o[c][f]);var o=e,h=Date;h.now||(h={now:function(){return+new Date}});var m=0,g,v=/\blang(?:uage)?-([\w.]+)(?!\S)/,y=/\bprettyprint\b/,b=/\bprettyprinted\b/,x=/pre|xmp/i,w=/^code$/i,C=/^(?:pre|code|xmp)$/i,S={};r()}};"function"==typeof define&&define.amd&&define("google-code-prettify",[],function(){return k})}()}(),PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\n\r]*/,null,"#"],["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[!-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["apollo","agc","aea"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^"(?:[^\n\r"\\]|\\.)*(?:"|$)/,a,'"'],["pln",/^\s+/,a," \r\n "]],[["com",/^REM[^\n\r]*/,a],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,a],["pln",/^[a-z][^\W_]?(?:\$|%)?/i,a],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i,a,"0123456789"],["pun",/^.[^\s\w"$%.]*/,a]]),["basic","cbm"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[([{]+/,a,"([{"],["clo",/^[)\]}]+/,a,")]}"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,a],["typ",/^:[\dA-Za-z-]+/]]),["clj"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \r\n\f"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]+)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}\b/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]),PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]),PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "]],[["com",/^#!.*/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/.*/],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],["typ",/^\b(?:bool|double|dynamic|int|num|object|string|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?'''[\S\s]*?[^\\]'''/],["str",/^r?"""[\S\s]*?[^\\]"""/],["str",/^r?'('|[^\n\f\r]*?[^\\]')/],["str",/^r?"("|[^\n\f\r]*?[^\\]")/],["pln",/^[$_a-z]\w*/i],["pun",/^[!%&*+/:<-?^|~-]/],["lit",/^\b0x[\da-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(),.;[\]{}]/]]),["dart"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null," \n\f\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["lit",/^[a-z]\w*/],["lit",/^'(?:[^\n\f\r'\\]|\\[^&])+'?/,null,"'"],["lit",/^\?[^\t\n ({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],["kwd",/^-[_a-z]+/],["typ",/^[A-Z_]\w*/],["pun",/^[,.;]/]]),["erlang","erl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null," \n\f\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/,null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","lsp","scm","ss","rkt"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^!?"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["com",/^;[^\n\r]*/,null,";"]],[["pln",/^[!%@](?:[$\-.A-Z_a-z][\w$\-.]*|\d+)/],["kwd",/^[^\W\d]\w*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[Xx][\dA-Fa-f]+)/],["pun",/^[(-*,:<->[\]{}]|\.\.\.$/]]),["llvm","ll"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:[^"]|\\.)*"/,null,'"']],[["com",/^;[^\n\r]*/,null,";"],["dec",/^\$(?:d|device|ec|ecode|es|estack|et|etrap|h|horolog|i|io|j|job|k|key|p|principal|q|quit|st|stack|s|storage|sy|system|t|test|tl|tlevel|tr|trestart|x|y|z[a-z]*|a|ascii|c|char|d|data|e|extract|f|find|fn|fnumber|g|get|j|justify|l|length|na|name|o|order|p|piece|ql|qlength|qs|qsubscript|q|query|r|random|re|reverse|s|select|st|stack|t|text|tr|translate|nan)\b/i,null],["kwd",/^(?:[^$]b|break|c|close|d|do|e|else|f|for|g|goto|h|halt|h|hang|i|if|j|job|k|kill|l|lock|m|merge|n|new|o|open|q|quit|r|read|s|set|tc|tcommit|tre|trestart|tro|trollback|ts|tstart|u|use|v|view|w|write|x|xecute)\b/i,null],["lit",/^[+-]?(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?/i],["pln",/^[a-z][^\W_]*/i],["pun",/^[^\w\t\n\r"$%;^\xa0]|_/]]),["mumps"]); -var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n "]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n "]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]),PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null," \n\r \u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“”'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null," abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]),PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);var a=null,a=null;PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]),function(e){e.fn.zclip=function(t){if("object"==typeof t&&!t.length){var n=e.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:!0,setHandCursor:!0,setCSSEffects:!0},t);return this.each(function(){var t=e(this);if(t.is(":visible")&&("string"==typeof n.copy||e.isFunction(n.copy))){ZeroClipboard.setMoviePath(n.path);var r=new ZeroClipboard.Client;e.isFunction(n.copy)&&t.bind("zClip_copy",n.copy),e.isFunction(n.beforeCopy)&&t.bind("zClip_beforeCopy",n.beforeCopy),e.isFunction(n.afterCopy)&&t.bind("zClip_afterCopy",n.afterCopy),r.setHandCursor(n.setHandCursor),r.setCSSEffects(n.setCSSEffects),r.addEventListener("mouseOver",function(e){t.trigger("mouseenter")}),r.addEventListener("mouseOut",function(e){t.trigger("mouseleave")}),r.addEventListener("mouseDown",function(i){t.trigger("mousedown"),r.setText(e.isFunction(n.copy)?t.triggerHandler("zClip_copy"):n.copy),e.isFunction(n.beforeCopy)&&t.trigger("zClip_beforeCopy")}),r.addEventListener("complete",function(r,i){e.isFunction(n.afterCopy)?t.trigger("zClip_afterCopy"):(i.length>500&&(i=i.substr(0,500)+"...\n\n("+(i.length-500)+" characters not shown)"),t.removeClass("hover"),alert("Copied text to clipboard:\n\n "+i)),n.clickAfter&&t.trigger("click")}),r.glue(t[0],t.parent()[0]),e(window).bind("load resize",function(){r.reposition()})}})}return"string"==typeof t?this.each(function(){var n=e(this);t=t.toLowerCase();var r=n.data("zclipId"),i=e("#"+r+".zclip");"remove"==t?(i.remove(),n.removeClass("active hover")):"hide"==t?(i.hide(),n.removeClass("active hover")):"show"==t&&i.show()}):void 0}}(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(e){return"string"==typeof e&&(e=document.getElementById(e)),e.addClass||(e.hide=function(){},e.show=function(){this.style.display=""},e.addClass=function(e){this.removeClass(e),this.className+=" "+e},e.removeClass=function(e){for(var t=this.className.split(/\s+/),n=-1,r=0;r<t.length;r++)t[r]==e&&(n=r,r=t.length);return n>-1&&(t.splice(n,1),this.className=t.join(" ")),this},e.hasClass=function(e){return!!this.className.match(new RegExp("\\s*"+e+"\\s*"))}),e},setMoviePath:function(e){this.moviePath=e},dispatch:function(e,t,n){var r=this.clients[e];r&&r.receiveEvent(t,n)},register:function(e,t){this.clients[e]=t},getDOMObjectPosition:function(e,t){var n={left:0,top:0,width:e.width?e.width:e.offsetWidth,height:e.height?e.height:e.offsetHeight};return e&&e!=t&&(n.left+=e.offsetLeft,n.top+=e.offsetTop),n},Client:function(e){this.handlers={},this.id=ZeroClipboard.nextId++,this.movieId="ZeroClipboardMovie_"+this.id,ZeroClipboard.register(this.id,this),e&&this.glue(e)}};ZeroClipboard.Client.prototype={id:0,ready:!1,movie:null,clipText:"",handCursorEnabled:!0,cssEffects:!0,handlers:null,glue:function(e,t,n){this.domElement=ZeroClipboard.$(e);var r=99;this.domElement.style.zIndex&&(r=parseInt(this.domElement.style.zIndex,10)+1),"string"==typeof t?t=ZeroClipboard.$(t):"undefined"==typeof t&&(t=document.getElementsByTagName("body")[0]);var i=ZeroClipboard.getDOMObjectPosition(this.domElement,t);this.div=document.createElement("div"),this.div.className="zclip",this.div.id="zclip-"+this.movieId,$(this.domElement).data("zclipId","zclip-"+this.movieId);var o=this.div.style;if(o.position="absolute",o.left=""+i.left+"px",o.top=""+i.top+"px",o.width=""+i.width+"px",o.height=""+i.height+"px",o.zIndex=r,"object"==typeof n)for(addedStyle in n)o[addedStyle]=n[addedStyle];t.appendChild(this.div),this.div.innerHTML=this.getHTML(i.width,i.height)},getHTML:function(e,t){var n="",r="id="+this.id+"&width="+e+"&height="+t;if(navigator.userAgent.match(/MSIE/)){var i=location.href.match(/^https/i)?"https://":"http://";n+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+i+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+e+'" height="'+t+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+r+'"/><param name="wmode" value="transparent"/></object>'}else n+='<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+e+'" height="'+t+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+r+'" wmode="transparent" />';return n},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide(),this.div.innerHTML="";var e=document.getElementsByTagName("body")[0];try{e.removeChild(this.div)}catch(t){}this.domElement=null,this.div=null}},reposition:function(e){if(e&&(this.domElement=ZeroClipboard.$(e),this.domElement||this.hide()),this.domElement&&this.div){var t=ZeroClipboard.getDOMObjectPosition(this.domElement),n=this.div.style;n.left=""+t.left+"px",n.top=""+t.top+"px"}},setText:function(e){this.clipText=e,this.ready&&this.movie.setText(e)},addEventListener:function(e,t){e=e.toString().toLowerCase().replace(/^on/,""),this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(t)},setHandCursor:function(e){this.handCursorEnabled=e,this.ready&&this.movie.setHandCursor(e)},setCSSEffects:function(e){this.cssEffects=!!e},receiveEvent:function(e,t){switch(e=e.toString().toLowerCase().replace(/^on/,"")){case"load":if(this.movie=document.getElementById(this.movieId),!this.movie){var n=this;return void setTimeout(function(){n.receiveEvent("load",null)},1)}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var n=this;return setTimeout(function(){n.receiveEvent("load",null)},100),void(this.ready=!0)}this.ready=!0;try{this.movie.setText(this.clipText)}catch(r){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(r){}break;case"mouseover":this.domElement&&this.cssEffects&&(this.domElement.addClass("hover"),this.recoverActive&&this.domElement.addClass("active"));break;case"mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0),this.domElement.removeClass("hover"));break;case"mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case"mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[e])for(var i=0,o=this.handlers[e].length;o>i;i++){var a=this.handlers[e][i];"function"==typeof a?a(this,t):"object"==typeof a&&2==a.length?a[0][a[1]](this,t):"string"==typeof a&&window[a](this,t)}}},$.fn.extend({tabs:function(){Tabs(this)}}),$.fn.extend({markdown_preview:function(e){Preview(this,e)}}),function($){function e(e,t){return"function"==typeof e?e.call(t):e}function t(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(e,t){this.$element=$(e),this.options=t,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var t=this.getTitle();if(t&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](t),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r=$.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),i=n[0].offsetWidth,o=n[0].offsetHeight,a=e(this.options.gravity,this.$element[0]),s;switch(a.charAt(0)){case"n":s={top:r.top+r.height+this.options.offset,left:r.left+r.width/2-i/2};break;case"s":s={top:r.top-o-this.options.offset,left:r.left+r.width/2-i/2};break;case"e":s={top:r.top+r.height/2-o/2,left:r.left-i-this.options.offset};break;case"w":s={top:r.top+r.height/2-o/2,left:r.left+r.width+this.options.offset}}2==a.length&&(s.left="w"==a.charAt(1)?r.left+r.width/2-15:r.left+r.width/2-i+15),n.css(s).addClass("tipsy-"+a),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+a.charAt(0),this.options.className&&n.addClass(e(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){$(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,n=this.options;this.fixTitle();var e,n=this.options;return"string"==typeof n.title?e=t.attr("title"==n.title?"original-title":n.title):"function"==typeof n.title&&(e=n.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||n.fallback},tip:function(){return this.$tip||(this.$tip=$('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>'),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},$.fn.tipsy=function(e){function t(t){var r=$.data(t,"tipsy");return r||(r=new n(t,$.fn.tipsy.elementOptions(t,e)),$.data(t,"tipsy",r)),r}function r(){var n=t(this);n.hoverState="in",0==e.delayIn?n.show():(n.fixTitle(),setTimeout(function(){"in"==n.hoverState&&n.show()},e.delayIn))}function i(){var n=t(this);n.hoverState="out",0==e.delayOut?n.hide():setTimeout(function(){"out"==n.hoverState&&n.hide()},e.delayOut)}if(e===!0)return this.data("tipsy");if("string"==typeof e){var o=this.data("tipsy");return o&&o[e](),this}if(e=$.extend({},$.fn.tipsy.defaults,e),e.live||this.each(function(){t(this)}),"manual"!=e.trigger){var a=e.live?"live":"bind",s="hover"==e.trigger?"mouseenter":"focus",l="hover"==e.trigger?"mouseleave":"blur";this[a](s,r)[a](l,i)}return this},$.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},$.fn.tipsy.revalidate=function(){$(".tipsy").each(function(){var e=$.data(this,"tipsy-pointee");e&&t(e)||$(this).remove()})},$.fn.tipsy.elementOptions=function(e,t){return $.metadata?$.extend({},t,$(e).metadata()):t},$.fn.tipsy.autoNS=function(){return $(this).offset().top>$(document).scrollTop()+$(window).height()/2?"s":"n"},$.fn.tipsy.autoWE=function(){return $(this).offset().left>$(document).scrollLeft()+$(window).width()/2?"e":"w"},$.fn.tipsy.autoBounds=function(e,t){return function(){var n={ns:t[0],ew:t.length>1?t[1]:!1},r=$(document).scrollTop()+e,i=$(document).scrollLeft()+e,o=$(this);return o.offset().top<r&&(n.ns="n"),o.offset().left<i&&(n.ew="w"),$(window).width()+$(document).scrollLeft()-o.offset().left<e&&(n.ew="e"),$(window).height()+$(document).scrollTop()-o.offset().top<e&&(n.ns="s"),n.ns+(n.ew?n.ew:"")}}}(jQuery);var Gogs={};!function($){var ajax=$.ajax;$.extend({ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{},url=options.url;var csrftoken=$("meta[name=_csrf]").attr("content"),headers=options.headers||{},domain=document.domain.replace(/\./gi,"\\.");(!/^(http:|https:).*/.test(url)||eval("/^(http:|https:)\\/\\/(.+\\.)*"+domain+".*/").test(url))&&(headers=$.extend(headers,{"X-Csrf-Token":csrftoken})),options.headers=headers;var callback=options.success;return options.success=function(e){e.once&&$("[name=_once]").val(e.once),callback&&callback.apply(this,arguments)},ajax(url,options)},changeHash:function(e){history.pushState?history.pushState(null,null,e):location.hash=e},deSelect:function(){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()}}),$.fn.extend({toggleHide:function(){$(this).addClass("hidden")},toggleShow:function(){$(this).removeClass("hidden")},toggleAjax:function(e,t){var n=$(this).data("ajax"),r=$(this).data("ajax-method")||"get",i=$(this).data("ajax-name"),o={};i.endsWith("preview")&&(o.mode="gfm",o.context=$(this).data("ajax-context")),$("[data-ajax-rel="+i+"]").each(function(){var e=$(this).data("ajax-field"),t=$(this).data("ajax-val");return"val"==t?(o[e]=$(this).val(),!0):"txt"==t?(o[e]=$(this).text(),!0):"html"==t?(o[e]=$(this).html(),!0):"data"==t?(o[e]=$(this).data("ajax-data"),!0):!0}),console.log("toggleAjax:",r,n,o),$.ajax({url:n,method:r.toUpperCase(),data:o,error:t,success:function(t){e&&e(t)}})}})}(jQuery),function($){Gogs.renderMarkdown=function(){var e=$(".markdown"),t=e.find("pre > code").parent();t.addClass("prettyprint"),prettyPrint();var n={};e.find("h1, h2, h3, h4, h5, h6").each(function(){var e=$(this),t=encodeURIComponent(e.text().toLowerCase().replace(/[^\w\- ]/g,"").replace(/[ ]/g,"-")),r=t;n[t]>0&&(r=t+"-"+n[t]),void 0==n[t]?n[t]=1:n[t]+=1,e=e.wrap('<div id="'+r+'" class="anchor-wrap" ></div>'),e.append('<a class="anchor" href="#'+r+'"><span class="octicon octicon-link"></span></a>')})},Gogs.renderCodeView=function(){function e(e,t,n){if(e.removeClass("active"),n){var r=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1)),a;if(r!=o){r>o&&(a=r,r=o,o=a);var s=[];for(i=r;o>=i;i++)s.push(".L"+i);return e.filter(s.join(",")).addClass("active"),void $.changeHash("#L"+r+"-L"+o)}}t.addClass("active"),$.changeHash("#"+t.attr("rel"))}$(document).on("click",".lines-num span",function(t){var n=$(this),r=n.parent().siblings(".lines-code").find("ol.linenums > li");e(r,r.filter("[rel="+n.attr("rel")+"]"),t.shiftKey?r.filter(".active").eq(0):null),$.deSelect()}),$(".code-view .lines-code > pre").each(function(){var e=$(this),t=e.parent(),n=t.siblings(".lines-num");if(n.length>0)for(var r=e.find("ol.linenums > li").length,i=1;r>=i;i++)n.append('<span id="L'+i+'" rel="L'+i+'">'+i+"</span>")}),$(window).on("hashchange",function(t){var n=window.location.hash.match(/^#(L\d+)\-(L\d+)$/),r=$(".code-view ol.linenums > li"),i;return n?(i=r.filter("."+n[1]),e(r,i,r.filter("."+n[2])),void $("html, body").scrollTop(i.offset().top-200)):(n=window.location.hash.match(/^#(L\d+)$/),void(n&&(i=r.filter("."+n[1]),e(r,i),$("html, body").scrollTop(i.offset().top-200))))}).trigger("hashchange")},Gogs.searchUsers=function(e,t){$.ajax({url:Gogs.AppSubUrl+"/api/v1/users/search?q="+e,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><img src="'+t.avatar+'">'+t.username+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.searchRepos=function(e,t,n){$.ajax({url:Gogs.AppSubUrl+"/api/v1/repos/search?q="+e+"&"+n,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><span class="octicon octicon-repo"></span> '+t.repolink+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.bindCopy=function(e){$(e).hasClass("js-copy-bind")||$(e).zclip({path:Gogs.AppSubUrl+"/js/ZeroClipboard.swf",copy:function(){var e=$(this).data("copy-val"),t=$($(this).data("copy-from")),n="";return"txt"==e&&(n=t.text()),"val"==e&&(n=t.val()),"html"==e&&(n=t.html()),n},afterCopy:function(){var e=$(this);e.tipsy("hide").attr("original-title",e.data("after-title")),setTimeout(function(){e.tipsy("show")},200),setTimeout(function(){e.tipsy("hide").attr("original-title",e.data("original-title"))},2e3)}}).addClass("js-copy-bind")}}(jQuery),$(document).ready(function(){Gogs.AppSubUrl=$("head").data("suburl")||"",initCore(),$("#user-profile-setting").length&&initUserSetting(),($("#repo-create-form").length||$("#repo-migrate-form").length)&&initRepoCreate(),$("#repo-header").length&&initRepo(),$("#repo-setting").length&&initRepoSetting(),$("#org-setting").length&&initOrgSetting(),$("#invite-box").length&&initInvite(),$("#team-create-form").length&&initOrgTeamCreate(),$("#team-members-list").length&&initTeamMembersList(),$("#team-repositories-list").length&&initTeamRepositoriesList(),$("#admin-setting").length&&initAdmin(),$("#install-form").length&&initInstall(),$("#user-profile-page").length&&initProfile(),$("#diff-page").length&&(initTimeSwitch(),initDiff()),$("#dashboard-sidebar-menu").tabs(),$("#pull-issue-preview").markdown_preview(".issue-add-comment"),homepage();var e=$("#footer-lang li").length;$("#footer-lang .drop-down").css({top:-31*e+"px",height:31*e-3+"px"})});
\ No newline at end of file +var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n "]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n "]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]),PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a," \n\r "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null," \n\r \u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“”'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r "]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null," abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]),PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);var a=null,a=null;PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]),function(e){e.fn.zclip=function(t){if("object"==typeof t&&!t.length){var n=e.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:!0,setHandCursor:!0,setCSSEffects:!0},t);return this.each(function(){var t=e(this);if(t.is(":visible")&&("string"==typeof n.copy||e.isFunction(n.copy))){ZeroClipboard.setMoviePath(n.path);var r=new ZeroClipboard.Client;e.isFunction(n.copy)&&t.bind("zClip_copy",n.copy),e.isFunction(n.beforeCopy)&&t.bind("zClip_beforeCopy",n.beforeCopy),e.isFunction(n.afterCopy)&&t.bind("zClip_afterCopy",n.afterCopy),r.setHandCursor(n.setHandCursor),r.setCSSEffects(n.setCSSEffects),r.addEventListener("mouseOver",function(e){t.trigger("mouseenter")}),r.addEventListener("mouseOut",function(e){t.trigger("mouseleave")}),r.addEventListener("mouseDown",function(i){t.trigger("mousedown"),r.setText(e.isFunction(n.copy)?t.triggerHandler("zClip_copy"):n.copy),e.isFunction(n.beforeCopy)&&t.trigger("zClip_beforeCopy")}),r.addEventListener("complete",function(r,i){e.isFunction(n.afterCopy)?t.trigger("zClip_afterCopy"):(i.length>500&&(i=i.substr(0,500)+"...\n\n("+(i.length-500)+" characters not shown)"),t.removeClass("hover"),alert("Copied text to clipboard:\n\n "+i)),n.clickAfter&&t.trigger("click")}),r.glue(t[0],t.parent()[0]),e(window).bind("load resize",function(){r.reposition()})}})}return"string"==typeof t?this.each(function(){var n=e(this);t=t.toLowerCase();var r=n.data("zclipId"),i=e("#"+r+".zclip");"remove"==t?(i.remove(),n.removeClass("active hover")):"hide"==t?(i.hide(),n.removeClass("active hover")):"show"==t&&i.show()}):void 0}}(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(e){return"string"==typeof e&&(e=document.getElementById(e)),e.addClass||(e.hide=function(){},e.show=function(){this.style.display=""},e.addClass=function(e){this.removeClass(e),this.className+=" "+e},e.removeClass=function(e){for(var t=this.className.split(/\s+/),n=-1,r=0;r<t.length;r++)t[r]==e&&(n=r,r=t.length);return n>-1&&(t.splice(n,1),this.className=t.join(" ")),this},e.hasClass=function(e){return!!this.className.match(new RegExp("\\s*"+e+"\\s*"))}),e},setMoviePath:function(e){this.moviePath=e},dispatch:function(e,t,n){var r=this.clients[e];r&&r.receiveEvent(t,n)},register:function(e,t){this.clients[e]=t},getDOMObjectPosition:function(e,t){var n={left:0,top:0,width:e.width?e.width:e.offsetWidth,height:e.height?e.height:e.offsetHeight};return e&&e!=t&&(n.left+=e.offsetLeft,n.top+=e.offsetTop),n},Client:function(e){this.handlers={},this.id=ZeroClipboard.nextId++,this.movieId="ZeroClipboardMovie_"+this.id,ZeroClipboard.register(this.id,this),e&&this.glue(e)}};ZeroClipboard.Client.prototype={id:0,ready:!1,movie:null,clipText:"",handCursorEnabled:!0,cssEffects:!0,handlers:null,glue:function(e,t,n){this.domElement=ZeroClipboard.$(e);var r=99;this.domElement.style.zIndex&&(r=parseInt(this.domElement.style.zIndex,10)+1),"string"==typeof t?t=ZeroClipboard.$(t):"undefined"==typeof t&&(t=document.getElementsByTagName("body")[0]);var i=ZeroClipboard.getDOMObjectPosition(this.domElement,t);this.div=document.createElement("div"),this.div.className="zclip",this.div.id="zclip-"+this.movieId,$(this.domElement).data("zclipId","zclip-"+this.movieId);var o=this.div.style;if(o.position="absolute",o.left=""+i.left+"px",o.top=""+i.top+"px",o.width=""+i.width+"px",o.height=""+i.height+"px",o.zIndex=r,"object"==typeof n)for(addedStyle in n)o[addedStyle]=n[addedStyle];t.appendChild(this.div),this.div.innerHTML=this.getHTML(i.width,i.height)},getHTML:function(e,t){var n="",r="id="+this.id+"&width="+e+"&height="+t;if(navigator.userAgent.match(/MSIE/)){var i=location.href.match(/^https/i)?"https://":"http://";n+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+i+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+e+'" height="'+t+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+r+'"/><param name="wmode" value="transparent"/></object>'}else n+='<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+e+'" height="'+t+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+r+'" wmode="transparent" />';return n},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide(),this.div.innerHTML="";var e=document.getElementsByTagName("body")[0];try{e.removeChild(this.div)}catch(t){}this.domElement=null,this.div=null}},reposition:function(e){if(e&&(this.domElement=ZeroClipboard.$(e),this.domElement||this.hide()),this.domElement&&this.div){var t=ZeroClipboard.getDOMObjectPosition(this.domElement),n=this.div.style;n.left=""+t.left+"px",n.top=""+t.top+"px"}},setText:function(e){this.clipText=e,this.ready&&this.movie.setText(e)},addEventListener:function(e,t){e=e.toString().toLowerCase().replace(/^on/,""),this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(t)},setHandCursor:function(e){this.handCursorEnabled=e,this.ready&&this.movie.setHandCursor(e)},setCSSEffects:function(e){this.cssEffects=!!e},receiveEvent:function(e,t){switch(e=e.toString().toLowerCase().replace(/^on/,"")){case"load":if(this.movie=document.getElementById(this.movieId),!this.movie){var n=this;return void setTimeout(function(){n.receiveEvent("load",null)},1)}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var n=this;return setTimeout(function(){n.receiveEvent("load",null)},100),void(this.ready=!0)}this.ready=!0;try{this.movie.setText(this.clipText)}catch(r){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(r){}break;case"mouseover":this.domElement&&this.cssEffects&&(this.domElement.addClass("hover"),this.recoverActive&&this.domElement.addClass("active"));break;case"mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0),this.domElement.removeClass("hover"));break;case"mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case"mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[e])for(var i=0,o=this.handlers[e].length;o>i;i++){var a=this.handlers[e][i];"function"==typeof a?a(this,t):"object"==typeof a&&2==a.length?a[0][a[1]](this,t):"string"==typeof a&&window[a](this,t)}}},$.fn.extend({tabs:function(){Tabs(this)}}),$.fn.extend({markdown_preview:function(e){Preview(this,e)}}),function($){function e(e,t){return"function"==typeof e?e.call(t):e}function t(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(e,t){this.$element=$(e),this.options=t,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var t=this.getTitle();if(t&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](t),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r=$.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),i=n[0].offsetWidth,o=n[0].offsetHeight,a=e(this.options.gravity,this.$element[0]),s;switch(a.charAt(0)){case"n":s={top:r.top+r.height+this.options.offset,left:r.left+r.width/2-i/2};break;case"s":s={top:r.top-o-this.options.offset,left:r.left+r.width/2-i/2};break;case"e":s={top:r.top+r.height/2-o/2,left:r.left-i-this.options.offset};break;case"w":s={top:r.top+r.height/2-o/2,left:r.left+r.width+this.options.offset}}2==a.length&&(s.left="w"==a.charAt(1)?r.left+r.width/2-15:r.left+r.width/2-i+15),n.css(s).addClass("tipsy-"+a),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+a.charAt(0),this.options.className&&n.addClass(e(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){$(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,n=this.options;this.fixTitle();var e,n=this.options;return"string"==typeof n.title?e=t.attr("title"==n.title?"original-title":n.title):"function"==typeof n.title&&(e=n.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||n.fallback},tip:function(){return this.$tip||(this.$tip=$('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>'),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},$.fn.tipsy=function(e){function t(t){var r=$.data(t,"tipsy");return r||(r=new n(t,$.fn.tipsy.elementOptions(t,e)),$.data(t,"tipsy",r)),r}function r(){var n=t(this);n.hoverState="in",0==e.delayIn?n.show():(n.fixTitle(),setTimeout(function(){"in"==n.hoverState&&n.show()},e.delayIn))}function i(){var n=t(this);n.hoverState="out",0==e.delayOut?n.hide():setTimeout(function(){"out"==n.hoverState&&n.hide()},e.delayOut)}if(e===!0)return this.data("tipsy");if("string"==typeof e){var o=this.data("tipsy");return o&&o[e](),this}if(e=$.extend({},$.fn.tipsy.defaults,e),e.live||this.each(function(){t(this)}),"manual"!=e.trigger){var a=e.live?"live":"bind",s="hover"==e.trigger?"mouseenter":"focus",l="hover"==e.trigger?"mouseleave":"blur";this[a](s,r)[a](l,i)}return this},$.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},$.fn.tipsy.revalidate=function(){$(".tipsy").each(function(){var e=$.data(this,"tipsy-pointee");e&&t(e)||$(this).remove()})},$.fn.tipsy.elementOptions=function(e,t){return $.metadata?$.extend({},t,$(e).metadata()):t},$.fn.tipsy.autoNS=function(){return $(this).offset().top>$(document).scrollTop()+$(window).height()/2?"s":"n"},$.fn.tipsy.autoWE=function(){return $(this).offset().left>$(document).scrollLeft()+$(window).width()/2?"e":"w"},$.fn.tipsy.autoBounds=function(e,t){return function(){var n={ns:t[0],ew:t.length>1?t[1]:!1},r=$(document).scrollTop()+e,i=$(document).scrollLeft()+e,o=$(this);return o.offset().top<r&&(n.ns="n"),o.offset().left<i&&(n.ew="w"),$(window).width()+$(document).scrollLeft()-o.offset().left<e&&(n.ew="e"),$(window).height()+$(document).scrollTop()-o.offset().top<e&&(n.ns="s"),n.ns+(n.ew?n.ew:"")}}}(jQuery);var Gogs={};!function($){var ajax=$.ajax;$.extend({ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{},url=options.url;var csrftoken=$("meta[name=_csrf]").attr("content"),headers=options.headers||{},domain=document.domain.replace(/\./gi,"\\.");(!/^(http:|https:).*/.test(url)||eval("/^(http:|https:)\\/\\/(.+\\.)*"+domain+".*/").test(url))&&(headers=$.extend(headers,{"X-Csrf-Token":csrftoken})),options.headers=headers;var callback=options.success;return options.success=function(e){e.once&&$("[name=_once]").val(e.once),callback&&callback.apply(this,arguments)},ajax(url,options)},changeHash:function(e){history.pushState?history.pushState(null,null,e):location.hash=e},deSelect:function(){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()}}),$.fn.extend({toggleHide:function(){$(this).addClass("hidden")},toggleShow:function(){$(this).removeClass("hidden")},toggleAjax:function(e,t){var n=$(this).data("ajax"),r=$(this).data("ajax-method")||"get",i=$(this).data("ajax-name"),o={};i.endsWith("preview")&&(o.mode="gfm",o.context=$(this).data("ajax-context")),$("[data-ajax-rel="+i+"]").each(function(){var e=$(this).data("ajax-field"),t=$(this).data("ajax-val");return"val"==t?(o[e]=$(this).val(),!0):"txt"==t?(o[e]=$(this).text(),!0):"html"==t?(o[e]=$(this).html(),!0):"data"==t?(o[e]=$(this).data("ajax-data"),!0):!0}),console.log("toggleAjax:",r,n,o),$.ajax({url:n,method:r.toUpperCase(),data:o,error:t,success:function(t){e&&e(t)}})}})}(jQuery),function($){Gogs.renderMarkdown=function(){var e=$(".markdown"),t=e.find("pre > code").parent();t.addClass("prettyprint"),prettyPrint();var n={};e.find("h1, h2, h3, h4, h5, h6").each(function(){var e=$(this),t=encodeURIComponent(e.text().toLowerCase().replace(/[^\w\- ]/g,"").replace(/[ ]/g,"-")),r=t;n[t]>0&&(r=t+"-"+n[t]),void 0==n[t]?n[t]=1:n[t]+=1,e=e.wrap('<div id="'+r+'" class="anchor-wrap" ></div>'),e.append('<a class="anchor" href="#'+r+'"><span class="octicon octicon-link"></span></a>')})},Gogs.renderCodeView=function(){function e(e,t,n){if(e.removeClass("active"),n){var r=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1)),a;if(r!=o){r>o&&(a=r,r=o,o=a);var s=[];for(i=r;o>=i;i++)s.push(".L"+i);return e.filter(s.join(",")).addClass("active"),void $.changeHash("#L"+r+"-L"+o)}}t.addClass("active"),$.changeHash("#"+t.attr("rel"))}$(document).on("click",".lines-num span",function(t){var n=$(this),r=n.parent().siblings(".lines-code").find("ol.linenums > li");e(r,r.filter("[rel="+n.attr("rel")+"]"),t.shiftKey?r.filter(".active").eq(0):null),$.deSelect()}),$(".code-view .lines-code > pre").each(function(){var e=$(this),t=e.parent(),n=t.siblings(".lines-num");if(n.length>0)for(var r=e.find("ol.linenums > li").length,i=1;r>=i;i++)n.append('<span id="L'+i+'" rel="L'+i+'">'+i+"</span>")}),$(window).on("hashchange",function(t){var n=window.location.hash.match(/^#(L\d+)\-(L\d+)$/),r=$(".code-view ol.linenums > li"),i;return n?(i=r.filter("."+n[1]),e(r,i,r.filter("."+n[2])),void $("html, body").scrollTop(i.offset().top-200)):(n=window.location.hash.match(/^#(L\d+)$/),void(n&&(i=r.filter("."+n[1]),e(r,i),$("html, body").scrollTop(i.offset().top-200))))}).trigger("hashchange")},Gogs.searchUsers=function(e,t){$.ajax({url:Gogs.AppSubUrl+"/api/v1/users/search?q="+e,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><img src="'+t.avatar_url+'">'+t.username+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.searchRepos=function(e,t,n){$.ajax({url:Gogs.AppSubUrl+"/api/v1/repos/search?q="+e+"&"+n,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><span class="octicon octicon-repo"></span> '+t.full_name+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.bindCopy=function(e){$(e).hasClass("js-copy-bind")||$(e).zclip({path:Gogs.AppSubUrl+"/js/ZeroClipboard.swf",copy:function(){var e=$(this).data("copy-val"),t=$($(this).data("copy-from")),n="";return"txt"==e&&(n=t.text()),"val"==e&&(n=t.val()),"html"==e&&(n=t.html()),n},afterCopy:function(){var e=$(this);e.tipsy("hide").attr("original-title",e.data("after-title")),setTimeout(function(){e.tipsy("show")},200),setTimeout(function(){e.tipsy("hide").attr("original-title",e.data("original-title"))},2e3)}}).addClass("js-copy-bind")}}(jQuery),$(document).ready(function(){Gogs.AppSubUrl=$("head").data("suburl")||"",initCore(),$("#user-profile-setting").length&&initUserSetting(),($("#repo-create-form").length||$("#repo-migrate-form").length)&&initRepoCreate(),$("#repo-header").length&&initRepo(),$("#repo-setting").length&&initRepoSetting(),$("#org-setting").length&&initOrgSetting(),$("#invite-box").length&&initInvite(),$("#team-create-form").length&&initOrgTeamCreate(),$("#team-members-list").length&&initTeamMembersList(),$("#team-repositories-list").length&&initTeamRepositoriesList(),$("#admin-setting").length&&initAdmin(),$("#install-form").length&&initInstall(),$("#user-profile-page").length&&initProfile(),$("#diff-page").length&&(initTimeSwitch(),initDiff()),$("#dashboard-sidebar-menu").tabs(),$("#pull-issue-preview").markdown_preview(".issue-add-comment"),homepage();var e=$("#footer-lang li").length;$("#footer-lang .drop-down").css({top:-31*e+"px",height:31*e-3+"px"})});
\ No newline at end of file diff --git a/public/ng/less/gogs/base.less b/public/ng/less/gogs/base.less index 49389b06..ed5f2fee 100644 --- a/public/ng/less/gogs/base.less +++ b/public/ng/less/gogs/base.less @@ -259,6 +259,9 @@ clear: both; .text-black { color: #444444; } +.text-gold { + color: #a1882b; +} .table { width: 100%; max-width: 100%; diff --git a/public/ng/less/gogs/issue.less b/public/ng/less/gogs/issue.less index 12cc59fc..79f9d793 100644 --- a/public/ng/less/gogs/issue.less +++ b/public/ng/less/gogs/issue.less @@ -223,19 +223,19 @@ textarea#issue-add-content { } // #issue list navigator #issue-list-nav { + border-bottom: 1px solid #DDD; + padding-bottom: 12px; li { > a { font-size: 13px; font-weight: bold; - padding: .4em .9em; - border-radius: .3em; + padding: .2em .8em; } } li.current { > a { background-color: #0079bc; color: #FAFAFA; - border-radius: .3em; } } li.right { @@ -247,7 +247,120 @@ textarea#issue-add-content { > a { padding: 0 !important; button { - height: 34px; + height: 29px; + } + } +} +// issue list menu +#issue-list-menu { + padding: 16px 0 12px 0; + border-bottom: 1px solid #BBB; + margin-bottom: 12px; + .mark { + a { + color: #AAA; + &:hover { + color: #444; + } + } + &.hover { + a { + color: #222; + font-weight: bold; + } + } + } + > .left { + .mark { + margin-right: 12px; + } + } + > .right { + .mark { + margin-left: 12px; + } + } +} +// each issue list item +#issue-list, +#pull-list { + .item { + position: relative; + padding-bottom: 12px; + margin-bottom: 12px; + border-bottom: 1px dashed #AAA; + .title > .title-text { + color: #444; + font-size: 15px; + margin: 0 6px; + } + .index-num { + padding: .25em .6em; + } + } + .comment { + color: #666; + position: absolute; + top: 6px; + right: 0; + } + .issue-label { + padding: .25em .6em; + a { + color: #FFF; } } + .desc { + color: #999; + a { + color: #999; + &:hover { + color: #03a2ef; + } + } + } +} +// issue list pager +#issue-list-pager { + margin: 18px 0 24px 0; + font-size: 14px; + line-height: 24px; +} +// labels numbers +#labels-num { + margin-right: 1em; +} +// labels list +#label-list { + .right { + margin-left: 1em; + color: #999; + i { + margin-right: 3px; + } + line-height: 30px; + &:hover { + color: #444444; + } + } + .num { + margin-right: 3px; + } + .issue-num { + margin-right: 4em; + } + .label { + &:hover { + color: #FFF; + } + i { + margin-right: 6px; + } + } + .item { + height: 30px; + padding-bottom: 12px; + margin-bottom: 12px; + border-bottom: 1px dashed #AAA; + } }
\ No newline at end of file diff --git a/public/ng/less/gogs/repository.less b/public/ng/less/gogs/repository.less index 4a8bc738..d0e4a3ce 100644 --- a/public/ng/less/gogs/repository.less +++ b/public/ng/less/gogs/repository.less @@ -72,9 +72,9 @@ } #repo-header-download-drop { line-height: 24px; - width: 440px; + width: 460px; top: 50px; - left: -370px; + left: -390px; padding: 20px; box-sizing: border-box; z-index: 1; @@ -84,12 +84,16 @@ button, input { font-size: 11px; } + #repo-clone-copy { + width: 85px; + text-overflow: clip; + } } #repo-content { padding: 18px 0; } .repo-wide-wrapper { - padding: 18px 0; + padding: 18px; position: relative; } #repo-clone-url { @@ -655,4 +659,4 @@ white-space: nowrap; margin-left: 44px; margin-top: -15px; -}
\ No newline at end of file +} diff --git a/public/ng/less/gogs/settings.less b/public/ng/less/gogs/settings.less index 80c00f2d..de923dab 100644 --- a/public/ng/less/gogs/settings.less +++ b/public/ng/less/gogs/settings.less @@ -68,6 +68,7 @@ #repo-hooks-panel, #repo-hooks-history-panel, #user-social-panel, +#user-applications-panel, #user-ssh-panel { margin-bottom: 20px; .setting-list { @@ -97,16 +98,20 @@ margin-right: 4px; } .print, + .access, .activity { color: #888; } + .access { + max-width: 500px; + } } - .ssh-delete-btn { + .ssh-btn { margin-top: 6px; } } -#user-ssh-add-form { +.form-settings-add { .panel-body { background-color: #FFF; padding: 30px 0; diff --git a/public/ng/less/ui.less b/public/ng/less/ui.less index 3db8b12c..fc7ad3c2 100644 --- a/public/ng/less/ui.less +++ b/public/ng/less/ui.less @@ -7,4 +7,5 @@ @import "ui/label"; @import "ui/bread"; @import "ui/alert"; -@import "ui/table";
\ No newline at end of file +@import "ui/table"; +@import "ui/pager";
\ No newline at end of file diff --git a/public/ng/less/ui/label.less b/public/ng/less/ui/label.less index 21a4c82d..ab07718f 100644 --- a/public/ng/less/ui/label.less +++ b/public/ng/less/ui/label.less @@ -1,7 +1,7 @@ @import "var"; .label { - padding: 2px 6px; + padding: .3em .6em .2em .6em; color: @labelFontColor; } diff --git a/public/ng/less/ui/pager.less b/public/ng/less/ui/pager.less new file mode 100644 index 00000000..37540b36 --- /dev/null +++ b/public/ng/less/ui/pager.less @@ -0,0 +1,28 @@ +@import "var"; + +.pager{ + .page{ + padding: .3em .5em .2em .5em; + margin: 0 .3em; + background-color: @pagerPageBgColor; + color: @pagerPageColor; + &:hover,&.hover{ + background-color: @pagerHoverBgColor; + color: @pagerHoverColor; + } + } + .prev,.next{ + padding: .4em .6em; + margin: 0 .3em; + background-color: @pagerDirectionBgColor; + color: @pagerDirectionColor; + &.invalid{ + background-color: @pagerInvalidBgColor; + color: @pagerInvalidColor; + cursor: not-allowed; + } + } + .page-radius{ + border-radius: .2em; + } +}
\ No newline at end of file diff --git a/public/ng/less/ui/var.less b/public/ng/less/ui/var.less index e3c5ada6..c9eb1629 100644 --- a/public/ng/less/ui/var.less +++ b/public/ng/less/ui/var.less @@ -81,3 +81,12 @@ @preBgColor:#444; @preFontColor:#FFF; + +@pagerPageColor:#444; +@pagerPageBgColor:#CCC; +@pagerHoverBgColor:#428BCA; +@pagerHoverColor:#FFF; +@pagerInvalidColor:#AAA; +@pagerInvalidBgColor:#EEE; +@pagerDirectionBgColor:#505050; +@pagerDirectionColor:#FAFAFA; diff --git a/routers/admin/users.go b/routers/admin/users.go index 35104453..0a1056f3 100644 --- a/routers/admin/users.go +++ b/routers/admin/users.go @@ -174,7 +174,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) { return } - // NOTE: need password length check? + // FIXME: need password length check if len(form.Passwd) > 0 { u.Passwd = form.Passwd u.Salt = models.GetUserSalt() @@ -191,6 +191,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) { u.AvatarEmail = form.Avatar u.IsActive = form.Active u.IsAdmin = form.Admin + u.AllowGitHook = form.AllowGitHook if err := models.UpdateUser(u); err != nil { ctx.Handle(500, "UpdateUser", err) return @@ -220,6 +221,9 @@ func DeleteUser(ctx *middleware.Context) { case models.ErrUserOwnRepos: ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) + case models.ErrUserHasOrgs: + ctx.Flash.Error(ctx.Tr("admin.users.still_has_org")) + ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) default: ctx.Handle(500, "DeleteUser", err) } diff --git a/routers/api/v1/miscellaneous.go b/routers/api/v1/miscellaneous.go index f75ae264..b3291fc1 100644 --- a/routers/api/v1/miscellaneous.go +++ b/routers/api/v1/miscellaneous.go @@ -13,12 +13,10 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const DOC_URL = "http://gogs.io/docs" - // Render an arbitrary Markdown document. func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) { if ctx.HasApiError() { - ctx.JSON(422, base.ApiJsonErr{ctx.GetErrMsg(), DOC_URL}) + ctx.JSON(422, base.ApiJsonErr{ctx.GetErrMsg(), base.DOC_URL}) return } @@ -35,7 +33,7 @@ func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) { func MarkdownRaw(ctx *middleware.Context) { body, err := ctx.Req.Body().Bytes() if err != nil { - ctx.JSON(422, base.ApiJsonErr{err.Error(), DOC_URL}) + ctx.JSON(422, base.ApiJsonErr{err.Error(), base.DOC_URL}) return } ctx.Write(base.RenderRawMarkdown(body, "")) diff --git a/routers/api/v1/repos.go b/routers/api/v1/repo.go index 2dee512f..33e3b05a 100644 --- a/routers/api/v1/repos.go +++ b/routers/api/v1/repo.go @@ -11,16 +11,16 @@ import ( "github.com/Unknwon/com" + api "github.com/gogits/go-gogs-client" + "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/modules/setting" ) -type repo struct { - RepoLink string `json:"repolink"` -} - func SearchRepos(ctx *middleware.Context) { opt := models.SearchOption{ Keyword: path.Base(ctx.Query("q")), @@ -60,7 +60,7 @@ func SearchRepos(ctx *middleware.Context) { return } - results := make([]*repo, len(repos)) + results := make([]*api.Repository, len(repos)) for i := range repos { if err = repos[i].GetOwner(); err != nil { ctx.JSON(500, map[string]interface{}{ @@ -69,8 +69,9 @@ func SearchRepos(ctx *middleware.Context) { }) return } - results[i] = &repo{ - RepoLink: path.Join(repos[i].Owner.Name, repos[i].Name), + results[i] = &api.Repository{ + Id: repos[i].Id, + FullName: path.Join(repos[i].Owner.Name, repos[i].Name), } } @@ -155,3 +156,74 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) { "error": err.Error(), }) } + +// GET /user/repos +// https://developer.github.com/v3/repos/#list-your-repositories +func ListMyRepos(ctx *middleware.Context) { + ownRepos, err := models.GetRepositories(ctx.User.Id, true) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetRepositories: " + err.Error(), base.DOC_URL}) + return + } + numOwnRepos := len(ownRepos) + + collaRepos, err := models.GetCollaborativeRepos(ctx.User.Name) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetCollaborativeRepos: " + err.Error(), base.DOC_URL}) + return + } + + sshUrlFmt := "%s@%s:%s/%s.git" + if setting.SshPort != 22 { + sshUrlFmt = "ssh://%s@%s:%d/%s/%s.git" + } + + repos := make([]*api.Repository, numOwnRepos+len(collaRepos)) + // FIXME: make only one loop + for i := range ownRepos { + repos[i] = &api.Repository{ + Id: ownRepos[i].Id, + Owner: api.User{ + Id: ctx.User.Id, + UserName: ctx.User.Name, + AvatarUrl: string(setting.Protocol) + ctx.User.AvatarLink(), + }, + FullName: ctx.User.Name + "/" + ownRepos[i].Name, + Private: ownRepos[i].IsPrivate, + Fork: ownRepos[i].IsFork, + HtmlUrl: setting.AppUrl + ctx.User.Name + "/" + ownRepos[i].Name, + SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, ctx.User.LowerName, ownRepos[i].LowerName), + Permissions: api.Permission{true, true, true}, + } + repos[i].CloneUrl = repos[i].HtmlUrl + ".git" + } + for i := range collaRepos { + if err = collaRepos[i].GetOwner(); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetOwner: " + err.Error(), base.DOC_URL}) + return + } + j := i + numOwnRepos + repos[j] = &api.Repository{ + Id: collaRepos[i].Id, + Owner: api.User{ + Id: collaRepos[i].Owner.Id, + UserName: collaRepos[i].Owner.Name, + AvatarUrl: string(setting.Protocol) + collaRepos[i].Owner.AvatarLink(), + }, + FullName: collaRepos[i].Owner.Name + "/" + collaRepos[i].Name, + Private: collaRepos[i].IsPrivate, + Fork: collaRepos[i].IsFork, + HtmlUrl: setting.AppUrl + collaRepos[i].Owner.Name + "/" + collaRepos[i].Name, + SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, collaRepos[i].Owner.LowerName, collaRepos[i].LowerName), + Permissions: api.Permission{false, collaRepos[i].CanPush, true}, + } + repos[j].CloneUrl = repos[j].HtmlUrl + ".git" + + // FIXME: cache result to reduce DB query? + if collaRepos[i].Owner.IsOrganization() && collaRepos[i].Owner.IsOrgOwner(ctx.User.Id) { + repos[j].Permissions.Admin = true + } + } + + ctx.JSON(200, &repos) +} diff --git a/routers/api/v1/repo_file.go b/routers/api/v1/repo_file.go new file mode 100644 index 00000000..a049904f --- /dev/null +++ b/routers/api/v1/repo_file.go @@ -0,0 +1,32 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/git" + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/repo" +) + +func GetRepoRawFile(ctx *middleware.Context) { + if ctx.Repo.Repository.IsPrivate && !ctx.Repo.HasAccess { + ctx.Error(404) + return + } + + blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName) + if err != nil { + if err == git.ErrNotExist { + ctx.Error(404) + } else { + ctx.JSON(500, &base.ApiJsonErr{"GetBlobByPath: " + err.Error(), base.DOC_URL}) + } + return + } + if err = repo.ServeBlob(ctx, blob); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"ServeBlob: " + err.Error(), base.DOC_URL}) + } +} diff --git a/routers/api/v1/repo_hooks.go b/routers/api/v1/repo_hooks.go new file mode 100644 index 00000000..49bf8e46 --- /dev/null +++ b/routers/api/v1/repo_hooks.go @@ -0,0 +1,168 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "encoding/json" + + api "github.com/gogits/go-gogs-client" + + "github.com/gogits/gogs/models" + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/middleware" +) + +// GET /repos/:username/:reponame/hooks +// https://developer.github.com/v3/repos/hooks/#list-hooks +func ListRepoHooks(ctx *middleware.Context) { + hooks, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetWebhooksByRepoId: " + err.Error(), base.DOC_URL}) + return + } + + apiHooks := make([]*api.Hook, len(hooks)) + for i := range hooks { + h := &api.Hook{ + Id: hooks[i].Id, + Type: hooks[i].HookTaskType.Name(), + Active: hooks[i].IsActive, + Config: make(map[string]string), + } + + // Currently, onle have push event. + h.Events = []string{"push"} + + h.Config["url"] = hooks[i].Url + h.Config["content_type"] = hooks[i].ContentType.Name() + if hooks[i].HookTaskType == models.SLACK { + s := hooks[i].GetSlackHook() + h.Config["channel"] = s.Channel + } + + apiHooks[i] = h + } + + ctx.JSON(200, &apiHooks) +} + +type CreateRepoHookForm struct { + Type string `json:"type" binding:"Required"` + Config map[string]string `json:"config" binding:"Required"` + Active bool `json:"active"` +} + +// POST /repos/:username/:reponame/hooks +// https://developer.github.com/v3/repos/hooks/#create-a-hook +func CreateRepoHook(ctx *middleware.Context, form CreateRepoHookForm) { + if !models.IsValidHookTaskType(form.Type) { + ctx.JSON(422, &base.ApiJsonErr{"invalid hook type", base.DOC_URL}) + return + } + for _, name := range []string{"url", "content_type"} { + if _, ok := form.Config[name]; !ok { + ctx.JSON(422, &base.ApiJsonErr{"missing config option: " + name, base.DOC_URL}) + return + } + } + if !models.IsValidHookContentType(form.Config["content_type"]) { + ctx.JSON(422, &base.ApiJsonErr{"invalid content type", base.DOC_URL}) + return + } + + w := &models.Webhook{ + RepoId: ctx.Repo.Repository.Id, + Url: form.Config["url"], + ContentType: models.ToHookContentType(form.Config["content_type"]), + Secret: form.Config["secret"], + HookEvent: &models.HookEvent{ + PushOnly: true, // Only support it now. + }, + IsActive: form.Active, + HookTaskType: models.ToHookTaskType(form.Type), + } + if w.HookTaskType == models.SLACK { + channel, ok := form.Config["channel"] + if !ok { + ctx.JSON(422, &base.ApiJsonErr{"missing config option: channel", base.DOC_URL}) + return + } + meta, err := json.Marshal(&models.Slack{ + Channel: channel, + }) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"slack: JSON marshal failed: " + err.Error(), base.DOC_URL}) + return + } + w.Meta = string(meta) + } + + if err := w.UpdateEvent(); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"UpdateEvent: " + err.Error(), base.DOC_URL}) + return + } else if err := models.CreateWebhook(w); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"CreateWebhook: " + err.Error(), base.DOC_URL}) + return + } + + ctx.JSON(201, map[string]interface{}{ + "ok": true, + }) +} + +type EditRepoHookForm struct { + Config map[string]string `json:"config"` + Active *bool `json:"active"` +} + +// PATCH /repos/:username/:reponame/hooks/:id +// https://developer.github.com/v3/repos/hooks/#edit-a-hook +func EditRepoHook(ctx *middleware.Context, form EditRepoHookForm) { + w, err := models.GetWebhookById(ctx.ParamsInt64(":id")) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"GetWebhookById: " + err.Error(), base.DOC_URL}) + return + } + + if form.Config != nil { + if url, ok := form.Config["url"]; ok { + w.Url = url + } + if ct, ok := form.Config["content_type"]; ok { + if !models.IsValidHookContentType(ct) { + ctx.JSON(422, &base.ApiJsonErr{"invalid content type", base.DOC_URL}) + return + } + w.ContentType = models.ToHookContentType(ct) + } + + if w.HookTaskType == models.SLACK { + if channel, ok := form.Config["channel"]; ok { + meta, err := json.Marshal(&models.Slack{ + Channel: channel, + }) + if err != nil { + ctx.JSON(500, &base.ApiJsonErr{"slack: JSON marshal failed: " + err.Error(), base.DOC_URL}) + return + } + w.Meta = string(meta) + } + } + } + + if form.Active != nil { + w.IsActive = *form.Active + } + + // FIXME: edit events + if err := models.UpdateWebhook(w); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"UpdateWebhook: " + err.Error(), base.DOC_URL}) + return + } + + ctx.JSON(200, map[string]interface{}{ + "ok": true, + }) +} diff --git a/routers/api/v1/users.go b/routers/api/v1/users.go index 062c3680..e0f51ca8 100644 --- a/routers/api/v1/users.go +++ b/routers/api/v1/users.go @@ -7,15 +7,12 @@ package v1 import ( "github.com/Unknwon/com" + api "github.com/gogits/go-gogs-client" + "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/middleware" ) -type user struct { - UserName string `json:"username"` - AvatarLink string `json:"avatar"` -} - func SearchUsers(ctx *middleware.Context) { opt := models.SearchOption{ Keyword: ctx.Query("q"), @@ -34,11 +31,11 @@ func SearchUsers(ctx *middleware.Context) { return } - results := make([]*user, len(us)) + results := make([]*api.User, len(us)) for i := range us { - results[i] = &user{ - UserName: us[i].Name, - AvatarLink: us[i].AvatarLink(), + results[i] = &api.User{ + UserName: us[i].Name, + AvatarUrl: us[i].AvatarLink(), } } diff --git a/routers/install.go b/routers/install.go index eff66e84..408ca108 100644 --- a/routers/install.go +++ b/routers/install.go @@ -165,9 +165,9 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) { // Set test engine. var x *xorm.Engine if err := models.NewTestEngine(x); err != nil { - // NOTE: should use core.QueryDriver (github.com/go-xorm/core) + // FIXME: should use core.QueryDriver (github.com/go-xorm/core) if strings.Contains(err.Error(), `Unknown database type: sqlite3`) { - ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available"), INSTALL, &form) + ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "http://gogs.io/docs/installation/install_from_binary.html"), INSTALL, &form) } else { ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), INSTALL, &form) } diff --git a/routers/repo/commit.go b/routers/repo/commit.go index b2c2e0f9..4a974aab 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -20,6 +20,17 @@ const ( DIFF base.TplName = "repo/diff" ) +func RefCommits(ctx *middleware.Context) { + switch { + case len(ctx.Repo.TreeName) == 0: + Commits(ctx) + case ctx.Repo.TreeName == "search": + SearchCommits(ctx) + default: + FileHistory(ctx) + } +} + func Commits(ctx *middleware.Context) { ctx.Data["IsRepoToolbarCommits"] = true @@ -109,6 +120,69 @@ func SearchCommits(ctx *middleware.Context) { ctx.HTML(200, COMMITS) } +func FileHistory(ctx *middleware.Context) { + ctx.Data["IsRepoToolbarCommits"] = true + + fileName := ctx.Repo.TreeName + if len(fileName) == 0 { + Commits(ctx) + return + } + + userName := ctx.Repo.Owner.Name + repoName := ctx.Repo.Repository.Name + branchName := ctx.Repo.BranchName + + brs, err := ctx.Repo.GitRepo.GetBranches() + if err != nil { + ctx.Handle(500, "GetBranches", err) + return + } else if len(brs) == 0 { + ctx.Handle(404, "GetBranches", nil) + return + } + + commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName) + if err != nil { + ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err) + return + } else if commitsCount == 0 { + ctx.Handle(404, "repo.FileHistory", nil) + return + } + + // Calculate and validate page number. + page := com.StrTo(ctx.Query("p")).MustInt() + if page < 1 { + page = 1 + } + lastPage := page - 1 + if lastPage < 0 { + lastPage = 0 + } + nextPage := page + 1 + if nextPage*50 > commitsCount { + nextPage = 0 + } + + commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange( + branchName, fileName, page) + if err != nil { + ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err) + return + } + commits = models.ValidateCommitsWithEmails(commits) + + ctx.Data["Commits"] = commits + ctx.Data["Username"] = userName + ctx.Data["Reponame"] = repoName + ctx.Data["FileName"] = fileName + ctx.Data["CommitCount"] = commitsCount + ctx.Data["LastPageNum"] = lastPage + ctx.Data["NextPageNum"] = nextPage + ctx.HTML(200, COMMITS) +} + func Diff(ctx *middleware.Context) { ctx.Data["IsRepoToolbarCommits"] = true @@ -226,70 +300,7 @@ func CompareDiff(ctx *middleware.Context) { ctx.Data["Commit"] = commit ctx.Data["Diff"] = diff ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 - ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", afterCommitId) - ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", afterCommitId) + ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", afterCommitId) + ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", afterCommitId) ctx.HTML(200, DIFF) } - -func FileHistory(ctx *middleware.Context) { - ctx.Data["IsRepoToolbarCommits"] = true - - fileName := ctx.Params("*") - if len(fileName) == 0 { - Commits(ctx) - return - } - - userName := ctx.Repo.Owner.Name - repoName := ctx.Repo.Repository.Name - branchName := ctx.Params(":branchname") - - brs, err := ctx.Repo.GitRepo.GetBranches() - if err != nil { - ctx.Handle(500, "GetBranches", err) - return - } else if len(brs) == 0 { - ctx.Handle(404, "GetBranches", nil) - return - } - - commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName) - if err != nil { - ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err) - return - } else if commitsCount == 0 { - ctx.Handle(404, "repo.FileHistory", nil) - return - } - - // Calculate and validate page number. - page := com.StrTo(ctx.Query("p")).MustInt() - if page < 1 { - page = 1 - } - lastPage := page - 1 - if lastPage < 0 { - lastPage = 0 - } - nextPage := page + 1 - if nextPage*50 > commitsCount { - nextPage = 0 - } - - commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange( - branchName, fileName, page) - if err != nil { - ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err) - return - } - commits = models.ValidateCommitsWithEmails(commits) - - ctx.Data["Commits"] = commits - ctx.Data["Username"] = userName - ctx.Data["Reponame"] = repoName - ctx.Data["FileName"] = fileName - ctx.Data["CommitCount"] = commitsCount - ctx.Data["LastPageNum"] = lastPage - ctx.Data["NextPageNum"] = nextPage - ctx.HTML(200, COMMITS) -} diff --git a/routers/repo/download.go b/routers/repo/download.go index abb9b062..6367c40e 100644 --- a/routers/repo/download.go +++ b/routers/repo/download.go @@ -9,22 +9,14 @@ import ( "path" "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/middleware" ) -func SingleDownload(ctx *middleware.Context) { - treename := ctx.Params("*") - - blob, err := ctx.Repo.Commit.GetBlobByPath(treename) - if err != nil { - ctx.Handle(500, "GetBlobByPath", err) - return - } - +func ServeBlob(ctx *middleware.Context, blob *git.Blob) error { dataRc, err := blob.Data() if err != nil { - ctx.Handle(500, "repo.SingleDownload(Data)", err) - return + return err } buf := make([]byte, 1024) @@ -37,9 +29,25 @@ func SingleDownload(ctx *middleware.Context) { _, isImageFile := base.IsImageFile(buf) ctx.Resp.Header().Set("Content-Type", contentType) if !isTextFile && !isImageFile { - ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(treename)) + ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName)) ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") } ctx.Resp.Write(buf) io.Copy(ctx.Resp, dataRc) + return nil +} + +func SingleDownload(ctx *middleware.Context) { + blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName) + if err != nil { + if err == git.ErrNotExist { + ctx.Handle(404, "GetBlobByPath", nil) + } else { + ctx.Handle(500, "GetBlobByPath", err) + } + return + } + if err = ServeBlob(ctx, blob); err != nil { + ctx.Handle(500, "ServeBlob", err) + } } diff --git a/routers/repo/http.go b/routers/repo/http.go index 3641f4da..2dc66449 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -7,8 +7,6 @@ package repo import ( "bytes" "compress/gzip" - "encoding/base64" - "errors" "fmt" "io" "io/ioutil" @@ -18,6 +16,7 @@ import ( "path" "path/filepath" "regexp" + "runtime" "strconv" "strings" "time" @@ -29,27 +28,6 @@ import ( "github.com/gogits/gogs/modules/setting" ) -func basicEncode(username, password string) string { - auth := username + ":" + password - return base64.StdEncoding.EncodeToString([]byte(auth)) -} - -func basicDecode(encoded string) (user string, name string, err error) { - var s []byte - s, err = base64.StdEncoding.DecodeString(encoded) - if err != nil { - return user, name, err - } - - a := strings.Split(string(s), ":") - if len(a) == 2 { - user, name = a[0], a[1] - } else { - err = errors.New("decode failed") - } - return user, name, err -} - func authRequired(ctx *middleware.Context) { ctx.Resp.Header().Set("WWW-Authenticate", "Basic realm=\".\"") ctx.Data["ErrorMsg"] = "no basic auth and digit auth" @@ -112,11 +90,12 @@ func Http(ctx *middleware.Context) { auths := strings.Fields(baHead) // currently check basic auth // TODO: support digit auth + // FIXME: middlewares/context.go did basic auth check already if len(auths) != 2 || auths[0] != "Basic" { ctx.Handle(401, "no basic auth and digit auth", nil) return } - authUsername, passwd, err = basicDecode(auths[1]) + authUsername, passwd, err = base.BasicAuthDecode(auths[1]) if err != nil { ctx.Handle(401, "no basic auth and digit auth", nil) return @@ -205,6 +184,7 @@ func Http(ctx *middleware.Context) { handler := HttpBackend(&config) handler(ctx.Resp, ctx.Req.Request) + runtime.GC() } type route struct { diff --git a/routers/repo/issue.go b/routers/repo/issue.go index e3a14e19..b08b0605 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -1125,3 +1125,11 @@ func IssueGetAttachment(ctx *middleware.Context) { func Issues2(ctx *middleware.Context){ ctx.HTML(200,"repo/issue2/list") } + +func PullRequest2(ctx *middleware.Context){ + ctx.HTML(200,"repo/pr2/list") +} + +func Labels2(ctx *middleware.Context){ + ctx.HTML(200,"repo/issue2/labels") +} diff --git a/routers/repo/release.go b/routers/repo/release.go index addeb1ce..cc9864fe 100644 --- a/routers/repo/release.go +++ b/routers/repo/release.go @@ -22,21 +22,38 @@ func Releases(ctx *middleware.Context) { ctx.Data["Title"] = "Releases" ctx.Data["IsRepoToolbarReleases"] = true ctx.Data["IsRepoReleaseNew"] = false + rawTags, err := ctx.Repo.GitRepo.GetTags() if err != nil { - ctx.Handle(500, "release.Releases(GetTags)", err) + ctx.Handle(500, "GetTags", err) return } rels, err := models.GetReleasesByRepoId(ctx.Repo.Repository.Id) if err != nil { - ctx.Handle(500, "release.Releases(GetReleasesByRepoId)", err) + ctx.Handle(500, "GetReleasesByRepoId", err) + return + } + + // Get default branch. + refName := ctx.Repo.Repository.DefaultBranch + if !ctx.Repo.GitRepo.IsBranchExist(refName) { + brs, err := ctx.Repo.GitRepo.GetBranches() + if err != nil { + ctx.Handle(500, "GetBranches", err) + return + } + refName = brs[0] + } + commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(refName) + if err != nil { + ctx.Handle(500, "GetCommitOfBranch", err) return } - commitsCount, err := ctx.Repo.Commit.CommitsCount() + commitsCount, err := commit.CommitsCount() if err != nil { - ctx.Handle(500, "release.Releases(CommitsCount)", err) + ctx.Handle(500, "CommitsCount", err) return } @@ -59,18 +76,18 @@ func Releases(ctx *middleware.Context) { if ctx.Repo.BranchName != rel.Target { // Get count if not exists. if _, ok := countCache[rel.Target]; !ok { - commit, err := ctx.Repo.GitRepo.GetCommitOfTag(rel.TagName) + commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(ctx.Repo.BranchName) if err != nil { - ctx.Handle(500, "GetCommitOfTag", err) + ctx.Handle(500, "GetCommitOfBranch", err) return } - countCache[rel.Target], err = commit.CommitsCount() + countCache[ctx.Repo.BranchName], err = commit.CommitsCount() if err != nil { ctx.Handle(500, "CommitsCount2", err) return } } - rel.NumCommitsBehind = countCache[rel.Target] - rel.NumCommits + rel.NumCommitsBehind = countCache[ctx.Repo.BranchName] - rel.NumCommits } else { rel.NumCommitsBehind = commitsCount - rel.NumCommits } @@ -134,14 +151,20 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) { return } - commitsCount, err := ctx.Repo.Commit.CommitsCount() + if !ctx.Repo.GitRepo.IsBranchExist(form.Target) { + ctx.RenderWithErr(ctx.Tr("form.target_branch_not_exist"), RELEASE_NEW, &form) + return + } + + commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(form.Target) if err != nil { - ctx.Handle(500, "release.ReleasesNewPost(CommitsCount)", err) + ctx.Handle(500, "GetCommitOfBranch", err) return } - if !ctx.Repo.GitRepo.IsBranchExist(form.Target) { - ctx.RenderWithErr("Target branch does not exist", "release/new", &form) + commitsCount, err := commit.CommitsCount() + if err != nil { + ctx.Handle(500, "CommitsCount", err) return } @@ -151,7 +174,7 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) { Title: form.Title, TagName: form.TagName, Target: form.Target, - Sha1: ctx.Repo.Commit.Id.String(), + Sha1: commit.Id.String(), NumCommits: commitsCount, Note: form.Content, IsDraft: len(form.Draft) > 0, diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 2116e2c9..8e4ace99 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -24,8 +24,23 @@ import ( const ( CREATE base.TplName = "repo/create" MIGRATE base.TplName = "repo/migrate" + FORK base.TplName = "repo/fork" ) +func checkContextUser(ctx *middleware.Context, uid int64) (*models.User, error) { + ctxUser := ctx.User + if uid > 0 { + org, err := models.GetUserById(uid) + if err != models.ErrUserNotExist { + if err != nil { + return nil, fmt.Errorf("GetUserById: %v", err) + } + ctxUser = org + } + } + return ctxUser, nil +} + func Create(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("new_repo") @@ -35,14 +50,10 @@ func Create(ctx *middleware.Context) { ctx.Data["Gitignores"] = models.Gitignores ctx.Data["Licenses"] = models.Licenses - ctxUser := ctx.User - if orgId := com.StrTo(ctx.Query("org")).MustInt64(); orgId > 0 { - org, err := models.GetUserById(orgId) - if err != nil && err != models.ErrUserNotExist { - ctx.Handle(500, "GetUserById", err) - return - } - ctxUser = org + ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org")) + if err != nil { + ctx.Handle(500, "checkContextUser", err) + return } ctx.Data["ContextUser"] = ctxUser @@ -64,12 +75,12 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) { ctxUser := ctx.User // Not equal means current user is an organization. if form.Uid != ctx.User.Id { - org, err := models.GetUserById(form.Uid) - if err != nil && err != models.ErrUserNotExist { - ctx.Handle(500, "GetUserById", err) + var err error + ctxUser, err = checkContextUser(ctx, form.Uid) + if err != nil { + ctx.Handle(500, "checkContextUser", err) return } - ctxUser = org } ctx.Data["ContextUser"] = ctxUser @@ -95,8 +106,8 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) { repo, err := models.CreateRepository(ctxUser, form.RepoName, form.Description, form.Gitignore, form.License, form.Private, false, form.InitReadme) if err == nil { - log.Trace("Repository created: %s/%s", ctxUser.Name, form.RepoName) - ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + form.RepoName) + log.Trace("Repository created: %s/%s", ctxUser.Name, repo.Name) + ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) return } else if err == models.ErrRepoAlreadyExist { ctx.Data["Err_RepoName"] = true @@ -119,14 +130,10 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) { func Migrate(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("new_migrate") - ctxUser := ctx.User - if orgId := com.StrTo(ctx.Query("org")).MustInt64(); orgId > 0 { - org, err := models.GetUserById(orgId) - if err != nil && err != models.ErrUserNotExist { - ctx.Handle(500, "GetUserById", err) - return - } - ctxUser = org + ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org")) + if err != nil { + ctx.Handle(500, "checkContextUser", err) + return } ctx.Data["ContextUser"] = ctxUser @@ -145,12 +152,12 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) { ctxUser := ctx.User // Not equal means current user is an organization. if form.Uid != ctx.User.Id { - org, err := models.GetUserById(form.Uid) + var err error + ctxUser, err = checkContextUser(ctx, form.Uid) if err != nil { - ctx.Handle(500, "GetUserById", err) + ctx.Handle(500, "checkContextUser", err) return } - ctxUser = org } ctx.Data["ContextUser"] = ctxUser @@ -206,6 +213,114 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) { ctx.Handle(500, "MigratePost", err) } +func getForkRepository(ctx *middleware.Context) (*models.Repository, error) { + forkId := ctx.QueryInt64("fork_id") + ctx.Data["ForkId"] = forkId + + forkRepo, err := models.GetRepositoryById(forkId) + if err != nil { + return nil, fmt.Errorf("GetRepositoryById: %v", err) + } + ctx.Data["repo_name"] = forkRepo.Name + ctx.Data["desc"] = forkRepo.Description + + if err = forkRepo.GetOwner(); err != nil { + return nil, fmt.Errorf("GetOwner: %v", err) + } + ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name + return forkRepo, nil +} + +func Fork(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("new_fork") + + if _, err := getForkRepository(ctx); err != nil { + if err == models.ErrRepoNotExist { + ctx.Redirect(setting.AppSubUrl + "/") + } else { + ctx.Handle(500, "getForkRepository", err) + } + return + } + + // FIXME: maybe sometime can directly fork to organization? + ctx.Data["ContextUser"] = ctx.User + if err := ctx.User.GetOrganizations(); err != nil { + ctx.Handle(500, "GetOrganizations", err) + return + } + ctx.Data["Orgs"] = ctx.User.Orgs + + ctx.HTML(200, FORK) +} + +func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) { + ctx.Data["Title"] = ctx.Tr("new_fork") + + forkRepo, err := getForkRepository(ctx) + if err != nil { + if err == models.ErrRepoNotExist { + ctx.Redirect(setting.AppSubUrl + "/") + } else { + ctx.Handle(500, "getForkRepository", err) + } + return + } + + ctxUser := ctx.User + // Not equal means current user is an organization. + if form.Uid != ctx.User.Id { + var err error + ctxUser, err = checkContextUser(ctx, form.Uid) + if err != nil { + ctx.Handle(500, "checkContextUser", err) + return + } + } + ctx.Data["ContextUser"] = ctxUser + + if err := ctx.User.GetOrganizations(); err != nil { + ctx.Handle(500, "GetOrganizations", err) + return + } + ctx.Data["Orgs"] = ctx.User.Orgs + + if ctx.HasError() { + ctx.HTML(200, CREATE) + return + } + + if ctxUser.IsOrganization() { + // Check ownership of organization. + if !ctxUser.IsOrgOwner(ctx.User.Id) { + ctx.Error(403) + return + } + } + + repo, err := models.ForkRepository(ctxUser, forkRepo, form.RepoName, form.Description) + if err == nil { + log.Trace("Repository forked: %s/%s", ctxUser.Name, repo.Name) + ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) + return + } else if err == models.ErrRepoAlreadyExist { + ctx.Data["Err_RepoName"] = true + ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), FORK, &form) + return + } else if err == models.ErrRepoNameIllegal { + ctx.Data["Err_RepoName"] = true + ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), CREATE, &form) + return + } + + if repo != nil { + if errDelete := models.DeleteRepository(ctxUser.Id, repo.Id, ctxUser.Name); errDelete != nil { + log.Error(4, "DeleteRepository: %v", errDelete) + } + } + ctx.Handle(500, "ForkPost", err) +} + func Action(ctx *middleware.Context) { var err error switch ctx.Params(":action") { @@ -217,20 +332,6 @@ func Action(ctx *middleware.Context) { err = models.StarRepo(ctx.User.Id, ctx.Repo.Repository.Id, true) case "unstar": err = models.StarRepo(ctx.User.Id, ctx.Repo.Repository.Id, false) - case "fork": - repo, err := models.ForkRepository(ctx.User, ctx.Repo.Repository) - if err != nil { - if err != models.ErrRepoAlreadyExist { - log.Error(4, "Action(%s): %v", ctx.Params(":action"), err) - ctx.JSON(200, map[string]interface{}{ - "ok": false, - "err": err.Error(), - }) - return - } - } - ctx.Redirect(setting.AppSubUrl + "/" + repo.Owner.Name + "/" + repo.Name) - return case "desc": if !ctx.Repo.IsOwner { ctx.Error(404) @@ -263,15 +364,18 @@ func Download(ctx *middleware.Context) { refName string ext string archivePath string + archiveType git.ArchiveType ) switch { case strings.HasSuffix(uri, ".zip"): ext = ".zip" archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/zip") + archiveType = git.ZIP case strings.HasSuffix(uri, ".tar.gz"): ext = ".tar.gz" archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/targz") + archiveType = git.TARGZ default: ctx.Error(404) return @@ -314,9 +418,9 @@ func Download(ctx *middleware.Context) { return } - archivePath = path.Join(archivePath, ctx.Repo.CommitId+ext) + archivePath = path.Join(archivePath, base.ShortSha(commit.Id.String())+ext) if !com.IsFile(archivePath) { - if err := commit.CreateArchive(archivePath, git.ZIP); err != nil { + if err := commit.CreateArchive(archivePath, archiveType); err != nil { ctx.Handle(500, "Download -> CreateArchive "+archivePath, err) return } diff --git a/routers/repo/setting.go b/routers/repo/setting.go index a8e80272..491448a7 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -334,6 +334,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { return } + // FIXME: code too old here, sync with APIs ct := models.JSON if form.ContentType == "2" { ct = models.FORM diff --git a/routers/repo/view.go b/routers/repo/view.go index 26fa0b4c..162279ac 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -34,7 +34,7 @@ func Home(ctx *middleware.Context) { rawLink := ctx.Repo.RepoLink + "/raw/" + branchName // Get tree path - treename := ctx.Params("*") + treename := ctx.Repo.TreeName if len(treename) > 0 && treename[len(treename)-1] == '/' { ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1]) diff --git a/routers/user/setting.go b/routers/user/setting.go index 778f27ac..bb0fa910 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -18,13 +18,14 @@ import ( ) const ( - SETTINGS_PROFILE base.TplName = "user/settings/profile" - SETTINGS_PASSWORD base.TplName = "user/settings/password" - SETTINGS_SSH_KEYS base.TplName = "user/settings/sshkeys" - SETTINGS_SOCIAL base.TplName = "user/settings/social" - SETTINGS_DELETE base.TplName = "user/settings/delete" - NOTIFICATION base.TplName = "user/notification" - SECURITY base.TplName = "user/security" + SETTINGS_PROFILE base.TplName = "user/settings/profile" + SETTINGS_PASSWORD base.TplName = "user/settings/password" + SETTINGS_SSH_KEYS base.TplName = "user/settings/sshkeys" + SETTINGS_SOCIAL base.TplName = "user/settings/social" + SETTINGS_APPLICATIONS base.TplName = "user/settings/applications" + SETTINGS_DELETE base.TplName = "user/settings/delete" + NOTIFICATION base.TplName = "user/notification" + SECURITY base.TplName = "user/security" ) func Settings(ctx *middleware.Context) { @@ -129,7 +130,7 @@ func SettingsSSHKeys(ctx *middleware.Context) { ctx.Data["PageIsSettingsSSHKeys"] = true var err error - ctx.Data["Keys"], err = models.ListPublicKey(ctx.User.Id) + ctx.Data["Keys"], err = models.ListPublicKeys(ctx.User.Id) if err != nil { ctx.Handle(500, "ssh.ListPublicKey", err) return @@ -144,7 +145,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) { ctx.Data["PageIsSettingsSSHKeys"] = true var err error - ctx.Data["Keys"], err = models.ListPublicKey(ctx.User.Id) + ctx.Data["Keys"], err = models.ListPublicKeys(ctx.User.Id) if err != nil { ctx.Handle(500, "ssh.ListPublicKey", err) return @@ -235,6 +236,62 @@ func SettingsSocial(ctx *middleware.Context) { ctx.HTML(200, SETTINGS_SOCIAL) } +func SettingsApplications(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsUserSettings"] = true + ctx.Data["PageIsSettingsApplications"] = true + + // Delete access token. + remove, _ := com.StrTo(ctx.Query("remove")).Int64() + if remove > 0 { + if err := models.DeleteAccessTokenById(remove); err != nil { + ctx.Handle(500, "DeleteAccessTokenById", err) + return + } + ctx.Flash.Success(ctx.Tr("settings.delete_token_success")) + ctx.Redirect(setting.AppSubUrl + "/user/settings/applications") + return + } + + tokens, err := models.ListAccessTokens(ctx.User.Id) + if err != nil { + ctx.Handle(500, "ListAccessTokens", err) + return + } + ctx.Data["Tokens"] = tokens + + ctx.HTML(200, SETTINGS_APPLICATIONS) +} + +// FIXME: split to two different functions and pages to handle access token and oauth2 +func SettingsApplicationsPost(ctx *middleware.Context, form auth.NewAccessTokenForm) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsUserSettings"] = true + ctx.Data["PageIsSettingsApplications"] = true + + switch ctx.Query("type") { + case "token": + if ctx.HasError() { + ctx.HTML(200, SETTINGS_APPLICATIONS) + return + } + + t := &models.AccessToken{ + Uid: ctx.User.Id, + Name: form.Name, + } + if err := models.NewAccessToken(t); err != nil { + ctx.Handle(500, "NewAccessToken", err) + return + } + + ctx.Flash.Success(ctx.Tr("settings.generate_token_succees")) + ctx.Flash.Info(t.Sha1) + } + + ctx.Redirect(setting.AppSubUrl + "/user/settings/applications") +} + func SettingsDelete(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsUserSettings"] = true @@ -254,6 +311,9 @@ func SettingsDelete(ctx *middleware.Context) { case models.ErrUserOwnRepos: ctx.Flash.Error(ctx.Tr("form.still_own_repo")) ctx.Redirect(setting.AppSubUrl + "/user/settings/delete") + case models.ErrUserHasOrgs: + ctx.Flash.Error(ctx.Tr("form.still_has_org")) + ctx.Redirect(setting.AppSubUrl + "/user/settings/delete") default: ctx.Handle(500, "DeleteUser", err) } diff --git a/templates/.VERSION b/templates/.VERSION index 151da606..43806b4f 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.5.6.1027 Beta
\ No newline at end of file +0.5.8.1117 Beta
\ No newline at end of file diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index e5a210c2..3ccb106b 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -184,10 +184,6 @@ <dd><i class="fa fa{{if .SessionConfig.Secure}}-check{{end}}-square-o"></i></dd> <dt>{{.i18n.Tr "admin.config.cookie_life_time"}}</dt> <dd>{{.SessionConfig.CookieLifeTime}} {{.i18n.Tr "tool.raw_seconds"}}</dd> - <dt>{{.i18n.Tr "admin.config.session_hash_function"}}</dt> - <dd>{{.SessionConfig.SessionIDHashFunc}}</dd> - <dt>{{.i18n.Tr "admin.config.session_hash_key"}}</dt> - <dd>{{.SessionConfig.SessionIDHashKey}}</dd> </dl> </div> </div> diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl index 1d4cf806..31734993 100644 --- a/templates/admin/user/edit.tmpl +++ b/templates/admin/user/edit.tmpl @@ -56,15 +56,19 @@ <label></label> <input type="checkbox" name="active" {{if .User.IsActive}}checked{{end}}> <strong>{{.i18n.Tr "admin.users.is_activated"}}</strong> - <br> - <label></label> - <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}> - <strong>{{.i18n.Tr "admin.users.is_admin"}}</strong> + <br> + <label></label> + <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}> + <strong>{{.i18n.Tr "admin.users.is_admin"}}</strong> + <br> + <label></label> + <input type="checkbox" name="allow_git_hook" {{if .User.AllowGitHook}}checked{{end}}> + <strong>{{.i18n.Tr "admin.users.allow_git_hook"}}</strong> </div> <div class="field"> <label></label> <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "admin.users.update_profile"}}</button> - + <button class="btn btn-large btn-red btn-radius" id="delete-account-btn" href="#delete-account-modal">{{.i18n.Tr "admin.users.delete_account"}}</button> </div> <div class="white-popup-block mfp-hide" id="delete-account-modal"> diff --git a/templates/repo/fork.tmpl b/templates/repo/fork.tmpl new file mode 100644 index 00000000..1d096a75 --- /dev/null +++ b/templates/repo/fork.tmpl @@ -0,0 +1,65 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="repo-wrapper"> + <form id="repo-create-form" class="form form-align panel panel-radius" action="{{AppSubUrl}}/repo/fork?fork_id={{.ForkId}}" method="post"> + {{.CsrfTokenHtml}} + <div class="panel-header"> + <h2>{{.i18n.Tr "new_fork"}}</h2> + </div> + <div class="panel-content"> + {{template "ng/base/alert" .}} + <div class="field"> + <label for="owner" class="req">{{.i18n.Tr "repo.owner"}}</label> + <input id="repo-owner-id" type="hidden" name="uid" value="{{.ContextUser.Id}}" /> + <div class="inline-block drop"> + <a class="drop-bottom"> + <img class="avatar" src="{{.ContextUser.AvatarLink}}" id="repo-owner-avatar" alt="user-avatar"> + <strong id="repo-owner-name">{{.ContextUser.Name}}</strong> + </a> + <ul class="drop-down menu menu-vertical menu-radius switching-list" id="repo-create-owner-list"> + <li {{if eq $.ContextUser.Id .SignedUser.Id}}class="checked"{{end}} data-uid="{{.SignedUser.Id}}"> + <a> + <i class="octicon octicon-check"></i> + <img class="avatar" src="{{.SignedUser.AvatarLink}}" alt="user-avatar"> + <strong>{{.SignedUser.Name}}</strong> + </a> + </li> + {{range .Orgs}} + <li {{if eq $.ContextUser.Id .Id}}class="checked"{{end}} data-uid="{{.Id}}"> + <a> + <i class="octicon octicon-check"></i> + <img class="avatar" src="{{.AvatarLink}}" alt="user-avatar"> + <strong>{{.Name}}</strong> + </a> + </li> + {{end}} + </ul> + </div> + </div> + <div class="field"> + <label>{{.i18n.Tr "repo.fork_from"}}</label> + <span><a target="_blank" href="{{AppSubUrl}}/{{.ForkFrom}}">{{.ForkFrom}}</a></span> + </div> + <div class="field"> + <label class="req" for="repo-name">{{.i18n.Tr "repo.repo_name"}}</label> + <input class="ipt ipt-large ipt-radius {{if .Err_RepoName}}ipt-error{{end}}" id="repo-name" name="repo_name" type="text" value="{{.repo_name}}" required /> + <span class="form-label"></span> + <span class="help">{{.i18n.Tr "repo.repo_name_helper" | Str2html}}</span> + </div> + <div class="field"> + <label for="visibility">{{.i18n.Tr "repo.visibility"}}</label> + <span>{{.i18n.Tr "repo.fork_visiblity_helper"}}</span> + </div> + <div class="field clear"> + <label class="left" for="desc">{{.i18n.Tr "repo.repo_desc"}}</label> + <textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.desc}}</textarea> + </div> + <div class="field"> + <label></label> + <button class="btn btn-large btn-blue btn-radius">{{.i18n.Tr "repo.fork_repo"}}</button> + <a class="btn btn-small btn-gray btn-radius" id="repo-create-cancel" href="{{AppSubUrl}}/"><strong>{{.i18n.Tr "cancel"}}</strong></a> + </div> + </div> + </form> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index c2caf4b0..20e67db8 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -22,11 +22,11 @@ <button class="btn btn-gray left" id="repo-clone-https" data-link="{{$.CloneLink.HTTPS}}">HTTPS</button> <input id="repo-clone-url" class="ipt ipt-disabled left" value="{{$.CloneLink.SSH}}" readonly /> <button id="repo-clone-copy" class="btn btn-black left btn-right-radius" data-copy-val="val" data-copy-from="#repo-clone-url" original-title="{{$.i18n.Tr "repo.click_to_copy"}}" data-original-title="{{$.i18n.Tr "repo.click_to_copy"}}" data-after-title="{{$.i18n.Tr "repo.copied"}}">{{$.i18n.Tr "repo.copy_link"}}</button> - <p class="text-center" id="repo-clone-help">{{$.i18n.Tr "repo.clone_helper" | Str2html}}</p> + <p class="text-center" id="repo-clone-help">{{$.i18n.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}</p> <hr/> <div class="text-center" id="repo-clone-zip"> - <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{$.BranchName}}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a> - <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{$.BranchName}}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a> + <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{EscapePound $.BranchName}}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a> + <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{EscapePound $.BranchName}}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a> </div> </div> </div> @@ -47,7 +47,7 @@ </a> </li> <li id="repo-header-fork"> - <a id="repo-header-fork-btn" {{if not $.IsRepositoryTrueOwner}}href="{{.RepoLink}}/action/fork"{{end}}> + <a id="repo-header-fork-btn" {{if or (not $.IsRepositoryTrueOwner) $.Owner.IsOrganization}}href="{{AppSubUrl}}/repo/fork?fork_id={{.Id}}"{{end}}> <button class="btn btn-gray text-bold btn-radius"> <i class="octicon octicon-repo-forked"></i>{{$.i18n.Tr "repo.fork"}} <span class="num">{{.NumForks}}</span> diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl index 49bf1fd1..acfdc38b 100644 --- a/templates/repo/home.tmpl +++ b/templates/repo/home.tmpl @@ -31,30 +31,30 @@ </ul> <ul class="menu menu-vertical switching-list {{if .IsTag}}hide{{end}}" id="repo-branch-list"> {{range .Branches}} - <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{.}}"><i class="octicon octicon-check"></i>{{.}}</a></li> + <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{EscapePound .}}"><i class="octicon octicon-check"></i>{{.}}</a></li> {{end}} </ul> <ul class="menu menu-vertical switching-list {{if not .IsTag}}hide{{end}}" id="repo-tag-list"> {{range .Tags}} - <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{.}}"><i class="octicon octicon-check"></i>{{.}}</a></li> + <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{EscapePound .}}"><i class="octicon octicon-check"></i>{{.}}</a></li> {{end}} </ul> </div> </div> </li> <li id="repo-bread" class="breads"> - <a class="title bread" href="{{.RepoLink}}">{{.Repository.Name}}</a> + <a class="title bread" href="{{.RepoLink}}/src/{{EscapePound .BranchName}}">{{.Repository.Name}}</a> {{ $n := len .Treenames}} {{ $l := Subtract $n 1}} {{range $i, $v := .Treenames}} {{if eq $i $l}} - <span class="bread">{{$v}}</span> + <span class="bread">{{EscapePound $v}}</span> {{else}} - <span class="bread"><a href="{{$.BranchLink}}/{{index $.Paths $i}}">{{$v}}</a></span> + <span class="bread"><a href="{{EscapePound $.BranchLink}}/{{index $.Paths $i}}">{{$v}}</a></span> {{end}} {{end}} </li> - <li id="repo-commits-jump" class="repo-jump right"> + <!-- <li id="repo-commits-jump" class="repo-jump right"> <a href="#"> <button class="btn btn-small btn-gray btn-right-radius"><i class="octicon octicon-git-commit"></i></button> </a> @@ -63,7 +63,7 @@ <a href="#"> <button class="btn btn-small btn btn-small btn-gray btn-left-radius"><i class="octicon octicon-list-unordered"></i></button> </a> - </li> + </li> --> </ul> {{if .IsFile}} {{template "repo/view_file" .}} diff --git a/templates/repo/issue2/labels.tmpl b/templates/repo/issue2/labels.tmpl new file mode 100644 index 00000000..b499bae1 --- /dev/null +++ b/templates/repo/issue2/labels.tmpl @@ -0,0 +1,36 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="repo-wrapper"> + {{template "repo/header" .}} + <div class="issue-main container repo-wide-wrapper"> + <ul id="issue-list-nav" class="menu menu-line"> + <li><a href="#">Issue</a></li> + <li><a href="#">Pull Request</a></li> + <li class="current"><a href="#">Labels</a></li> + <li><a href="#">Milestones</a></li> + <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Issue</button></a></li> + <li class="right"><a href="#">Filter</a></li> + </ul> + <div id="issue-list-container"> + <div id="issue-list-menu"> + <div class="left"><span class="label label-black" id="labels-num">6</span><strong>Labels</strong></div> + <div class="clear"></div> + </div> + <ul id="label-list" class="list-no-style"> + <li class="item" id="label-id"> + <a class="right" href="#"><i class="octicon octicon-x"></i>Delete</a> + <a class="right" href="#"><i class="octicon octicon-pencil"></i>Edit</a> + <a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a> + <a class="left label clear" href="#" style="background-color: red"><i class="octicon octicon-tag"></i><strong>bug</strong></a> + </li> + <li class="item" id="label-id"> + <a class="right" href="#"><i class="octicon octicon-x"></i>Delete</a> + <a class="right" href="#"><i class="octicon octicon-pencil"></i>Edit</a> + <a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a> + <a class="left label clear" href="#" style="background-color: red"><i class="octicon octicon-tag"></i><strong>bug</strong></a> + </li> + </ul> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/repo/issue2/list.tmpl b/templates/repo/issue2/list.tmpl index d2440a3c..db69afb7 100644 --- a/templates/repo/issue2/list.tmpl +++ b/templates/repo/issue2/list.tmpl @@ -8,9 +8,64 @@ <li><a href="#">Pull Request</a></li> <li><a href="#">Labels</a></li> <li><a href="#">Milestones</a></li> - <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green btn-radius text-bold">New Issue</button></a></li> + <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Issue</button></a></li> <li class="right"><a href="#">Filter</a></li> </ul> + <div id="issue-list-container"> + <div id="issue-list-menu"> + <div class="left"> + <span class="mark open hover"><a href="#"> + <i class="octicon octicon-issue-opened"></i> 88 Open + </a></span> + <span class="mark close"><a href=""> + <i class="octicon octicon-issue-closed"></i> 12 Close + </a></span> + </div> + <div class="clear"></div> + </div> + <ul id="issue-list" class="list-no-style"> + <li class="item" id="issue-id"> + <a class="comment" href="#"> + <i class="octicon octicon-comment"></i> 7 + </a> + <p class="title text-bold"> + <span class="label label-black index-num">#588</span> + <a href="#" class="title-text">Delete account text and/or translations missing</a> + <span class="label label-red issue-label"><a href="#">bug</a></span> + </p> + <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p> + </li> + <li class="item" id="issue-id2"> + <a class="comment" href="#"> + <i class="octicon octicon-comment"></i> 7 + </a> + <p class="title text-bold"> + <span class="label label-black index-num">#588</span> + <a href="#" class="title-text">Delete account text and/or translations missing</a> + <span class="label label-red issue-label"><a href="#">bug</a></span> + </p> + <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p> + </li> + <li class="item" id="issue-id3"> + <a class="comment" href="#"> + <i class="octicon octicon-comment"></i> 7 + </a> + <p class="title text-bold"> + <span class="label label-black index-num">#588</span> + <a href="#" class="title-text">Disabling attachments breaks issues and comments ajax submit</a> + <span class="label label-red issue-label"><a href="#">bug</a></span> + </p> + <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p> + </li> + </ul> + <div id="issue-list-pager" class="pager text-center"> + <a class="prev invalid" href="#">Prev</a> + <a class="page" href="#">1</a> + <a class="page hover" href="#">2</a> + <a class="page" href="#">3</a> + <a class="next" href="#">Next</a> + </div> + </div> </div> </div> {{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/repo/pr2/list.tmpl b/templates/repo/pr2/list.tmpl new file mode 100644 index 00000000..93868256 --- /dev/null +++ b/templates/repo/pr2/list.tmpl @@ -0,0 +1,48 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="repo-wrapper"> + {{template "repo/header" .}} + <div class="issue-main container repo-wide-wrapper"> + <ul id="issue-list-nav" class="menu menu-line"> + <li><a href="#">Issue</a></li> + <li class="current"><a href="#">Pull Request</a></li> + <li><a href="#">Labels</a></li> + <li><a href="#">Milestones</a></li> + <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Pull Request</button></a></li> + <li class="right"><a href="#">Filter</a></li> + </ul> + <div id="issue-list-container"> + <div id="issue-list-menu"> + <div class="left"> + <span class="mark open hover"><a href="#"> + <i class="octicon octicon-git-pull-request"></i> 88 Open + </a></span> + <span class="mark close"><a href=""> + <i class="octicon octicon-issue-closed"></i> 12 Close + </a></span> + </div> + <div class="clear"></div> + </div> + <ul id="pull-list" class="list-no-style"> + <li class="item" id="pr-id"> + <a class="comment" href="#"> + <i class="octicon octicon-comment"></i> 7 + </a> + <p class="title text-bold"> + <i class="octicon octicon-git-pull-request"></i> + <a href="#" class="title-text">Delete account text and/or translations missing</a> + </p> + <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p> + </li> + </ul> + <div id="issue-list-pager" class="pager text-center"> + <a class="prev invalid" href="#">Prev</a> + <a class="page" href="#">1</a> + <a class="page hover" href="#">2</a> + <a class="page" href="#">3</a> + <a class="next" href="#">Next</a> + </div> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/repo/settings/hook_gogs.tmpl b/templates/repo/settings/hook_gogs.tmpl index 31a04ce0..39e612b9 100644 --- a/templates/repo/settings/hook_gogs.tmpl +++ b/templates/repo/settings/hook_gogs.tmpl @@ -2,7 +2,7 @@ <form class="form form-align panel-body repo-setting-form" id="repo-setting-form-gogs" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/gogs/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.Id}}{{end}}" method="post"> {{.CsrfTokenHtml}} <input type="hidden" name="hook_type" value="gogs"> - <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}</div> + <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_webhook_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</div> <div class="field"> <label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label> <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.Url}}" required /> diff --git a/templates/repo/settings/hook_slack.tmpl b/templates/repo/settings/hook_slack.tmpl index 08d86180..bc307ec8 100644 --- a/templates/repo/settings/hook_slack.tmpl +++ b/templates/repo/settings/hook_slack.tmpl @@ -2,7 +2,7 @@ <form class="form form-align panel-body repo-setting-form" id="repo-setting-form-slack" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/slack/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.Id}}{{end}}" method="post"> {{.CsrfTokenHtml}} <input type="hidden" name="hook_type" value="slack"> - <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}</div> + <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_slack_hook_desc" "http://slack.com" | Str2html}}</div> <div class="field"> <label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label> <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.Url}}" required /> diff --git a/templates/repo/settings/hooks.tmpl b/templates/repo/settings/hooks.tmpl index 6efd8f0a..6fcedab7 100644 --- a/templates/repo/settings/hooks.tmpl +++ b/templates/repo/settings/hooks.tmpl @@ -15,7 +15,7 @@ <strong>{{.i18n.Tr "repo.settings.hooks"}}</strong> </div> <ul class="panel-body setting-list"> - <li>{{.i18n.Tr "repo.settings.hooks_desc" | Str2html}}</li> + <li>{{.i18n.Tr "repo.settings.hooks_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</li> {{range .Webhooks}} <li> {{if .IsActive}} diff --git a/templates/repo/settings/nav.tmpl b/templates/repo/settings/nav.tmpl index 16128f01..6803c563 100644 --- a/templates/repo/settings/nav.tmpl +++ b/templates/repo/settings/nav.tmpl @@ -5,7 +5,9 @@ <li {{if .PageIsSettingsOptions}}class="current"{{end}}><a href="{{.RepoLink}}/settings">{{.i18n.Tr "repo.settings.options"}}</a></li> <li {{if .PageIsSettingsCollaboration}}class="current"{{end}}><a href="{{.RepoLink}}/settings/collaboration">{{.i18n.Tr "repo.settings.collaboration"}}</a></li> <li {{if .PageIsSettingsHooks}}class="current"{{end}}><a href="{{.RepoLink}}/settings/hooks">{{.i18n.Tr "repo.settings.hooks"}}</a></li> + {{if or .SignedUser.AllowGitHook .SignedUser.IsAdmin}} <li {{if .PageIsSettingsGitHooks}}class="current"{{end}}><a href="{{.RepoLink}}/settings/hooks/git">{{.i18n.Tr "repo.settings.githooks"}}</a></li> + {{end}} <!-- <li {{if .PageIsSettingsKeys}}class="current"{{end}}><a href="{{.RepoLink}}/settings/keys">{{.i18n.Tr "repo.settings.deploy_keys"}}</a></li> --> </ul> </div> diff --git a/templates/repo/sidebar.tmpl b/templates/repo/sidebar.tmpl index 7a00dbb8..9d6abb47 100644 --- a/templates/repo/sidebar.tmpl +++ b/templates/repo/sidebar.tmpl @@ -9,7 +9,7 @@ <li class="border-bottom"></li> <li class="head">{{if .IsViewBranch}}{{.BranchName}}{{else}}{{ShortSha .BranchName}}{{end}}</li> <li> - <a class="radius" href="{{.RepoLink}}/commits/{{.BranchName}}"><i class="octicon octicon-history"></i>{{.i18n.Tr "repo.commits"}} <span class="num right label label-gray label-radius">{{.CommitsCount}}</span></a> + <a class="radius" href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}"><i class="octicon octicon-history"></i>{{.i18n.Tr "repo.commits"}} <span class="num right label label-gray label-radius">{{.CommitsCount}}</span></a> </li> <!-- <li> <a class="radius" href="{{.RepoLink}}/branches"><i class="octicon octicon-git-branch"></i>Branches<span class="num right label label-gray label-radius">{{.BrancheCount}}</span></a> diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl index 4e2d4fc6..d33cc950 100644 --- a/templates/repo/view_file.tmpl +++ b/templates/repo/view_file.tmpl @@ -12,10 +12,10 @@ <strong class="file-name">{{.FileName}}</strong><span class="file-size">{{FileSize .FileSize}}</span> {{end}} {{if not .ReadmeInList}} - <a class="right" href="{{.RepoLink}}/commits/{{.BranchName}}/{{.TreeName}}"> + <a class="right" href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}/{{.TreeName}}"> <button class="btn btn-medium btn-gray btn-right-radius btn-comb">{{.i18n.Tr "repo.file_history"}}</button> </a> - <a class="right" href="{{.FileLink}}"> + <a class="right" href="{{EscapePound .FileLink}}"> <button class="btn btn-medium btn-gray btn-left-radius btn-comb">{{.i18n.Tr "repo.file_raw"}}</button> </a> {{end}} @@ -26,9 +26,9 @@ {{else if not .IsFileText}} <div class="view-raw"> {{if .IsImageFile}} - <img src="{{.FileLink}}"> + <img src="{{EscapePound .FileLink}}"> {{else}} - <a href="{{.FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">{{.i18n.Tr "repo.file_view_raw"}}</a> + <a href="{{EscapePound .FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">{{.i18n.Tr "repo.file_view_raw"}}</a> {{end}} </div> {{else if .FileSize}} diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl index 032b9e0f..e65d7c11 100644 --- a/templates/repo/view_list.tmpl +++ b/templates/repo/view_list.tmpl @@ -18,7 +18,7 @@ {{if .HasParentPath}} <tr class="has-parent"> <td class="icon"></td> - <td class="name"><a href="{{.BranchLink}}{{.ParentPath}}">..</a></td> + <td class="name"><a href="{{EscapePound .BranchLink}}{{.ParentPath}}">..</a></td> <td class="msg"></td> <td class="age"></td> </tr> @@ -39,7 +39,7 @@ <span class="octicon octicon-file-{{if or $entry.IsDir}}directory{{else}}text{{end}}"></span> </td> <td class="name"> - <a href="{{$.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a> + <a href="{{EscapePound $.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a> </td> {{end}} <td class="msg"> diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index af3d11a0..46bc99bd 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -70,13 +70,18 @@ <div class="tab-pane active"> <div id="org-repo-list"> {{range .Repos}} - {{if not .IsPrivate}} + {{if or (not .IsPrivate) (.HasAccess $.SignedUserName)}} <div class="org-repo-item"> <ul class="org-repo-status right"> <li><i class="octicon octicon-star"></i> {{.NumStars}}</li> <li><i class="octicon octicon-git-branch"></i> {{.NumForks}}</li> </ul> - <h2><a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a></h2> + <h2> + <a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a> + {{if .IsPrivate}} + <span class="text-gold"><i class="octicon octicon-lock"></i></span> + {{end}} + </h2> <p class="org-repo-description">{{.Description}}</p> <p class="org-repo-updated">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p> </div> diff --git a/templates/user/settings/applications.tmpl b/templates/user/settings/applications.tmpl new file mode 100644 index 00000000..f34349a5 --- /dev/null +++ b/templates/user/settings/applications.tmpl @@ -0,0 +1,56 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +<div id="setting-wrapper" class="main-wrapper"> + <div id="user-profile-setting" class="container clear"> + {{template "user/settings/nav" .}} + <div class="grid-4-5 left"> + <div class="setting-content"> + {{template "ng/base/alert" .}} + <div id="setting-content"> + <div id="user-applications-panel" class="panel panel-radius"> + <div class="panel-header"> + <a class="show-form-btn" data-target-form="#access-add-form"> + <button class="btn btn-medium btn-black btn-radius right">{{.i18n.Tr "settings.generate_new_token"}}</button> + </a> + <strong>{{.i18n.Tr "settings.manage_access_token"}}</strong> + </div> + <ul class="panel-body setting-list"> + <li>{{.i18n.Tr "settings.tokens_desc"}}</li> + {{range .Tokens}} + <li class="ssh clear"> + <span class="active-icon left label label-{{if .HasRecentActivity}}green{{else}}gray{{end}} label-radius"></span> + <i class="fa fa-send fa-2x left"></i> + <div class="ssh-content left"> + <p><strong>{{.Name}}</strong></p> + <p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} {{DateFormat .Created "M d, Y"}} — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFormat .Updated "M d, Y"}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p> + </div> + <a href="{{AppSubUrl}}/user/settings/applications?remove={{.Id}}"> + <button class="btn btn-small btn-red btn-radius ssh-btn right">{{$.i18n.Tr "settings.delete_token"}}</button> + </a> + </li> + {{end}} + </ul> + </div> + <br> + <form class="panel panel-radius form form-align form-settings-add hide" id="access-add-form" action="{{AppSubUrl}}/user/settings/applications" method="post"> + {{.CsrfTokenHtml}} + <p class="panel-header"><strong>{{.i18n.Tr "settings.generate_new_token"}}</strong></p> + <div class="panel-body"> + <div class="text-center panel-desc">{{.i18n.Tr "settings.new_token_desc"}}</div> + <input type="hidden" name="type" value="token"> + <p class="field"> + <label class="req" for="token-name">{{.i18n.Tr "settings.token_name"}}</label> + <input class="ipt ipt-radius" id="token-name" name="name" required /> + </p> + <p class="field"> + <label></label> + <button class="btn btn-green btn-medium btn-radius" id="ssh-add-btn">{{.i18n.Tr "settings.generate_token"}}</button> + </p> + </div> + </form> + </div> + </div> + </div> + </div> +</div> +{{template "ng/base/footer" .}}
\ No newline at end of file diff --git a/templates/user/settings/nav.tmpl b/templates/user/settings/nav.tmpl index fd60cb53..6204b85a 100644 --- a/templates/user/settings/nav.tmpl +++ b/templates/user/settings/nav.tmpl @@ -6,6 +6,7 @@ <li {{if .PageIsSettingsPassword}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/password">{{.i18n.Tr "settings.password"}}</a></li> <li {{if .PageIsSettingsSSHKeys}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/ssh">{{.i18n.Tr "settings.ssh_keys"}}</a></li> <li {{if .PageIsSettingsSocial}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/social">{{.i18n.Tr "settings.social"}}</a></li> + <li {{if .PageIsSettingsApplications}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/applications">{{.i18n.Tr "settings.applications"}}</a></li> <li {{if .PageIsSettingsDelete}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/delete">{{.i18n.Tr "settings.delete"}}</a></li> </ul> </div> diff --git a/templates/user/settings/sshkeys.tmpl b/templates/user/settings/sshkeys.tmpl index 188f078a..dcebccbb 100644 --- a/templates/user/settings/sshkeys.tmpl +++ b/templates/user/settings/sshkeys.tmpl @@ -9,7 +9,9 @@ <div id="user-ssh-setting-content"> <div id="user-ssh-panel" class="panel panel-radius"> <div class="panel-header"> - <a class="btn btn-small btn-black btn-header btn-radius right" id="ssh-add">{{.i18n.Tr "settings.add_key"}}</a> + <a class="show-form-btn" data-target-form="#user-ssh-add-form"> + <button class="btn btn-medium btn-black btn-radius right">{{.i18n.Tr "settings.add_key"}}</button> + </a> <strong>{{.i18n.Tr "settings.manage_ssh_keys"}}</strong> </div> <ul class="panel-body setting-list"> @@ -27,15 +29,15 @@ {{$.CsrfTokenHtml}} <input name="_method" type="hidden" value="DELETE"> <input name="id" type="hidden" value="{{.Id}}"> - <button class="right ssh-delete-btn btn btn-red btn-radius btn-small">{{$.i18n.Tr "settings.delete_key"}}</button> + <button class="right ssh-btn btn btn-red btn-radius btn-small">{{$.i18n.Tr "settings.delete_key"}}</button> </form> </li> {{end}} </ul> </div> - <p>{{.i18n.Tr "settings.ssh_helper" | Str2html}}</p> + <p>{{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}</p> <br> - <form class="panel panel-radius form form-align hide" id="user-ssh-add-form" action="{{AppSubUrl}}/user/settings/ssh" method="post"> + <form class="panel panel-radius form form-align form-settings-add hide" id="user-ssh-add-form" action="{{AppSubUrl}}/user/settings/ssh" method="post"> {{.CsrfTokenHtml}} <p class="panel-header"><strong>{{.i18n.Tr "settings.add_new_key"}}</strong></p> <div class="panel-body"> |